Copy disabled (too large)
Download .txt
Showing preview only (60,079K chars total). Download the full file to get everything.
Repository: Lakr233/FlowDown-Beta
Branch: main
Commit: eedb305046cc
Files: 1245
Total size: 252.6 MB
Directory structure:
gitextract_7mrrflkv/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── feature_request.yml
│ │ └── improvement.yml
│ └── workflows/
│ ├── ci.yml
│ ├── housekeeping.yml
│ ├── release-notarize.yml
│ └── test.yml
├── .gitignore
├── .gitmodules
├── .swift-format-list
├── AGENTS.md
├── Examples/
│ ├── ModelExchange/
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Info.plist
│ │ └── main.swift
│ └── ModelExchange.xcodeproj/
│ ├── project.pbxproj
│ └── xcshareddata/
│ └── xcschemes/
│ └── ModelExchange.xcscheme
├── FlowDown/
│ ├── Application/
│ │ ├── AppDelegate+Menu.swift
│ │ ├── AppDelegate.swift
│ │ ├── AppEnvironment.swift
│ │ ├── RecoveryMode.swift
│ │ ├── SceneDelegate.swift
│ │ ├── Value+DialTuneMode.swift
│ │ ├── Value+EditorBehavior.swift
│ │ ├── Value+LiveActivity.swift
│ │ ├── Value+MLX.swift
│ │ ├── Value+MarkdownTheme.swift
│ │ ├── Value+Memory.swift
│ │ ├── Value+ScrubberConfiguration.swift
│ │ └── Value+UserInterfaceStyle.swift
│ ├── Backend/
│ │ ├── Audio/
│ │ │ └── SoundEffectPlayer.swift
│ │ ├── ChatTemplate/
│ │ │ ├── ChatTemplate.swift
│ │ │ └── ChatTemplateManager.swift
│ │ ├── Conversation/
│ │ │ ├── ConversationManager+CRUD.swift
│ │ │ ├── ConversationManager+Compress.swift
│ │ │ ├── ConversationManager+EditorObject.swift
│ │ │ ├── ConversationManager+Export.swift
│ │ │ ├── ConversationManager+Menu.swift
│ │ │ ├── ConversationManager+Search.swift
│ │ │ ├── ConversationManager.swift
│ │ │ ├── ConversationSummarizer.swift
│ │ │ ├── Pipeline/
│ │ │ │ ├── ConversationSession+PreprocessAttachments.swift
│ │ │ │ ├── ConversationSession.swift
│ │ │ │ ├── ConversationSessionManager.swift
│ │ │ │ ├── Execute/
│ │ │ │ │ ├── ConversationSession+BuildMessages.swift
│ │ │ │ │ ├── ConversationSession+Cancel.swift
│ │ │ │ │ ├── ConversationSession+Execute.swift
│ │ │ │ │ ├── ConversationSession+ExecuteOnce.swift
│ │ │ │ │ ├── ConversationSession+FixReference.swift
│ │ │ │ │ ├── ConversationSession+SystemPrompt.swift
│ │ │ │ │ ├── ConversationSession+Trim.swift
│ │ │ │ │ └── ConversationSystemPromptBuilder.swift
│ │ │ │ ├── PostAction/
│ │ │ │ │ ├── ConversationSession+Icon.swift
│ │ │ │ │ ├── ConversationSession+Metadata.swift
│ │ │ │ │ ├── ConversationSession+Rename.swift
│ │ │ │ │ ├── ConversationSession+Title.swift
│ │ │ │ │ └── ModelResponseSanitizer.swift
│ │ │ │ └── PreAction/
│ │ │ │ ├── ConversationSession+Images.swift
│ │ │ │ └── ConversationSession+WebSearch.swift
│ │ │ └── RewriteAction.swift
│ │ ├── Evaluation/
│ │ │ ├── EvaluationManifest+Case.Content.swift
│ │ │ ├── EvaluationManifest+Case.Result.swift
│ │ │ ├── EvaluationManifest+Case.Verifier.swift
│ │ │ ├── EvaluationManifest+Case.swift
│ │ │ ├── EvaluationManifest+Suite.swift
│ │ │ ├── EvaluationManifest.swift
│ │ │ ├── EvaluationOptions.swift
│ │ │ ├── EvaluationSession.swift
│ │ │ ├── EvaluationSessionManager.swift
│ │ │ └── Manifests/
│ │ │ ├── InstructionFollowingSuite.swift
│ │ │ ├── ProgrammingCSuite.swift
│ │ │ ├── ProgrammingGoSuite.swift
│ │ │ ├── ProgrammingPythonSuite.swift
│ │ │ ├── ProgrammingRustSuite.swift
│ │ │ ├── ProgrammingSwiftSuite.swift
│ │ │ ├── ProgrammingWebSuite.swift
│ │ │ └── ToolCallingSuite.swift
│ │ ├── LiveActivity/
│ │ │ ├── LiveActivityService.swift
│ │ │ └── WidgetsAttributes.swift
│ │ ├── MCPService/
│ │ │ ├── MCPConnection.swift
│ │ │ ├── MCPError.swift
│ │ │ ├── MCPService+Tools.swift
│ │ │ ├── MCPService.swift
│ │ │ ├── MCPServiceActor.swift
│ │ │ ├── MCPTool.swift
│ │ │ ├── MCPToolInfo.swift
│ │ │ ├── MCPTransportManager.swift
│ │ │ └── ModelContextServer+DisplayName.swift
│ │ ├── Model/
│ │ │ ├── BalancedEmitter.swift
│ │ │ ├── CloudModelResponseFormat+Display.swift
│ │ │ ├── ModelExchangeCoordinator.swift
│ │ │ ├── ModelManager+AAPL.swift
│ │ │ ├── ModelManager+Cloud.swift
│ │ │ ├── ModelManager+Hub.swift
│ │ │ ├── ModelManager+Inference.swift
│ │ │ ├── ModelManager+Local.swift
│ │ │ ├── ModelManager+Menu.swift
│ │ │ ├── ModelManager+Parms.swift
│ │ │ ├── ModelManager.swift
│ │ │ └── PollinationsService.swift
│ │ ├── ModelTools/
│ │ │ ├── AttachmentDataParser.swift
│ │ │ ├── CalendarTools/
│ │ │ │ ├── AddCalendarTool.swift
│ │ │ │ └── QueryCalendarTool.swift
│ │ │ ├── LocationTools/
│ │ │ │ └── LocationTool.swift
│ │ │ ├── MemoryTools/
│ │ │ │ ├── MTDeleteMemoryTool.swift
│ │ │ │ ├── MTListMemoriesTool.swift
│ │ │ │ ├── MTRecallMemoryTool.swift
│ │ │ │ ├── MTStoreMemoryTool.swift
│ │ │ │ ├── MTUpdateMemoryTool.swift
│ │ │ │ ├── MemoryExtractor.swift
│ │ │ │ ├── MemoryStore+Prompt.swift
│ │ │ │ └── MemoryStore.swift
│ │ │ ├── ModelTools.swift
│ │ │ ├── ModelToolsManager.swift
│ │ │ ├── Supplement/
│ │ │ │ └── MTWebSearchTool.swift
│ │ │ ├── URLTools/
│ │ │ │ └── URLTool.swift
│ │ │ └── WebTools/
│ │ │ └── WebScraperTool.swift
│ │ ├── Shortcuts/
│ │ │ ├── InferenceIntentHandler.swift
│ │ │ ├── Intent/
│ │ │ │ ├── ClassifyContentIntent.swift
│ │ │ │ ├── CreateNewConversationIntent.swift
│ │ │ │ ├── FillConversationMessageIntent.swift
│ │ │ │ ├── GenerateNewConversationLinkIntent.swift
│ │ │ │ ├── GenerateResponseIntent.swift
│ │ │ │ ├── GetLatestConversationDetailsIntent.swift
│ │ │ │ ├── ImproveWritingIntent.swift
│ │ │ │ ├── OpenAppIntent.swift
│ │ │ │ ├── SearchConversationsIntent.swift
│ │ │ │ ├── SetConversationModelIntent.swift
│ │ │ │ ├── ShowAndSendConversationIntent.swift
│ │ │ │ ├── ShowConversationIntent.swift
│ │ │ │ ├── SummarizeIntent.swift
│ │ │ │ ├── TranscribeAudioIntent.swift
│ │ │ │ └── TranslateTextIntent.swift
│ │ │ ├── ModelShortcutEntities.swift
│ │ │ ├── ShortcutError.swift
│ │ │ ├── ShortcutUtilities.swift
│ │ │ └── Shortcuts.swift
│ │ ├── Storage/
│ │ │ ├── SettingsBackup.swift
│ │ │ └── Storage+Export.swift
│ │ ├── Supplement/
│ │ │ ├── AnchorVersion.swift
│ │ │ ├── AudioTranscoder.swift
│ │ │ ├── ChatSelection.swift
│ │ │ ├── DisposableExporter.swift
│ │ │ └── KeyboardNavigationDelegate.swift
│ │ └── UpdateManager/
│ │ └── UpdateManager.swift
│ ├── BundledResources/
│ │ ├── Emoji.json
│ │ ├── OpenSourceLicenses.md
│ │ ├── en.lproj/
│ │ │ └── PrivacyPolicy.md
│ │ └── zh-Hans.lproj/
│ │ └── PrivacyPolicy.md
│ ├── Configuration/
│ │ ├── AppGroup.swift
│ │ ├── Base.xcconfig
│ │ ├── Development.xcconfig
│ │ ├── Release.xcconfig
│ │ └── Version.xcconfig
│ ├── DerivedSources/
│ │ └── DerivedSourcesReadme.swift
│ ├── Extension/
│ │ ├── Combine.swift
│ │ ├── ConfigurableView.swift
│ │ ├── Errors.swift
│ │ ├── GlassEffect/
│ │ │ ├── LegacyGlassBackdropView.swift
│ │ │ └── PrivateBlurEngine.swift
│ │ ├── Indicator.swift
│ │ ├── MarkdownParser+MathPlaceholderRepair.swift
│ │ ├── NSAttributedString+Search.swift
│ │ ├── NSNumber.swift
│ │ ├── SequentialOperator.swift
│ │ ├── String.swift
│ │ ├── UIApplication.swift
│ │ ├── UIBezierPath.swift
│ │ ├── UIFont.swift
│ │ ├── UIView.swift
│ │ ├── UIViewController.swift
│ │ ├── UIViewControllerHolder.swift
│ │ └── Withable.swift
│ ├── Interface/
│ │ ├── ChatView/
│ │ │ ├── ChatView+Delegates.swift
│ │ │ ├── ChatView+HeaderVisualEffect.swift
│ │ │ ├── ChatView+Parms.swift
│ │ │ └── ChatView.swift
│ │ ├── ConversationCaptureView/
│ │ │ └── ConversationCaptureView.swift
│ │ ├── ConversationSearchController/
│ │ │ ├── ConversationSearchController+Cell.swift
│ │ │ ├── ConversationSearchController.swift
│ │ │ ├── KeyboardNavigationSearchBar.swift
│ │ │ ├── SearchContentController+HolderViews.swift
│ │ │ ├── SearchContentController+SearchBar.swift
│ │ │ ├── SearchContentController+Shortcuts.swift
│ │ │ ├── SearchContentController+TableView.swift
│ │ │ ├── SearchContentController.swift
│ │ │ └── SearchResult.swift
│ │ ├── ConversationSelectionView/
│ │ │ ├── ConversationSelectionView+Cell.swift
│ │ │ ├── ConversationSelectionView+Delegate.swift
│ │ │ ├── ConversationSelectionView.swift
│ │ │ └── SectionDateHeaderView.swift
│ │ ├── EmojiPicker/
│ │ │ ├── EmojiPicker+Cell.swift
│ │ │ ├── EmojiPicker+Data.swift
│ │ │ ├── EmojiPicker+Provider.swift
│ │ │ └── EmojiPicker.swift
│ │ ├── Evaluation/
│ │ │ ├── EvaluationAssistantController/
│ │ │ │ └── EvaluationAssistantController.swift
│ │ │ ├── EvaluationCaseDetailController/
│ │ │ │ ├── EvaluationCaseDetailController.swift
│ │ │ │ └── EvaluationMenuFactory.swift
│ │ │ ├── EvaluationController/
│ │ │ │ └── EvaluationController.swift
│ │ │ ├── EvaluationHistoryController/
│ │ │ │ └── EvaluationHistoryController.swift
│ │ │ └── EvaluationStatusController/
│ │ │ ├── EvaluationStatusCollectionView/
│ │ │ │ ├── EvaluationStatusCell.swift
│ │ │ │ ├── EvaluationStatusCollectionView+DataSource.swift
│ │ │ │ ├── EvaluationStatusCollectionView+Delegate.swift
│ │ │ │ ├── EvaluationStatusCollectionView+Layout.swift
│ │ │ │ └── EvaluationStatusCollectionView.swift
│ │ │ ├── EvaluationStatusController.swift
│ │ │ └── EvaluationSuiteHeaderView.swift
│ │ ├── MainController/
│ │ │ ├── MainController+Boot.swift
│ │ │ ├── MainController+Catalyst.swift
│ │ │ ├── MainController+Content.swift
│ │ │ ├── MainController+Gesture.swift
│ │ │ ├── MainController+Layout.swift
│ │ │ ├── MainController+SidbarDragger.swift
│ │ │ └── MainController.swift
│ │ ├── MessageListView/
│ │ │ ├── Components/
│ │ │ │ ├── ActivityReportingView.swift
│ │ │ │ ├── AiMessageView.swift
│ │ │ │ ├── HintMessageView.swift
│ │ │ │ ├── LoadingSymbol.swift
│ │ │ │ ├── ReasoningContentView.swift
│ │ │ │ ├── ShimmerTextLabel.swift
│ │ │ │ ├── ToolHintView.swift
│ │ │ │ ├── UserAttachmentView.swift
│ │ │ │ ├── UserMessageView.swift
│ │ │ │ └── WebSearchStateView.swift
│ │ │ ├── MessageListRowView.swift
│ │ │ ├── MessageListView+Adapter.swift
│ │ │ ├── MessageListView+DataSource.swift
│ │ │ ├── MessageListView+NodesCache.swift
│ │ │ └── MessageListView.swift
│ │ ├── ModelExchange/
│ │ │ ├── ModelExchangeCapability+Display.swift
│ │ │ └── ModelExchangeSelectionController.swift
│ │ ├── RichEditor/
│ │ │ ├── Extension/
│ │ │ │ ├── Ext+Data.swift
│ │ │ │ └── Ext+UIImage.swift
│ │ │ ├── RichEditor/
│ │ │ │ ├── EditorBehavior.swift
│ │ │ │ ├── RichEditorView+Delegate.swift
│ │ │ │ ├── RichEditorView+Delegates.swift
│ │ │ │ ├── RichEditorView+Notification.swift
│ │ │ │ ├── RichEditorView+Object.swift
│ │ │ │ ├── RichEditorView+PickerDelegates.swift
│ │ │ │ ├── RichEditorView+Progress.swift
│ │ │ │ ├── RichEditorView.swift
│ │ │ │ └── TemporaryStorage.swift
│ │ │ ├── RichEditor.xcassets/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── asterisk.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── attachment.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── beaker.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── camera.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── image.up.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── link.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── mic.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── plus.circle.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── send.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── server.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── text.attachment.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── tools.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── x.circle.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── x.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Sections/
│ │ │ │ ├── AttachmentsBar/
│ │ │ │ │ ├── AttachmentsBar+Cell.swift
│ │ │ │ │ ├── AttachmentsBar+Delegate.swift
│ │ │ │ │ ├── AttachmentsBar+Type.swift
│ │ │ │ │ └── AttachmentsBar.swift
│ │ │ │ ├── ControlPanel/
│ │ │ │ │ ├── ControlPanel+Delegate.swift
│ │ │ │ │ └── ControlPanel.swift
│ │ │ │ ├── InputEditor/
│ │ │ │ │ ├── InputEditor+Delegate.swift
│ │ │ │ │ ├── InputEditor+Layout.swift
│ │ │ │ │ ├── InputEditor+TextView.swift
│ │ │ │ │ └── InputEditor.swift
│ │ │ │ └── QuickSettingBar/
│ │ │ │ ├── QuickSettingBar+Delegate.swift
│ │ │ │ └── QuickSettingBar.swift
│ │ │ ├── SimpleSpeech/
│ │ │ │ ├── SimpleSpeechController+Task.swift
│ │ │ │ └── SimpleSpeechController.swift
│ │ │ └── Supplement/
│ │ │ ├── BlockButton.swift
│ │ │ ├── ColorfulShadowView.swift
│ │ │ ├── DeleteButton.swift
│ │ │ ├── DropView.swift
│ │ │ ├── EditorSectionView.swift
│ │ │ ├── GiantButton.swift
│ │ │ ├── IconButton.swift
│ │ │ ├── QuickLookController.swift
│ │ │ ├── RightClickFinder.swift
│ │ │ ├── TextMeasurementHelper.swift
│ │ │ └── ToggleBlockButton.swift
│ │ ├── SettingController/
│ │ │ ├── DataControl/
│ │ │ │ ├── SettingContent+DataControl.swift
│ │ │ │ ├── SettingContent+SettingsBackup.swift
│ │ │ │ └── SyncScopePage.swift
│ │ │ ├── General/
│ │ │ │ └── SettingContent+General.swift
│ │ │ ├── Inference/
│ │ │ │ ├── ChatTemplateEditorController.swift
│ │ │ │ ├── ChatTemplateListController.swift
│ │ │ │ └── InferenceController.swift
│ │ │ ├── MCP/
│ │ │ │ ├── MCPController/
│ │ │ │ │ ├── MCPController+Bar.swift
│ │ │ │ │ ├── MCPController+Cell.swift
│ │ │ │ │ └── MCPController.swift
│ │ │ │ └── MCPEditorController/
│ │ │ │ └── MCPEditorController.swift
│ │ │ ├── Memory/
│ │ │ │ ├── MemoryListController.swift
│ │ │ │ └── SettingContent+Memory.swift
│ │ │ ├── Model/
│ │ │ │ ├── ModelController/
│ │ │ │ │ ├── ModelController+Bar.swift
│ │ │ │ │ ├── ModelController+Cell.swift
│ │ │ │ │ ├── ModelController+Delegates.swift
│ │ │ │ │ └── ModelController.swift
│ │ │ │ ├── ModelDownloadController/
│ │ │ │ │ ├── HubModelDetailController.swift
│ │ │ │ │ ├── HubModelDownloadController+Cell.swift
│ │ │ │ │ ├── HubModelDownloadController+Delegates.swift
│ │ │ │ │ ├── HubModelDownloadController+RemoteModel.swift
│ │ │ │ │ ├── HubModelDownloadController.swift
│ │ │ │ │ └── HubModelDownloadProgressController.swift
│ │ │ │ └── ModelEditorController/
│ │ │ │ ├── CloudModelEditorController+BodyFieldsMenu.swift
│ │ │ │ ├── CloudModelEditorController+Content.swift
│ │ │ │ ├── CloudModelEditorController+Menus.swift
│ │ │ │ ├── CloudModelEditorController.swift
│ │ │ │ └── LocalModelEditorController.swift
│ │ │ ├── Permission/
│ │ │ │ └── SettingContent+Permission.swift
│ │ │ ├── SettingContent.swift
│ │ │ ├── SettingController.swift
│ │ │ ├── Support/
│ │ │ │ ├── LogViewerController.swift
│ │ │ │ ├── OpenSourceLicenseController.swift
│ │ │ │ ├── PrivacyPolicyController.swift
│ │ │ │ └── SettingContent+Support.swift
│ │ │ └── Tools/
│ │ │ └── SettingContent+Tools.swift
│ │ ├── Sidebar/
│ │ │ ├── Sidebar+Delegates.swift
│ │ │ ├── Sidebar.swift
│ │ │ ├── SidebarBrandingLabel.swift
│ │ │ └── SidebarSyncLabel.swift
│ │ ├── SupplementController/
│ │ │ ├── CodeEditorController.swift
│ │ │ ├── HTMLPreviewController.swift
│ │ │ ├── JsonEditorController.swift
│ │ │ ├── JsonStringMapEditorController.swift
│ │ │ ├── TextEditorContentController.swift
│ │ │ ├── TextEditorController.swift
│ │ │ └── TextViewerController.swift
│ │ ├── SupplementView/
│ │ │ ├── AutoLayoutMarginView.swift
│ │ │ ├── BrandingLabel.swift
│ │ │ ├── CircleImageView.swift
│ │ │ ├── ImageCircleButton.swift
│ │ │ ├── NewChatButton.swift
│ │ │ ├── SafeInputView.swift
│ │ │ ├── SearchControllerOpenButton.swift
│ │ │ ├── SeparatorView.swift
│ │ │ ├── SettingButton.swift
│ │ │ └── StackScrollController.swift
│ │ └── Welcome/
│ │ ├── FeatureRowView.swift
│ │ ├── WelcomeExperience.swift
│ │ ├── WelcomePageViewController+Configuration.swift
│ │ └── WelcomePageViewController.swift
│ ├── PlatformSupport/
│ │ └── Catalyst/
│ │ └── FLDCatalystHelper.swift
│ ├── Resources/
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Avatar.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Background.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── BackgroundTexture.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── DialTune/
│ │ │ ├── dial_tune_0.m4a
│ │ │ ├── dial_tune_1.m4a
│ │ │ ├── dial_tune_2.m4a
│ │ │ ├── dial_tune_3.m4a
│ │ │ ├── dial_tune_4.m4a
│ │ │ ├── dial_tune_5.m4a
│ │ │ ├── dial_tune_6.m4a
│ │ │ ├── dial_tune_7.m4a
│ │ │ ├── dial_tune_8.m4a
│ │ │ └── dial_tune_9.m4a
│ │ ├── Entitlements/
│ │ │ ├── Entitlements-Catalyst.entitlements
│ │ │ └── Entitlements-iOS.entitlements
│ │ ├── Icon.xcassets/
│ │ │ ├── Contents.json
│ │ │ ├── model.cloud.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── model.local.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── star.shine.imageset/
│ │ │ └── Contents.json
│ │ ├── InfoPlist/
│ │ │ ├── Info-Catalyst.plist
│ │ │ └── Info-iOS.plist
│ │ ├── InfoPlist.xcstrings
│ │ ├── LaunchScreen.storyboard
│ │ └── Localizable.xcstrings
│ └── main.swift
├── FlowDown.xcodeproj/
│ ├── .gitignore
│ ├── project.pbxproj
│ └── xcshareddata/
│ └── xcschemes/
│ ├── FlowDown.xcscheme
│ ├── FlowDownTranslationProvider.xcscheme
│ └── FlowDownUnitTests.xcscheme
├── FlowDown.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── WorkspaceSettings.xcsettings
│ └── swiftpm/
│ └── Package.resolved
├── FlowDownTranslationProvider/
│ ├── Assets.xcassets/
│ │ ├── AccentColor.colorset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── CommonTranslationLanguage.swift
│ ├── Entitlements.entitlements
│ ├── IconButtonContainer.swift
│ ├── Info.plist
│ ├── InfoPlist.xcstrings
│ ├── Localizable.xcstrings
│ ├── Models.swift
│ ├── TranslateSegmentView.swift
│ ├── TranslationProvider.swift
│ ├── TranslationProviderModel.swift
│ ├── TranslationProviderView+Content.swift
│ ├── TranslationProviderView+Footer.swift
│ ├── TranslationProviderView.swift
│ ├── TranslationSegment.swift
│ └── main.swift
├── FlowDownUnitTests/
│ ├── ApplicationScopeTests.swift
│ ├── AudioTranscoderTests.swift
│ ├── BalanceEmitterTest.swift
│ ├── BalancedEmitterTest.swift
│ ├── CloudModelImportExportTests.swift
│ ├── ConversationExecutionSupportTests.swift
│ ├── ConversationScopeTests.swift
│ ├── ConversationSystemPromptBuilderTests.swift
│ ├── EvaluationSessionTests.swift
│ ├── HuggingFaceAPITests.swift
│ ├── InferenceIntentHandlerTests.swift
│ ├── InterfaceScopeTests.swift
│ ├── LiveActivityServiceTests.swift
│ ├── LocalModelConfigurationSmokeTests.swift
│ ├── MCPServiceConnectionTests.swift
│ ├── MCPServiceScopeTests.swift
│ ├── MCPToolDiscoveryTests.swift
│ ├── MarkdownMathPlaceholderRepairTests.swift
│ ├── MemoryExtractorTests.swift
│ ├── MemorySettingsTests.swift
│ ├── MemoryStoreAndToolsTests.swift
│ ├── ModelManagerInferenceTests.swift
│ ├── ModelManagerLocalTests.swift
│ ├── ModelScopeTests.swift
│ ├── ModelToolsScopeTests.swift
│ ├── OnlineE2ETestSupport.swift
│ ├── OnlineModelBackedE2ETests.swift
│ ├── OnlineToolAndContextE2ETests.swift
│ ├── PlatformSupportScopeTests.swift
│ ├── SettingsBackupTests.swift
│ ├── ShortcutIntentSmokeTests.swift
│ ├── ShortcutsScopeTests.swift
│ ├── StorageScopeTests.swift
│ ├── SupplementScopeTests.swift
│ ├── TestSupport/
│ │ ├── ChatServiceSpy.swift
│ │ └── FlowDownTestContext.swift
│ ├── UnitTest.swift
│ └── UpdateManagerTests.swift
├── FlowDownUnitTests.xctestplan
├── FlowDownWidgets/
│ ├── Assets.xcassets/
│ │ ├── AccentColor.colorset/
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── WidgetBackground.colorset/
│ │ └── Contents.json
│ ├── FlowDownWidgetsBundle.swift
│ ├── FlowDownWidgetsLiveActivity.swift
│ ├── Info.plist
│ ├── InfoPlist.xcstrings
│ └── Localizable.xcstrings
├── Frameworks/
│ ├── FlowDownModelExchange/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── FlowDownModelExchange/
│ │ │ ├── ModelExchangeCrypto.swift
│ │ │ ├── ModelExchangeTypes.swift
│ │ │ └── ModelExchangeURL.swift
│ │ └── Tests/
│ │ └── FlowDownModelExchangeTests/
│ │ └── FlowDownModelExchangeTests.swift
│ ├── Logger/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── Logger/
│ │ │ ├── LogLevel.swift
│ │ │ ├── LogStore.swift
│ │ │ ├── Logger+FileLogging.swift
│ │ │ └── Logger+Subsystem.swift
│ │ └── Tests/
│ │ └── LoggerTests/
│ │ └── LogStoreTests.swift
│ ├── RunestoneEditor/
│ │ ├── .gitignore
│ │ ├── External/
│ │ │ ├── Runestone/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Package.swift
│ │ │ │ ├── Sources/
│ │ │ │ │ ├── Runestone/
│ │ │ │ │ │ ├── Library/
│ │ │ │ │ │ │ ├── ByteCount.swift
│ │ │ │ │ │ │ ├── ByteRange.swift
│ │ │ │ │ │ │ ├── Caret.swift
│ │ │ │ │ │ │ ├── CharacterSet+Helpers.swift
│ │ │ │ │ │ │ ├── DefaultStringAttributes.swift
│ │ │ │ │ │ │ ├── HairlineLength.swift
│ │ │ │ │ │ │ ├── KeyboardObserver.swift
│ │ │ │ │ │ │ ├── L10n.swift
│ │ │ │ │ │ │ ├── LineEndingDetector.swift
│ │ │ │ │ │ │ ├── NSAttributedString+Helpers.swift
│ │ │ │ │ │ │ ├── NSRange+Helpers.swift
│ │ │ │ │ │ │ ├── NSString+Helpers.swift
│ │ │ │ │ │ │ ├── QuickTapGestureRecognizer.swift
│ │ │ │ │ │ │ ├── String+Helpers.swift
│ │ │ │ │ │ │ ├── Symbol.swift
│ │ │ │ │ │ │ ├── TabWidthMeasurer.swift
│ │ │ │ │ │ │ ├── TextChange.swift
│ │ │ │ │ │ │ ├── TextEditHelper.swift
│ │ │ │ │ │ │ ├── TreeSitterTextPoint+Helpers.swift
│ │ │ │ │ │ │ ├── UIFont+Helpers.swift
│ │ │ │ │ │ │ ├── UIScrollView+Helpers.swift
│ │ │ │ │ │ │ ├── UITextInput+Helpers.swift
│ │ │ │ │ │ │ ├── UITextSelectionDisplayInteraction+Helpers.swift
│ │ │ │ │ │ │ └── ViewReuseQueue.swift
│ │ │ │ │ │ ├── LineManager/
│ │ │ │ │ │ │ ├── DocumentLineChildrenUpdater.swift
│ │ │ │ │ │ │ ├── DocumentLineNodeData.swift
│ │ │ │ │ │ │ ├── LineChangeSet.swift
│ │ │ │ │ │ │ ├── LineManager.swift
│ │ │ │ │ │ │ ├── LinePosition.swift
│ │ │ │ │ │ │ └── NewLineFinder.swift
│ │ │ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ │ │ ├── RedBlackTree/
│ │ │ │ │ │ │ ├── ClosedRangeValueDescriptor.swift
│ │ │ │ │ │ │ ├── RedBlackTree.swift
│ │ │ │ │ │ │ ├── RedBlackTreeChildrenUpdater.swift
│ │ │ │ │ │ │ ├── RedBlackTreeIterator.swift
│ │ │ │ │ │ │ ├── RedBlackTreeNode.swift
│ │ │ │ │ │ │ ├── RedBlackTreeNodeColor.swift
│ │ │ │ │ │ │ ├── RedBlackTreeNodePosition.swift
│ │ │ │ │ │ │ ├── RedBlackTreeSearchMatch.swift
│ │ │ │ │ │ │ └── RedBlackTreeSearchQuery.swift
│ │ │ │ │ │ ├── Resources/
│ │ │ │ │ │ │ ├── de.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── en.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── es.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── fi.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── fr.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ └── ja.lproj/
│ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ ├── StringSyntaxHighlighter.swift
│ │ │ │ │ │ ├── TextView/
│ │ │ │ │ │ │ ├── Appearance/
│ │ │ │ │ │ │ │ ├── DefaultTheme.swift
│ │ │ │ │ │ │ │ ├── FontTraits.swift
│ │ │ │ │ │ │ │ ├── HighlightName.swift
│ │ │ │ │ │ │ │ ├── LineBreakMode.swift
│ │ │ │ │ │ │ │ ├── LineSelectionDisplayType.swift
│ │ │ │ │ │ │ │ ├── Theme.swift
│ │ │ │ │ │ │ │ └── Theme.xcassets/
│ │ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ │ ├── theme_comment.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_constant_builtin.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_constant_character.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_constructor.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_current_line.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_foreground.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_function.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_gutter_background.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_gutter_hairline.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_invisible_characters.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_keyword.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_line_number.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_line_number_current_line.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_marked_text.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_number.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_operator.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_page_guide_background.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_page_guide_hairline.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_property.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_punctuation.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_search_match_found.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_search_match_highlighted.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_selection.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_string.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_type.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ └── theme_variable_builtin.colorset/
│ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ ├── CharacterPairs/
│ │ │ │ │ │ │ │ ├── CharacterPair.swift
│ │ │ │ │ │ │ │ └── CharacterPairTrailingComponentDeletionMode.swift
│ │ │ │ │ │ │ ├── Core/
│ │ │ │ │ │ │ │ ├── ContentSizeService.swift
│ │ │ │ │ │ │ │ ├── EditMenuController.swift
│ │ │ │ │ │ │ │ ├── FloatingCaretView.swift
│ │ │ │ │ │ │ │ ├── IndexedPosition.swift
│ │ │ │ │ │ │ │ ├── IndexedRange.swift
│ │ │ │ │ │ │ │ ├── LayoutManager.swift
│ │ │ │ │ │ │ │ ├── LineEnding.swift
│ │ │ │ │ │ │ │ ├── LineFragmentView.swift
│ │ │ │ │ │ │ │ ├── LineMovementController.swift
│ │ │ │ │ │ │ │ ├── MoveLinesService.swift
│ │ │ │ │ │ │ │ ├── StringView.swift
│ │ │ │ │ │ │ │ ├── TextInputStringTokenizer.swift
│ │ │ │ │ │ │ │ ├── TextInputView.swift
│ │ │ │ │ │ │ │ ├── TextView.swift
│ │ │ │ │ │ │ │ ├── TextViewDelegate.swift
│ │ │ │ │ │ │ │ ├── TextViewState.swift
│ │ │ │ │ │ │ │ └── TimedUndoManager.swift
│ │ │ │ │ │ │ ├── Gutter/
│ │ │ │ │ │ │ │ ├── GutterBackgroundView.swift
│ │ │ │ │ │ │ │ ├── GutterWidthService.swift
│ │ │ │ │ │ │ │ └── LineNumberView.swift
│ │ │ │ │ │ │ ├── Highlight/
│ │ │ │ │ │ │ │ ├── HighlightNavigationController.swift
│ │ │ │ │ │ │ │ ├── HighlightService.swift
│ │ │ │ │ │ │ │ ├── HighlightedRange.swift
│ │ │ │ │ │ │ │ ├── HighlightedRangeFragment.swift
│ │ │ │ │ │ │ │ └── HighlightedRangeLoopingMode.swift
│ │ │ │ │ │ │ ├── Indent/
│ │ │ │ │ │ │ │ ├── DetectedIndentStrategy.swift
│ │ │ │ │ │ │ │ ├── IndentController.swift
│ │ │ │ │ │ │ │ ├── IndentLevelMeasurer.swift
│ │ │ │ │ │ │ │ └── IndentStrategy.swift
│ │ │ │ │ │ │ ├── InvisibleCharacters/
│ │ │ │ │ │ │ │ └── InvisibleCharacterConfiguration.swift
│ │ │ │ │ │ │ ├── LineController/
│ │ │ │ │ │ │ │ ├── LineBreak/
│ │ │ │ │ │ │ │ │ ├── CharacterLineBreakSuggester.swift
│ │ │ │ │ │ │ │ │ ├── LineBreakSuggester.swift
│ │ │ │ │ │ │ │ │ └── WordWrappingLineBreakSuggester.swift
│ │ │ │ │ │ │ │ ├── LineController.swift
│ │ │ │ │ │ │ │ ├── LineControllerFactory.swift
│ │ │ │ │ │ │ │ ├── LineControllerStorage.swift
│ │ │ │ │ │ │ │ ├── LineFragment.swift
│ │ │ │ │ │ │ │ ├── LineFragmentCharacterLocationQuery.swift
│ │ │ │ │ │ │ │ ├── LineFragmentController.swift
│ │ │ │ │ │ │ │ ├── LineFragmentFrameQuery.swift
│ │ │ │ │ │ │ │ ├── LineFragmentNode.swift
│ │ │ │ │ │ │ │ ├── LineFragmentRenderer.swift
│ │ │ │ │ │ │ │ ├── LineFragmentSelectionRect.swift
│ │ │ │ │ │ │ │ ├── LineSyntaxHighlighter.swift
│ │ │ │ │ │ │ │ └── LineTypesetter.swift
│ │ │ │ │ │ │ ├── Navigation/
│ │ │ │ │ │ │ │ ├── GoToLineSelection.swift
│ │ │ │ │ │ │ │ └── TextLocation.swift
│ │ │ │ │ │ │ ├── PageGuide/
│ │ │ │ │ │ │ │ ├── PageGuideController.swift
│ │ │ │ │ │ │ │ └── PageGuideView.swift
│ │ │ │ │ │ │ ├── SearchAndReplace/
│ │ │ │ │ │ │ │ ├── BatchReplaceSet.swift
│ │ │ │ │ │ │ │ ├── ParsedReplacementString.swift
│ │ │ │ │ │ │ │ ├── ReplacementStringParser.swift
│ │ │ │ │ │ │ │ ├── SearchController.swift
│ │ │ │ │ │ │ │ ├── SearchQuery.swift
│ │ │ │ │ │ │ │ ├── SearchReplaceResult.swift
│ │ │ │ │ │ │ │ ├── SearchResult.swift
│ │ │ │ │ │ │ │ ├── StringModifier.swift
│ │ │ │ │ │ │ │ ├── TextPreview.swift
│ │ │ │ │ │ │ │ └── UITextSearchingHelper.swift
│ │ │ │ │ │ │ ├── SyntaxHighlighting/
│ │ │ │ │ │ │ │ ├── Internal/
│ │ │ │ │ │ │ │ │ ├── InternalLanguageMode.swift
│ │ │ │ │ │ │ │ │ ├── InternalLanguageModeFactory.swift
│ │ │ │ │ │ │ │ │ ├── PlainText/
│ │ │ │ │ │ │ │ │ │ ├── PlainTextInternalLanguageMode.swift
│ │ │ │ │ │ │ │ │ │ └── PlainTextSyntaxHighlighter.swift
│ │ │ │ │ │ │ │ │ └── TreeSitter/
│ │ │ │ │ │ │ │ │ ├── TreeSitterIndentController.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterIndentStrategyDetector.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInjectedLanguage.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInjectedLanguageMapper.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInternalLanguage.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInternalLanguageMode.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterLanguageLayer.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterLanguageLayerStore.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterSyntaxHighlightToken.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterSyntaxHighlighter.swift
│ │ │ │ │ │ │ │ │ └── TreeSitterTextPredicatesEvaluator.swift
│ │ │ │ │ │ │ │ ├── LanguageMode.swift
│ │ │ │ │ │ │ │ ├── PlainText/
│ │ │ │ │ │ │ │ │ └── PlainTextLanguageMode.swift
│ │ │ │ │ │ │ │ ├── SyntaxNode.swift
│ │ │ │ │ │ │ │ └── TreeSitter/
│ │ │ │ │ │ │ │ ├── TreeSitterIndentationScopes.swift
│ │ │ │ │ │ │ │ ├── TreeSitterLanguage.swift
│ │ │ │ │ │ │ │ ├── TreeSitterLanguageMode.swift
│ │ │ │ │ │ │ │ └── TreeSitterLanguageProvider.swift
│ │ │ │ │ │ │ └── TextSelection/
│ │ │ │ │ │ │ ├── CaretRectService.swift
│ │ │ │ │ │ │ ├── SelectionRectService.swift
│ │ │ │ │ │ │ └── TextSelectionRect.swift
│ │ │ │ │ │ └── TreeSitter/
│ │ │ │ │ │ ├── TreeSitterCapture.swift
│ │ │ │ │ │ ├── TreeSitterInputEdit.swift
│ │ │ │ │ │ ├── TreeSitterNode.swift
│ │ │ │ │ │ ├── TreeSitterParser.swift
│ │ │ │ │ │ ├── TreeSitterPredicate.swift
│ │ │ │ │ │ ├── TreeSitterPredicateMapper.swift
│ │ │ │ │ │ ├── TreeSitterQuery.swift
│ │ │ │ │ │ ├── TreeSitterQueryCursor.swift
│ │ │ │ │ │ ├── TreeSitterQueryMatch.swift
│ │ │ │ │ │ ├── TreeSitterTextInput.swift
│ │ │ │ │ │ ├── TreeSitterTextPoint.swift
│ │ │ │ │ │ ├── TreeSitterTextPredicate.swift
│ │ │ │ │ │ ├── TreeSitterTextRange.swift
│ │ │ │ │ │ └── TreeSitterTree.swift
│ │ │ │ │ └── TestTreeSitterLanguages/
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── parser.c
│ │ │ │ │ │ ├── scanner.cc
│ │ │ │ │ │ └── tag.h
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── html.h
│ │ │ │ │ │ ├── javascript.h
│ │ │ │ │ │ ├── json.h
│ │ │ │ │ │ ├── parser.h
│ │ │ │ │ │ ├── python.h
│ │ │ │ │ │ └── yaml.h
│ │ │ │ │ ├── javascript/
│ │ │ │ │ │ ├── parser.c
│ │ │ │ │ │ └── scanner.c
│ │ │ │ │ ├── json/
│ │ │ │ │ │ └── parser.c
│ │ │ │ │ ├── python/
│ │ │ │ │ │ ├── parser.c
│ │ │ │ │ │ └── scanner.cc
│ │ │ │ │ └── yaml/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── scanner.cc
│ │ │ │ └── Tests/
│ │ │ │ └── RunestoneTests/
│ │ │ │ ├── ByteRangeTests.swift
│ │ │ │ ├── Helpers/
│ │ │ │ │ └── LanguageModeFactory.swift
│ │ │ │ ├── IndentLevelMeasurerTests.swift
│ │ │ │ ├── Indentation/
│ │ │ │ │ ├── HTMLIndentationTests.swift
│ │ │ │ │ ├── JSONIndentationTests.swift
│ │ │ │ │ ├── JavaScriptIndentationTests.swift
│ │ │ │ │ └── PythonIndentationTests.swift
│ │ │ │ ├── LineEndingDetectorTests.swift
│ │ │ │ ├── LineManagerTests.swift
│ │ │ │ ├── Mock/
│ │ │ │ │ └── MockTreeSitterParserDelegate.swift
│ │ │ │ ├── NSRangeTests.swift
│ │ │ │ ├── NSStringHelpersTests.swift
│ │ │ │ ├── ParsedReplacementStringTests.swift
│ │ │ │ ├── ReplacementStringParserTests.swift
│ │ │ │ ├── SearchQueryTests.swift
│ │ │ │ ├── StringHelpersTest.swift
│ │ │ │ ├── StringModifierTests.swift
│ │ │ │ ├── StringViewTests.swift
│ │ │ │ ├── TextInputStringTokenizerTests.swift
│ │ │ │ ├── TreeSitterParserTests.swift
│ │ │ │ └── XCTestManifests.swift
│ │ │ ├── RunestoneLanguageSupport/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ ├── RunestoneLanguageSupport/
│ │ │ │ │ └── RunestoneLanguageSupport.swift
│ │ │ │ ├── TreeSitterAstro/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ ├── tag.h
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterAstroQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterAstroRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterBash/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterBashQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterBashRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterC/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterCPP/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ ├── parser.h
│ │ │ │ │ └── runtime.h
│ │ │ │ ├── TreeSitterCPPQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCPPRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterCQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterCSS/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterCSSQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCSSRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterCSharp/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterCSharpQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterCSharpRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterComment/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ ├── tree_sitter/
│ │ │ │ │ │ └── parser.h
│ │ │ │ │ └── tree_sitter_comment/
│ │ │ │ │ ├── chars.c
│ │ │ │ │ ├── chars.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── parser.h
│ │ │ │ │ └── tokens.h
│ │ │ │ ├── TreeSitterCommentQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCommentRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterElixir/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterElixirQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterElixirRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterElm/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterElmQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterElmRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterGo/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterGoQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterGoRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterHTML/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ ├── tag.h
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterHTMLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterHTMLRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterHaskell/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterHaskellQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterHaskellRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJSDoc/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJSDocQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterJSDocRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJSON/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJSON5/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJSON5Queries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterJSON5Runestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJSONQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterJSONRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJava/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJavaQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterJavaRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJavaScript/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJavaScriptQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights-jsx.scm
│ │ │ │ │ ├── highlights-params.scm
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── injections.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterJavaScriptRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJulia/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJuliaQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterJuliaRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterLaTeX/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterLaTeXQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterLaTeXRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterLanguagesCommon/
│ │ │ │ │ ├── dummy.c
│ │ │ │ │ └── include/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterLua/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterLuaQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterLuaRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterMarkdown/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterMarkdownInline/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterMarkdownInlineQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterMarkdownInlineRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterMarkdownQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterMarkdownRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterOCaml/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ └── scanner.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterOCamlQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterOCamlRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterPHP/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterPHPQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── injections.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterPHPRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterPerl/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterPerlQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterPerlRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterPython/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterPythonQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterPythonRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterR/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterRQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterRRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterRegex/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ ├── parser.h
│ │ │ │ │ └── runtime.h
│ │ │ │ ├── TreeSitterRegexQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterRegexRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterRuby/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterRubyQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterRubyRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterRust/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterRustQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterRustRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSCSS/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterSCSSQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterSCSSRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSQL/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterSQLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterSQLRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSvelte/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── allocator.h
│ │ │ │ │ ├── ekstring.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ ├── tag.h
│ │ │ │ │ ├── tree_sitter/
│ │ │ │ │ │ └── parser.h
│ │ │ │ │ ├── uthash.h
│ │ │ │ │ └── vc_vector.h
│ │ │ │ ├── TreeSitterSvelteQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterSvelteRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSwift/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterSwiftQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── locals.scm
│ │ │ │ ├── TreeSitterSwiftRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterTOML/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterTOMLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterTOMLRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterTSX/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ └── scanner.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterTSXQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterTSXRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterTypeScript/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ └── scanner.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterTypeScriptQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterTypeScriptRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterYAML/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ ├── schema.generated.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterYAMLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ └── TreeSitterYAMLRunestone/
│ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ ├── RunestoneThemeSupport/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ ├── RunestoneOneDarkTheme/
│ │ │ │ │ ├── Colors.xcassets/
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── OneDarkAqua.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkBackground.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkBlue.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkComment.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkCurrentLine.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkForeground.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkGreen.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkPurple.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkRed.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── OneDarkYellow.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── OneDarkTheme.swift
│ │ │ │ ├── RunestonePlainTextTheme/
│ │ │ │ │ └── PlainTextTheme.swift
│ │ │ │ ├── RunestoneThemeCommon/
│ │ │ │ │ ├── EditorTheme.swift
│ │ │ │ │ └── HighlightName.swift
│ │ │ │ ├── RunestoneThemeSupport/
│ │ │ │ │ └── RunestoneThemeSupport.swift
│ │ │ │ └── RunestoneTomorrowTheme/
│ │ │ │ ├── Colors.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── TomorrowAqua.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowBackground.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowBlue.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowComment.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowCurrentLine.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowForeground.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowGreen.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowOrange.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowPurple.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowRed.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── TomorrowYellow.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── TomorrowTheme.swift
│ │ │ └── TreeSitter/
│ │ │ ├── LICENSE
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── TreeSitter/
│ │ │ ├── include/
│ │ │ │ └── tree_sitter/
│ │ │ │ ├── api.h
│ │ │ │ └── parser.h
│ │ │ └── src/
│ │ │ ├── alloc.c
│ │ │ ├── alloc.h
│ │ │ ├── array.h
│ │ │ ├── atomic.h
│ │ │ ├── clock.h
│ │ │ ├── error_costs.h
│ │ │ ├── get_changed_ranges.c
│ │ │ ├── get_changed_ranges.h
│ │ │ ├── host.h
│ │ │ ├── language.c
│ │ │ ├── language.h
│ │ │ ├── length.h
│ │ │ ├── lexer.c
│ │ │ ├── lexer.h
│ │ │ ├── lib.c
│ │ │ ├── node.c
│ │ │ ├── parser.c
│ │ │ ├── point.h
│ │ │ ├── query.c
│ │ │ ├── reduce_action.h
│ │ │ ├── reusable_node.h
│ │ │ ├── stack.c
│ │ │ ├── stack.h
│ │ │ ├── subtree.c
│ │ │ ├── subtree.h
│ │ │ ├── tree.c
│ │ │ ├── tree.h
│ │ │ ├── tree_cursor.c
│ │ │ ├── tree_cursor.h
│ │ │ ├── unicode/
│ │ │ │ ├── ptypes.h
│ │ │ │ ├── umachine.h
│ │ │ │ ├── urename.h
│ │ │ │ ├── utf.h
│ │ │ │ ├── utf16.h
│ │ │ │ └── utf8.h
│ │ │ └── unicode.h
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ └── Sources/
│ │ └── RunestoneEditor/
│ │ └── RunestoneEditor.swift
│ └── Storage/
│ ├── .gitignore
│ ├── Example/
│ │ ├── Objects.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── ObjectsDemo/
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AccentColor.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Entitlements.entitlements
│ │ │ └── main.swift
│ │ └── ObjectsDemo.xcodeproj/
│ │ └── project.pbxproj
│ ├── Package.resolved
│ ├── Package.swift
│ ├── README.md
│ ├── Sources/
│ │ └── Storage/
│ │ ├── Extension/
│ │ │ ├── Data+Compression.swift
│ │ │ └── Date+Timestamp.swift
│ │ ├── Import.swift
│ │ ├── Objects/
│ │ │ ├── LocalModel.swift
│ │ │ └── ModelCapabilities.swift
│ │ ├── Storage/
│ │ │ ├── DBMigration.swift
│ │ │ ├── DBVersion.swift
│ │ │ ├── DeviceOwned.swift
│ │ │ ├── Storage+Attachment.swift
│ │ │ ├── Storage+ChatTemplate.swift
│ │ │ ├── Storage+CloudModel.swift
│ │ │ ├── Storage+Conversation.swift
│ │ │ ├── Storage+ConversationSummary.swift
│ │ │ ├── Storage+Instance.swift
│ │ │ ├── Storage+Memory.swift
│ │ │ ├── Storage+Message.swift
│ │ │ ├── Storage+ModelContextClient.swift
│ │ │ ├── Storage+Sync.swift
│ │ │ ├── Storage+SyncMetadata.swift
│ │ │ ├── Storage+UploadQueue.swift
│ │ │ └── Storage.swift
│ │ ├── Sync/
│ │ │ ├── Internal/
│ │ │ │ ├── CKRecord+Extension.swift
│ │ │ │ ├── CloudContainer.swift
│ │ │ │ ├── CloudDatabase.swift
│ │ │ │ ├── IsolatedWeakVar.swift
│ │ │ │ ├── LockIsolated.swift
│ │ │ │ ├── MockCloudContainer.swift
│ │ │ │ ├── MockCloudDatabase.swift
│ │ │ │ ├── MockSyncEngine.swift
│ │ │ │ ├── SyncEngine.Event.swift
│ │ │ │ └── SyncEngineProtocol.swift
│ │ │ ├── NotificationInfo.swift
│ │ │ ├── SyncEngine.swift
│ │ │ ├── SyncPreferences.swift
│ │ │ ├── SyncQueryable.swift
│ │ │ ├── Syncable.swift
│ │ │ └── Updatable.swift
│ │ └── Tables/
│ │ ├── Attachment.swift
│ │ ├── ChatTemplateRecord.swift
│ │ ├── CloudModel.swift
│ │ ├── Conversation.swift
│ │ ├── ConversationSummary.swift
│ │ ├── Memory.swift
│ │ ├── Message.swift
│ │ ├── ModelContextServer.swift
│ │ ├── SyncMetadata.swift
│ │ ├── TableNamed.swift
│ │ ├── UploadQueue.swift
│ │ └── V1/
│ │ ├── AttachmentV1.swift
│ │ ├── CloudModelV1.swift
│ │ ├── ConversationV1.swift
│ │ ├── MemoryV1.swift
│ │ ├── MessageV1.swift
│ │ └── ModelContextServerV1.swift
│ └── Tests/
│ └── StorageTests/
│ ├── CloudModelMemoryMCPTests.swift
│ ├── ConversationStorageTests.swift
│ ├── ConversationSummaryMigrationTests.swift
│ ├── MessageStorageTests.swift
│ ├── StorageTestSupport.swift
│ └── TemplateMigrationTests.swift
├── LICENSE
├── LandingPage/
│ ├── .gitignore
│ ├── README.md
│ ├── eslint.config.mjs
│ ├── mdx-components.tsx
│ ├── next.config.ts
│ ├── package.json
│ ├── pnpm-workspace.yaml
│ ├── postcss.config.mjs
│ ├── public/
│ │ └── .gitkeep
│ ├── src/
│ │ ├── app/
│ │ │ ├── docs/
│ │ │ │ ├── documents/
│ │ │ │ │ ├── [...slug]/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── app_store.md
│ │ │ │ │ ├── architecture/
│ │ │ │ │ │ ├── chat_pipeline.md
│ │ │ │ │ │ ├── message_normalization.md
│ │ │ │ │ │ └── model_exchange.md
│ │ │ │ │ ├── capabilities/
│ │ │ │ │ │ ├── attachments.md
│ │ │ │ │ │ ├── mcp_integration.md
│ │ │ │ │ │ ├── tools_automation.md
│ │ │ │ │ │ └── web_search.md
│ │ │ │ │ ├── changelog.md
│ │ │ │ │ ├── configuration/
│ │ │ │ │ │ ├── chat_templates.md
│ │ │ │ │ │ └── system_prompts.md
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── apple_shortcuts.md
│ │ │ │ │ │ └── calendar_workflow.md
│ │ │ │ │ ├── legal/
│ │ │ │ │ │ ├── privacy.md
│ │ │ │ │ │ └── software_license.md
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── auxiliary_tasks.md
│ │ │ │ │ │ ├── cloud_models_setup.md
│ │ │ │ │ │ ├── inference_configuration.md
│ │ │ │ │ │ └── vision.md
│ │ │ │ │ ├── pricing_timeline.md
│ │ │ │ │ ├── quickstart/
│ │ │ │ │ │ └── basic_usage.md
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── data_backup.md
│ │ │ │ │ │ ├── general.md
│ │ │ │ │ │ └── memory_management.md
│ │ │ │ │ ├── troubleshooting/
│ │ │ │ │ │ ├── faq.md
│ │ │ │ │ │ └── report_issue.md
│ │ │ │ │ └── welcome.md
│ │ │ │ ├── layout.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── globals.css
│ │ │ ├── layout.tsx
│ │ │ ├── page.tsx
│ │ │ └── template.tsx
│ │ └── components/
│ │ ├── animations/
│ │ │ ├── FadeIn.tsx
│ │ │ ├── StaggerContainer.tsx
│ │ │ └── index.ts
│ │ ├── docs/
│ │ │ ├── MobileNav.tsx
│ │ │ ├── Sidebar.tsx
│ │ │ └── index.ts
│ │ └── sections/
│ │ ├── FAQSection.tsx
│ │ ├── FeaturesSection.tsx
│ │ ├── Footer.tsx
│ │ ├── HeroSection.tsx
│ │ ├── Navigation.tsx
│ │ ├── TeamSection.tsx
│ │ ├── TestimonialsSection.tsx
│ │ └── index.ts
│ ├── tsconfig.json
│ └── wrangler.jsonc
├── Makefile
├── README.md
└── Resources/
├── AdditionalLicenses/
│ ├── EventSource@Recouse/
│ │ └── LICENSE
│ ├── Litext@Helixform/
│ │ └── LICENSE
│ ├── Litext@Lakr233/
│ │ └── LICENSE
│ ├── gemoji/
│ │ └── LICENSE
│ ├── unsplash.com/
│ │ └── LICENSE
│ └── wcdb@Tencent/
│ └── LICENSE
├── DevKit/
│ ├── resources/
│ │ ├── .gitkeep
│ │ └── EvaluationManifestExample.fdem
│ └── scripts/
│ ├── apple-resign-scan.py
│ ├── archive.all.sh
│ ├── bump.version.sh
│ ├── check_translations.py
│ ├── check_untranslated.py
│ ├── codesign-macos.sh
│ ├── find_inconsistent_keys.py
│ ├── fix_inconsistent_keys.py
│ ├── get_first_ios_simulator.sh
│ ├── i18n_tools.py
│ ├── install-notary-config.sh
│ ├── install-notary-profile.sh
│ ├── notarize-zip.sh
│ ├── notary-action.sh
│ ├── notary-setup-keychain.sh
│ ├── resolve-packages.sh
│ ├── run_online_e2e_tests.sh
│ ├── run_xcodebuild.sh
│ ├── scan.license.sh
│ ├── select_newest_xcode.py
│ ├── select_newest_xcode.sh
│ ├── update_missing_i18n.py
│ └── xcodebuild-archive-macos.sh
├── Privacy/
│ └── PrivacyStatements-2025.03.04.txt
└── i18n/
└── zh-Hans/
└── README.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: "🐛 Bug Report"
description: "Report crashes, regressions, or incorrect behavior in FlowDown"
title: "[Bug] Short summary"
labels:
- bug
body:
- type: markdown
attributes:
value: |
Thanks for the report!
How to find app version/build:
1) Open FlowDown
2) Tap the gear icon (Settings)
3) Scroll to the bottom and copy the line that looks like “Version 1.2.3 (123)”
How to send logs (if possible):
1) In Settings, tap “Contact Us” → “View Logs”
2) On the log screen, tap the button with three dots in a circle (top right)
3) Tap “Share” and choose Files/Notes/AirDrop, then attach here
4) If you can’t share, a screenshot is also okay
- type: input
id: summary
attributes:
label: Issue summary
description: One sentence that captures the core problem.
placeholder: e.g. App shows white screen after launch
validations:
required: true
- type: textarea
id: repro
attributes:
label: Steps to reproduce
description: Step-by-step actions; if intermittent, note frequency.
placeholder: |
1. Open ...
2. Tap ...
3. Observe ...
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
placeholder: What you expected to happen
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual behavior
placeholder: What actually happened
validations:
required: true
- type: dropdown
id: platform
attributes:
label: Platform
options:
- iPhone or iPad
- Mac (Catalyst build)
validations:
required: true
- type: input
id: osVersion
attributes:
label: OS version
placeholder: e.g. iOS 18.1 / macOS 15.1
validations:
required: true
- type: input
id: appVersion
attributes:
label: App version/build
description: "Open Settings → scroll to bottom → copy “Version 1.2.3 (123)”."
placeholder: e.g. 1.2.3 (123)
validations:
required: true
- type: dropdown
id: regression
attributes:
label: Did this work before?
options:
- Not sure
- Yes, it worked before
- No, it never worked
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs/crash info
description: Paste the shared log text (see steps above). If you cannot share logs, attach a screenshot.
render: shell
- type: textarea
id: screenshots
attributes:
label: Screenshots or screen recording
description: Optional but helpful.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Q&A / Discussions
url: https://github.com/Lakr233/FlowDown/discussions
about: Ask questions or share ideas that are not bugs/features.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: "✨ Feature Request"
description: "Propose new capabilities, UX improvements, or model-related needs"
title: "[Feature] Short summary"
labels:
- enhancement
body:
- type: markdown
attributes:
value: |
Thanks for the ideas! Please describe the scenario and expected value.
- type: input
id: summary
attributes:
label: Feature overview
description: One sentence to summarize the request.
placeholder: e.g. Export conversations as Markdown
validations:
required: true
- type: textarea
id: problem
attributes:
label: Problem to solve / goal
description: Current limitation or desired outcome.
placeholder: |
e.g. Cannot batch export, making team sharing difficult.
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed solution
description: Describe desired behavior, entry points, or settings.
placeholder: |
e.g. Add an “Export” button in conversation list for PDF/Markdown.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: Note any workarounds you tried.
- type: dropdown
id: platform
attributes:
label: Primary platform
options:
- iPhone or iPad
- Mac (Catalyst build)
- Cross-platform (both)
validations:
required: true
- type: input
id: appVersion
attributes:
label: Current app version/build
description: "Open FlowDown → Settings → scroll to bottom → copy “Version 1.2.3 (123)”."
placeholder: e.g. 1.2.3 (123)
validations:
required: true
- type: textarea
id: impact
attributes:
label: Value and impact
description: Who benefits and how to measure success (optional).
- type: textarea
id: additional
attributes:
label: Additional context
description: Links to designs, prototypes, or references.
================================================
FILE: .github/ISSUE_TEMPLATE/improvement.yml
================================================
name: "🔧 Improvement / Chore"
description: "Track minor fixes, refactors, docs, or performance improvements"
title: "[Improve] Short summary"
labels:
- chore
body:
- type: markdown
attributes:
value: |
For improvements that are neither bugs nor new features.
- type: input
id: summary
attributes:
label: Improvement scope
description: One sentence on what needs to be done.
placeholder: e.g. Improve chat list scroll performance
validations:
required: true
- type: textarea
id: context
attributes:
label: Context and motivation
description: Current issue, optimization goal, or affected module.
validations:
required: true
- type: textarea
id: plan
attributes:
label: Proposed plan / tasks
description: List subtasks, risks, or resources needed.
- type: input
id: appVersion
attributes:
label: Related version
description: "Open FlowDown → Settings → scroll to bottom → copy “Version 1.2.3 (123)”."
placeholder: e.g. 1.2.3 (123) or next minor
validations:
required: true
- type: textarea
id: additional
attributes:
label: Additional notes
description: References, metrics, or acceptance criteria.
================================================
FILE: .github/workflows/ci.yml
================================================
name: Build
on:
pull_request:
paths:
- "FlowDown/**"
- "Frameworks/**"
- "FlowDownUnitTests/**"
- "Resources/**"
- "FlowDown.xcodeproj/**"
- "FlowDown.xcworkspace/**"
- ".github/workflows/ci.yml"
- "Makefile"
- "Package.resolved"
jobs:
build:
if: ${{ !startsWith(github.head_ref, 'housekeeping/') }}
name: Build (${{ matrix.target }})
runs-on: macos-26
strategy:
fail-fast: false
matrix:
include:
- target: ios
scheme: FlowDown
destination: "generic/platform=iOS"
archive_path: BuildArtifacts/ios.xcarchive
- target: macos
scheme: FlowDown
destination: "generic/platform=macOS,variant=Mac Catalyst"
archive_path: BuildArtifacts/macos.xcarchive
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Select Newest Xcode
run: |
chmod +x Resources/DevKit/scripts/select_newest_xcode.sh
./Resources/DevKit/scripts/select_newest_xcode.sh
- name: Resolve Packages (${{ matrix.target }})
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme "${{ matrix.scheme }}" \
-resolvePackageDependencies \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Archive (${{ matrix.target }})
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
mkdir -p BuildArtifacts
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme "${{ matrix.scheme }}" \
-configuration Release \
-destination '${{ matrix.destination }}' \
archive \
-archivePath "${{ matrix.archive_path }}" \
-resultBundlePath "BuildArtifacts/${{ matrix.target }}.xcresult" \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Compress Archive (${{ matrix.target }})
run: |
ditto -c -k --sequesterRsrc --keepParent "${{ matrix.archive_path }}" "BuildArtifacts/${{ matrix.target }}.xcarchive.zip"
- name: Upload Build Artifact (${{ matrix.target }})
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.target }}-xcresult
path: BuildArtifacts/${{ matrix.target }}.xcresult
if-no-files-found: error
retention-days: 7
- name: Upload Archive Artifact (${{ matrix.target }})
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.target }}-xcarchive
path: BuildArtifacts/${{ matrix.target }}.xcarchive.zip
if-no-files-found: error
retention-days: 7
================================================
FILE: .github/workflows/housekeeping.yml
================================================
name: Housekeeping
on:
schedule:
- cron: "0 8 * * *" # daily at 8:00 UTC
workflow_dispatch:
permissions:
contents: write
pull-requests: write
jobs:
housekeeping:
name: Housekeeping
runs-on: macos-26
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Select Newest Xcode
run: |
chmod +x Resources/DevKit/scripts/select_newest_xcode.sh
./Resources/DevKit/scripts/select_newest_xcode.sh
- name: Install Dependencies
run: brew install xcbeautify
- name: Configure Git
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
- name: Check for Submodule Updates
id: check
run: |
set -euo pipefail
echo "[+] checking submodule updates..."
has_updates=false
update_summary=""
git submodule foreach --quiet '
name=$(basename "$sm_path")
current=$(git rev-parse HEAD)
git fetch origin --quiet
default_branch=$(git remote show origin | grep "HEAD branch" | sed "s/.*: //")
if [ -z "$default_branch" ]; then
default_branch="main"
fi
latest=$(git rev-parse "origin/$default_branch")
if [ "$current" != "$latest" ]; then
current_short=$(git rev-parse --short HEAD)
latest_short=$(git rev-parse --short "origin/$default_branch")
echo "UPDATE:$name:$current_short:$latest_short"
fi
' > /tmp/submodule_updates.txt || true
if [ -s /tmp/submodule_updates.txt ]; then
has_updates=true
while IFS=: read -r prefix name current latest; do
update_summary="${update_summary}- **${name}**: \`${current}\` → \`${latest}\`\n"
done < /tmp/submodule_updates.txt
fi
echo "has_updates=$has_updates" >> "$GITHUB_OUTPUT"
echo "update_summary<<EOF" >> "$GITHUB_OUTPUT"
echo -e "$update_summary" >> "$GITHUB_OUTPUT"
echo "EOF" >> "$GITHUB_OUTPUT"
if [ "$has_updates" = "true" ]; then
echo "[+] updates found"
else
echo "[+] all submodules up to date"
fi
- name: Update Submodules
if: steps.check.outputs.has_updates == 'true'
run: |
set -euo pipefail
echo "[+] updating submodules..."
git submodule foreach --quiet '
git fetch origin --quiet
default_branch=$(git remote show origin | grep "HEAD branch" | sed "s/.*: //")
if [ -z "$default_branch" ]; then
default_branch="main"
fi
git checkout "origin/$default_branch" --quiet
'
echo "[+] submodules updated"
- name: Scan Licenses
id: licenses
run: |
set -euo pipefail
echo "[+] scanning licenses..."
ALLOW_DIRTY=1 Resources/DevKit/scripts/scan.license.sh
# check if license file changed
if git diff --quiet FlowDown/BundledResources/OpenSourceLicenses.md; then
echo "has_license_updates=false" >> "$GITHUB_OUTPUT"
echo "[+] licenses unchanged"
else
echo "has_license_updates=true" >> "$GITHUB_OUTPUT"
echo "[+] licenses updated"
fi
- name: Resolve Packages
if: steps.check.outputs.has_updates == 'true' || steps.licenses.outputs.has_license_updates == 'true'
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme FlowDown \
-resolvePackageDependencies \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Disable CloudKit for CI Testing
if: steps.check.outputs.has_updates == 'true' || steps.licenses.outputs.has_license_updates == 'true'
run: |
echo '' >> FlowDown/Configuration/DevelopmentDeveloper.xcconfig
echo 'SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) TEST_SIMULATOR_DISABLE_CLOUD_KIT' >> FlowDown/Configuration/DevelopmentDeveloper.xcconfig
- name: Build (iOS)
if: steps.check.outputs.has_updates == 'true' || steps.licenses.outputs.has_license_updates == 'true'
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
DESTINATION=$(bash Resources/DevKit/scripts/get_first_ios_simulator.sh)
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme FlowDown \
-configuration Debug \
-destination "$DESTINATION" \
build \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Run Unit Tests
if: steps.check.outputs.has_updates == 'true' || steps.licenses.outputs.has_license_updates == 'true'
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
DESTINATION=$(bash Resources/DevKit/scripts/get_first_ios_simulator.sh)
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme FlowDownUnitTests \
-configuration Debug \
-destination "$DESTINATION" \
test \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Revert CI-only Config Changes
if: steps.check.outputs.has_updates == 'true' || steps.licenses.outputs.has_license_updates == 'true'
run: git checkout -- FlowDown/Configuration/DevelopmentDeveloper.xcconfig
- name: Create Pull Request
if: steps.check.outputs.has_updates == 'true' || steps.licenses.outputs.has_license_updates == 'true'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "Housekeeping Updates"
title: "Housekeeping Updates"
body: |
## Housekeeping Updates
### Submodule Updates
${{ steps.check.outputs.update_summary }}
### License Updates
License file regenerated: `${{ steps.licenses.outputs.has_license_updates }}`
---
*This PR was automatically created by the housekeeping workflow.*
branch: housekeeping/updates
delete-branch: true
labels: |
housekeeping
dependencies
================================================
FILE: .github/workflows/release-notarize.yml
================================================
name: Notarize Release
on:
push:
tags:
- "*.*.*"
permissions:
contents: write
jobs:
notarize:
name: Notarize macOS build
runs-on: macos-26
env:
VERSION: ${{ github.ref_name }}
XCODE_VERSION: "26.3"
steps:
- name: Validate ref
id: tag_check
run: |
set -euo pipefail
if [[ "${VERSION}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "ok=true" >> "$GITHUB_OUTPUT"
echo "mode=tag" >> "$GITHUB_OUTPUT"
exit 0
fi
echo "ok=false" >> "$GITHUB_OUTPUT"
echo "Tag ${VERSION} does not match x.x.x (no v/beta/rev); skipping notarization." >> "$GITHUB_STEP_SUMMARY"
- name: Checkout
if: steps.tag_check.outputs.ok == 'true'
uses: actions/checkout@v4
with:
ref: ${{ github.ref }}
fetch-depth: 0
submodules: recursive
- name: Setup notary keychain and signing env
if: steps.tag_check.outputs.ok == 'true'
id: setup_notary
env:
NOTARY_TOOLBOX_ZIP_BASE64: ${{ secrets.NOTARY_TOOLBOX_ZIP_BASE64 }}
NOTARY_TOOLBOX_PASSWORD: ${{ secrets.NOTARY_TOOLBOX_PASSWORD }}
run: |
set -euo pipefail
./Resources/DevKit/scripts/notary-setup-keychain.sh "$GITHUB_OUTPUT" "$GITHUB_ENV"
- name: Install notarize provisioning profile
if: steps.tag_check.outputs.ok == 'true'
env:
NOTARY_TOOLBOX_PROVISION_PROFILE_BASE64: ${{ secrets.NOTARY_TOOLBOX_PROVISION_PROFILE_BASE64 }}
run: |
set -euo pipefail
./Resources/DevKit/scripts/install-notary-profile.sh "$GITHUB_ENV"
- name: Run notarization action
if: steps.tag_check.outputs.ok == 'true'
id: notarize_action
env:
CODE_SIGNING_IDENTITY: ${{ steps.setup_notary.outputs.code_signing_identity }}
CODE_SIGNING_TEAM: ${{ steps.setup_notary.outputs.code_signing_team }}
KEYCHAIN_DB: ${{ steps.setup_notary.outputs.keychain_db }}
NOTARIZE_KEYCHAIN_PROFILE: ${{ steps.setup_notary.outputs.notarize_keychain_profile }}
PROVISIONING_PROFILE_SPECIFIER: ${{ env.PROVISIONING_PROFILE_SPECIFIER }}
ENABLE_NOTARIZE: "1"
VERSION: ${{ env.VERSION }}
NOTARIZE_ZIP_OUTPUT: ${{ format('{0}/BuildArtifacts/FlowDown-{1}.zip', github.workspace, env.VERSION) }}
run: |
set -euo pipefail
./Resources/DevKit/scripts/notary-action.sh "$GITHUB_OUTPUT"
- name: Upload build outputs
if: steps.tag_check.outputs.ok == 'true'
uses: actions/upload-artifact@v4
with:
name: FlowDown-${{ env.VERSION }}-build-pre-notarize
path: |
BuildArtifacts/FlowDown-macos.xcarchive
BuildArtifacts/macos-notary.xcresult
if-no-files-found: error
retention-days: 7
- name: Create release (replace if exists)
if: steps.tag_check.outputs.ok == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
set -euo pipefail
if gh release view "${VERSION}" >/dev/null 2>&1; then
echo "Release ${VERSION} already exists; deleting to replace"
gh release delete "${VERSION}" --yes
fi
gh release create "${VERSION}" --title "${VERSION}" --notes "Automated release for ${VERSION}"
- name: Upload notarized ZIP to release
if: steps.tag_check.outputs.ok == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ env.VERSION }}
ZIP_PATH: ${{ steps.notarize_action.outputs.zip_path }}
run: |
set -euo pipefail
if [[ ! -f "$ZIP_PATH" ]]; then
echo "ZIP not found at $ZIP_PATH" >&2
exit 1
fi
gh release upload "${VERSION}" "$ZIP_PATH#FlowDown-${VERSION}.zip" --clobber
- name: Upload notarized ZIP as artifact
if: steps.tag_check.outputs.ok == 'true'
uses: actions/upload-artifact@v4
with:
name: FlowDown-${{ env.VERSION }}-notarized-zip
path: ${{ steps.notarize_action.outputs.zip_path }}
if-no-files-found: error
retention-days: 7
================================================
FILE: .github/workflows/test.yml
================================================
name: Test
# This workflow runs unit tests on pull requests, and online E2E tests
# when the FLOWDOWN_ONLINE_E2E_TOKEN and FLOWDOWN_ONLINE_E2E_ENDPOINT
# secrets are available.
on:
push:
branches:
- main
pull_request:
paths:
- "FlowDown/**"
- "Frameworks/**"
- "FlowDownUnitTests/**"
- "Resources/**"
- "FlowDown.xcodeproj/**"
- "FlowDown.xcworkspace/**"
- ".github/workflows/test.yml"
- "Makefile"
- "Package.resolved"
workflow_dispatch:
schedule:
- cron: "0 3 * * *"
jobs:
test:
if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'housekeeping/') }}
name: Unit Tests
runs-on: macos-26
permissions:
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Select Newest Xcode
run: |
chmod +x Resources/DevKit/scripts/select_newest_xcode.sh
./Resources/DevKit/scripts/select_newest_xcode.sh
- name: Resolve Packages
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme FlowDown \
-resolvePackageDependencies \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Build FlowDown (for codegen)
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
DESTINATION=$(bash Resources/DevKit/scripts/get_first_ios_simulator.sh)
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme FlowDown \
-configuration Debug \
-destination "$DESTINATION" \
build \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Run Unit Tests
run: |
set -o pipefail
xcodebuild -downloadComponent MetalToolchain
DESTINATION=$(bash Resources/DevKit/scripts/get_first_ios_simulator.sh)
xcodebuild \
-workspace FlowDown.xcworkspace \
-scheme FlowDown \
-configuration Debug \
-destination "$DESTINATION" \
test \
CODE_SIGNING_ALLOWED=NO \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGN_IDENTITY="" \
| xcbeautify --is-ci --disable-colored-output --disable-logging
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: |
~/Library/Developer/Xcode/DerivedData/*/Logs/Test/*.xcresult
if-no-files-found: warn
retention-days: 7
online-e2e:
if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'housekeeping/') }}
name: Online E2E
needs: test
runs-on: macos-26
env:
FLOWDOWN_ONLINE_E2E_TOKEN: ${{ secrets.FLOWDOWN_ONLINE_E2E_TOKEN }}
FLOWDOWN_ONLINE_E2E_ENDPOINT: ${{ secrets.FLOWDOWN_ONLINE_E2E_ENDPOINT }}
permissions:
contents: read
steps:
- name: Check Secrets
run: |
if [ -z "$FLOWDOWN_ONLINE_E2E_TOKEN" ] || [ -z "$FLOWDOWN_ONLINE_E2E_ENDPOINT" ]; then
echo "::notice::FLOWDOWN_ONLINE_E2E_TOKEN or FLOWDOWN_ONLINE_E2E_ENDPOINT not available, skipping online E2E tests"
echo "SKIP_E2E=true" >> "$GITHUB_ENV"
fi
- name: Checkout
if: env.SKIP_E2E != 'true'
uses: actions/checkout@v4
with:
submodules: recursive
- name: Select Newest Xcode
if: env.SKIP_E2E != 'true'
run: |
chmod +x Resources/DevKit/scripts/select_newest_xcode.sh
./Resources/DevKit/scripts/select_newest_xcode.sh
- name: Run Online E2E
if: env.SKIP_E2E != 'true'
run: |
chmod +x Resources/DevKit/scripts/run_online_e2e_tests.sh
./Resources/DevKit/scripts/run_online_e2e_tests.sh
- name: Upload Test Results
if: always() && env.SKIP_E2E != 'true'
uses: actions/upload-artifact@v4
with:
name: online-e2e-results
path: |
~/Library/Developer/Xcode/DerivedData/*/Logs/Test/*.xcresult
if-no-files-found: warn
retention-days: 7
================================================
FILE: .gitignore
================================================
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
!default.xcworkspace
*.dSYM
*.dSYM.zip
*.hmap
*.ipa
*.lcov
*.lock
*.log
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
*.pid
*.pid.lock
*.seed
*.swp
*.tgz
*.tsbuildinfo
*.xccheckout
*.xcscmblueprint
*.xcuserstate
*~.nib
.AppleDB
.AppleDesktop
.AppleDouble
.DS_Store
.DocumentRevisions-V100
.LSOverride
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
._*
.apdisk
.build
.bundle
.cache
.cache/
.com.apple.timemachine.donotpresent
.dynamodb/
.env
.env.test
.eslintcache
.fseventsd
.fusebox/
.grunt
.idea
.lock-wscript
.next
.node_repl_history
.npm
.nuxt
.nyc_output
.parcel-cache
.pnp.*
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
.serverless/
.swiftpm
.tern-port
.vscode-test
.vuepress/dist
.yarn-integrity
.yarn/build-state.yml
.yarn/cache
.yarn/unplugged
/*.gcno
Artifacts/
CI
CI-Pods.tar
Carthage/Build
Carthage/Build/
DerivedData
DerivedData/
Icon
Network Trash Folder
Pipeline/Dockers/Buildtime/
Podfile.lock
Pods/
Temporary Items
artifacts/
bower_components
build/
build/Release
coverage
default.profraw
dist
dockerbuild
dockermnt
fastlane/Preview.html
fastlane/report.xml
fastlane/screenshots/**/*.png
fastlane/test_output
iOSInjectionProject/
jspm_packages/
lerna-debug.log*
lib-cov
logs
node_modules/
npm-debug.log*
pids
profile
project.xcworkspace
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
temp/
temps/
web_modules/
xcuserdata
xcuserdata/
yarn-debug.log*
yarn-error.log*
FlowDown/Configuration/*Developer*.xcconfig
FlowDown/Configuration/GitHubAction.xcconfig
FlowDown/DerivedSources/*
!FlowDown/DerivedSources/DerivedSourcesReadme.swift
/example*
/References
*.provisionprofile
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[codz]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py.cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
# Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
# poetry.lock
# poetry.toml
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
# pdm.lock
# pdm.toml
.pdm-python
.pdm-build/
# pixi
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
# pixi.lock
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
# in the .venv directory. It is recommended not to include this directory in version control.
.pixi
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# Redis
*.rdb
*.aof
*.pid
# RabbitMQ
mnesia/
rabbitmq/
rabbitmq-data/
# ActiveMQ
activemq-data/
# SageMath parsed files
*.sage.py
# Environments
.env
.envrc
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
# .idea/
# Abstra
# Abstra is an AI-powered process automation framework.
# Ignore directories containing user credentials, local state, and settings.
# Learn more at https://abstra.io/docs
.abstra/
# Visual Studio Code
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
# and can be added to the global gitignore or merged into this file. However, if you prefer,
# you could uncomment the following to ignore the entire vscode folder
# .vscode/
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc
# Marimo
marimo/_static/
marimo/_lsp/
__marimo__/
# Streamlit
.streamlit/secrets.toml
================================================
FILE: .gitmodules
================================================
[submodule "Frameworks/ChatClientKit"]
path = Frameworks/ChatClientKit
url = https://github.com/Lakr233/ChatClientKit.git
[submodule "Frameworks/mlx-swift-lm"]
path = Frameworks/mlx-swift-lm
url = https://github.com/ml-explore/mlx-swift-lm.git
branch = main
================================================
FILE: .swift-format-list
================================================
# Include-only list for SwiftFormat.
# One path per line, relative to repo root. Blank lines and comments are ignored.
Examples
FlowDown
FlowDownTranslationProvider
FlowDownUnitTests
FlowDownWidgets
Frameworks/ChatClientKit
Frameworks/FlowDownModelExchange
Frameworks/Logger
Frameworks/Storage
================================================
FILE: AGENTS.md
================================================
# FlowDown Agent Guide
This file provides guidance to AI coding agents working inside this repository.
## Overview
FlowDown is a Swift-based AI/LLM client for iOS and macOS (Catalyst) with a privacy-first mindset. The workspace hosts the main app plus several Swift Package Manager frameworks (e.g. `ChatClientKit`, `Storage`, `Logger`) that power storage, editing, model integrations, and on-device MLX inference. Persistent configuration lives in the `ConfigurableKit` package.
- All code text (UI strings, comments, logs) must remain in English.
## Environment & Tooling
- Prefer opening `FlowDown.xcworkspace` so the app and frameworks resolve together under shared schemes.
- `ChatClientKit` intentionally relies on the `FlowDown.xcworkspace` package override for `mlx-swift-lm`; keep `Frameworks/ChatClientKit/Package.swift` on `branch: "main"` for that dependency and validate integration changes through workspace builds driven by the top-level `Makefile`.
- Use Xcode 26.x (Swift 6.0 toolchain) or newer to satisfy package manifests and the Swift `Testing` library.
- Build on macOS 26 or later to ensure compatibility with the required toolchain.
- Install `xcbeautify` (`brew install xcbeautify`) so the shared `make` workflows can produce readable logs.
- Lean on automation in `Resources/DevKit/scripts/` (localization, archiving, licensing) instead of ad-hoc scripts.
- Always use the top-level `Makefile` for build, test, package resolution, archive, and verification flows.
- Do not run `xcodebuild` directly in the shell. If a workflow is missing, add a `Makefile` target first.
## Platform Requirements & Dependencies
- Target platforms reflect framework minimums: iOS 17.0+, macCatalyst 17.0+ (macOS 14+ for Catalyst helpers).
- Toolchain: Swift 6.0 (`swift-tools-version: 6.0`) and the Xcode 26 SDK line are required. MLX currently resolves to `mlx-swift` 0.21.x and `mlx-swift-examples` on `main`.
- Core SwiftPM dependencies include MLX/MLX examples, ConfigurableKit, SnapKit, SwifterSwift, MarkdownView, WCDB prebuilt binaries, ZIPFoundation, ScrubberKit, AlertController, GlyphixTextFx, ColorfulX, UIEffectKit, DpkgVersion, swift-transformers, and additional UI/tooling libraries listed in `FlowDown.xcodeproj`.
- `Storage` wraps WCDB with Markdown parsing and ZIP export; `ChatClientKit` layers MLX, EventSource, and Logger to deliver on-device and streaming chat.
- MLX GPU support is automatically detected and disabled in simulator/x86_64 builds (see `FlowDown/main.swift`).
## Project Structure
- `FlowDown.xcworkspace`: Entry point with app and frameworks.
- `FlowDown/`: Application sources divided into `Application/` (entry surfaces), `Backend/` (conversations, models, storage, security), `Interface/` (UIKit), `PlatformSupport/` (macOS/Catalyst glue), and `BundledResources/` (curated assets shipped with the app).
- `FlowDown/DerivedSources/`: Generated during builds (`BuildInfo.swift`, `CloudKitConfig.swift`). Treat as generated—schemes will overwrite changes.
- `Frameworks/`: Shared Swift packages (`ChatClientKit`, `Storage`, `RichEditor`, `RunestoneEditor`, `Logger`). Each package owns its manifest and dependency graph.
- `FlowDownUnitTests/`: App-level tests using Swift's `Testing` package (`@Test` entry points).
- `Resources/`: Shared assets, localization collateral, privacy documents, and DevKit utilities.
- `Resources/DevKit/scripts/`: Automation helpers (archiving, translation, licence scanning). Prefer extending these over new stand-alone scripts.
- `Playgrounds/`: Exploratory prototypes; do not assume production readiness.
## Build & Run Commands
- Open the workspace: `open FlowDown.xcworkspace`.
- Build commands:
- `make build` for the iOS and Mac Catalyst app
- `make build-ios` for the iOS app
- `make build-catalyst` for the Mac Catalyst app
- `make build-extension` for the translation provider extension
- Test commands:
- `make test` for the default test flow
- `make test-unit` for app tests on the first available iOS simulator
- `make test-online-e2e` for the online E2E suite
- Package and license commands:
- `make package-resolve` to resolve SwiftPM packages
- `make scan-license` to refresh `OpenSourceLicenses.md`
- Localization commands:
- `make localization-check` to check for missing translations
- `make localization-stale-check` to prune stale keys and verify completeness
- Archive commands:
- `make archive` for both platforms
- `make archive-ios` for the iOS archive
- `make archive-macos` for the macOS archive
- Cleanup commands:
- `make clean-build` to remove repo-local build artifacts
- `make clean` to remove repo-local build artifacts and derived data
- Archive script automatically commits changes and bumps version before building; ensure the working tree is clean beforehand.
- Use `make help` to discover the current command surface.
- Localization validation helpers:
- `make localization-stale-check`
- `make localization-check`
- `python3 Resources/DevKit/scripts/update_missing_i18n.py FlowDown/Resources/Localizable.xcstrings` to scaffold missing locales; extend `NEW_STRINGS` in that script when adding new keys.
## Shell Script Style
### Core Principles
- **Simplicity**: Keep scripts minimal and focused
- **No unnecessary complexity**: Avoid features that aren't needed
- **Visual clarity**: Use line breaks for readability
- **Failure handling**: Use `set -euo pipefail`
- **Use shebang for scripts**: Use `#!/bin/zsh`
### Output Guidelines
- Use `[+]` for successful operations
- Use `[-]` for failed operations (when needed)
- Keep echo messages lowercase
- Simple status messages: "building...", "completed successfully"
### Code Style
- Minimal comments - focus on self-evident code
- No unnecessary color output or visual fluff
- Line breaks for long command chains
- Assume required tools are available (e.g., xcbeautify)
- Don't add if checks when pipefail handles failures
## Development Guidelines
### Swift Style
- 4-space indentation with opening braces on the same line
- Single spaces around operators and after commas
- PascalCase types; camelCase properties, methods, and file names
- Organize extensions into targeted files (`Type+Feature.swift`) and keep each file focused on one responsibility
- Lean on modern Swift patterns: `@Observable`, structured concurrency (`async`/`await`), result builders, and protocol-oriented design
### Architecture & Key Services
- Respect the established managers: `ModelManager`, `ModelToolsManager`, `ConversationManager`, `MCPService`, and `UpdateManager`. Consult them before adding new singletons.
- Compose features via dependency injection and protocols instead of inheritance.
- Keep Catalyst-specific behaviour under `PlatformSupport/` to avoid leaking platform checks throughout the codebase.
- Security hardening lives in `FlowDown/Backend/Security/`: release builds validate app signatures, strip debuggers, and verify sandbox enforcement (see `main.swift`).
- Backend services are organized by domain: `ChatTemplate`, `Conversation`, `Model`, `ModelTools`, `MCPService`, `Storage`, `Security`, `UpdateManager`.
- `main.swift` wires storage (`Storage.db()`), CloudKit sync, logging, and shared singletons (`ModelManager`, `ModelToolsManager`, `ConversationManager`, `MCPService`, `UpdateManager`, `ChatSelection`). Keep this order intact to avoid race conditions.
- `ConfigurableKit` powers persisted user settings—add keys through dedicated `Value+*.swift` helpers and publish updates via its typed publishers.
## Testing Expectations
- Add or update unit/UI tests alongside behavioural changes. `FlowDownUnitTests` leverages the Swift `Testing` library—author tests as `@Test func featureScenario_expectation()`.
- Run app-level tests through `make test` or `make test-unit`.
- Use `make test-online-e2e` when a change needs the online E2E suite.
- Document manual verification steps whenever UI or integration flows lack automation.
## Security & Privacy
- Never hardcode secrets; rely on user-supplied keys and platform keychains.
- Validate new managers or services against the sanctioned singleton list above.
- Use `assert`/`precondition` to capture invariants during development.
- Audit persistence changes for privacy impacts before shipping.
- Preserve existing safeguards in `main.swift`: release builds disable stdout/stderr, strip debuggers, enforce signature validation, and ensure Catalyst sandboxing.
- Keep CloudKit identifiers, entitlements, and derived `CloudKitConfig.swift` generation in sync with deployment environments.
## Documentation & Knowledge Sharing
- Capture key findings from external research in PR descriptions so future contributors can trace decisions.
- Reference official docs, WWDC sessions, or sample projects when introducing new APIs.
- Keep architectural rationale and trade-offs close to the code (doc comments or dedicated markdown) when complexity grows.
- Call out changes to generated assets or DevKit scripts (`FlowDown/DerivedSources`, `Resources/DevKit/scripts/`) in PR summaries so reviewers can trace automation impacts.
## Collaboration Workflow
- Craft concise, capitalized commit subjects (e.g., `Adjust Compiler Settings`) and use bodies to explain decisions or link issues (`#123`).
- Group related work per commit and avoid bundling unrelated refactors.
- Pull requests must include a summary, testing checklist, and before/after visuals for UI changes. Mention localization or asset updates when relevant.
- Tag reviewers responsible for the affected modules and outline any follow-up tasks or risks.
## Code Review Guidelines
- Keep reviews pragmatic: prioritize reproducible, high-impact defects with clear user or data risk.
- Do not report intentional fail-fast patterns as bugs by default (`force unwrap`, `as!`, `try!`, `unowned`) when they protect explicit invariants.
- If an invariant can be violated, prefer explicit fail-fast checks (`precondition`/`assert`) over silent fallbacks that hide corruption.
- Avoid recommending fixes for extremely low-probability race conditions unless impact is severe or reproduction is clear.
- Prefer root-cause fixes over broad defensive rewrites that mostly reduce crash visibility without improving correctness.
- Write findings as actionable items: include trigger condition, concrete impact, and minimal viable fix.
### CI Review Check
- For GitHub Actions workflows that build, test, or archive through `make` or project scripts, ensure the Metal toolchain is downloaded before the first build step.
## Localization Guidelines
- `AlertViewController` and `ConfigurableKit` APIs expect `String.LocalizationValue`; pass localization values directly for consistency
- Other UI entry points should continue using `String(localized: ...)` for user-facing strings
- Source all user-visible strings from localization files instead of hardcoded literals
### Dynamic values (avoid missed translations)
When a localized string includes runtime values (counts, sizes, etc.), do NOT build the key as a `String` via interpolation.
- Bad (produces a runtime `String` key like "3 chances" and will NOT match entries like "%lld chances"):
- `String(localized: "\(value) chances")`
- Good (ensures a `String.LocalizationValue` is produced, so it matches the formatted key in `.xcstrings`):
- `let key: String.LocalizationValue = "\(value) chances"`
- `String(localized: key)`
Prefer `String.LocalizationValue`/`LocalizedStringResource` formatting over `String(format:)` in app code. Use `String(format:)` only when needed for compatibility.
- Main app localization files:
- `FlowDown/Resources/Localizable.xcstrings`: Main app UI strings
- `FlowDown/Resources/InfoPlist.xcstrings`: Info.plist localization strings
- Translation provider localization files:
- `FlowDownTranslationProvider/Localizable.xcstrings`: Translation provider UI strings
- `FlowDownTranslationProvider/InfoPlist.xcstrings`: Translation provider Info.plist localization strings
- FlowDownWidgets localization files:
- `FlowDownWidgets/Localizable.xcstrings`: Widgets UI strings
- `FlowDownWidgets/InfoPlist.xcstrings`: Widgets Info.plist localization strings
- We ship multiple locales (en base plus de, es, fr, ja, ko, zh-Hans); keep all locales populated when adding or updating strings—do not leave only English/Chinese
- **IMPORTANT**: When adding new strings, you MUST provide translations for ALL supported languages (de, es, fr, ja, ko, zh-Hans) in `NEW_STRINGS`. Never add strings with only partial translations.
- **IMPORTANT**: When adding new strings, you MUST provide translations for ALL supported languages (de, es, fr, ja, ko, zh-Hans) in `NEW_STRINGS`. Never add strings with only partial translations.
- Use the provided scripts to manage translations:
- `python3 Resources/DevKit/scripts/update_missing_i18n.py FlowDown/Resources/Localizable.xcstrings` to scaffold new keys (extend `NEW_STRINGS` dict in the script as required)
- `python3 Resources/DevKit/scripts/translate_missing.py FlowDown/Resources/Localizable.xcstrings` to apply curated zh-Hans translations
- `python3 Resources/DevKit/scripts/check_untranslated.py FlowDown/Resources/Localizable.xcstrings` to surface untranslated entries (missing or empty) across ALL languages
- `python3 Resources/DevKit/scripts/check_translations.py FlowDown/Resources/Localizable.xcstrings` to remove stale keys and verify completeness across all locales
- Script usage notes:
- `update_missing_i18n.py`: Add translations for ALL languages to `NEW_STRINGS` dict before running; the script merges them into xcstrings. Format: `{"Key": {"de": "...", "es": "...", "fr": "...", "ja": "...", "ko": "...", "zh-Hans": "..."}}`
- `check_untranslated.py`: Reports strings missing translations in ANY supported language (not just zh-Hans)
- `check_translations.py`: Use this to find strings missing translations in any locale (missing, empty, or non-translated state)
- Localization files such as `Localizable.xcstrings` exceed 10k lines; update the supporting Python scripts to regenerate changes instead of editing the JSON directly.
- Follow existing localization patterns and maintain consistency with the codebase. Avoid manual edits to `.xcstrings`; let scripts manage JSON structure.
================================================
FILE: Examples/ModelExchange/Assets.xcassets/AccentColor.colorset/Contents.json
================================================
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Examples/ModelExchange/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Examples/ModelExchange/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Examples/ModelExchange/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>ModelExchange</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>wiki.qaq.model-exchange.example</string>
<key>CFBundleURLSchemes</key>
<array>
<string>example-callback</string>
</array>
</dict>
</array>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>flowdown</string>
</array>
<key>UILaunchScreen</key>
<dict/>
<key>UIRequiresFullScreen</key>
<false/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: Examples/ModelExchange/main.swift
================================================
//
// main.swift
// ModelExchange
//
// Created by qaq on 8/12/2025.
//
import FlowDownModelExchange
import SwiftUI
FlowDownModelExchangeExampleApp.main()
struct FlowDownModelExchangeExampleApp: App {
@State private var keyPair = ModelExchangeKeyPair()
@State private var sessionId: String?
@State private var status: String = "Idle"
@State private var receivedModels: String = "No payload yet"
@State private var lastExchangeURL: String?
@State private var lastPayload: String?
var body: some Scene {
WindowGroup {
NavigationStack {
ExampleView(
keyPair: $keyPair,
sessionId: $sessionId,
status: $status,
receivedModels: $receivedModels,
lastExchangeURL: $lastExchangeURL,
lastPayload: $lastPayload,
)
}
}
}
}
private struct ExampleView: View {
@Environment(\.openURL) private var openURL
@Binding var keyPair: ModelExchangeKeyPair
@Binding var sessionId: String?
@Binding var status: String
@Binding var receivedModels: String
@Binding var lastExchangeURL: String?
@Binding var lastPayload: String?
private let callbackScheme = "example-callback"
@State private var selectedCapabilities: Set<ModelExchangeCapability> = [.audio, .developerRole]
private let allCapabilities: [ModelExchangeCapability] = [.audio, .visual, .tool, .developerRole]
private var builder: ModelExchangeRequestBuilder {
ModelExchangeRequestBuilder(
flowdownScheme: "flowdown",
callbackScheme: callbackScheme,
keyPair: keyPair,
)
}
private var handshakeURL: URL? {
builder.makeHandshakeURL()
}
var body: some View {
List {
Section("Flow") {
Button("Start handshake with FlowDown") {
startHandshake()
}
Button("Rotate key pair") {
keyPair = ModelExchangeKeyPair()
sessionId = nil
status = "Keys rotated"
receivedModels = "No payload yet"
lastExchangeURL = nil
lastPayload = nil
}
}
Section("Capabilities") {
ForEach(allCapabilities, id: \.self) { capability in
Toggle(name(for: capability), isOn: binding(for: capability))
}
}
Section("Current session") {
LabeledContent("Session", value: sessionId ?? "Not verified")
LabeledContent("Status", value: status)
}
Section("Handshake URL") {
Text(handshakeURL?.absoluteString ?? "Unavailable")
.font(.footnote)
.textSelection(.enabled)
}
if let lastExchangeURL {
Section("Last exchange request") {
Text(lastExchangeURL)
.font(.footnote)
.textSelection(.enabled)
}
}
if let lastPayload {
Section("Raw payload") {
Text(lastPayload)
.font(.footnote.monospaced())
.textSelection(.enabled)
}
}
Section("Received models") {
Text(receivedModels)
.font(.footnote.monospaced())
.textSelection(.enabled)
}
Section("Public key") {
Text("Signing: \(keyPair.publicKey.signing.base64EncodedString())")
.font(.footnote)
.textSelection(.enabled)
Text("Agreement: \(keyPair.publicKey.agreement.base64EncodedString())")
.font(.footnote)
.textSelection(.enabled)
}
}
.navigationTitle("Model Exchange Demo")
.onOpenURL { url in
handleCallback(url: url)
}
}
private func binding(for capability: ModelExchangeCapability) -> Binding<Bool> {
Binding(
get: { selectedCapabilities.contains(capability) },
set: { isOn in
if isOn {
selectedCapabilities.insert(capability)
} else {
selectedCapabilities.remove(capability)
}
},
)
}
private func name(for capability: ModelExchangeCapability) -> String {
switch capability {
case .audio:
"Audio"
case .visual:
"Visual"
case .tool:
"Tool"
case .developerRole:
"Role"
}
}
private func startHandshake() {
guard let url = handshakeURL else {
status = "Handshake URL unavailable"
return
}
status = "Opening FlowDown for verification"
openURL(url)
}
private func handleCallback(url: URL) {
guard url.scheme == callbackScheme,
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
else { return }
let dict = Dictionary(uniqueKeysWithValues: (components.queryItems ?? []).compactMap { item -> (String, String)? in
guard let value = item.value else { return nil }
return (item.name.lowercased(), value)
})
switch dict["stage"]?.lowercased() {
case "verification":
handleVerification(dict: dict)
case "completed":
handleCompletion(dict: dict)
case "cancelled":
sessionId = nil
status = "User cancelled in FlowDown"
default:
status = "Unknown callback stage"
}
}
private func handleVerification(dict: [String: String]) {
guard let session = dict["session"] else {
status = "Missing session in verification"
return
}
guard let pk = dict["pk"], pk == keyPair.encodedPublicKey else {
status = "Public key mismatch in verification"
return
}
sessionId = session
status = "Session verified, requesting models"
sendExchangeRequest(session: session)
}
private func handleCompletion(dict: [String: String]) {
guard let payload = dict["payload"] else {
status = "Missing payload"
return
}
guard dict["session"] == sessionId else {
status = "Session mismatch"
return
}
do {
let encrypted = try ModelExchangeEncryptedPayload.decode(from: payload)
let data = try ModelExchangeCrypto.decrypt(encrypted, with: keyPair)
let rendered = try renderModels(from: data, format: dict["format"] ?? "plist")
receivedModels = rendered.text
status = "Received \(rendered.count) model(s)"
lastPayload = payload
} catch {
status = "Decrypt failed: \(error.localizedDescription)"
}
sessionId = nil
}
private func sendExchangeRequest(session: String) {
do {
let signed = try builder.makeExchangeURL(
session: session,
appName: "Example Integrator",
reason: "Request models from FlowDown",
capabilities: Array(selectedCapabilities),
multipleSelection: false,
)
lastExchangeURL = signed.url.absoluteString
status = "Opening FlowDown to pick models"
openURL(signed.url)
} catch {
status = "Build request failed: \(error.localizedDescription)"
}
}
private func renderModels(from data: Data, format: String) throws -> (text: String, count: Int) {
if format.lowercased() == "plist" {
let plist = try PropertyListSerialization.propertyList(from: data, options: [], format: nil)
let normalized = normalizeJSONCompatible(plist)
let count = (normalized as? [Any])?.count ?? 0
guard JSONSerialization.isValidJSONObject(normalized),
let jsonData = try? JSONSerialization.data(withJSONObject: normalized, options: [.prettyPrinted, .sortedKeys]),
let jsonText = String(data: jsonData, encoding: .utf8)
else {
return (String(describing: normalized), count)
}
return (jsonText, count)
}
return (String(data: data, encoding: .utf8) ?? "Unsupported payload", 0)
}
private func normalizeJSONCompatible(_ value: Any) -> Any {
switch value {
case let date as Date:
return ISO8601DateFormatter().string(from: date)
case let data as Data:
return data.base64EncodedString()
case let array as [Any]:
return array.map { normalizeJSONCompatible($0) }
case let dict as [String: Any]:
var converted: [String: Any] = [:]
for (key, value) in dict {
converted[key] = normalizeJSONCompatible(value)
}
return converted
default:
return value
}
}
}
================================================
FILE: Examples/ModelExchange.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 77;
objects = {
/* Begin PBXBuildFile section */
506575872EE6568B008EBAC6 /* FlowDownModelExchange in Frameworks */ = {isa = PBXBuildFile; productRef = 506575862EE6568B008EBAC6 /* FlowDownModelExchange */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
50EA4DBD2EE65615008AD512 /* ModelExchange.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ModelExchange.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
50FB9C1F2EE6676200AFD828 /* Exceptions for "ModelExchange" folder in "ModelExchange" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 50EA4DBC2EE65615008AD512 /* ModelExchange */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
50EA4DBF2EE65615008AD512 /* ModelExchange */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
50FB9C1F2EE6676200AFD828 /* Exceptions for "ModelExchange" folder in "ModelExchange" target */,
);
path = ModelExchange;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
50EA4DBA2EE65615008AD512 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
506575872EE6568B008EBAC6 /* FlowDownModelExchange in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
506575852EE6568B008EBAC6 /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
50EA4DB42EE65615008AD512 = {
isa = PBXGroup;
children = (
50EA4DBF2EE65615008AD512 /* ModelExchange */,
506575852EE6568B008EBAC6 /* Frameworks */,
50EA4DBE2EE65615008AD512 /* Products */,
);
sourceTree = "<group>";
};
50EA4DBE2EE65615008AD512 /* Products */ = {
isa = PBXGroup;
children = (
50EA4DBD2EE65615008AD512 /* ModelExchange.app */,
);
name = Products;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
50EA4DBC2EE65615008AD512 /* ModelExchange */ = {
isa = PBXNativeTarget;
buildConfigurationList = 50EA4DC82EE65616008AD512 /* Build configuration list for PBXNativeTarget "ModelExchange" */;
buildPhases = (
50EA4DB92EE65615008AD512 /* Sources */,
50EA4DBA2EE65615008AD512 /* Frameworks */,
50EA4DBB2EE65615008AD512 /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
50EA4DBF2EE65615008AD512 /* ModelExchange */,
);
name = ModelExchange;
packageProductDependencies = (
506575862EE6568B008EBAC6 /* FlowDownModelExchange */,
);
productName = ModelExchange;
productReference = 50EA4DBD2EE65615008AD512 /* ModelExchange.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
50EA4DB52EE65615008AD512 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 2610;
LastUpgradeCheck = 2610;
TargetAttributes = {
50EA4DBC2EE65615008AD512 = {
CreatedOnToolsVersion = 26.1.1;
};
};
};
buildConfigurationList = 50EA4DB82EE65615008AD512 /* Build configuration list for PBXProject "ModelExchange" */;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 50EA4DB42EE65615008AD512;
minimizedProjectReferenceProxies = 1;
preferredProjectObjectVersion = 77;
productRefGroup = 50EA4DBE2EE65615008AD512 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
50EA4DBC2EE65615008AD512 /* ModelExchange */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
50EA4DBB2EE65615008AD512 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
50EA4DB92EE65615008AD512 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
50EA4DC62EE65616008AD512 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 964G86XT2P;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
50EA4DC72EE65616008AD512 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 964G86XT2P;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SWIFT_COMPILATION_MODE = wholemodule;
};
name = Release;
};
50EA4DC92EE65616008AD512 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 964G86XT2P;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = ModelExchange/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ModelExchange;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 18.0;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 26.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = wiki.qaq.ModelExchange;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
XROS_DEPLOYMENT_TARGET = 26.1;
};
name = Debug;
};
50EA4DCA2EE65616008AD512 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 964G86XT2P;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GENERATE_INFOPLIST_FILE = NO;
INFOPLIST_FILE = ModelExchange/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = ModelExchange;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 18.0;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 26.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = wiki.qaq.ModelExchange;
PRODUCT_NAME = "$(TARGET_NAME)";
REGISTER_APP_GROUPS = YES;
SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = YES;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
XROS_DEPLOYMENT_TARGET = 26.1;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
50EA4DB82EE65615008AD512 /* Build configuration list for PBXProject "ModelExchange" */ = {
isa = XCConfigurationList;
buildConfigurations = (
50EA4DC62EE65616008AD512 /* Debug */,
50EA4DC72EE65616008AD512 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
50EA4DC82EE65616008AD512 /* Build configuration list for PBXNativeTarget "ModelExchange" */ = {
isa = XCConfigurationList;
buildConfigurations = (
50EA4DC92EE65616008AD512 /* Debug */,
50EA4DCA2EE65616008AD512 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCSwiftPackageProductDependency section */
506575862EE6568B008EBAC6 /* FlowDownModelExchange */ = {
isa = XCSwiftPackageProductDependency;
productName = FlowDownModelExchange;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 50EA4DB52EE65615008AD512 /* Project object */;
}
================================================
FILE: Examples/ModelExchange.xcodeproj/xcshareddata/xcschemes/ModelExchange.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2640"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "50EA4DBC2EE65615008AD512"
BuildableName = "ModelExchange.app"
BlueprintName = "ModelExchange"
ReferencedContainer = "container:ModelExchange.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "50EA4DBC2EE65615008AD512"
BuildableName = "ModelExchange.app"
BlueprintName = "ModelExchange"
ReferencedContainer = "container:ModelExchange.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "50EA4DBC2EE65615008AD512"
BuildableName = "ModelExchange.app"
BlueprintName = "ModelExchange"
ReferencedContainer = "container:ModelExchange.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: FlowDown/Application/AppDelegate+Menu.swift
================================================
//
// AppDelegate+Menu.swift
// FlowDown
//
// Created by Alan Ye on 6/27/25.
//
import AlertController
import OrderedCollections
import Storage
import UIKit
extension AppDelegate {
// MARK: - Menu Building
override func buildMenu(with builder: UIMenuBuilder) {
super.buildMenu(with: builder)
guard builder.system == UIMenuSystem.main else { return }
builder.insertChild(
UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "New Chat"),
action: #selector(requestNewChatFromMenu(_:)),
input: "n",
modifierFlags: .command,
),
UIMenu(
title: String(localized: "New Chat with Template"),
options: .displayInline,
children: Self.buildTemplateMenuItems(target: self),
),
],
),
atStartOfMenu: .file,
)
builder.insertChild(
UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "Delete Chat"),
action: #selector(deleteConversationFromMenu(_:)),
input: "\u{8}",
modifierFlags: [.command, .shift],
),
],
),
atEndOfMenu: .file,
)
if UpdateManager.shared.canCheckForUpdates {
builder.insertSibling(
UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "Check for Updates..."),
action: #selector(checkForUpdatesFromMenu(_:)),
input: "u",
modifierFlags: [.command, .shift],
),
],
),
afterMenu: .preferences,
)
}
builder.insertSibling(
UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "Settings..."),
action: #selector(openSettingsFromMenu(_:)),
input: ",",
modifierFlags: .command,
),
],
),
afterMenu: .preferences,
)
#if targetEnvironment(macCatalyst)
builder.replace(
menu: .close,
with: UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "Close"),
action: #selector(requestAppExitFromMenu(_:)),
input: "w",
modifierFlags: .command,
),
],
),
)
builder.replace(
menu: .quit,
with: UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "Exit"),
action: #selector(requestAppExitFromMenu(_:)),
input: "q",
modifierFlags: .command,
),
],
),
)
#endif
builder.insertChild(
UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "Search…"),
action: #selector(searchConversationsFromMenu(_:)),
input: "f",
modifierFlags: [.command, .shift],
),
],
),
atStartOfMenu: .edit,
)
builder.insertChild(
UIMenu(
title: "",
options: .displayInline,
children: [
UIKeyCommand(
title: String(localized: "Previous Conversation"),
action: #selector(selectPreviousConversationFromMenu(_:)),
input: UIKeyCommand.inputUpArrow,
modifierFlags: [.command, .alternate],
),
UIKeyCommand(
title: String(localized: "Next Conversation"),
action: #selector(selectNextConversationFromMenu(_:)),
input: UIKeyCommand.inputDownArrow,
modifierFlags: [.command, .alternate],
),
UIKeyCommand(
title: String(localized: "Toggle Sidebar"),
action: #selector(toggleSidebarFromMenu(_:)),
input: "/",
modifierFlags: [.control, .shift],
),
].compactMap(\.self),
),
atStartOfMenu: .view,
)
}
// MARK: - Template Menu
private static func buildTemplateMenuItems(target: AppDelegate) -> [UIMenuElement] {
let templates = Array(ChatTemplateManager.shared.templates.values)
guard !templates.isEmpty else {
return [UIAction(title: String(localized: "No Chat Templates"), attributes: .disabled, handler: { _ in })]
}
var items: [UIMenuElement] = []
for (idx, template) in templates.enumerated() {
let title = "\(template.name)"
let action = #selector(AppDelegate.requestNewChatWithTemplateFromMenu(_:))
let propertyList = template.id.uuidString
if idx < 9 {
let keyInput = String(idx + 1)
items.append(
UIKeyCommand(
title: title,
action: action,
input: keyInput,
modifierFlags: [.command, .alternate],
propertyList: propertyList,
),
)
} else {
items.append(
UIAction(
title: title,
handler: { _ in
target.requestNewChatWithTemplateFromMenuWithID(propertyList)
},
),
)
}
}
return items
}
// MARK: - Menu Actions
var mainWindow: UIWindow? {
let windowScenes = UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
let windows = windowScenes.flatMap(\.windows)
return windows.first(where: \.isKeyWindow) ?? windows.first
}
@objc func checkForUpdatesFromMenu(_: Any?) {
UpdateManager.shared.anchor(mainWindow?.rootViewController?.view ?? .init())
UpdateManager.shared.performUpdateCheckFromUI()
}
/// Wire from MainController
@objc func requestNewChatFromMenu(_: Any?) {
(mainWindow?.rootViewController as? MainController)?.requestNewChat()
}
@objc func searchConversationsFromMenu(_: Any?) {
(mainWindow?.rootViewController as? MainController)?.searchConversationsFromMenu()
}
@objc func openSettingsFromMenu(_: Any?) {
(mainWindow?.rootViewController as? MainController)?.openSettings()
}
#if targetEnvironment(macCatalyst)
@objc func requestAppExitFromMenu(_: Any?) {
requestApplicationExit()
}
#endif
// new chat with template
@objc func requestNewChatWithTemplateFromMenu(_ sender: UICommand) {
guard let templateIDString = sender.propertyList as? String,
let templateID = UUID(uuidString: templateIDString),
let template = ChatTemplateManager.shared.template(for: templateID)
else { return }
let conversationID = ChatTemplateManager.shared.createConversationFromTemplate(template)
if let mainVC = mainWindow?.rootViewController as? MainController {
ChatSelection.shared.select(conversationID)
mainVC.chatView.use(conversation: conversationID) {
mainVC.chatView.focusEditor()
}
}
}
func requestNewChatWithTemplateFromMenuWithID(_ templateID: String) {
guard let id = UUID(uuidString: templateID),
let template = ChatTemplateManager.shared.template(for: id)
else { return }
let conversationID = ChatTemplateManager.shared.createConversationFromTemplate(template)
if let mainVC = mainWindow?.rootViewController as? MainController {
ChatSelection.shared.select(conversationID)
mainVC.chatView.use(conversation: conversationID) {
mainVC.chatView.focusEditor()
}
}
}
/// conversation related
private func withCurrentConversation(
_ block: (MainController, Conversation.ID, Conversation) -> Void,
) {
guard let mainVC = mainWindow?.rootViewController as? MainController,
let conversationID = mainVC.chatView.conversationIdentifier,
let conversation = ConversationManager.shared.conversation(identifier: conversationID)
else {
return
}
block(mainVC, conversationID, conversation)
}
@objc func deleteConversationFromMenu(_: Any?) {
withCurrentConversation { _, conversationID, _ in
let conversations = ConversationManager.shared.conversations.value.values
let nextIdentifier: Conversation.ID? = {
guard let currentIndex = conversations.firstIndex(where: { $0.id == conversationID }) else {
return nil
}
if currentIndex + 1 < conversations.count {
return conversations[currentIndex + 1].id
} else if currentIndex > 0 {
return conversations[currentIndex - 1].id
} else {
return nil
}
}()
ConversationManager.shared.deleteConversation(identifier: conversationID)
if let nextIdentifier {
ChatSelection.shared.select(nextIdentifier)
}
}
}
/// conversation navigation
@objc func selectPreviousConversationFromMenu(_: Any?) {
withCurrentConversation { mainVC, conversationID, _ in
let list = ConversationManager.shared.conversations.value.values
guard let currentIndex = list.firstIndex(where: { $0.id == conversationID }), currentIndex > 0 else { return }
let previousID = list[currentIndex - 1].id
ChatSelection.shared.select(previousID)
mainVC.chatView.use(conversation: previousID) {
mainVC.chatView.focusEditor()
}
}
}
@objc func selectNextConversationFromMenu(_: Any?) {
withCurrentConversation { mainVC, conversationID, _ in
let list = ConversationManager.shared.conversations.value.values
guard let currentIndex = list.firstIndex(where: { $0.id == conversationID }), currentIndex < list.count - 1 else { return }
let nextID = list[currentIndex + 1].id
ChatSelection.shared.select(nextID)
mainVC.chatView.use(conversation: nextID) {
mainVC.chatView.focusEditor()
}
}
}
@objc func toggleSidebarFromMenu(_: Any?) {
if let mainVC = mainWindow?.rootViewController as? MainController {
mainVC.view.doWithAnimation { mainVC.isSidebarCollapsed.toggle() }
}
}
}
================================================
FILE: FlowDown/Application/AppDelegate.swift
================================================
//
// AppDelegate.swift
// FlowDown
//
// Created by 秋星桥 on 2024/12/31.
//
import AlertController
import ChatClientKit
import CloudKit
import Combine
import ConfigurableKit
import MarkdownView
import MLX
import ScrubberKit
import Storage
import UIKit
@objc(AppDelegate)
class AppDelegate: UIResponder, UIApplicationDelegate {
private var templateMenuCancellable: AnyCancellable?
private var isPresentingExitConfirmation = false
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]? = nil,
) -> Bool {
guard !RecoveryMode.isActivated else { return true }
UITableView.appearance().backgroundColor = .clear
UIButton.appearance().tintColor = .accent
UITextView.appearance().tintColor = .accent
UINavigationBar.appearance().tintColor = .accent
UISwitch.appearance().onTintColor = .accent
UIUserInterfaceStyle.subscribeToConfigurableItem()
StreamAudioEffectSetting.subscribeToConfigurableItem()
#if canImport(ActivityKit) && os(iOS) && !targetEnvironment(macCatalyst)
LiveActivitySetting.subscribeToConfigurableItem()
#endif
_ = SoundEffectPlayer.shared
MLX.GPU.subscribeToConfigurableItem()
EditorBehavior.subscribeToConfigurableItem()
MarkdownTheme.subscribeToConfigurableItem()
ScrubberConfiguration.subscribeToConfigurableItem()
ScrubberConfiguration.setup() // build access control rule
AlertControllerConfiguration.alertImage = .avatar
AlertControllerConfiguration.accentColor = .accent
AlertControllerConfiguration.backgroundColor = .background
AlertControllerConfiguration.separatorColor = SeparatorView.color
DefaultMessageSanitizerConfiguration.placeholderText = String(
localized: "Continue if not finished",
)
templateMenuCancellable = ChatTemplateManager.shared.$templates
.sink { _ in
Task { @MainActor in
UIMenuSystem.main.setNeedsRebuild()
}
}
application.registerForRemoteNotifications()
let isSyncEnabled = SyncEngine.isSyncEnabled
if isSyncEnabled {
Task {
if isSyncEnabled {
try await syncEngine.fetchChanges()
}
}
}
sdb.clearDeletedRecords()
if let firstSeenTicketURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first?
.appendingPathComponent("first_seen_ticket.txt")
{
let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "unknown"
if !FileManager.default.fileExists(atPath: firstSeenTicketURL.path) {
do {
try version.write(to: firstSeenTicketURL, atomically: true, encoding: .utf8)
logger.infoFile("wrote first seen ticket: \(version)")
} catch {
logger.errorFile("failed to write first seen ticket: \(error)")
}
}
}
return true
}
func application(_: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken _: Data) {
guard !RecoveryMode.isActivated else { return }
logger.infoFile("Did register for remote notifications")
}
func application(_: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
guard !RecoveryMode.isActivated else { return }
logger.errorFile("ERROR: Failed to register for notifications: \(error.localizedDescription)")
}
func application(_: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard let notification = CKNotification(fromRemoteNotificationDictionary: userInfo) else {
completionHandler(.noData)
return
}
logger.infoFile("Received cloudkit notification: \(notification)")
guard notification.containerIdentifier == CloudKitConfig.containerIdentifier else {
completionHandler(.noData)
return
}
Task {
do {
logger.infoFile("cloudkit notification fetchChanges")
try await syncEngine.fetchChanges()
completionHandler(.newData)
} catch {
logger.errorFile("cloudkit notification fetchLatestChanges: \(error)")
completionHandler(.failed)
}
}
}
#if targetEnvironment(macCatalyst)
@objc func terminate(_: Any?) {
requestApplicationExit()
}
@objc override func performClose(_: Any?) {
requestApplicationExit()
}
func requestApplicationExit() {
requestProtectedTermination {
terminateApplication()
}
}
private var hasExecutingConversations: Bool {
ConversationSessionManager.shared.hasExecutingSessions
}
private func requestProtectedTermination(_ action: @escaping () -> Void) {
guard hasExecutingConversations else {
action()
return
}
presentExitConfirmationIfNeeded(action: action)
}
private func presentExitConfirmationIfNeeded(action: @escaping () -> Void) {
guard !isPresentingExitConfirmation else { return }
guard let rootViewController = mainWindow?.rootViewController else {
action()
return
}
isPresentingExitConfirmation = true
let alert = AlertViewController(
title: String(localized: "Exit"),
message: String(localized: "Exiting now will interrupt the running conversation."),
) { [weak self] context in
context.addAction(title: String(localized: "Cancel")) {
self?.isPresentingExitConfirmation = false
context.dispose()
}
context.addAction(title: String(localized: "Exit"), attribute: .accent) {
self?.isPresentingExitConfirmation = false
context.dispose {
action()
}
}
}
rootViewController.topMostController.present(alert, animated: true)
}
#endif
}
func terminateApplication() -> Never {
#if targetEnvironment(macCatalyst)
exit(0)
#else
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
Task.detached {
try await Task.sleep(for: .seconds(1))
exit(0)
}
sleep(5)
fatalError()
#endif
}
================================================
FILE: FlowDown/Application/AppEnvironment.swift
================================================
//
// AppEnvironment.swift
// FlowDown
//
// Created by OpenAI Code Assistant on 2/17/25.
//
import Foundation
import Storage
/// Centralizes core services so they can be swapped (for previews/tests) without touching global singletons.
nonisolated enum AppEnvironment {
nonisolated struct Container {
nonisolated let storage: Storage
nonisolated let syncEngine: SyncEngine
}
private static var containerStack: [Container] = []
nonisolated static var isBootstrapped: Bool {
!containerStack.isEmpty
}
nonisolated static var current: Container {
guard let container = containerStack.last else {
fatalError("Call AppEnvironment.bootstrap(_) before accessing dependencies.")
}
return container
}
@discardableResult
nonisolated static func bootstrap(_ container: Container) -> Container {
containerStack = [container]
apply(container)
return container
}
nonisolated static func push(_ container: Container) {
containerStack.append(container)
apply(container)
}
nonisolated static func pop() {
guard containerStack.count > 1 else {
assertionFailure("Attempted to pop the root AppEnvironment container.")
return
}
_ = containerStack.popLast()
if let container = containerStack.last {
apply(container)
}
}
private nonisolated static func apply(_ container: Container) {
Storage.setSyncEngine(container.syncEngine)
}
}
nonisolated extension AppEnvironment.Container {
nonisolated static func live() throws -> AppEnvironment.Container {
let storage = try Storage.db()
let isRunningTests = ProcessInfo.processInfo.environment["XCTestConfigurationFilePath"] != nil
let shouldUseMockSync = isRunningTests
let shouldEnableCloudSync = SyncEngine.isCloudSyncSupported
if !shouldEnableCloudSync || shouldUseMockSync {
SyncEngine.setSyncEnabled(false)
}
let mode: SyncEngine.Mode = shouldUseMockSync ? .mock : .live
let automaticallySync = shouldUseMockSync ? false : shouldEnableCloudSync
#if DEBUG
let infoDic = Bundle.main.infoDictionary
let value = infoDic?["UIApplicationSupportsMultipleScenes"] as? Bool
assert(value == false)
#endif
let syncEngine = SyncEngine(
storage: storage,
containerIdentifier: CloudKitConfig.containerIdentifier,
mode: mode,
automaticallySync: automaticallySync,
)
return .init(storage: storage, syncEngine: syncEngine)
}
}
/// Convenience accessors to keep existing call sites small.
nonisolated var sdb: Storage {
AppEnvironment.current.storage
}
nonisolated var syncEngine: SyncEngine {
AppEnvironment.current.syncEngine
}
================================================
FILE: FlowDown/Application/RecoveryMode.swift
================================================
//
// RecoveryMode.swift
// FlowDown
//
// Created by qaq on 9/12/2025.
//
import Foundation
import SwiftUI
import UIKit
enum RecoveryMode {
private(set) static var isActivated = false
private(set) static var error: Error?
static func launch(with error: Error) -> Never {
self.error = error
isActivated = true // 在存在 user default 的情况下 window group 可能不会被使用
UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, nil)
fatalError()
}
static func resetApplication() -> Never {
debugPrint("\(#file) \(#function) \(self)")
do {
// make sure sandbox is enabled otherwise panic the app
let sandboxTestDir = URL(fileURLWithPath: "/tmp/sandbox.test.\(UUID().uuidString)")
FileManager.default.createFile(atPath: sandboxTestDir.path, contents: nil, attributes: nil)
if FileManager.default.fileExists(atPath: sandboxTestDir.path) {
fatalError("this app should not run outside of sandbox which may cause trouble.")
}
}
let domain = Bundle.main.bundleIdentifier!
UserDefaults.resetStandardUserDefaults()
UserDefaults.standard.removePersistentDomain(forName: domain)
UserDefaults.standard.synchronize()
debugPrint(Array(UserDefaults.standard.dictionaryRepresentation().keys).count)
let documents = FileManager
.default
.urls(for: .documentDirectory, in: .userDomainMask)
let libraries = FileManager
.default
.urls(for: .libraryDirectory, in: .userDomainMask)
let caches = FileManager
.default
.urls(for: .cachesDirectory, in: .userDomainMask)
let trashs = FileManager
.default
.urls(for: .trashDirectory, in: .userDomainMask)
for dir in documents + libraries + caches + trashs {
try? FileManager.default.removeItem(at: dir)
}
terminateApplication()
}
}
class RecoveryModeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
let powerButton = UIImageView()
powerButton.image = .init(systemName: "power.circle.fill")
powerButton.tintColor = .gray.withAlphaComponent(0.025)
powerButton.contentMode = .scaleAspectFit
view.addSubview(powerButton)
powerButton.snp.makeConstraints { x in
x.height.lessThanOrEqualTo(500)
x.height.lessThanOrEqualToSuperview().inset(50)
x.width.lessThanOrEqualTo(500)
x.width.lessThanOrEqualToSuperview().inset(50)
x.center.equalToSuperview()
}
let recoverText =
"""
There seems to be a problem with the application. You can reset or restart it.
Il semble y avoir un problème avec l'application. Vous pouvez la réinitialiser ou la redémarrer.
Es scheint ein Problem mit der Anwendung zu geben. Sie können sie zurücksetzen oder neu starten.
Parece que hay un problema con la aplicación. Puedes restablecerla o reiniciarla.
アプリケーションに問題が発生したようです。リセットまたは再起動を選択できます。
应用程序似乎出了问题。您可以选择重置或重新启动。
\(RecoveryMode.error?.localizedDescription ?? "")
"""
.trimmingCharacters(in: .whitespacesAndNewlines)
let label = UILabel()
label.numberOfLines = 0
label.backgroundColor = .clear
label.attributedText = .init(string: recoverText, attributes: [
.paragraphStyle: {
let style = NSMutableParagraphStyle()
style.alignment = .center
style.lineSpacing = 2
style.paragraphSpacing = 8
return style
}(),
.font: UIFont.preferredFont(forTextStyle: .footnote),
])
view.addSubview(label)
label.snp.makeConstraints { x in
x.center.equalToSuperview()
x.width.lessThanOrEqualTo(350)
x.width.lessThanOrEqualToSuperview().inset(50)
x.height.lessThanOrEqualToSuperview().inset(50)
}
let resetButton = UIButton()
resetButton.setImage(.init(systemName: "trash.fill"), for: .normal)
resetButton.tintColor = .systemRed
resetButton.addTarget(self, action: #selector(resetApplication), for: .touchUpInside)
view.addSubview(resetButton)
resetButton.snp.makeConstraints { x in
x.left.equalTo(label.snp.left)
x.top.equalTo(label.snp.bottom).offset(50)
x.width.equalTo(50)
x.height.equalTo(50)
}
let rebootButton = UIButton()
rebootButton.setImage(.init(systemName: "stop.fill"), for: .normal)
rebootButton.tintColor = .systemBlue
rebootButton.addTarget(self, action: #selector(terminate), for: .touchUpInside)
view.addSubview(rebootButton)
rebootButton.snp.makeConstraints { x in
x.right.equalTo(label.snp.right)
x.top.equalTo(label.snp.bottom).offset(50)
x.width.equalTo(50)
x.height.equalTo(50)
}
}
@objc
func resetApplication() {
RecoveryMode.resetApplication()
}
@objc func terminate() {
terminateApplication()
}
}
================================================
FILE: FlowDown/Application/SceneDelegate.swift
================================================
//
// SceneDelegate.swift
// FlowDown
//
// Created by 秋星桥 on 2024/12/31.
//
import Combine
import ConfigurableKit
import FlowDownModelExchange
import MLX
import Storage
import UIKit
@objc(SceneDelegate)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var cancellables = Set<AnyCancellable>()
lazy var mainController = MainController()
func scene(
_ scene: UIScene, willConnectTo _: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions,
) {
guard let windowScene = (scene as? UIWindowScene) else { return }
#if targetEnvironment(macCatalyst)
if let titlebar = windowScene.titlebar {
titlebar.titleVisibility = .hidden
titlebar.toolbar = nil
}
windowScene.sizeRestrictions?.minimumSize = CGSize(width: 650, height: 650)
#endif
let window = UIWindow(windowScene: windowScene)
defer {
window.makeKeyAndVisible()
self.window = window
}
if RecoveryMode.isActivated {
window.rootViewController = RecoveryModeViewController()
} else {
window.rootViewController = mainController
ModelExchangeCoordinator.shared.registerPresenter(mainController)
UIUserInterfaceStyle.reapplyConfiguredStyle()
for urlContext in connectionOptions.urlContexts {
handleIncomingURL(urlContext.url)
}
}
}
func scene(_: UIScene, openURLContexts contexts: Set<UIOpenURLContext>) {
guard !RecoveryMode.isActivated else { return }
for urlContext in contexts {
handleIncomingURL(urlContext.url)
}
}
func sceneWillEnterForeground(_: UIScene) {
guard !RecoveryMode.isActivated else { return }
UIUserInterfaceStyle.reapplyConfiguredStyle()
MLX.GPU.onApplicationBecomeActivate()
#if canImport(ActivityKit) && os(iOS) && !targetEnvironment(macCatalyst)
if #available(iOS 16.2, *) {
LiveActivityService.shared.appDidEnterForeground()
}
#endif
}
func sceneWillResignActive(_: UIScene) {
guard !RecoveryMode.isActivated else { return }
MLX.GPU.onApplicationResignActivate()
#if canImport(ActivityKit) && os(iOS) && !targetEnvironment(macCatalyst)
if #available(iOS 16.2, *) {
LiveActivityService.shared.appWillEnterBackground()
}
#endif
}
func sceneDidDisconnect(_: UIScene) {
#if targetEnvironment(macCatalyst)
guard !RecoveryMode.isActivated else { return }
Task { @MainActor in
try? await Task.sleep(for: .milliseconds(200))
let remainingWindowScenes = UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
guard remainingWindowScenes.isEmpty else { return }
exit(0)
}
#endif
}
}
private extension SceneDelegate {
func handleIncomingURL(_ url: URL) {
switch url.scheme {
case "file":
switch url.pathExtension {
case "fdmodel", "plist":
importModel(from: url)
case "fdtemplate":
importTemplate(from: url)
case "fdmcp":
importMCPServer(from: url)
default: break // dont know how
}
case "flowdown":
handleFlowDownURL(url)
default:
break
}
}
func importModel(from url: URL) {
_ = url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
try? FileManager.default.startDownloadingUbiquitousItem(at: url)
do {
let model = try ModelManager.shared.importCloudModel(at: url)
mainController.queueBootMessage(
text: "Successfully imported model \(model.auxiliaryIdentifier)",
)
} catch {
mainController.queueBootMessage(
text: "Failed to import model: \(error.localizedDescription)",
)
}
}
func importTemplate(from url: URL) {
_ = url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
try? FileManager.default.startDownloadingUbiquitousItem(at: url)
do {
let data = try Data(contentsOf: url)
Task { @MainActor in
do {
let template = try ChatTemplateManager.shared.importTemplate(from: data)
mainController.queueBootMessage(text: "Successfully imported \(template.name)")
} catch {
Logger.app.errorFile("failed to import template from URL: \(url), error: \(error)")
mainController.queueBootMessage(
text: "Failed to import template: \(error.localizedDescription)",
)
}
}
} catch {
Logger.app.errorFile("failed to import template from URL: \(url), error: \(error)")
mainController.queueBootMessage(
text: "Failed to import template: \(error.localizedDescription)",
)
}
}
func importMCPServer(from url: URL) {
_ = url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
try? FileManager.default.startDownloadingUbiquitousItem(at: url)
do {
let data = try Data(contentsOf: url)
Task { @MainActor in
do {
let server = try MCPService.shared.importServer(from: data)
let serverName = if let serverUrl = URL(string: server.endpoint), let host = serverUrl.host {
host
} else if !server.name.isEmpty {
server.name
} else {
String(localized: "MCP Server")
}
mainController.queueBootMessage(
text: "Successfully imported MCP server \(serverName)",
)
} catch {
Logger.app.errorFile("failed to import MCP server from URL: \(url), error: \(error)")
mainController.queueBootMessage(
text: "Failed to import MCP server: \(error.localizedDescription)",
)
}
}
} catch {
Logger.app.errorFile("failed to import MCP server from URL: \(url), error: \(error)")
mainController.queueBootMessage(
text: "Failed to import MCP server: \(error.localizedDescription)",
)
}
}
func handleFlowDownURL(_ url: URL) {
Logger.app.infoFile("handling incoming message: \(url)")
if let handled = ModelExchangeAPI.resolveInputScheme(url) {
if handled == false {
mainController.queueBootMessage(
text: "Model exchange request failed validation",
)
}
return
}
guard let host = url.host(), !host.isEmpty else { return }
switch host {
case "new": handleNewMessageURL(url)
default: break
}
}
func handleNewMessageURL(_ url: URL) {
let pathComponents = url.pathComponents
guard pathComponents.count >= 2 else { return }
let encodedMessage = pathComponents[1]
let message = encodedMessage.removingPercentEncoding?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
mainController.queueNewConversation(text: message, shouldSend: !message.isEmpty)
}
}
================================================
FILE: FlowDown/Application/Value+DialTuneMode.swift
================================================
//
// Value+DialTuneMode.swift
// FlowDown
//
// Created by AI on 1/6/26.
//
import Combine
import ConfigurableKit
import Foundation
enum StreamAudioEffectSetting: Int, CaseIterable {
case off = 0
case random = 11
case custom = 12
var icon: String {
switch self {
case .off: "speaker.slash"
case .random: "shuffle"
case .custom: "music.note"
}
}
var title: String.LocalizationValue {
switch self {
case .off: "Off"
case .random: "Random Dial Tone"
case .custom: "Custom Audio"
}
}
var audioIndex: Int? {
switch self {
case .off: nil
case .random: Int.random(in: 0 ... 9)
case .custom: nil
}
}
}
extension StreamAudioEffectSetting {
static let storageKey = "app.audio.stream.effect"
private static var cancellables: Set<AnyCancellable> = []
static let configurableObject: ConfigurableObject = .init(
icon: "speaker.wave.2",
title: "Audio Feedback",
explain: "Play audio feedback during inference output. This helps determine if a task is complete when running in the background.",
key: storageKey,
defaultValue: StreamAudioEffectSetting.off.rawValue,
annotation: .menu {
StreamAudioEffectSetting.allCases.map { item -> MenuAnnotation.Option in
.init(
icon: item.icon,
title: item.title,
rawValue: item.rawValue,
)
}
},
)
static func subscribeToConfigurableItem() {
assert(cancellables.isEmpty)
ConfigurableKit.publisher(forKey: storageKey, type: Int.self)
.sink { _ in
Task { @MainActor in
SoundEffectPlayer.shared.updateMode()
}
}
.store(in: &cancellables)
}
static func configuredMode() -> StreamAudioEffectSetting {
guard
let rawValue: Int = ConfigurableKit.value(forKey: storageKey),
let mode = StreamAudioEffectSetting(rawValue: rawValue)
else {
return .off
}
return mode
}
}
================================================
FILE: FlowDown/Application/Value+EditorBehavior.swift
================================================
//
// Value+EditorBehavior.swift
// FlowDown
//
// Created by 秋星桥 on 2/22/25.
//
import Combine
import ConfigurableKit
import Foundation
extension EditorBehavior {
static let pasteAsFileStorageKey = "app.editor.paste.as.file"
static let compressImageStorageKey = "app.editor.compress.image"
static let useConfirmationOnSendKey = "app.editor.confirmation.on.send"
private static var cancellables: Set<AnyCancellable> = []
static let useConfirmationOnSendConfigurableObject: ConfigurableObject = .init(
icon: "checkmark.circle",
title: "Confirmation on Send",
explain: "Enable this to require Command + Enter to send message. On touch devices, you will need to tap the send button manually.",
key: useConfirmationOnSendKey,
defaultValue: false,
annotation: .toggle,
)
static let pasteAsFileConfigurableObject: ConfigurableObject = .init(
icon: "doc.text",
title: "Paste as File",
explain: "When enabled, large content pasted into the editor will be attached as a file. You can tap on the file to edit it.",
key: pasteAsFileStorageKey,
defaultValue: true,
annotation: .toggle,
)
static let compressImageConfigurableObject: ConfigurableObject = .init(
icon: "text.below.photo",
title: "Compress Image",
explain: "If enabled, images will be compressed before added to chat. Compressed image will be easier to upload but may lose some quality.",
key: compressImageStorageKey,
defaultValue: true,
annotation: .toggle,
)
static func subscribeToConfigurableItem() {
assert(cancellables.isEmpty)
ConfigurableKit.publisher(forKey: useConfirmationOnSendKey, type: Bool.self)
.sink { input in
guard let input else { return }
Logger.ui.debugFile("applying editor behavior: confirmation on send: \(input)")
useConfirmationOnSend = input
}
.store(in: &cancellables)
ConfigurableKit.publisher(forKey: pasteAsFileStorageKey, type: Bool.self)
.sink { input in
guard let input else { return }
Logger.ui.debugFile("applying editor behavior: paste as file: \(input)")
pasteLargeTextContentAsFile = input
}
.store(in: &cancellables)
ConfigurableKit.publisher(forKey: compressImageStorageKey, type: Bool.self)
.sink { input in
guard let input else { return }
Logger.ui.debugFile("applying editor behavior: compress image: \(input)")
compressImage = input
}
.store(in: &cancellables)
}
}
================================================
FILE: FlowDown/Application/Value+LiveActivity.swift
================================================
//
// Value+LiveActivity.swift
// FlowDown
//
// Created by AI on 1/6/26.
//
import Combine
import ConfigurableKit
import Foundation
enum LiveActivitySetting {
static let storageKey = "app.liveactivity.enabled"
private static var cancellables: Set<AnyCancellable> = []
static let configurableObject: ConfigurableObject = .init(
icon: "bolt.horizontal.circle",
title: "Enable Live Activity",
explain: "Show a Live Activity while streaming in the background.",
key: storageKey,
defaultValue: false,
annotation: .toggle,
)
static func isEnabled() -> Bool {
(ConfigurableKit.value(forKey: storageKey) as Bool?) ?? false
}
static func setEnabled(_ enabled: Bool) {
ConfigurableKit.set(value: enabled, forKey: storageKey)
}
static func subscribeToConfigurableItem() {
assert(cancellables.isEmpty)
// Keep Live Activity toggle consistent with Audio Feedback.
ConfigurableKit.publisher(forKey: StreamAudioEffectSetting.storageKey, type: Int.self)
.ensureMainThread()
.sink { rawValue in
let mode = StreamAudioEffectSetting(rawValue: rawValue ?? StreamAudioEffectSetting.off.rawValue) ?? .off
if mode == .off {
LiveActivitySetting.setEnabled(false)
}
}
.store(in: &cancellables)
// When the toggle itself changes, refresh Live Activity state.
ConfigurableKit.publisher(forKey: storageKey, type: Bool.self)
.ensureMainThread()
.sink { _ in
Task { @MainActor in
ConversationSessionManager.shared.refreshLiveActivity()
}
}
.store(in: &cancellables)
}
}
================================================
FILE: FlowDown/Application/Value+MLX.swift
================================================
//
// Value+MLX.swift
// FlowDown
//
// Created by 秋星桥 on 1/31/25.
//
import Combine
import ConfigurableKit
import Foundation
import MLX
import UIKit
extension MLX.GPU {
static let storageKey = "wiki.qaq.MLX.GPU.cacheSize"
static var cancellables = Set<AnyCancellable>()
static let isSupportedKey = "Device.isMlxSupported"
static var isSupported: Bool {
ConfigurableKit.value(forKey: isSupportedKey) ?? false
}
enum CacheSizeLimit: String, CaseIterable {
case notAllowed
case allowedInForeground
#if targetEnvironment(macCatalyst)
case unrestricted
#endif
var title: String.LocalizationValue {
switch self {
case .notAllowed: return "Not Allowed"
case .allowedInForeground: return "Allowed in Foreground"
#if targetEnvironment(macCatalyst)
case .unrestricted: return "Unrestricted"
#endif
}
}
}
static let configurableObject: ConfigurableObject = .init(
icon: "aqi.medium",
title: "Inference Cache",
explain: "Set the strategy for handling runtime resource cache. Allowing the use of cache can speed up inference and save energy, but may cause the software to close unexpectedly.",
key: storageKey,
defaultValue: CacheSizeLimit.notAllowed.rawValue,
annotation: .menu {
CacheSizeLimit.allCases.map { item in
MenuAnnotation.Option(title: item.title, rawValue: item.rawValue)
}
},
availabilityRequirement: .match(key: isSupportedKey, value: true),
)
static func subscribeToConfigurableItem() {
#if targetEnvironment(simulator) || arch(x86_64)
return
#else
assert(cancellables.isEmpty)
let value: String? = ConfigurableKit.value(forKey: Self.storageKey)
if value == nil { ConfigurableKit.set(value: CacheSizeLimit.notAllowed.rawValue, forKey: Self.storageKey) }
ConfigurableKit.publisher(forKey: storageKey, type: String.self)
.sink { _ in onApplicationBecomeActivate() }
.store(in: &cancellables)
#endif
}
static func onApplicationResignActivate() {
guard isSupported else { return }
let value: String = ConfigurableKit.value(forKey: storageKey) ?? ""
let limit = CacheSizeLimit(rawValue: value) ?? .notAllowed
switch limit {
case .notAllowed:
MLX.Memory.cacheLimit = 0
MLX.Memory.clearCache()
case .allowedInForeground:
MLX.Memory.cacheLimit = 0
MLX.Memory.clearCache()
#if targetEnvironment(macCatalyst)
case .unrestricted:
MLX.Memory.cacheLimit = .max
#endif
}
}
static func onApplicationBecomeActivate() {
guard isSupported else { return }
let value: String = ConfigurableKit.value(forKey: storageKey) ?? ""
let limit = CacheSizeLimit(rawValue: value) ?? .notAllowed
switch limit {
case .notAllowed:
MLX.Memory.cacheLimit = 0
MLX.Memory.clearCache()
case .allowedInForeground:
MLX.Memory.cacheLimit = .max
#if targetEnvironment(macCatalyst)
case .unrestricted:
MLX.Memory.cacheLimit = .max
#endif
}
}
}
================================================
FILE: FlowDown/Application/Value+MarkdownTheme.swift
================================================
//
// Value+MarkdownTheme.swift
// FlowDown
//
// Created by 秋星桥 on 1/26/25.
//
import Combine
import ConfigurableKit
import Foundation
import MarkdownView
extension MarkdownTheme.FontScale {
var title: String.LocalizationValue {
switch self {
case .tiny: "Tiny"
case .small: "Small"
case .middle: "Middle"
case .large: "Large"
case .huge: "Huge"
}
}
}
extension MarkdownTheme {
static let storageKey = "app.appearance.MarkdownTheme.font.scale"
private static var cancellables: Set<AnyCancellable> = []
static let fontScaleDidChange = PassthroughSubject<Void, Never>()
static let configurableObject: ConfigurableObject = .init(
icon: "wand.and.rays",
title: "Font Size",
explain: "Adjust the font size of the markdown content.",
key: storageKey,
defaultValue: MarkdownTheme.FontScale.middle.rawValue,
annotation: .menu {
MarkdownTheme.FontScale.allCases.map { input in
MenuAnnotation.Option(
icon: "circle",
title: input.title,
rawValue: input.rawValue,
)
}
},
)
@MainActor
static func subscribeToConfigurableItem() {
assert(cancellables.isEmpty)
ConfigurableKit.publisher(forKey: storageKey, type: String.self)
.receive(on: RunLoop.main)
.sink { input in
guard let input,
let scale = MarkdownTheme.FontScale(rawValue: input)
else { return }
Logger.ui.debugFile("applying font scale to markdown fonts: \(scale)")
MarkdownTheme.default.scaleFont(by: scale)
fontScaleDidChange.send(())
}
.store(in: &cancellables)
}
}
================================================
FILE: FlowDown/Application/Value+Memory.swift
================================================
//
// Value+Memory.swift
// FlowDown
//
// Created by GPT-5 Codex on 11/6/25.
//
import ConfigurableKit
import Foundation
enum MemoryProactiveProvisionScope: String, CaseIterable, Codable {
case off
case pastDay
case pastWeek
case pastMonth
case pastYear
case recent15
case recent30
case all
var icon: String {
switch self {
case .off:
"nosign"
case .pastDay:
"sun.max"
case .pastWeek:
"calendar"
case .pastMonth:
"calendar"
case .pastYear:
"calendar.badge.clock"
case .recent15:
"list.number"
case .recent30:
"list.number"
case .all:
"tray.full"
}
}
var title: String.LocalizationValue {
switch self {
case .off:
"Off"
case .pastDay:
"Past Day"
case .pastWeek:
"Past Week"
case .pastMonth:
"Past Month"
case .pastYear:
"Past Year"
case .recent15:
"Latest 15 Items"
case .recent30:
"Latest 30 Items"
case .all:
"All Memories"
}
}
var briefDescription: String.LocalizationValue {
switch self {
case .off:
"Proactive memory sharing is disabled."
case .pastDay:
"Memories saved within the past 24 hours."
case .pastWeek:
"Memories saved within the past 7 days."
case .pastMonth:
"Memories saved within the past 30 days."
case .pastYear:
"Memories saved within the past year."
case .recent15:
"The most recent 15 memories."
case .recent30:
"The most recent 30 memories."
case .all:
"All stored memories."
}
}
enum Filter {
case none
case timeInterval(TimeInterval)
case count(Int)
case all
}
var filter: Filter {
switch self {
case .off:
.none
case .pastDay:
.timeInterval(24 * 60 * 60)
case .pastWeek:
.timeInterval(7 * 24 * 60 * 60)
case .pastMonth:
.timeInterval(30 * 24 * 60 * 60)
case .pastYear:
.timeInterval(365 * 24 * 60 * 60)
case .recent15:
.count(15)
case .recent30:
.count(30)
case .all:
.all
}
}
}
enum MemoryProactiveProvisionSetting {
static let storageKey = "app.memory.proactive.provision.scope"
static let configurableObject: ConfigurableObject = .init(
icon: "brain.head.profile",
title: "Proactive Memory Context",
explain: "Choose how we proactively shares stored memories with the model during conversations and automations. This includes system Shortcuts.",
key: storageKey,
defaultValue: MemoryProactiveProvisionScope.recent30.rawValue,
annotation: .menu {
MemoryProactiveProvisionScope.allCases.map { scope in
.init(
icon: scope.icon,
title: scope.title,
rawValue: scope.rawValue,
)
}
},
)
static var currentScope: MemoryProactiveProvisionScope {
let raw: String? = ConfigurableKit.value(forKey: storageKey)
if let raw, let scope = MemoryProactiveProvisionScope(rawValue: raw) {
return scope
}
return .recent30
}
static func shouldInjectRecentConversationContext(
for scope: MemoryProactiveProvisionScope,
) -> Bool {
scope != .off
}
static var shouldInjectRecentConversationContext: Bool {
shouldInjectRecentConversationContext(for: currentScope)
}
}
================================================
FILE: FlowDown/Application/Value+ScrubberConfiguration.swift
================================================
//
// Value+ScrubberConfiguration.swift
// FlowDown
//
// Created by 秋星桥 on 2/22/25.
//
import Combine
import ConfigurableKit
import Foundation
import ScrubberKit
nonisolated(unsafe) extension ScrubberConfiguration {
static let googleEnabledKey = "app.scrubber.engine.google.enabled"
static let duckduckgoEnabledKey = "app.scrubber.engine.duckduckgo.enabled"
static let yahooEnabledKey = "app.scrubber.engine.yahoo.enabled"
static let bingEnabledKey = "app.scrubber.engine.bing.enabled"
static let limitKey = "app.scrubber.engine.limit"
private static var cancellables: Set<AnyCancellable> = []
static let engineConfigChanged: PassthroughSubject<Void, Never> = .init()
nonisolated(unsafe) static let googleEnabledConfigurableObject: ConfigurableObject = .init(
icon: "sparkle.magnifyingglass",
title: "Google Search",
explain: "Web search will fetch results from Google if enabled.",
key: googleEnabledKey,
defaultValue: true,
annotation: .toggle,
)
nonisolated(unsafe) static let duckduckgoEnabledConfigurableObject: ConfigurableObject = .init(
icon: "sparkle.magnifyingglass",
title: "Duck Duck Go Search",
explain: "Web search will fetch results from Duck Duck Go if enabled.",
key: duckduckgoEnabledKey,
defaultValue: true,
annotation: .toggle,
)
nonisolated(unsafe) static let yahooEnabledConfigurableObject: ConfigurableObject = .init(
icon: "sparkle.magnifyingglass",
title: "Yahoo Search",
explain: "Web search will fetch results from Yahoo if enabled.",
key: yahooEnabledKey,
defaultValue: true,
annotation: .toggle,
)
nonisolated(unsafe) static let bingEnabledConfigurableObject: ConfigurableObject = .init(
icon: "sparkle.magnifyingglass",
title: "Bing Search",
explain: "Web search will fetch results from Bing if enabled.",
key: bingEnabledKey,
defaultValue: true,
annotation: .toggle,
)
nonisolated(unsafe) static let limitConfigurableObject: ConfigurableObject = .init(
icon: "number.circle",
title: "Search Limit",
explain: "The maximum number of search results to fetch.",
key: limitKey,
defaultValue: 20,
annotation: .menu { [
.init(title: "5 Pages", rawValue: 5),
.init(title: "10 Pages", rawValue: 10),
.init(title: "15 Pages", rawValue: 15),
.init(title: "20 Pages", rawValue: 20),
.init(title: "Unlimited Pages", rawValue: 100),
] },
)
static var limitConfigurableObjectValue: Int {
ConfigurableKit.value(forKey: limitKey) ?? 20
}
@MainActor
static func subscribeToConfigurableItem() {
assert(cancellables.isEmpty)
let publisher: AnyPublisher<(Bool, Bool, Bool, Bool), Never> = Publishers.CombineLatest4(
ConfigurableKit.publisher(forKey: googleEnabledKey, type: Bool.self)
.compactMap { $0 ?? true }
.eraseToAnyPublisher(),
ConfigurableKit.publisher(forKey: duckduckgoEnabledKey, type: Bool.self)
.compactMap { $0 ?? true }
.eraseToAnyPublisher(),
ConfigurableKit.publisher(forKey: yahooEnabledKey, type: Bool.self)
.compactMap { $0 ?? true }
.eraseToAnyPublisher(),
ConfigurableKit.publisher(forKey: bingEnabledKey, type: Bool.self)
.compactMap { $0 ?? true }
.eraseToAnyPublisher(),
)
.eraseToAnyPublisher()
let disabledEnginesPublisher = publisher
.map { g, d, y, b in
var disabledEnginesBuilder: Set<ScrubEngine> = []
if !g { disabledEnginesBuilder.insert(.google) }
if !d { disabledEnginesBuilder.insert(.duckduckgo) }
if !y { disabledEnginesBuilder.insert(.yahoo) }
if !b { disabledEnginesBuilder.insert(.bing) }
return disabledEnginesBuilder
}
.eraseToAnyPublisher()
disabledEnginesPublisher
.ensureMainThread()
.sink { input in
if input.count == ScrubEngine.allCases.count {
disabledEngines = []
ConfigurableKit.set(value: true, forKey: googleEnabledKey)
} else {
disabledEngines = input
}
}
.store(in: &cancellables)
}
}
================================================
FILE: FlowDown/Application/Value+UserInterfaceStyle.swift
================================================
//
// Value+UserInterfaceStyle.swift
// FlowDown
//
// Created by 秋星桥 on 1/26/25.
//
import Combine
import ConfigurableKit
import Foundation
import UIKit
extension UIUserInterfaceStyle {
static var cases: [UIUserInterfaceStyle] = [
.light,
.dark,
.unspecified,
]
var icon: String {
switch self {
case .light: "sun.max"
case .dark: "moon"
case .unspecified: "circle"
@unknown default: "circle"
}
}
var title: String.LocalizationValue {
switch self {
case .light: "Light"
case .dark: "Dark"
case .unspecified: "System"
@unknown default: "System"
}
}
var catalystAppearance: NSObject? {
switch self {
case .light:
(NSClassFromString("NSAppearance") as? NSObject.Type)?
.perform(NSSelectorFromString("appearanceNamed:"), with: "NSAppearanceNameAqua")?
.takeUnretainedValue() as? NSObject
case .dark:
(NSClassFromString("NSAppearance") as? NSObject.Type)?
.perform(NSSelectorFromString("appearanceNamed:"), with: "NSAppearanceNameDarkAqua")?
.takeUnretainedValue() as? NSObject
default: nil
}
}
}
extension UIUserInterfaceStyle {
static let storageKey = "app.appearance.UIUserInterfaceStyle"
private static var cancellables: Set<AnyCancellable> = []
static let configurableObject: ConfigurableObject = .init(
icon: "lightbulb",
title: "Appearance",
explain: "Override system appearance, either light or dark.",
key: storageKey,
defaultValue: UIUserInterfaceStyle.unspecified.rawValue,
annotation: .menu {
UIUserInterfaceStyle.cases.map { item -> MenuAnnotation.Option in
.init(
icon: item.icon,
title: item.title,
rawValue: item.rawValue,
)
}
},
)
static func subscribeToConfigurableItem() {
assert(cancellables.isEmpty)
ConfigurableKit.publisher(forKey: storageKey, type: Int.self)
.sink { input in
var style: UIUserInterfaceStyle = .unspecified
if let input, let value = UIUserInterfaceStyle(rawValue: input) {
style = value
}
UIView.animate(withDuration: 0.25) {
apply(style: style)
}
}
.store(in: &cancellables)
reapplyConfiguredStyle()
}
static func apply(style: Self) {
#if targetEnvironment(macCatalyst)
let appearance = style.catalystAppearance
let setAppearanceSelector = Selector(("setAppearance:"))
guard let app = (NSClassFromString("NSApplication") as? NSObject.Type)?
.value(forKey: "sharedApplication") as? NSObject,
app.responds(to: setAppearanceSelector)
else { return }
app.perform(setAppearanceSelector, with: appearance)
#else
UIApplication.shared.connectedScenes
.compactMap { $0 as? UIWindowScene }
.flatMap(\.windows)
.forEach { $0.overrideUserInterfaceStyle = style }
#endif
}
static func configuredStyle() -> UIUserInterfaceStyle {
guard
let rawValue: Int = ConfigurableKit.value(forKey: storageKey),
let style = UIUserInterfaceStyle(rawValue: rawValue)
else {
return .unspecified
}
return style
}
static func reapplyConfiguredStyle() {
apply(style: configuredStyle())
}
}
================================================
FILE: FlowDown/Backend/Audio/SoundEffectPlayer.swift
================================================
//
// SoundEffectPlayer.swift
// FlowDown
//
// Created by AI on 1/6/26.
//
import AVFoundation
import ConfigurableKit
import Foundation
@MainActor
class SoundEffectPlayer: NSObject {
static let shared = SoundEffectPlayer()
static let customAudioDirectoryName = "Audio"
static let customAudioFileName = "streaming_audio_effect.m4a"
private var audioPlayers: [AVAudioPlayer] = []
private var customPlayer: AVAudioPlayer?
private var currentMode: StreamAudioEffectSetting = .off
private var timer: Timer?
private var tik: Int = 0
private var tok: Int = 0
override private init() {
super.init()
let timer = Timer(timeInterval: 0.2, repeats: true) { [weak self] _ in
MainActor.assumeIsolated {
self?.timerTick()
}
}
self.timer = timer
RunLoop.main.add(timer, forMode: .common)
updateMode()
Task.detached { await self.preloadAudioFiles() }
}
deinit {
timer?.invalidate()
timer = nil
}
private nonisolated func preloadAudioFiles() async {
var players: [AVAudioPlayer] = []
for i in 0 ... 9 {
guard let url = Bundle.main.url(
forResource: "dial_tune_\(i)",
withExtension: "m4a",
subdirectory: "DialTune",
) else {
assertionFailure()
continue
}
do {
let player = try AVAudioPlayer(contentsOf: url)
player.prepareToPlay()
players.append(player)
} catch {
logger.error("Failed to load audio file dial_tune_\(i): \(error)")
assertionFailure()
}
}
let list = players
await MainActor.run { self.audioPlayers = list }
await loadCustomAudio()
}
private nonisolated func loadCustomAudio() async {
guard let url = await Self.customAudioURL(),
FileManager.default.fileExists(atPath: url.path)
else {
await MainActor.run { self.customPlayer = nil }
return
}
do {
let player = try AVAudioPlayer(contentsOf: url)
player.prepareToPlay()
await MainActor.run { self.customPlayer = player }
} catch {
logger.error("failed to load custom sound effect: \(error)")
await MainActor.run { self.customPlayer = nil }
}
}
func reloadCustomAudio() {
Task.detached { [weak self] in
await self?.loadCustomAudio()
}
}
func updateMode() {
currentMode = StreamAudioEffectSetting.configuredMode()
let isActivated = switch currentMode {
case .off: false
default: true
}
do {
let session = AVAudioSession.sharedInstance()
try session.setCategory(.playback, mode: .default, options: [.mixWithOthers])
try session.setActive(isActivated)
logger.info("setting audio session to \(isActivated)")
} catch {
logger.error("failed to set audio session mode \(error.localizedDescription)")
}
}
func play() {
guard currentMode != .off else { return }
tik += 1
}
private func timerTick() {
if currentMode == .custom {
guard let player = customPlayer else { return }
guard tik > tok else { return }
tok = tik
player.currentTime = 0
player.play()
return
}
guard let audioIndex = currentMode.audioIndex,
audioIndex >= 0,
audioIndex < audioPlayers.count
else { return }
guard tik > tok else { return }
tok = tik
let player = audioPlayers[audioIndex]
player.currentTime = 0
player.play()
}
}
extension SoundEffectPlayer {
static func customAudioDirectory() -> URL? {
FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
.first?
.appendingPathComponent(customAudioDirectoryName, isDirectory: true)
}
static func customAudioURL() -> URL? {
customAudioDirectory()?
.appendingPathComponent(customAudioFileName)
}
static func ensureCustomAudioDirectory() throws -> URL {
enum AudioFileError: LocalizedError {
case missingDocumentsDirectory // won't happen
}
guard let directory = customAudioDirectory() else {
throw AudioFileError.missingDocumentsDirectory
}
if !FileManager.default.fileExists(atPath: directory.path) {
try FileManager.default.createDirectory(
at: directory,
withIntermediateDirectories: true,
)
}
return directory
}
}
================================================
FILE: FlowDown/Backend/ChatTemplate/ChatTemplate.swift
================================================
//
// ChatTemplate.swift
// FlowDown
//
// Created by 秋星桥 on 6/28/25.
//
import Foundation
import UIKit
struct ChatTemplate: Identifiable, Codable, Equatable {
var id: UUID = .init()
var name: String = .init(localized: "Template")
var avatar: Data = "😶".textToImage(size: 64)?.pngData() ?? .init()
var prompt: String = .init(localized: "Please help me to...")
var inheritApplicationPrompt: Bool = true
func with(_ modification: (inout ChatTemplate) -> Void) -> ChatTemplate {
var template = self
modification(&template)
return template
}
}
================================================
FILE: FlowDown/Backend/ChatTemplate/ChatTemplateManager.swift
================================================
//
// ChatTemplateManager.swift
// FlowDown
//
// Created by 秋星桥 on 6/28/25.
//
import ChatClientKit
import Combine
import ConfigurableKit
import Foundation
import OrderedCollections
import Storage
import UIKit
import XMLCoder
class ChatTemplateManager {
static let shared = ChatTemplateManager()
private let legacyStoreKey = "ChatTemplates"
private let legacyMigrationFlagKey = "ChatTemplatesMigratedToStorage"
private var cancellables = Set<AnyCancellable>()
@Published private(set) var templates: OrderedDictionary<ChatTemplate.ID, ChatTemplate> = [:]
private init() {
reloadFromStorage()
migrateLegacyTemplatesIfNeeded()
observeSyncNotifications()
}
func addTemplate(_ template: ChatTemplate) {
assert(Thread.isMainThread)
let record = makeRecord(
from: template,
existing: nil,
sortIndex: sdb.templateNextSortIndex(),
shouldMarkModified: false,
)
sdb.templateSave(record: record)
reloadFromStorage()
}
@discardableResult
func importTemplate(from data: Data) throws -> ChatTemplate {
let decoder = PropertyListDecoder()
var template = try decoder.decode(ChatTemplate.self, from: data)
// Always treat imports as a new object.
// This prevents collisions with existing/soft-deleted records that can make imports appear to succeed but persist nothing.
template.id = UUID()
addTemplate(template)
return template
}
func exportTemplateData(_ template: ChatTemplate) throws -> Data {
let encoder = PropertyListEncoder()
encoder.outputFormat = .xml
let data = try encoder.encode(template)
// Validate round-trip decodability.
_ = try PropertyListDecoder().decode(ChatTemplate.self, from: data)
return data
}
func template(for itemIdentifier: ChatTemplate.ID) -> ChatTemplate? {
assert(Thread.isMainThread)
return templates[itemIdentifier]
}
func update(_ template: ChatTemplate) {
assert(Thread.isMainThread)
if let record = sdb.template(with: template.id.uuidString) {
let updated = makeRecord(
from: template,
existing: record,
sortIndex: record.sortIndex,
shouldMarkModified: true,
)
sdb.templateSave(record: updated)
} else {
addTemplate(template)
return
}
reloadFromStorage()
}
func remove(_ template: ChatTemplate) {
assert(Thread.isMainThread)
remove(for: template.id)
}
func remove(for itemIdentifier: ChatTemplate.ID) {
assert(Thread.isMainThread)
sdb.templateMarkDelete(identifier: itemIdentifier.uuidString)
reloadFromStorage()
}
func reorderTemplates(_ orderedIDs: [ChatTemplate.ID]) {
assert(Thread.isMainThread)
guard !orderedIDs.isEmpty else { return }
sdb.templateReorder(orderedIDs.map(\.uuidString))
reloadFromStorage()
}
private func reloadFromStorage() {
let records = sdb.templateList()
let items = records.compactMap { makeTemplate(from: $0) }
templates = OrderedDictionary(uniqueKeysWithValues: items.map { ($0.id, $0) })
Logger.model.infoFile("loaded \(templates.count) chat templates from storage")
}
private func makeTemplate(from record: ChatTemplateRecord) -> ChatTemplate {
var template = ChatTemplate()
let identifier = UUID(uuidString: record.objectId) ?? UUID()
template = template.with {
$0.id = identifier
$0.name = record.name
$0.avatar = record.avatar
$0.prompt = record.prompt
$0.inheritApplicationPrompt = record.inheritApplicationPrompt
}
if identifier.uuidString != record.objectId {
let fixedRecord = makeRecord(
from: template,
existing: record,
sortIndex: record.sortIndex,
shouldMarkModified: true,
)
sdb.templateSave(record: fixedRecord)
}
return template
}
private func observeSyncNotifications() {
NotificationCenter.default.publisher(for: SyncEngine.ChatTemplateChanged)
.debounce(for: .seconds(1), scheduler: RunLoop.main)
.sink { [weak self] _ in
self?.reloadFromStorage()
}
.store(in: &cancellables)
NotificationCenter.default.publisher(for: SyncEngine.LocalDataDeleted)
.debounce(for: .seconds(1), scheduler: RunLoop.main)
.sink { [weak self] _ in
self?.reloadFromStorage()
}
.store(in: &cancellables)
}
private func makeRecord(
from template: ChatTemplate,
existing: ChatTemplateRecord?,
sortIndex: Double? = nil,
creation: Date? = nil,
shouldMarkModified: Bool = false,
) -> ChatTemplateRecord {
let record = ChatTemplateRecord(
deviceId: existing?.deviceId ?? Storage.deviceId,
objectId: existing?.objectId ?? template.id.uuidString,
name: template.name,
avatar: template.avatar,
prompt: template.prompt,
inheritApplicationPrompt: template.inheritApplicationPrompt,
sortIndex: sortIndex ?? existing?.sortIndex ?? sdb.templateNextSortIndex(),
creation: creation ?? existing?.creation ?? Date.now,
)
if shouldMarkModified {
record.markModified()
}
return record
}
private func migrateLegacyTemplatesIfNeeded() {
let defaults = UserDefaults.standard
guard defaults.bool(forKey: legacyMigrationFlagKey) == false else { return }
guard templates.isEmpty else {
defaults.set(true, forKey: legacyMigrationFlagKey)
defaults.removeObject(forKey: legacyStoreKey)
return
}
let data = defaults.data(forKey: legacyStoreKey) ?? Data()
guard !data.isEmpty,
let decoded = try? PropertyListDecoder().decode(
OrderedDictionary<ChatTemplate.ID, ChatTemplate>.self,
from: data,
),
!decoded.isEmpty
else {
defaults.set(true, forKey: legacyMigrationFlagKey)
defaults.removeObject(forKey: legacyStoreKey)
return
}
let now = Date.now
let records: [ChatTemplateRecord] = decoded.values.enumerated().map { index, template in
makeRecord(
from: template,
existing: nil,
sortIndex: Double(index),
creation: now,
shouldMarkModified: false,
)
}
sdb.templateSave(records: records)
defaults.set(true, forKey: legacyMigrationFlagKey)
defaults.removeObject(forKey: legacyStoreKey)
reloadFromStorage()
}
func createConversationFromTemplate(_ template: ChatTemplate) -> Conversation.ID {
assert(Thread.isMainThread)
let conversation = ConversationManager.shared.createNewConversation {
$0.update(\.icon, to: template.avatar)
$0.update(\.title, to: template.name)
$0.update(\.shouldAutoRename, to: true)
}
let session = ConversationSessionManager.shared.session(for: conversation.id)
defer {
session.save()
session.notifyMessagesDidChange()
}
if !template.prompt.isEmpty {
if !template.inheritApplicationPrompt {
let systemMessages = session.messages.filter { $0.role == .system }
for message in systemMessages {
session.delete(messageIdentifier: message.objectId)
}
}
session.appendNewMessage(role: .system) {
$0.update(\.document, to: template.prompt)
}
}
session.appendNewMessage(role: .hint) {
$0.update(\.document, to: String(localized: "This conversation is based on the template: \(template.name)."))
}
return conversation.id
}
func createTemplateFromConversation(
_ conversation: Conversation,
model: ModelManager.ModelIdentifier,
completion: @escaping (Result<ChatTemplate, Error>) -> Void,
) {
Task {
do {
let template = try await generateChatTemplate(from: conversation, using: model)
await MainActor.run {
completion(.success(template))
}
} catch {
await MainActor.run {
completion(.failure(error))
}
}
}
}
func rewriteTemplate(
template: ChatTemplate,
request: String,
model: ModelManager.ModelIdentifier,
completion: @escaping (Result<ChatTemplate, Error>) -> Void,
) {
Task {
do {
let template = try await rewriteTemplate(
template: template,
request: request,
model: model,
)
await MainActor.run {
completion(.success(template))
}
} catch {
await MainActor.run {
completion(.failure(error))
}
}
}
}
private func rewriteTemplate(
template: ChatTemplate,
request: String,
model: ModelManager.ModelIdentifier,
) async throws -> ChatTemplate {
let prompt = """
You are a chat template expert. Please modify the following chat template according to the user's request.
IMPORTANT RULES:
- Only change what the user specifically requests
- If the user doesn't mention name or prompt, keep them unchanged
- Respond ONLY with valid XML following the exact format provided
- Do not include any text outside the XML structure
- Use the user's preferred language for content
Current template:
<template>
<name>\(template.name)</name>
<prompt>\(template.prompt)</prompt>
</template>
User request: \(request)
Please return the modified template in the same XML format, keeping unchanged fields exactly as they are.
"""
let messages: [ChatRequestBody.Message] = [
.system(content: .text("You are a chat template editor. Modify only what the user requests, keeping everything else unchanged. Respond ONLY with valid XML in the exact format provided.")),
.user(content: .text(prompt)),
]
let response = try await ModelManager.shared.infer(with: model, input: messages)
let raw = response.text.isEmpty ? response.reasoning : response.text
let parsedResponse = try parseTemplateResponse(raw)
return template.with {
$0.name = parsedResponse.name
$0.prompt = parsedResponse.prompt
}
}
private func generateChatTemplate(from conversation: Conversation, using model: ModelManager.ModelIdentifier) async throws -> ChatTemplate {
let session = ConversationSessionManager.shared.session(for: conversation.id)
// Get conversation messages for analysis
let userMessages = session.messages.filter { $0.role == .user }
let assistantMessages = session.messages.filter { $0.role == .assistant }
guard !userMessages.isEmpty, !assistantMessages.isEmpty else {
throw NSError(
domain: "ChatTemplate",
code: 1,
userInfo: [
NSLocalizedDescriptionKey: String(localized: "Conversation does not have enough messages to create a template."),
],
)
}
// Prepare conversation context
let conversationContext = userMessages.prefix(3).map(\.document).joined(separator: "\n\n")
let responseContext = assistantMessages.prefix(3).map(\.document).joined(separator: "\n\n")
// Create XML structure for template generation
let templateRequest = TemplateGenerationXML(
task: String(localized: "Analyze the conversation and generate a reusable chat template. Extract the core purpose, create a concise name, suggest an appropriate emoji, and write a system prompt that captures the essence of the conversation pattern."),
conversation_context: conversationContext,
response_context: responseContext,
output_format: TemplateGenerationXML.OutputFormat(
name: "Short descriptive name for the template using concise language",
emoji: "Single emoji representing the template purpose",
prompt: "System prompt that captures the conversation pattern and purpose",
inherit_app_prompt: true,
),
)
let encoder = XMLEncoder()
encoder.outputFormatting = .prettyPrinted
let xmlData = try encoder.encode(templateRequest, withRootKey: "template_generation")
let xmlString = String(data: xmlData, encoding: .utf8) ?? ""
let messages: [ChatRequestBody.Message] = [
.system(content: .text("You are a chat template generator. Analyze conversations and create reusable templates. Respond ONLY with valid XML following the exact format provided. Do not include any text outside the XML structure. Please ensure using user's preferred language inside conversation.")),
.user(content: .text(xmlString)),
]
let response = try await ModelManager.shared.infer(with: model, input: messages)
let raw = response.text.isEmpty ? response.reasoning : response.text
return try parseTemplateResponse(raw)
}
private func parseTemplateResponse(_ xmlString: String) throws -> ChatTemplate {
let decoder = XMLDecoder()
if let data = xmlString.data(using: .utf8),
let templateResponse = try? decoder.decode(TemplateResponse.self, from: data)
{
let emojiData = templateResponse.emoji.textToImage(size: 64)?.pngData() ?? Data()
return ChatTemplate(
name: templateResponse.name.trimmingCharacters(in: .whitespacesAndNewlines),
avatar: emojiData,
prompt: templateResponse.prompt.trimmingCharacters(in: .whitespacesAndNewlines),
inheritApplicationPrompt: templateResponse.inherit_app_prompt,
)
}
return try parseTemplateUsingRegex(xmlString)
}
private func parseTemplateUsingRegex(_ xmlString: String) throws -> ChatTemplate {
let namePattern = #"<name>(.*?)</name>"#
let emojiPattern = #"<emoji>(.*?)</emoji>"#
let promptPattern = #"<prompt>(.*?)</prompt>"#
let inheritPattern = #"<inherit_app_prompt>(.*?)</inherit_app_prompt>"#
guard let nameRegex = try? NSRegularExpression(pattern: namePattern, options: [.caseInsensitive, .dotMatchesLineSeparators]),
let emojiRegex = try? NSRegularExpression(pattern: emojiPattern, options: [.caseInsensitive, .dotMatchesLineSeparators]),
let promptRegex = try? NSRegularExpression(pattern: promptPattern, options: [.caseInsensitive, .dotMatchesLineSeparators]),
let inheritRegex = try? NSRegularExpression(pattern: inheritPattern, options: [.caseInsensitive, .dotMatchesLineSeparators])
else {
throw NSError(
domain: "ChatTemplateGenerator",
code: 2,
userInfo: [NSLocalizedDescriptionKey: String(localized: "Failed to create regex patterns")],
)
}
let range = NSRange(xmlString.startIndex ..< xmlString.endIndex, in: xmlString)
let name = if let nameMatch = nameRegex.firstMatch(in: xmlString, options: [], range: range),
let nameRange = Range(nameMatch.range(at: 1), in: xmlString)
{
String(xmlString[nameRange]).trimmingCharacters(in: .whitespacesAndNewlines)
} else {
throw NSError(domain: "ChatTemplate", code: -1, userInfo: [
NSLocalizedDescriptionKey: String(localized: "Failed to extract required information from model response."),
])
}
let emoji = if let emojiMatch = emojiRegex.firstMatch(in: xmlString, options: [], range: range),
let emojiRange = Range(emojiMatch.range(at: 1), in: xmlString)
{
String(xmlString[emojiRange]).trimmingCharacters(in: .whitespacesAndNewlines)
} else {
"🤖"
}
let prompt = if let promptMatch = promptRegex.firstMatch(in: xmlString, options: [], range: range),
let promptRange = Range(promptMatch.range(at: 1), in: xmlString)
{
String(xmlString[promptRange]).trimmingCharacters(in: .whitespacesAndNewlines)
} else {
throw NSError(domain: "ChatTemplate", code: -1, userInfo: [
NSLocalizedDescriptionKey: String(localized: "Failed to extract required information from model response."),
])
}
let inheritAppPrompt: Bool
if let inheritMatch = inheritRegex.firstMatch(in: xmlString, options: [], range: range),
let inheritRange = Range(inheritMatch.range(at: 1), in: xmlString)
{
let inheritValue = String(xmlString[inheritRange]).trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
inheritAppPrompt = inheritValue == "true"
} else {
inheritAppPrompt = true
}
let emojiData = emoji.textToImage(size: 64)?.pngData() ?? Data()
return ChatTemplate(
name: name,
avatar: emojiData,
prompt: prompt,
inheritApplicationPrompt: inheritAppPrompt,
)
}
}
// MARK: - XML Models for Template Generation
private struct TemplateGenerationXML: Codable {
let task: String
let conversation_context: String
let response_context: String
let output_format: OutputFormat
struct OutputFormat: Codable {
let name: String
let emoji: String
let prompt: String
let inherit_app_prompt: Bool
}
}
private struct TemplateResponse: Codable {
let name: String
let emoji: String
let prompt: String
let inherit_app_prompt: Bool
}
================================================
FILE: FlowDown/Backend/Conversation/ConversationManager+CRUD.swift
================================================
//
// ConversationManager+CRUD.swift
// FlowDown
//
// Created by 秋星桥 on 1/31/25.
//
import Combine
import Foundation
import OrderedCollections
import Storage
extension ConversationManager {
func scanAll() {
let items: [Conversation] = sdb.conversationList()
Logger.database.infoFile("scanned \(items.count) conversations")
// Cannot convert value of type '[Conversation]' to expected argument type 'OrderedDictionary<Conversation.ID, Conversation>' (aka 'OrderedDictionary<Int64, Conversation>')
let dic = OrderedDictionary(uniqueKeysWithValues: items.map { ($0.id, $0) })
conversations.send(dic)
}
func initialConversation() -> Conversation {
if let firstItem = conversations.value.values.first,
message(within: firstItem.id).isEmpty
{
Logger.database.debugFile("using first empty conversation id: \(firstItem.id)")
return firstItem
}
Logger.database.infoFile("creating a new conversation")
return createNewConversation()
}
func createNewConversation(_ block: Storage.ConversationMakeInitDataBlock? = nil, autoSelect: Bool = false) -> Conversation {
let tempObject = sdb.conversationMake {
$0.update(\.title, to: String(localized: "Conversation"))
if $0.modelId?.isEmpty ?? true {
$0.update(\.modelId, to: ModelManager.ModelIdentifier.defaultModelForConversation)
}
if let block {
block($0)
}
}
scanAll()
guard let object = sdb.conversationWith(identifier: tempObject.id) else {
preconditionFailure()
}
Logger.database.infoFile("created new conversation id: \(object.id)")
NotificationCenter.default.post(name: .newChatCreated, object: object.id)
let session = ConversationSessionManager.shared.session(for: object.id)
// guide message when no history message
if ConversationManager.shouldShowGuideMessage {
if conversations.value.count <= 1 {
let guide = String(localized:
"""
**Welcome to FlowDown🐦**, a blazing fast and smooth client app for LLMs with respect of your privacy.
Free models included. You can also _configure cloud models_ or _run local models_ on device.
💡 For more information, check out [our wiki](https://flowdown.ai/docs/).
---
**What to do next?**
1. Select or _add a new model_, and **create a new conversation**.
2. Later, you can go to **Settings** to customize your experience.
3. For any issues, feel free to [contact us](https://discord.gg/UHKMRyJcgc).
✨ **Enjoy your FlowDown experience!**
""")
session.appendNewMessage(role: .assistant) {
$0.update(\.document, to: guide)
}
session.save()
session.notifyMessagesDidChange()
editConversation(identifier: object.id) { conversation in
let icon = "🥳".textToImage(size: 128)?.pngData() ?? .init()
conversation.update(\.title, to: String(localized: "Introduction to FlowDown"))
conversation.update(\.icon, to: icon)
conversation.update(\.shouldAutoRename, to: false)
}
ConversationManager.shouldShowGuideMessage = false
}
}
session.prepareSystemPrompt()
if autoSelect { ChatSelection.shared.select(object.id, options: [.collapseSidebar, .focusEditor]) }
return object
}
func conversation(identifier: Conversation.ID?) -> Conversation? {
guard let identifier else { return nil }
if let cached = conversations.value[identifier] {
return cached
}
return sdb.conversationWith(identifier: identifier)
}
func editConversation(identifier: Conversation.ID, block: @escaping (inout Conversation) -> Void) {
let conv = conversation(identifier: identifier)
guard var conv else { return }
block(&conv)
sdb.conversationUpdate(object: conv)
scanAll()
}
func duplicateConversation(identifier: Conversation.ID) -> Conversation.ID? {
let ans = sdb.conversationDuplicate(identifier: identifier) { conv in
let title = String(localized: "\(conv.title) Copy")
conv.update(\.title, to: title)
}
scanAll()
return ans
}
func deleteConversation(identifier: Conversation.ID) {
let session = ConversationSessionManager.shared.session(for: identifier)
session.cancelCurrentTask {}
sdb.conversationRemove(conversationWith: identifier)
try? Storage.db().deleteSummary(forConversation: identifier.description)
setRichEditorObject(identifier: identifier, nil)
scanAll()
// Invalidate session cache so next access reloads from DB
ConversationSessionManager.shared.invalidateSession(for: identifier)
}
func eraseAll() {
sdb.conversationsDrop()
clearRichEditorObject()
ConversationManager.shouldShowGuideMessage = true
scanAll()
// Clear all cached sessions after mass deletion
for (identifier, _) in conversations.value {
ConversationSessionManager.shared.invalidateSession(for: identifier)
}
}
func conversationIdentifierLookup(from messageIdentifier: Message.ID) -> Conversation.ID? {
sdb.conversationIdentifierLookup(identifier: messageIdentifier)
}
}
extension ConversationManager {
func message(within conv: Conversation.ID) -> [Message] {
sdb.listMessages(within: conv)
}
}
extension Notification.Name {
static let newChatCreated = Notification.Name("newChatCreated")
}
extension ConversationManager {
static var shouldShowGuideMessage: Bool {
get {
if UserDefaults.standard.object(forKey: "ShowGuideMessage") == nil {
// true on initial start
UserDefaults.standard.set(true, forKey: "ShowGuideMessage")
return true
}
return UserDefaults.standard.bool(forKey: "ShowGuideMessage")
}
set {
UserDefaults.standard.set(newValue, forKey: "ShowGuideMessage")
}
}
}
================================================
FILE: FlowDown/Backend/Conversation/ConversationManager+Compress.swift
================================================
//
// ConversationManager+Compress.swift
// FlowDown
//
// Created by 秋星桥 on 6/30/25.
//
import ChatClientKit
import Foundation
import Storage
extension ConversationManager {
func compressConversation(
identifier: Conversation.ID,
model: ModelManager.ModelIdentifier,
onConversationCreated: @escaping (Conversation.ID) -> Void,
completion: @escaping (Result<Conversation.ID, Error>) -> Void,
) {
guard let conv = conversation(identifier: identifier) else {
assertionFailure()
completion(.failure(NSError(domain: "ConversationManager", code: 404, userInfo: [
NSLocalizedDescriptionKey: String(localized: "Unknown Error"),
])))
return
}
exportConversation(
identifier: identifier,
exportFormat: .markdown,
) { result in
switch result {
case let .success(success):
self.compressConversation(
model: model,
title: conv.title,
text: success,
onConversationCreated: onConversationCreated,
completion: completion,
)
case let .failure(failure):
completion(.failure(failure))
}
}
}
private func compressConversation(
model: ModelManager.ModelIdentifier,
title: String,
text: String,
onConversationCreated: @escaping (Conversation.ID) -> Void,
completion: @escaping (Result<Conversation.ID, Error>) -> Void,
) {
let conv = ConversationManager.shared.createNewConversation {
let icon = "🗜️".textToImage(size: 64)?.pngData() ?? .init()
$0.update(\.title, to: title)
$0.update(\.icon, to: icon)
$0.update(\.shouldAutoRename, to: true)
}
let sess = ConversationSessionManager.shared.session(for: conv.id)
sess.appendNewMessage(role: .hint) {
$0.update(\.document, to: String(localized: "This conversation is created by compressing \"\(title)\"."))
}
sess.save()
sess.notifyMessagesDidChange()
let messageBody: [ChatRequestBody.Message] = [
.system(content: .text(
String(localized: """
You are a professional conversation summarization assistant. Please compress and summarize the previous conversation according to the following requirements:
1. Retain the core information and important conclusions of the conversation; remove irrelevant, repetitive, or redundant content.
2. Maintain the original logical order and context to ensure the compressed content is easy to understand.
3. Clearly list any to-do items, decisions, conclusions, or key issues mentioned in the conversation.
4. Preserve necessary contextual information to avoid loss or misunderstanding due to compression.
5. Use concise and accurate language; do not add information that was not mentioned or make subjective assumptions.
6. If the conversation covers multiple topics, organize them into separate sections or bullet points.
7. Output the summary in structured Markdown format, including titles and bullet points for easy reference.
Please compress and summarize the content of the "Previous Conversation" according to the above requirements.
""")
+ [
"- Do not output any additional text, such as 'Okay' or 'Continue', before the Markdown content.",
"- Please ensure the output is in Markdown format, including appropriate headings and bullet points.",
"- Do not output any code blocks or unnecessary formatting.",
"- Please ensure the output is concise and focused on the key points of the conversation.",
"**DO NOT START THE OUTPUT WITH ``` NOR ENDING WITH IT**",
].joined(separator: "\n"),
)),
.user(content: .text(String(localized: "Please summarize the following conversation:"))),
.user(content: .text(text), name: String(localized: "Previous Conversation")),
]
Task.detached {
await MainActor.run { onConversationCreated(conv.id) }
do {
let stream = try await ModelManager.shared.streamingInfer(
with: model,
input: messageBody,
)
let mess = sess.appendNewMessage(role: .assistant)
var compressed = ""
for try await chunk in stream {
switch chunk {
case let .text(value):
compressed += value
mess.update(\.document, to: compressed)
case let .reasoning(value):
mess.update(\.reasoningContent, to: mess.reasoningContent + value)
case .tool, .image:
break
}
sess.notifyMessagesDidChange()
sess.save()
}
sess.notifyMessagesDidChange()
sess.save()
await MainActor.run { completion(.success(conv.id)) }
} catch {
await MainActor.run {
sess.appendNewMessage(role: .assistant) {
$0.update(
\.document,
to: String(localized: "An error occurred during compression: \(error.localizedDescription)"),
)
}
sess.notifyMessagesDidChange()
sess.save()
completion(.failure(error))
}
}
}
}
}
================================================
FILE: FlowDown/Backend/Conversation/ConversationManager+EditorObject.swift
================================================
//
// ConversationManager+EditorObject.swift
// FlowDown
//
// Created by 秋星桥 on 1/31/25.
//
import AlertController
import Combine
import ConfigurableKit
import Foundation
import Storage
extension ConversationManager {
func getRichEditorObject(identifier: Conversation.ID) -> RichEditorView.Object? {
temporaryEditorObjects[identifier]
}
func setRichEditorObject(identifier: Conversation.ID, _ object: RichEditorView.Object?) {
if let object {
temporaryEditorObjects[identifier] = object
} else {
temporaryEditorObjects.removeValue(forKey: identifier)
}
}
func clearRichEditorObject() {
temporaryEditorObjects.removeAll()
}
}
extension ConversationManager {
static let removeAllEditorObjectsPublisher: PassthroughSubject<Void, Never> = .init()
static let removeAllEditorObjects: ConfigurableObject = .init(
icon: "eraser",
title: "Clear Editing",
explain: "This will delete all edits, including unsent conversation text and attachments.",
ephemeralAnnotation: .action { controller in
let alert = AlertViewController(
title: "Clear Editing",
message: "This will delete all edits, including unsent conversation text and attachments.",
) { context in
context.allowSimpleDispose()
context.addAction(title: "Cancel") {
context.dispose()
}
context.addAction(title: "Clear", attribute: .accent) {
context.dispose {
ConversationManager.shared.clearRichEditorObject()
removeAllEditorObjectsPublisher.send(())
Indicator.present(
title: "Done",
preset: .done,
referencingView: controller.view,
)
}
}
}
controller.present(alert, animated: true)
},
)
}
================================================
FILE: FlowDown/Backend/Conversation/ConversationManager+Export.swift
================================================
//
// ConversationManager+Export.swift
// FlowDown
//
// Created by 秋星桥 on 6/30/25.
//
import Foundation
import Storage
extension ConversationManager {
enum ExportFormat: String, Codable, CaseIterable {
case plainText
case markdown
case json
}
func exportConversation(
identifier: Conversation.ID,
exportFormat: ExportFormat,
completion: @escaping (Result<String, Error>) -> Void,
) {
guard let conversation = ConversationManager.shared.conversation(identifier: identifier) else {
assertionFailure()
completion(.failure(NSError(domain: "ConversationManager", code: 404, userInfo: [
NSLocalizedDescriptionKey: String(localized: "Unknown Error"),
])))
return
}
let session = ConversationSessionManager.shared.session(for: identifier)
switch exportFormat {
case .plainText:
var content: [String] = [String(localized: "Exported Conversation - \(conversation.title)")]
for message in session.messages {
let messageText = [
message.role.rawValue.capitalized,
message.creation.formatted(date: .abbreviated, time: .omitted),
message.reasoningContent,
message.document,
]
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
.joined(separator: "\n")
content.append(messageText)
}
let markdownContent = content
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
.joined(separator: "\n\n")
completion(.success(markdownContent))
case .markdown:
var content: [String] = [String(localized: "Exported Conversation - \(conversation.title)")]
for message in session.messages {
let messageText = [
"## \(message.role.rawValue.capitalized) - \(message.creation.formatted(date: .abbreviated, time: .omitted))",
message.reasoningContent.isEmpty ? "" : " > \(message.reasoningContent)",
message.document,
]
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
.joined(separator: "\n\n")
content.append(messageText)
}
let markdownContent = content
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
.joined(separator: "\n\n---\n\n")
completion(.success(markdownContent))
case .json:
let exportData: [String: Any] = [
"metadata": conversation,
"messages": session.messages,
]
do {
let propertyListData = try JSONSerialization.data(withJSONObject: exportData, options: [
.prettyPrinted,
.fragmentsAllowed,
.sortedKeys,
])
guard let propertyListString = String(data: propertyListData, encoding: .utf8) else {
throw NSError(domain: "ConversationManager", code: 500, userInfo: [
NSLocalizedDescriptionKey: String(localized: "Failed to decode data."),
])
}
completion(.success(propertyListString))
} catch {
completion(.failure(error))
}
}
}
}
================================================
FILE: FlowDown/Backend/Conversation/ConversationManager+Menu.swift
================================================
//
// ConversationManager+Menu.swift
// FlowDown
//
// Created by 秋星桥 on 2/5/25.
//
import AlertController
import Foundation
import Storage
import UIKit
private let dateFormatter = DateFormatter().with {
$0.locale = .current
$0.dateStyle = .short
$0.timeStyle = .short
}
extension ConversationManager {
func menu(
forConversation identifier: Conversation.ID?,
view: UIView,
) -> UIMenu? {
guard let controller = view.parentViewController else { return nil }
guard let conv = conversation(identifier: identifier) else { return nil }
let convHasEmptyContent = ConversationSessionManager.shared.session(for: conv.id)
.messages
.filter { [.user, .assistant].contains($0.role) }
.isEmpty
let session = ConversationSessionManager.shared.session(for: conv.id)
let mainMenu = UIMenu(
title: [
dateFormatter.string(from: conv.creation),
].joined(separator: " "),
options: [.displayInline],
children: [
UIAction(
title: String(localized: "Rename"),
image: UIImage(systemName: "pencil.tip.crop.circle.badge.arrow.forward"),
) { _ in
let alert = AlertInputViewController(
title: "Rename",
message: "Set a new title for the conversation. Leave empty to keep unchanged. This will disable auto-renaming.",
placeholder: "Title",
text: conv.title,
) { text in
guard !text.isEmpty else { return }
ConversationManager.shared.editConversation(identifier: conv.id) {
$0.update(\.title, to: text)
$0.update(\.shouldAutoRename, to: false)
}
}
controller.present(alert, animated: true)
},
UIAction(
title: String(localized: "Pick New Icon"),
image: UIImage(systemName: "person.crop.circle.badge.plus"),
) { _ in
let picker = EmojiPickerViewController(sourceView: view) { emoji in
ConversationManager.shared.editConversation(identifier: conv.id) {
let icon = emoji.emoji.textToImage(size: 128)?.pngData() ?? .init()
$0.update(\.icon, to: icon)
$0.update(\.shouldAutoRename, to: false)
}
}
controller.present(picker, animated: true)
},
],
)
let exportDocumentMenu = UIMenu(
title: String(localized: "Export Document"),
image: UIImage(systemName: "doc"),
children: [
UIAction(
title: String(localized: "Export Plain Text"),
image: UIImage(systemName: "doc.plaintext"),
) { _ in
ConversationManager.shared.exportConversation(identifier: conv.id, exportFormat: .plainText) { result in
switch result {
case let .success(content):
DisposableExporter(
data: Data(content.utf8),
name: "Exported-\(Int(Date().timeIntervalSince1970))",
pathExtension: "txt",
title: "Export Plain Text",
).run(anchor: view, mode: .file)
case .failure:
Indicator.present(
title: "Export Failed",
preset: .error,
referencingView: view,
)
}
}
},
UIAction(
title: String(localized: "Export Markdown"),
image: UIImage(systemName: "doc.richtext"),
) { _ in
ConversationManager.shared.exportConversation(identifier: conv.id, exportFormat: .markdown) { result in
switch result {
case let .success(content):
DisposableExporter(
data: Data(content.utf8),
name: "Exported-\(Int(Date().timeIntervalSince1970))",
pathExtension: "md",
title: "Export Markdown",
).run(anchor: view, mode: .file)
case .failure:
Indicator.present(
title: "Export Failed",
preset: .error,
referencingView: view,
)
}
}
},
],
)
let saveImageMenu = UIMenu(
title: String(localized: "Save Image"),
image: UIImage(systemName: "text.below.photo"),
children: ConversationCaptureView.LayoutPreset.allCases.map { preset in
UIAction(
title: preset.displayName,
image: UIImage(systemName: "text.below.photo"),
) { _ in
let captureView = ConversationCaptureView(session: session, preset: preset)
Indicator.progress(
title: "Rendering Content",
controller: controller,
) { completion in
let image = await withCheckedContinuation { continuation in
Task { @MainActor in
captureView.capture(controller: controller) { image in
continuation.resume(returning: image)
}
}
}
guard let image, let png = image.pngData() else { throw NSError() }
let exporter = DisposableExporter(
data: png,
name: "Exported-\(Int(Date().timeIntervalSince1970))-\(Int(preset.rawValue))".sanitizedFileName,
pathExtension: "png",
title: "Export Image",
)
await completion { exporter.run(anchor: view) }
}
}
},
)
let savePictureMenu = UIMenu(
options: [.displayInline],
children: [
saveImageMenu,
exportDocumentMenu,
],
)
let automationMenu = UIMenu(
title: String(localized: "Automation"),
options: [.displayInline],
children: [
UIAction(
title: String(localized: "Generate New Icon"),
image: UIImage(systemName: "arrow.clockwise"),
) { _ in
Indicator.progress(
title: "Generating New Icon",
controller: controller,
) { completion in
let sessionManager = ConversationSessionManager.shared
let session = sessionManager.session(for: conv.id)
let emoji = await session.generateConversationIcon()
await completion {
if let emoji {
ConversationManager.shared.editConversation(identifier: conv.id) { conversation in
let icon = emoji.textToImage(size: 128)?.pngData() ?? .init()
conversation.update(\.icon, to: icon)
}
} else {
Indicator.present(
title: "Unable to generate icon",
preset: .error,
referencingView: view,
)
}
}
}
},
UIAction(
title: String(localized: "Generate New Title"),
image: UIImage(systemName: "arrow.clockwise"),
) { _ in
Indicator.progress(
title: "Generating New Title",
controller: controller,
) { completion in
let sessionManager = ConversationSessionManager.shared
let session = sessionManager.session(for: conv.id)
let title = await session.generateConversationTitle()
await completion {
if let title {
ConversationManager.shared.editConversation(identifier: conv.id) { conversation in
conversation.update(\.title, to: title)
}
} else {
Indicator.present(
title: "Unable to generate title",
preset: .error,
referencingView: view,
)
}
}
}
},
].compactMap(\.self),
)
let managementGroup: [UIMenuElement] = [
{ () -> UIMenuElement? in
if conv.isFavorite {
return UIAction(
title: String(localized: "Unfavorite"),
image: UIImage(systemName: "star.slash"),
) { _ in
ConversationManager.shared.editConversation(identifier: conv.id) {
$0.update(\.isFavorite, to: false)
}
}
} else {
return nil
}
}(),
{ () -> UIMenuElement? in
if !conv.isFavorite {
return UIAction(
title: String(localized: "Favorite"),
image: UIImage(systemName: "star"),
) { _ in
ConversationManager.shared.editConversation(identifier: conv.id) {
$0.update(\.isFavorite, to: true)
}
}
} else {
return nil
}
}(),
{ () -> UIMenu? in
if !convHasEmptyContent {
return savePictureMenu
} else {
return nil
}
}(),
{ () -> UIMenu? in
if convHasEmptyContent {
return nil
} else {
return UIMenu(options: [.displayInline], children: [
UIAction(
title: String(localized: "Compress to New Chat"),
image: UIImage(systemName: "arrow.down.doc"),
) { _ in
let model = session.models.chat
let name = ModelManager.shared.modelName(identifier: model)
guard let model, !name.isEmpty else {
let alert = AlertViewController(
title: "Model Not Available",
message: "Please select a model to generate chat template.",
) { context in
context.allowSimpleDispose()
context.addAction(title: "OK", attribute: .accent) {
context.dispose()
}
}
controller.present(alert, animated: true)
return
}
let alert = AlertViewController(
title: "Compress to New Chat",
message: "This will use \(name) compress the current conversation into a short summary and create a new chat with it. The original conversation will remain unchanged.",
) { context in
context.allowSimpleDispose()
context.addAction(title: "Cancel") {
context.dispose()
}
context.addAction(title: "Compress", attribute: .accent) {
context.dispose {
Indicator.progress(
title: "Compressing",
controller: controller,
) { completion in
let result = await withCheckedContinuation { continuation in
ConversationManager.shared.compressConversation(
identifier: conv.id,
model: model,
) { convId in
ChatSelection.shared.select(convId, options: [.collapseSidebar])
} completion: { result in
continuation.resume(returning: result)
}
}
gitextract_7mrrflkv/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── feature_request.yml
│ │ └── improvement.yml
│ └── workflows/
│ ├── ci.yml
│ ├── housekeeping.yml
│ ├── release-notarize.yml
│ └── test.yml
├── .gitignore
├── .gitmodules
├── .swift-format-list
├── AGENTS.md
├── Examples/
│ ├── ModelExchange/
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── Info.plist
│ │ └── main.swift
│ └── ModelExchange.xcodeproj/
│ ├── project.pbxproj
│ └── xcshareddata/
│ └── xcschemes/
│ └── ModelExchange.xcscheme
├── FlowDown/
│ ├── Application/
│ │ ├── AppDelegate+Menu.swift
│ │ ├── AppDelegate.swift
│ │ ├── AppEnvironment.swift
│ │ ├── RecoveryMode.swift
│ │ ├── SceneDelegate.swift
│ │ ├── Value+DialTuneMode.swift
│ │ ├── Value+EditorBehavior.swift
│ │ ├── Value+LiveActivity.swift
│ │ ├── Value+MLX.swift
│ │ ├── Value+MarkdownTheme.swift
│ │ ├── Value+Memory.swift
│ │ ├── Value+ScrubberConfiguration.swift
│ │ └── Value+UserInterfaceStyle.swift
│ ├── Backend/
│ │ ├── Audio/
│ │ │ └── SoundEffectPlayer.swift
│ │ ├── ChatTemplate/
│ │ │ ├── ChatTemplate.swift
│ │ │ └── ChatTemplateManager.swift
│ │ ├── Conversation/
│ │ │ ├── ConversationManager+CRUD.swift
│ │ │ ├── ConversationManager+Compress.swift
│ │ │ ├── ConversationManager+EditorObject.swift
│ │ │ ├── ConversationManager+Export.swift
│ │ │ ├── ConversationManager+Menu.swift
│ │ │ ├── ConversationManager+Search.swift
│ │ │ ├── ConversationManager.swift
│ │ │ ├── ConversationSummarizer.swift
│ │ │ ├── Pipeline/
│ │ │ │ ├── ConversationSession+PreprocessAttachments.swift
│ │ │ │ ├── ConversationSession.swift
│ │ │ │ ├── ConversationSessionManager.swift
│ │ │ │ ├── Execute/
│ │ │ │ │ ├── ConversationSession+BuildMessages.swift
│ │ │ │ │ ├── ConversationSession+Cancel.swift
│ │ │ │ │ ├── ConversationSession+Execute.swift
│ │ │ │ │ ├── ConversationSession+ExecuteOnce.swift
│ │ │ │ │ ├── ConversationSession+FixReference.swift
│ │ │ │ │ ├── ConversationSession+SystemPrompt.swift
│ │ │ │ │ ├── ConversationSession+Trim.swift
│ │ │ │ │ └── ConversationSystemPromptBuilder.swift
│ │ │ │ ├── PostAction/
│ │ │ │ │ ├── ConversationSession+Icon.swift
│ │ │ │ │ ├── ConversationSession+Metadata.swift
│ │ │ │ │ ├── ConversationSession+Rename.swift
│ │ │ │ │ ├── ConversationSession+Title.swift
│ │ │ │ │ └── ModelResponseSanitizer.swift
│ │ │ │ └── PreAction/
│ │ │ │ ├── ConversationSession+Images.swift
│ │ │ │ └── ConversationSession+WebSearch.swift
│ │ │ └── RewriteAction.swift
│ │ ├── Evaluation/
│ │ │ ├── EvaluationManifest+Case.Content.swift
│ │ │ ├── EvaluationManifest+Case.Result.swift
│ │ │ ├── EvaluationManifest+Case.Verifier.swift
│ │ │ ├── EvaluationManifest+Case.swift
│ │ │ ├── EvaluationManifest+Suite.swift
│ │ │ ├── EvaluationManifest.swift
│ │ │ ├── EvaluationOptions.swift
│ │ │ ├── EvaluationSession.swift
│ │ │ ├── EvaluationSessionManager.swift
│ │ │ └── Manifests/
│ │ │ ├── InstructionFollowingSuite.swift
│ │ │ ├── ProgrammingCSuite.swift
│ │ │ ├── ProgrammingGoSuite.swift
│ │ │ ├── ProgrammingPythonSuite.swift
│ │ │ ├── ProgrammingRustSuite.swift
│ │ │ ├── ProgrammingSwiftSuite.swift
│ │ │ ├── ProgrammingWebSuite.swift
│ │ │ └── ToolCallingSuite.swift
│ │ ├── LiveActivity/
│ │ │ ├── LiveActivityService.swift
│ │ │ └── WidgetsAttributes.swift
│ │ ├── MCPService/
│ │ │ ├── MCPConnection.swift
│ │ │ ├── MCPError.swift
│ │ │ ├── MCPService+Tools.swift
│ │ │ ├── MCPService.swift
│ │ │ ├── MCPServiceActor.swift
│ │ │ ├── MCPTool.swift
│ │ │ ├── MCPToolInfo.swift
│ │ │ ├── MCPTransportManager.swift
│ │ │ └── ModelContextServer+DisplayName.swift
│ │ ├── Model/
│ │ │ ├── BalancedEmitter.swift
│ │ │ ├── CloudModelResponseFormat+Display.swift
│ │ │ ├── ModelExchangeCoordinator.swift
│ │ │ ├── ModelManager+AAPL.swift
│ │ │ ├── ModelManager+Cloud.swift
│ │ │ ├── ModelManager+Hub.swift
│ │ │ ├── ModelManager+Inference.swift
│ │ │ ├── ModelManager+Local.swift
│ │ │ ├── ModelManager+Menu.swift
│ │ │ ├── ModelManager+Parms.swift
│ │ │ ├── ModelManager.swift
│ │ │ └── PollinationsService.swift
│ │ ├── ModelTools/
│ │ │ ├── AttachmentDataParser.swift
│ │ │ ├── CalendarTools/
│ │ │ │ ├── AddCalendarTool.swift
│ │ │ │ └── QueryCalendarTool.swift
│ │ │ ├── LocationTools/
│ │ │ │ └── LocationTool.swift
│ │ │ ├── MemoryTools/
│ │ │ │ ├── MTDeleteMemoryTool.swift
│ │ │ │ ├── MTListMemoriesTool.swift
│ │ │ │ ├── MTRecallMemoryTool.swift
│ │ │ │ ├── MTStoreMemoryTool.swift
│ │ │ │ ├── MTUpdateMemoryTool.swift
│ │ │ │ ├── MemoryExtractor.swift
│ │ │ │ ├── MemoryStore+Prompt.swift
│ │ │ │ └── MemoryStore.swift
│ │ │ ├── ModelTools.swift
│ │ │ ├── ModelToolsManager.swift
│ │ │ ├── Supplement/
│ │ │ │ └── MTWebSearchTool.swift
│ │ │ ├── URLTools/
│ │ │ │ └── URLTool.swift
│ │ │ └── WebTools/
│ │ │ └── WebScraperTool.swift
│ │ ├── Shortcuts/
│ │ │ ├── InferenceIntentHandler.swift
│ │ │ ├── Intent/
│ │ │ │ ├── ClassifyContentIntent.swift
│ │ │ │ ├── CreateNewConversationIntent.swift
│ │ │ │ ├── FillConversationMessageIntent.swift
│ │ │ │ ├── GenerateNewConversationLinkIntent.swift
│ │ │ │ ├── GenerateResponseIntent.swift
│ │ │ │ ├── GetLatestConversationDetailsIntent.swift
│ │ │ │ ├── ImproveWritingIntent.swift
│ │ │ │ ├── OpenAppIntent.swift
│ │ │ │ ├── SearchConversationsIntent.swift
│ │ │ │ ├── SetConversationModelIntent.swift
│ │ │ │ ├── ShowAndSendConversationIntent.swift
│ │ │ │ ├── ShowConversationIntent.swift
│ │ │ │ ├── SummarizeIntent.swift
│ │ │ │ ├── TranscribeAudioIntent.swift
│ │ │ │ └── TranslateTextIntent.swift
│ │ │ ├── ModelShortcutEntities.swift
│ │ │ ├── ShortcutError.swift
│ │ │ ├── ShortcutUtilities.swift
│ │ │ └── Shortcuts.swift
│ │ ├── Storage/
│ │ │ ├── SettingsBackup.swift
│ │ │ └── Storage+Export.swift
│ │ ├── Supplement/
│ │ │ ├── AnchorVersion.swift
│ │ │ ├── AudioTranscoder.swift
│ │ │ ├── ChatSelection.swift
│ │ │ ├── DisposableExporter.swift
│ │ │ └── KeyboardNavigationDelegate.swift
│ │ └── UpdateManager/
│ │ └── UpdateManager.swift
│ ├── BundledResources/
│ │ ├── Emoji.json
│ │ ├── OpenSourceLicenses.md
│ │ ├── en.lproj/
│ │ │ └── PrivacyPolicy.md
│ │ └── zh-Hans.lproj/
│ │ └── PrivacyPolicy.md
│ ├── Configuration/
│ │ ├── AppGroup.swift
│ │ ├── Base.xcconfig
│ │ ├── Development.xcconfig
│ │ ├── Release.xcconfig
│ │ └── Version.xcconfig
│ ├── DerivedSources/
│ │ └── DerivedSourcesReadme.swift
│ ├── Extension/
│ │ ├── Combine.swift
│ │ ├── ConfigurableView.swift
│ │ ├── Errors.swift
│ │ ├── GlassEffect/
│ │ │ ├── LegacyGlassBackdropView.swift
│ │ │ └── PrivateBlurEngine.swift
│ │ ├── Indicator.swift
│ │ ├── MarkdownParser+MathPlaceholderRepair.swift
│ │ ├── NSAttributedString+Search.swift
│ │ ├── NSNumber.swift
│ │ ├── SequentialOperator.swift
│ │ ├── String.swift
│ │ ├── UIApplication.swift
│ │ ├── UIBezierPath.swift
│ │ ├── UIFont.swift
│ │ ├── UIView.swift
│ │ ├── UIViewController.swift
│ │ ├── UIViewControllerHolder.swift
│ │ └── Withable.swift
│ ├── Interface/
│ │ ├── ChatView/
│ │ │ ├── ChatView+Delegates.swift
│ │ │ ├── ChatView+HeaderVisualEffect.swift
│ │ │ ├── ChatView+Parms.swift
│ │ │ └── ChatView.swift
│ │ ├── ConversationCaptureView/
│ │ │ └── ConversationCaptureView.swift
│ │ ├── ConversationSearchController/
│ │ │ ├── ConversationSearchController+Cell.swift
│ │ │ ├── ConversationSearchController.swift
│ │ │ ├── KeyboardNavigationSearchBar.swift
│ │ │ ├── SearchContentController+HolderViews.swift
│ │ │ ├── SearchContentController+SearchBar.swift
│ │ │ ├── SearchContentController+Shortcuts.swift
│ │ │ ├── SearchContentController+TableView.swift
│ │ │ ├── SearchContentController.swift
│ │ │ └── SearchResult.swift
│ │ ├── ConversationSelectionView/
│ │ │ ├── ConversationSelectionView+Cell.swift
│ │ │ ├── ConversationSelectionView+Delegate.swift
│ │ │ ├── ConversationSelectionView.swift
│ │ │ └── SectionDateHeaderView.swift
│ │ ├── EmojiPicker/
│ │ │ ├── EmojiPicker+Cell.swift
│ │ │ ├── EmojiPicker+Data.swift
│ │ │ ├── EmojiPicker+Provider.swift
│ │ │ └── EmojiPicker.swift
│ │ ├── Evaluation/
│ │ │ ├── EvaluationAssistantController/
│ │ │ │ └── EvaluationAssistantController.swift
│ │ │ ├── EvaluationCaseDetailController/
│ │ │ │ ├── EvaluationCaseDetailController.swift
│ │ │ │ └── EvaluationMenuFactory.swift
│ │ │ ├── EvaluationController/
│ │ │ │ └── EvaluationController.swift
│ │ │ ├── EvaluationHistoryController/
│ │ │ │ └── EvaluationHistoryController.swift
│ │ │ └── EvaluationStatusController/
│ │ │ ├── EvaluationStatusCollectionView/
│ │ │ │ ├── EvaluationStatusCell.swift
│ │ │ │ ├── EvaluationStatusCollectionView+DataSource.swift
│ │ │ │ ├── EvaluationStatusCollectionView+Delegate.swift
│ │ │ │ ├── EvaluationStatusCollectionView+Layout.swift
│ │ │ │ └── EvaluationStatusCollectionView.swift
│ │ │ ├── EvaluationStatusController.swift
│ │ │ └── EvaluationSuiteHeaderView.swift
│ │ ├── MainController/
│ │ │ ├── MainController+Boot.swift
│ │ │ ├── MainController+Catalyst.swift
│ │ │ ├── MainController+Content.swift
│ │ │ ├── MainController+Gesture.swift
│ │ │ ├── MainController+Layout.swift
│ │ │ ├── MainController+SidbarDragger.swift
│ │ │ └── MainController.swift
│ │ ├── MessageListView/
│ │ │ ├── Components/
│ │ │ │ ├── ActivityReportingView.swift
│ │ │ │ ├── AiMessageView.swift
│ │ │ │ ├── HintMessageView.swift
│ │ │ │ ├── LoadingSymbol.swift
│ │ │ │ ├── ReasoningContentView.swift
│ │ │ │ ├── ShimmerTextLabel.swift
│ │ │ │ ├── ToolHintView.swift
│ │ │ │ ├── UserAttachmentView.swift
│ │ │ │ ├── UserMessageView.swift
│ │ │ │ └── WebSearchStateView.swift
│ │ │ ├── MessageListRowView.swift
│ │ │ ├── MessageListView+Adapter.swift
│ │ │ ├── MessageListView+DataSource.swift
│ │ │ ├── MessageListView+NodesCache.swift
│ │ │ └── MessageListView.swift
│ │ ├── ModelExchange/
│ │ │ ├── ModelExchangeCapability+Display.swift
│ │ │ └── ModelExchangeSelectionController.swift
│ │ ├── RichEditor/
│ │ │ ├── Extension/
│ │ │ │ ├── Ext+Data.swift
│ │ │ │ └── Ext+UIImage.swift
│ │ │ ├── RichEditor/
│ │ │ │ ├── EditorBehavior.swift
│ │ │ │ ├── RichEditorView+Delegate.swift
│ │ │ │ ├── RichEditorView+Delegates.swift
│ │ │ │ ├── RichEditorView+Notification.swift
│ │ │ │ ├── RichEditorView+Object.swift
│ │ │ │ ├── RichEditorView+PickerDelegates.swift
│ │ │ │ ├── RichEditorView+Progress.swift
│ │ │ │ ├── RichEditorView.swift
│ │ │ │ └── TemporaryStorage.swift
│ │ │ ├── RichEditor.xcassets/
│ │ │ │ ├── Contents.json
│ │ │ │ ├── asterisk.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── attachment.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── beaker.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── camera.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── image.up.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── link.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── mic.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── plus.circle.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── send.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── server.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── text.attachment.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── tools.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── x.circle.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── x.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Sections/
│ │ │ │ ├── AttachmentsBar/
│ │ │ │ │ ├── AttachmentsBar+Cell.swift
│ │ │ │ │ ├── AttachmentsBar+Delegate.swift
│ │ │ │ │ ├── AttachmentsBar+Type.swift
│ │ │ │ │ └── AttachmentsBar.swift
│ │ │ │ ├── ControlPanel/
│ │ │ │ │ ├── ControlPanel+Delegate.swift
│ │ │ │ │ └── ControlPanel.swift
│ │ │ │ ├── InputEditor/
│ │ │ │ │ ├── InputEditor+Delegate.swift
│ │ │ │ │ ├── InputEditor+Layout.swift
│ │ │ │ │ ├── InputEditor+TextView.swift
│ │ │ │ │ └── InputEditor.swift
│ │ │ │ └── QuickSettingBar/
│ │ │ │ ├── QuickSettingBar+Delegate.swift
│ │ │ │ └── QuickSettingBar.swift
│ │ │ ├── SimpleSpeech/
│ │ │ │ ├── SimpleSpeechController+Task.swift
│ │ │ │ └── SimpleSpeechController.swift
│ │ │ └── Supplement/
│ │ │ ├── BlockButton.swift
│ │ │ ├── ColorfulShadowView.swift
│ │ │ ├── DeleteButton.swift
│ │ │ ├── DropView.swift
│ │ │ ├── EditorSectionView.swift
│ │ │ ├── GiantButton.swift
│ │ │ ├── IconButton.swift
│ │ │ ├── QuickLookController.swift
│ │ │ ├── RightClickFinder.swift
│ │ │ ├── TextMeasurementHelper.swift
│ │ │ └── ToggleBlockButton.swift
│ │ ├── SettingController/
│ │ │ ├── DataControl/
│ │ │ │ ├── SettingContent+DataControl.swift
│ │ │ │ ├── SettingContent+SettingsBackup.swift
│ │ │ │ └── SyncScopePage.swift
│ │ │ ├── General/
│ │ │ │ └── SettingContent+General.swift
│ │ │ ├── Inference/
│ │ │ │ ├── ChatTemplateEditorController.swift
│ │ │ │ ├── ChatTemplateListController.swift
│ │ │ │ └── InferenceController.swift
│ │ │ ├── MCP/
│ │ │ │ ├── MCPController/
│ │ │ │ │ ├── MCPController+Bar.swift
│ │ │ │ │ ├── MCPController+Cell.swift
│ │ │ │ │ └── MCPController.swift
│ │ │ │ └── MCPEditorController/
│ │ │ │ └── MCPEditorController.swift
│ │ │ ├── Memory/
│ │ │ │ ├── MemoryListController.swift
│ │ │ │ └── SettingContent+Memory.swift
│ │ │ ├── Model/
│ │ │ │ ├── ModelController/
│ │ │ │ │ ├── ModelController+Bar.swift
│ │ │ │ │ ├── ModelController+Cell.swift
│ │ │ │ │ ├── ModelController+Delegates.swift
│ │ │ │ │ └── ModelController.swift
│ │ │ │ ├── ModelDownloadController/
│ │ │ │ │ ├── HubModelDetailController.swift
│ │ │ │ │ ├── HubModelDownloadController+Cell.swift
│ │ │ │ │ ├── HubModelDownloadController+Delegates.swift
│ │ │ │ │ ├── HubModelDownloadController+RemoteModel.swift
│ │ │ │ │ ├── HubModelDownloadController.swift
│ │ │ │ │ └── HubModelDownloadProgressController.swift
│ │ │ │ └── ModelEditorController/
│ │ │ │ ├── CloudModelEditorController+BodyFieldsMenu.swift
│ │ │ │ ├── CloudModelEditorController+Content.swift
│ │ │ │ ├── CloudModelEditorController+Menus.swift
│ │ │ │ ├── CloudModelEditorController.swift
│ │ │ │ └── LocalModelEditorController.swift
│ │ │ ├── Permission/
│ │ │ │ └── SettingContent+Permission.swift
│ │ │ ├── SettingContent.swift
│ │ │ ├── SettingController.swift
│ │ │ ├── Support/
│ │ │ │ ├── LogViewerController.swift
│ │ │ │ ├── OpenSourceLicenseController.swift
│ │ │ │ ├── PrivacyPolicyController.swift
│ │ │ │ └── SettingContent+Support.swift
│ │ │ └── Tools/
│ │ │ └── SettingContent+Tools.swift
│ │ ├── Sidebar/
│ │ │ ├── Sidebar+Delegates.swift
│ │ │ ├── Sidebar.swift
│ │ │ ├── SidebarBrandingLabel.swift
│ │ │ └── SidebarSyncLabel.swift
│ │ ├── SupplementController/
│ │ │ ├── CodeEditorController.swift
│ │ │ ├── HTMLPreviewController.swift
│ │ │ ├── JsonEditorController.swift
│ │ │ ├── JsonStringMapEditorController.swift
│ │ │ ├── TextEditorContentController.swift
│ │ │ ├── TextEditorController.swift
│ │ │ └── TextViewerController.swift
│ │ ├── SupplementView/
│ │ │ ├── AutoLayoutMarginView.swift
│ │ │ ├── BrandingLabel.swift
│ │ │ ├── CircleImageView.swift
│ │ │ ├── ImageCircleButton.swift
│ │ │ ├── NewChatButton.swift
│ │ │ ├── SafeInputView.swift
│ │ │ ├── SearchControllerOpenButton.swift
│ │ │ ├── SeparatorView.swift
│ │ │ ├── SettingButton.swift
│ │ │ └── StackScrollController.swift
│ │ └── Welcome/
│ │ ├── FeatureRowView.swift
│ │ ├── WelcomeExperience.swift
│ │ ├── WelcomePageViewController+Configuration.swift
│ │ └── WelcomePageViewController.swift
│ ├── PlatformSupport/
│ │ └── Catalyst/
│ │ └── FLDCatalystHelper.swift
│ ├── Resources/
│ │ ├── Assets.xcassets/
│ │ │ ├── AccentColor.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Avatar.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Background.colorset/
│ │ │ │ └── Contents.json
│ │ │ ├── BackgroundTexture.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── Contents.json
│ │ ├── DialTune/
│ │ │ ├── dial_tune_0.m4a
│ │ │ ├── dial_tune_1.m4a
│ │ │ ├── dial_tune_2.m4a
│ │ │ ├── dial_tune_3.m4a
│ │ │ ├── dial_tune_4.m4a
│ │ │ ├── dial_tune_5.m4a
│ │ │ ├── dial_tune_6.m4a
│ │ │ ├── dial_tune_7.m4a
│ │ │ ├── dial_tune_8.m4a
│ │ │ └── dial_tune_9.m4a
│ │ ├── Entitlements/
│ │ │ ├── Entitlements-Catalyst.entitlements
│ │ │ └── Entitlements-iOS.entitlements
│ │ ├── Icon.xcassets/
│ │ │ ├── Contents.json
│ │ │ ├── model.cloud.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── model.local.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── star.shine.imageset/
│ │ │ └── Contents.json
│ │ ├── InfoPlist/
│ │ │ ├── Info-Catalyst.plist
│ │ │ └── Info-iOS.plist
│ │ ├── InfoPlist.xcstrings
│ │ ├── LaunchScreen.storyboard
│ │ └── Localizable.xcstrings
│ └── main.swift
├── FlowDown.xcodeproj/
│ ├── .gitignore
│ ├── project.pbxproj
│ └── xcshareddata/
│ └── xcschemes/
│ ├── FlowDown.xcscheme
│ ├── FlowDownTranslationProvider.xcscheme
│ └── FlowDownUnitTests.xcscheme
├── FlowDown.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ ├── WorkspaceSettings.xcsettings
│ └── swiftpm/
│ └── Package.resolved
├── FlowDownTranslationProvider/
│ ├── Assets.xcassets/
│ │ ├── AccentColor.colorset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── CommonTranslationLanguage.swift
│ ├── Entitlements.entitlements
│ ├── IconButtonContainer.swift
│ ├── Info.plist
│ ├── InfoPlist.xcstrings
│ ├── Localizable.xcstrings
│ ├── Models.swift
│ ├── TranslateSegmentView.swift
│ ├── TranslationProvider.swift
│ ├── TranslationProviderModel.swift
│ ├── TranslationProviderView+Content.swift
│ ├── TranslationProviderView+Footer.swift
│ ├── TranslationProviderView.swift
│ ├── TranslationSegment.swift
│ └── main.swift
├── FlowDownUnitTests/
│ ├── ApplicationScopeTests.swift
│ ├── AudioTranscoderTests.swift
│ ├── BalanceEmitterTest.swift
│ ├── BalancedEmitterTest.swift
│ ├── CloudModelImportExportTests.swift
│ ├── ConversationExecutionSupportTests.swift
│ ├── ConversationScopeTests.swift
│ ├── ConversationSystemPromptBuilderTests.swift
│ ├── EvaluationSessionTests.swift
│ ├── HuggingFaceAPITests.swift
│ ├── InferenceIntentHandlerTests.swift
│ ├── InterfaceScopeTests.swift
│ ├── LiveActivityServiceTests.swift
│ ├── LocalModelConfigurationSmokeTests.swift
│ ├── MCPServiceConnectionTests.swift
│ ├── MCPServiceScopeTests.swift
│ ├── MCPToolDiscoveryTests.swift
│ ├── MarkdownMathPlaceholderRepairTests.swift
│ ├── MemoryExtractorTests.swift
│ ├── MemorySettingsTests.swift
│ ├── MemoryStoreAndToolsTests.swift
│ ├── ModelManagerInferenceTests.swift
│ ├── ModelManagerLocalTests.swift
│ ├── ModelScopeTests.swift
│ ├── ModelToolsScopeTests.swift
│ ├── OnlineE2ETestSupport.swift
│ ├── OnlineModelBackedE2ETests.swift
│ ├── OnlineToolAndContextE2ETests.swift
│ ├── PlatformSupportScopeTests.swift
│ ├── SettingsBackupTests.swift
│ ├── ShortcutIntentSmokeTests.swift
│ ├── ShortcutsScopeTests.swift
│ ├── StorageScopeTests.swift
│ ├── SupplementScopeTests.swift
│ ├── TestSupport/
│ │ ├── ChatServiceSpy.swift
│ │ └── FlowDownTestContext.swift
│ ├── UnitTest.swift
│ └── UpdateManagerTests.swift
├── FlowDownUnitTests.xctestplan
├── FlowDownWidgets/
│ ├── Assets.xcassets/
│ │ ├── AccentColor.colorset/
│ │ │ └── Contents.json
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── WidgetBackground.colorset/
│ │ └── Contents.json
│ ├── FlowDownWidgetsBundle.swift
│ ├── FlowDownWidgetsLiveActivity.swift
│ ├── Info.plist
│ ├── InfoPlist.xcstrings
│ └── Localizable.xcstrings
├── Frameworks/
│ ├── FlowDownModelExchange/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── FlowDownModelExchange/
│ │ │ ├── ModelExchangeCrypto.swift
│ │ │ ├── ModelExchangeTypes.swift
│ │ │ └── ModelExchangeURL.swift
│ │ └── Tests/
│ │ └── FlowDownModelExchangeTests/
│ │ └── FlowDownModelExchangeTests.swift
│ ├── Logger/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ ├── Sources/
│ │ │ └── Logger/
│ │ │ ├── LogLevel.swift
│ │ │ ├── LogStore.swift
│ │ │ ├── Logger+FileLogging.swift
│ │ │ └── Logger+Subsystem.swift
│ │ └── Tests/
│ │ └── LoggerTests/
│ │ └── LogStoreTests.swift
│ ├── RunestoneEditor/
│ │ ├── .gitignore
│ │ ├── External/
│ │ │ ├── Runestone/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Package.swift
│ │ │ │ ├── Sources/
│ │ │ │ │ ├── Runestone/
│ │ │ │ │ │ ├── Library/
│ │ │ │ │ │ │ ├── ByteCount.swift
│ │ │ │ │ │ │ ├── ByteRange.swift
│ │ │ │ │ │ │ ├── Caret.swift
│ │ │ │ │ │ │ ├── CharacterSet+Helpers.swift
│ │ │ │ │ │ │ ├── DefaultStringAttributes.swift
│ │ │ │ │ │ │ ├── HairlineLength.swift
│ │ │ │ │ │ │ ├── KeyboardObserver.swift
│ │ │ │ │ │ │ ├── L10n.swift
│ │ │ │ │ │ │ ├── LineEndingDetector.swift
│ │ │ │ │ │ │ ├── NSAttributedString+Helpers.swift
│ │ │ │ │ │ │ ├── NSRange+Helpers.swift
│ │ │ │ │ │ │ ├── NSString+Helpers.swift
│ │ │ │ │ │ │ ├── QuickTapGestureRecognizer.swift
│ │ │ │ │ │ │ ├── String+Helpers.swift
│ │ │ │ │ │ │ ├── Symbol.swift
│ │ │ │ │ │ │ ├── TabWidthMeasurer.swift
│ │ │ │ │ │ │ ├── TextChange.swift
│ │ │ │ │ │ │ ├── TextEditHelper.swift
│ │ │ │ │ │ │ ├── TreeSitterTextPoint+Helpers.swift
│ │ │ │ │ │ │ ├── UIFont+Helpers.swift
│ │ │ │ │ │ │ ├── UIScrollView+Helpers.swift
│ │ │ │ │ │ │ ├── UITextInput+Helpers.swift
│ │ │ │ │ │ │ ├── UITextSelectionDisplayInteraction+Helpers.swift
│ │ │ │ │ │ │ └── ViewReuseQueue.swift
│ │ │ │ │ │ ├── LineManager/
│ │ │ │ │ │ │ ├── DocumentLineChildrenUpdater.swift
│ │ │ │ │ │ │ ├── DocumentLineNodeData.swift
│ │ │ │ │ │ │ ├── LineChangeSet.swift
│ │ │ │ │ │ │ ├── LineManager.swift
│ │ │ │ │ │ │ ├── LinePosition.swift
│ │ │ │ │ │ │ └── NewLineFinder.swift
│ │ │ │ │ │ ├── PrivacyInfo.xcprivacy
│ │ │ │ │ │ ├── RedBlackTree/
│ │ │ │ │ │ │ ├── ClosedRangeValueDescriptor.swift
│ │ │ │ │ │ │ ├── RedBlackTree.swift
│ │ │ │ │ │ │ ├── RedBlackTreeChildrenUpdater.swift
│ │ │ │ │ │ │ ├── RedBlackTreeIterator.swift
│ │ │ │ │ │ │ ├── RedBlackTreeNode.swift
│ │ │ │ │ │ │ ├── RedBlackTreeNodeColor.swift
│ │ │ │ │ │ │ ├── RedBlackTreeNodePosition.swift
│ │ │ │ │ │ │ ├── RedBlackTreeSearchMatch.swift
│ │ │ │ │ │ │ └── RedBlackTreeSearchQuery.swift
│ │ │ │ │ │ ├── Resources/
│ │ │ │ │ │ │ ├── de.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── en.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── es.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── fi.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ ├── fr.lproj/
│ │ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ │ └── ja.lproj/
│ │ │ │ │ │ │ └── Localizable.strings
│ │ │ │ │ │ ├── StringSyntaxHighlighter.swift
│ │ │ │ │ │ ├── TextView/
│ │ │ │ │ │ │ ├── Appearance/
│ │ │ │ │ │ │ │ ├── DefaultTheme.swift
│ │ │ │ │ │ │ │ ├── FontTraits.swift
│ │ │ │ │ │ │ │ ├── HighlightName.swift
│ │ │ │ │ │ │ │ ├── LineBreakMode.swift
│ │ │ │ │ │ │ │ ├── LineSelectionDisplayType.swift
│ │ │ │ │ │ │ │ ├── Theme.swift
│ │ │ │ │ │ │ │ └── Theme.xcassets/
│ │ │ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ │ │ ├── theme_comment.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_constant_builtin.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_constant_character.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_constructor.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_current_line.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_foreground.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_function.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_gutter_background.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_gutter_hairline.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_invisible_characters.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_keyword.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_line_number.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_line_number_current_line.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_marked_text.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_number.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_operator.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_page_guide_background.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_page_guide_hairline.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_property.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_punctuation.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_search_match_found.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_search_match_highlighted.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_selection.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_string.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ ├── theme_type.colorset/
│ │ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ │ └── theme_variable_builtin.colorset/
│ │ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ │ ├── CharacterPairs/
│ │ │ │ │ │ │ │ ├── CharacterPair.swift
│ │ │ │ │ │ │ │ └── CharacterPairTrailingComponentDeletionMode.swift
│ │ │ │ │ │ │ ├── Core/
│ │ │ │ │ │ │ │ ├── ContentSizeService.swift
│ │ │ │ │ │ │ │ ├── EditMenuController.swift
│ │ │ │ │ │ │ │ ├── FloatingCaretView.swift
│ │ │ │ │ │ │ │ ├── IndexedPosition.swift
│ │ │ │ │ │ │ │ ├── IndexedRange.swift
│ │ │ │ │ │ │ │ ├── LayoutManager.swift
│ │ │ │ │ │ │ │ ├── LineEnding.swift
│ │ │ │ │ │ │ │ ├── LineFragmentView.swift
│ │ │ │ │ │ │ │ ├── LineMovementController.swift
│ │ │ │ │ │ │ │ ├── MoveLinesService.swift
│ │ │ │ │ │ │ │ ├── StringView.swift
│ │ │ │ │ │ │ │ ├── TextInputStringTokenizer.swift
│ │ │ │ │ │ │ │ ├── TextInputView.swift
│ │ │ │ │ │ │ │ ├── TextView.swift
│ │ │ │ │ │ │ │ ├── TextViewDelegate.swift
│ │ │ │ │ │ │ │ ├── TextViewState.swift
│ │ │ │ │ │ │ │ └── TimedUndoManager.swift
│ │ │ │ │ │ │ ├── Gutter/
│ │ │ │ │ │ │ │ ├── GutterBackgroundView.swift
│ │ │ │ │ │ │ │ ├── GutterWidthService.swift
│ │ │ │ │ │ │ │ └── LineNumberView.swift
│ │ │ │ │ │ │ ├── Highlight/
│ │ │ │ │ │ │ │ ├── HighlightNavigationController.swift
│ │ │ │ │ │ │ │ ├── HighlightService.swift
│ │ │ │ │ │ │ │ ├── HighlightedRange.swift
│ │ │ │ │ │ │ │ ├── HighlightedRangeFragment.swift
│ │ │ │ │ │ │ │ └── HighlightedRangeLoopingMode.swift
│ │ │ │ │ │ │ ├── Indent/
│ │ │ │ │ │ │ │ ├── DetectedIndentStrategy.swift
│ │ │ │ │ │ │ │ ├── IndentController.swift
│ │ │ │ │ │ │ │ ├── IndentLevelMeasurer.swift
│ │ │ │ │ │ │ │ └── IndentStrategy.swift
│ │ │ │ │ │ │ ├── InvisibleCharacters/
│ │ │ │ │ │ │ │ └── InvisibleCharacterConfiguration.swift
│ │ │ │ │ │ │ ├── LineController/
│ │ │ │ │ │ │ │ ├── LineBreak/
│ │ │ │ │ │ │ │ │ ├── CharacterLineBreakSuggester.swift
│ │ │ │ │ │ │ │ │ ├── LineBreakSuggester.swift
│ │ │ │ │ │ │ │ │ └── WordWrappingLineBreakSuggester.swift
│ │ │ │ │ │ │ │ ├── LineController.swift
│ │ │ │ │ │ │ │ ├── LineControllerFactory.swift
│ │ │ │ │ │ │ │ ├── LineControllerStorage.swift
│ │ │ │ │ │ │ │ ├── LineFragment.swift
│ │ │ │ │ │ │ │ ├── LineFragmentCharacterLocationQuery.swift
│ │ │ │ │ │ │ │ ├── LineFragmentController.swift
│ │ │ │ │ │ │ │ ├── LineFragmentFrameQuery.swift
│ │ │ │ │ │ │ │ ├── LineFragmentNode.swift
│ │ │ │ │ │ │ │ ├── LineFragmentRenderer.swift
│ │ │ │ │ │ │ │ ├── LineFragmentSelectionRect.swift
│ │ │ │ │ │ │ │ ├── LineSyntaxHighlighter.swift
│ │ │ │ │ │ │ │ └── LineTypesetter.swift
│ │ │ │ │ │ │ ├── Navigation/
│ │ │ │ │ │ │ │ ├── GoToLineSelection.swift
│ │ │ │ │ │ │ │ └── TextLocation.swift
│ │ │ │ │ │ │ ├── PageGuide/
│ │ │ │ │ │ │ │ ├── PageGuideController.swift
│ │ │ │ │ │ │ │ └── PageGuideView.swift
│ │ │ │ │ │ │ ├── SearchAndReplace/
│ │ │ │ │ │ │ │ ├── BatchReplaceSet.swift
│ │ │ │ │ │ │ │ ├── ParsedReplacementString.swift
│ │ │ │ │ │ │ │ ├── ReplacementStringParser.swift
│ │ │ │ │ │ │ │ ├── SearchController.swift
│ │ │ │ │ │ │ │ ├── SearchQuery.swift
│ │ │ │ │ │ │ │ ├── SearchReplaceResult.swift
│ │ │ │ │ │ │ │ ├── SearchResult.swift
│ │ │ │ │ │ │ │ ├── StringModifier.swift
│ │ │ │ │ │ │ │ ├── TextPreview.swift
│ │ │ │ │ │ │ │ └── UITextSearchingHelper.swift
│ │ │ │ │ │ │ ├── SyntaxHighlighting/
│ │ │ │ │ │ │ │ ├── Internal/
│ │ │ │ │ │ │ │ │ ├── InternalLanguageMode.swift
│ │ │ │ │ │ │ │ │ ├── InternalLanguageModeFactory.swift
│ │ │ │ │ │ │ │ │ ├── PlainText/
│ │ │ │ │ │ │ │ │ │ ├── PlainTextInternalLanguageMode.swift
│ │ │ │ │ │ │ │ │ │ └── PlainTextSyntaxHighlighter.swift
│ │ │ │ │ │ │ │ │ └── TreeSitter/
│ │ │ │ │ │ │ │ │ ├── TreeSitterIndentController.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterIndentStrategyDetector.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInjectedLanguage.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInjectedLanguageMapper.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInternalLanguage.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterInternalLanguageMode.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterLanguageLayer.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterLanguageLayerStore.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterSyntaxHighlightToken.swift
│ │ │ │ │ │ │ │ │ ├── TreeSitterSyntaxHighlighter.swift
│ │ │ │ │ │ │ │ │ └── TreeSitterTextPredicatesEvaluator.swift
│ │ │ │ │ │ │ │ ├── LanguageMode.swift
│ │ │ │ │ │ │ │ ├── PlainText/
│ │ │ │ │ │ │ │ │ └── PlainTextLanguageMode.swift
│ │ │ │ │ │ │ │ ├── SyntaxNode.swift
│ │ │ │ │ │ │ │ └── TreeSitter/
│ │ │ │ │ │ │ │ ├── TreeSitterIndentationScopes.swift
│ │ │ │ │ │ │ │ ├── TreeSitterLanguage.swift
│ │ │ │ │ │ │ │ ├── TreeSitterLanguageMode.swift
│ │ │ │ │ │ │ │ └── TreeSitterLanguageProvider.swift
│ │ │ │ │ │ │ └── TextSelection/
│ │ │ │ │ │ │ ├── CaretRectService.swift
│ │ │ │ │ │ │ ├── SelectionRectService.swift
│ │ │ │ │ │ │ └── TextSelectionRect.swift
│ │ │ │ │ │ └── TreeSitter/
│ │ │ │ │ │ ├── TreeSitterCapture.swift
│ │ │ │ │ │ ├── TreeSitterInputEdit.swift
│ │ │ │ │ │ ├── TreeSitterNode.swift
│ │ │ │ │ │ ├── TreeSitterParser.swift
│ │ │ │ │ │ ├── TreeSitterPredicate.swift
│ │ │ │ │ │ ├── TreeSitterPredicateMapper.swift
│ │ │ │ │ │ ├── TreeSitterQuery.swift
│ │ │ │ │ │ ├── TreeSitterQueryCursor.swift
│ │ │ │ │ │ ├── TreeSitterQueryMatch.swift
│ │ │ │ │ │ ├── TreeSitterTextInput.swift
│ │ │ │ │ │ ├── TreeSitterTextPoint.swift
│ │ │ │ │ │ ├── TreeSitterTextPredicate.swift
│ │ │ │ │ │ ├── TreeSitterTextRange.swift
│ │ │ │ │ │ └── TreeSitterTree.swift
│ │ │ │ │ └── TestTreeSitterLanguages/
│ │ │ │ │ ├── html/
│ │ │ │ │ │ ├── parser.c
│ │ │ │ │ │ ├── scanner.cc
│ │ │ │ │ │ └── tag.h
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── html.h
│ │ │ │ │ │ ├── javascript.h
│ │ │ │ │ │ ├── json.h
│ │ │ │ │ │ ├── parser.h
│ │ │ │ │ │ ├── python.h
│ │ │ │ │ │ └── yaml.h
│ │ │ │ │ ├── javascript/
│ │ │ │ │ │ ├── parser.c
│ │ │ │ │ │ └── scanner.c
│ │ │ │ │ ├── json/
│ │ │ │ │ │ └── parser.c
│ │ │ │ │ ├── python/
│ │ │ │ │ │ ├── parser.c
│ │ │ │ │ │ └── scanner.cc
│ │ │ │ │ └── yaml/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── scanner.cc
│ │ │ │ └── Tests/
│ │ │ │ └── RunestoneTests/
│ │ │ │ ├── ByteRangeTests.swift
│ │ │ │ ├── Helpers/
│ │ │ │ │ └── LanguageModeFactory.swift
│ │ │ │ ├── IndentLevelMeasurerTests.swift
│ │ │ │ ├── Indentation/
│ │ │ │ │ ├── HTMLIndentationTests.swift
│ │ │ │ │ ├── JSONIndentationTests.swift
│ │ │ │ │ ├── JavaScriptIndentationTests.swift
│ │ │ │ │ └── PythonIndentationTests.swift
│ │ │ │ ├── LineEndingDetectorTests.swift
│ │ │ │ ├── LineManagerTests.swift
│ │ │ │ ├── Mock/
│ │ │ │ │ └── MockTreeSitterParserDelegate.swift
│ │ │ │ ├── NSRangeTests.swift
│ │ │ │ ├── NSStringHelpersTests.swift
│ │ │ │ ├── ParsedReplacementStringTests.swift
│ │ │ │ ├── ReplacementStringParserTests.swift
│ │ │ │ ├── SearchQueryTests.swift
│ │ │ │ ├── StringHelpersTest.swift
│ │ │ │ ├── StringModifierTests.swift
│ │ │ │ ├── StringViewTests.swift
│ │ │ │ ├── TextInputStringTokenizerTests.swift
│ │ │ │ ├── TreeSitterParserTests.swift
│ │ │ │ └── XCTestManifests.swift
│ │ │ ├── RunestoneLanguageSupport/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ ├── RunestoneLanguageSupport/
│ │ │ │ │ └── RunestoneLanguageSupport.swift
│ │ │ │ ├── TreeSitterAstro/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ ├── tag.h
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterAstroQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterAstroRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterBash/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterBashQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterBashRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterC/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterCPP/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ ├── parser.h
│ │ │ │ │ └── runtime.h
│ │ │ │ ├── TreeSitterCPPQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCPPRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterCQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterCSS/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterCSSQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCSSRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterCSharp/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterCSharpQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterCSharpRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterComment/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ ├── tree_sitter/
│ │ │ │ │ │ └── parser.h
│ │ │ │ │ └── tree_sitter_comment/
│ │ │ │ │ ├── chars.c
│ │ │ │ │ ├── chars.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── parser.h
│ │ │ │ │ └── tokens.h
│ │ │ │ ├── TreeSitterCommentQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterCommentRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterElixir/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterElixirQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterElixirRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterElm/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterElmQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterElmRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterGo/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterGoQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterGoRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterHTML/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ ├── tag.h
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterHTMLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterHTMLRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterHaskell/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterHaskellQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterHaskellRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJSDoc/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJSDocQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterJSDocRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJSON/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJSON5/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJSON5Queries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterJSON5Runestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJSONQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterJSONRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJava/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJavaQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterJavaRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJavaScript/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJavaScriptQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights-jsx.scm
│ │ │ │ │ ├── highlights-params.scm
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── injections.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterJavaScriptRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterJulia/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterJuliaQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterJuliaRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterLaTeX/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterLaTeXQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterLaTeXRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterLanguagesCommon/
│ │ │ │ │ ├── dummy.c
│ │ │ │ │ └── include/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterLua/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterLuaQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterLuaRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterMarkdown/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterMarkdownInline/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterMarkdownInlineQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterMarkdownInlineRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterMarkdownQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterMarkdownRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterOCaml/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ └── scanner.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterOCamlQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterOCamlRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterPHP/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterPHPQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── injections.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterPHPRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterPerl/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterPerlQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterPerlRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterPython/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterPythonQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterPythonRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterR/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterRQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterRRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterRegex/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ ├── parser.h
│ │ │ │ │ └── runtime.h
│ │ │ │ ├── TreeSitterRegexQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterRegexRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterRuby/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterRubyQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterRubyRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterRust/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterRustQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterRustRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSCSS/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterSCSSQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterSCSSRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSQL/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterSQLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterSQLRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSvelte/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── allocator.h
│ │ │ │ │ ├── ekstring.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ ├── tag.h
│ │ │ │ │ ├── tree_sitter/
│ │ │ │ │ │ └── parser.h
│ │ │ │ │ ├── uthash.h
│ │ │ │ │ └── vc_vector.h
│ │ │ │ ├── TreeSitterSvelteQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── injections.scm
│ │ │ │ ├── TreeSitterSvelteRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterSwift/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterSwiftQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ └── locals.scm
│ │ │ │ ├── TreeSitterSwiftRunestone/
│ │ │ │ │ ├── TreeSitterIndentationScopes+Helpers.swift
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterTOML/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterTOMLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ ├── TreeSitterTOMLRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterTSX/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ └── scanner.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterTSXQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterTSXRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterTypeScript/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── common/
│ │ │ │ │ │ └── scanner.h
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.c
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterTypeScriptQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ ├── highlights.scm
│ │ │ │ │ ├── locals.scm
│ │ │ │ │ └── tags.scm
│ │ │ │ ├── TreeSitterTypeScriptRunestone/
│ │ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ │ ├── TreeSitterYAML/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── public.h
│ │ │ │ │ └── src/
│ │ │ │ │ ├── parser.c
│ │ │ │ │ ├── scanner.cc
│ │ │ │ │ ├── schema.generated.cc
│ │ │ │ │ └── tree_sitter/
│ │ │ │ │ └── parser.h
│ │ │ │ ├── TreeSitterYAMLQueries/
│ │ │ │ │ ├── Query.swift
│ │ │ │ │ └── highlights.scm
│ │ │ │ └── TreeSitterYAMLRunestone/
│ │ │ │ └── TreeSitterLanguage+Helpers.swift
│ │ │ ├── RunestoneThemeSupport/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ ├── RunestoneOneDarkTheme/
│ │ │ │ │ ├── Colors.xcassets/
│ │ │ │ │ │ ├── Contents.json
│ │ │ │ │ │ ├── OneDarkAqua.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkBackground.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkBlue.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkComment.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkCurrentLine.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkForeground.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkGreen.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkPurple.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ ├── OneDarkRed.colorset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── OneDarkYellow.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── OneDarkTheme.swift
│ │ │ │ ├── RunestonePlainTextTheme/
│ │ │ │ │ └── PlainTextTheme.swift
│ │ │ │ ├── RunestoneThemeCommon/
│ │ │ │ │ ├── EditorTheme.swift
│ │ │ │ │ └── HighlightName.swift
│ │ │ │ ├── RunestoneThemeSupport/
│ │ │ │ │ └── RunestoneThemeSupport.swift
│ │ │ │ └── RunestoneTomorrowTheme/
│ │ │ │ ├── Colors.xcassets/
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── TomorrowAqua.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowBackground.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowBlue.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowComment.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowCurrentLine.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowForeground.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowGreen.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowOrange.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowPurple.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── TomorrowRed.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── TomorrowYellow.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── TomorrowTheme.swift
│ │ │ └── TreeSitter/
│ │ │ ├── LICENSE
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── TreeSitter/
│ │ │ ├── include/
│ │ │ │ └── tree_sitter/
│ │ │ │ ├── api.h
│ │ │ │ └── parser.h
│ │ │ └── src/
│ │ │ ├── alloc.c
│ │ │ ├── alloc.h
│ │ │ ├── array.h
│ │ │ ├── atomic.h
│ │ │ ├── clock.h
│ │ │ ├── error_costs.h
│ │ │ ├── get_changed_ranges.c
│ │ │ ├── get_changed_ranges.h
│ │ │ ├── host.h
│ │ │ ├── language.c
│ │ │ ├── language.h
│ │ │ ├── length.h
│ │ │ ├── lexer.c
│ │ │ ├── lexer.h
│ │ │ ├── lib.c
│ │ │ ├── node.c
│ │ │ ├── parser.c
│ │ │ ├── point.h
│ │ │ ├── query.c
│ │ │ ├── reduce_action.h
│ │ │ ├── reusable_node.h
│ │ │ ├── stack.c
│ │ │ ├── stack.h
│ │ │ ├── subtree.c
│ │ │ ├── subtree.h
│ │ │ ├── tree.c
│ │ │ ├── tree.h
│ │ │ ├── tree_cursor.c
│ │ │ ├── tree_cursor.h
│ │ │ ├── unicode/
│ │ │ │ ├── ptypes.h
│ │ │ │ ├── umachine.h
│ │ │ │ ├── urename.h
│ │ │ │ ├── utf.h
│ │ │ │ ├── utf16.h
│ │ │ │ └── utf8.h
│ │ │ └── unicode.h
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ └── Sources/
│ │ └── RunestoneEditor/
│ │ └── RunestoneEditor.swift
│ └── Storage/
│ ├── .gitignore
│ ├── Example/
│ │ ├── Objects.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── ObjectsDemo/
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AccentColor.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Entitlements.entitlements
│ │ │ └── main.swift
│ │ └── ObjectsDemo.xcodeproj/
│ │ └── project.pbxproj
│ ├── Package.resolved
│ ├── Package.swift
│ ├── README.md
│ ├── Sources/
│ │ └── Storage/
│ │ ├── Extension/
│ │ │ ├── Data+Compression.swift
│ │ │ └── Date+Timestamp.swift
│ │ ├── Import.swift
│ │ ├── Objects/
│ │ │ ├── LocalModel.swift
│ │ │ └── ModelCapabilities.swift
│ │ ├── Storage/
│ │ │ ├── DBMigration.swift
│ │ │ ├── DBVersion.swift
│ │ │ ├── DeviceOwned.swift
│ │ │ ├── Storage+Attachment.swift
│ │ │ ├── Storage+ChatTemplate.swift
│ │ │ ├── Storage+CloudModel.swift
│ │ │ ├── Storage+Conversation.swift
│ │ │ ├── Storage+ConversationSummary.swift
│ │ │ ├── Storage+Instance.swift
│ │ │ ├── Storage+Memory.swift
│ │ │ ├── Storage+Message.swift
│ │ │ ├── Storage+ModelContextClient.swift
│ │ │ ├── Storage+Sync.swift
│ │ │ ├── Storage+SyncMetadata.swift
│ │ │ ├── Storage+UploadQueue.swift
│ │ │ └── Storage.swift
│ │ ├── Sync/
│ │ │ ├── Internal/
│ │ │ │ ├── CKRecord+Extension.swift
│ │ │ │ ├── CloudContainer.swift
│ │ │ │ ├── CloudDatabase.swift
│ │ │ │ ├── IsolatedWeakVar.swift
│ │ │ │ ├── LockIsolated.swift
│ │ │ │ ├── MockCloudContainer.swift
│ │ │ │ ├── MockCloudDatabase.swift
│ │ │ │ ├── MockSyncEngine.swift
│ │ │ │ ├── SyncEngine.Event.swift
│ │ │ │ └── SyncEngineProtocol.swift
│ │ │ ├── NotificationInfo.swift
│ │ │ ├── SyncEngine.swift
│ │ │ ├── SyncPreferences.swift
│ │ │ ├── SyncQueryable.swift
│ │ │ ├── Syncable.swift
│ │ │ └── Updatable.swift
│ │ └── Tables/
│ │ ├── Attachment.swift
│ │ ├── ChatTemplateRecord.swift
│ │ ├── CloudModel.swift
│ │ ├── Conversation.swift
│ │ ├── ConversationSummary.swift
│ │ ├── Memory.swift
│ │ ├── Message.swift
│ │ ├── ModelContextServer.swift
│ │ ├── SyncMetadata.swift
│ │ ├── TableNamed.swift
│ │ ├── UploadQueue.swift
│ │ └── V1/
│ │ ├── AttachmentV1.swift
│ │ ├── CloudModelV1.swift
│ │ ├── ConversationV1.swift
│ │ ├── MemoryV1.swift
│ │ ├── MessageV1.swift
│ │ └── ModelContextServerV1.swift
│ └── Tests/
│ └── StorageTests/
│ ├── CloudModelMemoryMCPTests.swift
│ ├── ConversationStorageTests.swift
│ ├── ConversationSummaryMigrationTests.swift
│ ├── MessageStorageTests.swift
│ ├── StorageTestSupport.swift
│ └── TemplateMigrationTests.swift
├── LICENSE
├── LandingPage/
│ ├── .gitignore
│ ├── README.md
│ ├── eslint.config.mjs
│ ├── mdx-components.tsx
│ ├── next.config.ts
│ ├── package.json
│ ├── pnpm-workspace.yaml
│ ├── postcss.config.mjs
│ ├── public/
│ │ └── .gitkeep
│ ├── src/
│ │ ├── app/
│ │ │ ├── docs/
│ │ │ │ ├── documents/
│ │ │ │ │ ├── [...slug]/
│ │ │ │ │ │ └── page.tsx
│ │ │ │ │ ├── app_store.md
│ │ │ │ │ ├── architecture/
│ │ │ │ │ │ ├── chat_pipeline.md
│ │ │ │ │ │ ├── message_normalization.md
│ │ │ │ │ │ └── model_exchange.md
│ │ │ │ │ ├── capabilities/
│ │ │ │ │ │ ├── attachments.md
│ │ │ │ │ │ ├── mcp_integration.md
│ │ │ │ │ │ ├── tools_automation.md
│ │ │ │ │ │ └── web_search.md
│ │ │ │ │ ├── changelog.md
│ │ │ │ │ ├── configuration/
│ │ │ │ │ │ ├── chat_templates.md
│ │ │ │ │ │ └── system_prompts.md
│ │ │ │ │ ├── guides/
│ │ │ │ │ │ ├── apple_shortcuts.md
│ │ │ │ │ │ └── calendar_workflow.md
│ │ │ │ │ ├── legal/
│ │ │ │ │ │ ├── privacy.md
│ │ │ │ │ │ └── software_license.md
│ │ │ │ │ ├── models/
│ │ │ │ │ │ ├── auxiliary_tasks.md
│ │ │ │ │ │ ├── cloud_models_setup.md
│ │ │ │ │ │ ├── inference_configuration.md
│ │ │ │ │ │ └── vision.md
│ │ │ │ │ ├── pricing_timeline.md
│ │ │ │ │ ├── quickstart/
│ │ │ │ │ │ └── basic_usage.md
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── data_backup.md
│ │ │ │ │ │ ├── general.md
│ │ │ │ │ │ └── memory_management.md
│ │ │ │ │ ├── troubleshooting/
│ │ │ │ │ │ ├── faq.md
│ │ │ │ │ │ └── report_issue.md
│ │ │ │ │ └── welcome.md
│ │ │ │ ├── layout.tsx
│ │ │ │ └── page.tsx
│ │ │ ├── globals.css
│ │ │ ├── layout.tsx
│ │ │ ├── page.tsx
│ │ │ └── template.tsx
│ │ └── components/
│ │ ├── animations/
│ │ │ ├── FadeIn.tsx
│ │ │ ├── StaggerContainer.tsx
│ │ │ └── index.ts
│ │ ├── docs/
│ │ │ ├── MobileNav.tsx
│ │ │ ├── Sidebar.tsx
│ │ │ └── index.ts
│ │ └── sections/
│ │ ├── FAQSection.tsx
│ │ ├── FeaturesSection.tsx
│ │ ├── Footer.tsx
│ │ ├── HeroSection.tsx
│ │ ├── Navigation.tsx
│ │ ├── TeamSection.tsx
│ │ ├── TestimonialsSection.tsx
│ │ └── index.ts
│ ├── tsconfig.json
│ └── wrangler.jsonc
├── Makefile
├── README.md
└── Resources/
├── AdditionalLicenses/
│ ├── EventSource@Recouse/
│ │ └── LICENSE
│ ├── Litext@Helixform/
│ │ └── LICENSE
│ ├── Litext@Lakr233/
│ │ └── LICENSE
│ ├── gemoji/
│ │ └── LICENSE
│ ├── unsplash.com/
│ │ └── LICENSE
│ └── wcdb@Tencent/
│ └── LICENSE
├── DevKit/
│ ├── resources/
│ │ ├── .gitkeep
│ │ └── EvaluationManifestExample.fdem
│ └── scripts/
│ ├── apple-resign-scan.py
│ ├── archive.all.sh
│ ├── bump.version.sh
│ ├── check_translations.py
│ ├── check_untranslated.py
│ ├── codesign-macos.sh
│ ├── find_inconsistent_keys.py
│ ├── fix_inconsistent_keys.py
│ ├── get_first_ios_simulator.sh
│ ├── i18n_tools.py
│ ├── install-notary-config.sh
│ ├── install-notary-profile.sh
│ ├── notarize-zip.sh
│ ├── notary-action.sh
│ ├── notary-setup-keychain.sh
│ ├── resolve-packages.sh
│ ├── run_online_e2e_tests.sh
│ ├── run_xcodebuild.sh
│ ├── scan.license.sh
│ ├── select_newest_xcode.py
│ ├── select_newest_xcode.sh
│ ├── update_missing_i18n.py
│ └── xcodebuild-archive-macos.sh
├── Privacy/
│ └── PrivacyStatements-2025.03.04.txt
└── i18n/
└── zh-Hans/
└── README.md
SYMBOL INDEX (2218 symbols across 218 files)
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/html/parser.c
function ts_lex (line 318) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 1888) | extern const TSLanguage *tree_sitter_html(void) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/html/scanner.cc
type TokenType (line 14) | enum TokenType {
type Scanner (line 26) | struct Scanner {
method Scanner (line 27) | Scanner() {}
method serialize (line 29) | unsigned serialize(char *buffer) {
method deserialize (line 57) | void deserialize(const char *buffer, unsigned length) {
method string (line 82) | string scan_tag_name(TSLexer *lexer) {
method scan_comment (line 93) | bool scan_comment(TSLexer *lexer) {
method scan_raw_text (line 120) | bool scan_raw_text(TSLexer *lexer) {
method scan_implicit_end_tag (line 146) | bool scan_implicit_end_tag(TSLexer *lexer) {
method scan_start_tag_name (line 186) | bool scan_start_tag_name(TSLexer *lexer) {
method scan_end_tag_name (line 205) | bool scan_end_tag_name(TSLexer *lexer) {
method scan_self_closing_tag_delimiter (line 218) | bool scan_self_closing_tag_delimiter(TSLexer *lexer) {
method scan (line 231) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_html_external_scanner_scan (line 289) | bool tree_sitter_html_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_html_external_scanner_serialize (line 295) | unsigned tree_sitter_html_external_scanner_serialize(void *payload, char...
function tree_sitter_html_external_scanner_deserialize (line 300) | void tree_sitter_html_external_scanner_deserialize(void *payload, const ...
function tree_sitter_html_external_scanner_destroy (line 305) | void tree_sitter_html_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/html/tag.h
type TagType (line 7) | enum TagType {
function is_void (line 309) | struct Tag {
function Tag (line 372) | static inline Tag for_name(const string &name) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/include/html.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/include/javascript.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/include/json.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/include/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/include/python.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/include/yaml.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/javascript/parser.c
function sym_identifier_character_set_1 (line 2228) | static inline bool sym_identifier_character_set_1(int32_t c) {
function ts_lex (line 2246) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 3576) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 59775) | extern const TSLanguage *tree_sitter_javascript(void) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/javascript/scanner.c
type TokenType (line 4) | enum TokenType {
function tree_sitter_javascript_external_scanner_destroy (line 10) | void tree_sitter_javascript_external_scanner_destroy(void *p) {}
function tree_sitter_javascript_external_scanner_reset (line 11) | void tree_sitter_javascript_external_scanner_reset(void *p) {}
function tree_sitter_javascript_external_scanner_serialize (line 12) | unsigned tree_sitter_javascript_external_scanner_serialize(void *p, char...
function tree_sitter_javascript_external_scanner_deserialize (line 13) | void tree_sitter_javascript_external_scanner_deserialize(void *p, const ...
function advance (line 15) | static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
function scan_whitespace_and_comments (line 17) | static bool scan_whitespace_and_comments(TSLexer *lexer) {
function tree_sitter_javascript_external_scanner_scan (line 53) | bool tree_sitter_javascript_external_scanner_scan(void *payload, TSLexer...
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/json/parser.c
function ts_lex (line 228) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 844) | extern const TSLanguage *tree_sitter_json(void) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/python/parser.c
function sym_identifier_character_set_1 (line 2165) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 2915) | static inline bool sym_identifier_character_set_2(int32_t c) {
function ts_lex (line 3881) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 4574) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 53309) | extern const TSLanguage *tree_sitter_python(void) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/python/scanner.cc
type TokenType (line 13) | enum TokenType {
type Delimiter (line 22) | struct Delimiter {
method Delimiter (line 33) | Delimiter() : flags(0) {}
method is_format (line 35) | bool is_format() const {
method is_raw (line 39) | bool is_raw() const {
method is_triple (line 43) | bool is_triple() const {
method is_bytes (line 47) | bool is_bytes() const {
method end_character (line 51) | int32_t end_character() const {
method set_format (line 58) | void set_format() {
method set_raw (line 62) | void set_raw() {
method set_triple (line 66) | void set_triple() {
method set_bytes (line 70) | void set_bytes() {
method set_end_character (line 74) | void set_end_character(int32_t character) {
type Scanner (line 93) | struct Scanner {
method Scanner (line 94) | Scanner() {
method serialize (line 99) | unsigned serialize(char *buffer) {
method deserialize (line 122) | void deserialize(const char *buffer, unsigned length) {
method advance (line 143) | void advance(TSLexer *lexer) {
method skip (line 147) | void skip(TSLexer *lexer) {
method scan (line 151) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_python_external_scanner_scan (line 374) | bool tree_sitter_python_external_scanner_scan(void *payload, TSLexer *le...
function tree_sitter_python_external_scanner_serialize (line 380) | unsigned tree_sitter_python_external_scanner_serialize(void *payload, ch...
function tree_sitter_python_external_scanner_deserialize (line 385) | void tree_sitter_python_external_scanner_deserialize(void *payload, cons...
function tree_sitter_python_external_scanner_destroy (line 390) | void tree_sitter_python_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/yaml/parser.c
function ts_lex (line 2181) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 38711) | extern const TSLanguage *tree_sitter_yaml(void) {
FILE: Frameworks/RunestoneEditor/External/Runestone/Sources/TestTreeSitterLanguages/yaml/scanner.cc
type tree_sitter_yaml (line 5) | namespace tree_sitter_yaml {
type ResultSchema (line 9) | enum ResultSchema {
function adv_sch_stt (line 17) | int8_t adv_sch_stt(int8_t sch_stt, int32_t cur_chr, ResultSchema *rlt_...
type TokenType (line 214) | enum TokenType {
type Scanner (line 328) | struct Scanner {
method Scanner (line 346) | Scanner() {
method serialize (line 350) | unsigned serialize(char *buffer) {
method deserialize (line 368) | void deserialize(const char *buffer, unsigned length) {
method adv (line 392) | void adv(TSLexer *lexer) {
method adv_nwl (line 398) | void adv_nwl(TSLexer *lexer) {
method skp (line 405) | void skp(TSLexer *lexer) {
method skp_nwl (line 411) | void skp_nwl(TSLexer *lexer) {
method mrk_end (line 418) | void mrk_end(TSLexer *lexer) {
method init (line 424) | void init() {
method flush (line 432) | void flush() {
method pop_ind (line 437) | void pop_ind() {
method push_ind (line 442) | void push_ind(int16_t typ, int16_t len) {
method is_wsp (line 447) | bool is_wsp(int32_t c) {
method is_nwl (line 451) | bool is_nwl(int32_t c) {
method is_wht (line 455) | bool is_wht(int32_t c) {
method is_ns_dec_digit (line 459) | bool is_ns_dec_digit(int32_t c) {
method is_ns_hex_digit (line 463) | bool is_ns_hex_digit(int32_t c) {
method is_ns_word_char (line 469) | bool is_ns_word_char(int32_t c) {
method is_nb_json (line 476) | bool is_nb_json(int32_t c) {
method is_nb_double_char (line 480) | bool is_nb_double_char(int32_t c) {
method is_nb_single_char (line 484) | bool is_nb_single_char(int32_t c) {
method is_ns_char (line 488) | bool is_ns_char(int32_t c) {
method is_c_indicator (line 497) | bool is_c_indicator(int32_t c) {
method is_c_flow_indicator (line 503) | bool is_c_flow_indicator(int32_t c) {
method is_plain_safe_in_block (line 507) | bool is_plain_safe_in_block(int32_t c) {
method is_plain_safe_in_flow (line 511) | bool is_plain_safe_in_flow(int32_t c) {
method is_ns_uri_char (line 515) | bool is_ns_uri_char(int32_t c) {
method is_ns_tag_char (line 522) | bool is_ns_tag_char(int32_t c) {
method is_ns_anchor_char (line 529) | bool is_ns_anchor_char(int32_t c) {
method scn_uri_esc (line 533) | char scn_uri_esc(TSLexer *lexer) {
method scn_ns_uri_char (line 544) | char scn_ns_uri_char(TSLexer *lexer) {
method scn_ns_tag_char (line 549) | char scn_ns_tag_char(TSLexer *lexer) {
method scn_dir_bgn (line 554) | bool scn_dir_bgn(TSLexer *lexer) {
method scn_dir_yml_ver (line 595) | bool scn_dir_yml_ver(TSLexer *lexer, TSSymbol result_symbol) {
method scn_tag_hdl_tal (line 607) | bool scn_tag_hdl_tal(TSLexer *lexer) {
method scn_dir_tag_hdl (line 616) | bool scn_dir_tag_hdl(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dir_tag_pfx (line 624) | bool scn_dir_tag_pfx(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dir_rsv_prm (line 638) | bool scn_dir_rsv_prm(TSLexer *lexer, TSSymbol result_symbol) {
method scn_tag (line 646) | bool scn_tag(TSLexer *lexer, TSSymbol result_symbol) {
method scn_acr_bgn (line 679) | bool scn_acr_bgn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_acr_ctn (line 687) | bool scn_acr_ctn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_als_bgn (line 693) | bool scn_als_bgn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_als_ctn (line 701) | bool scn_als_ctn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dqt_esc_seq (line 707) | bool scn_dqt_esc_seq(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dqt_str_cnt (line 734) | bool scn_dqt_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
method scn_sqt_str_cnt (line 745) | bool scn_sqt_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
method scn_blk_str_bgn (line 756) | bool scn_blk_str_bgn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_blk_str_cnt (line 801) | bool scn_blk_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
method scn_pln_cnt (line 820) | char scn_pln_cnt(TSLexer *lexer, bool (Scanner::*is_plain_safe)(int32_...
method scn_drs_doc_end (line 847) | bool scn_drs_doc_end(TSLexer *lexer) {
method scan (line 862) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_yaml_external_scanner_destroy (line 1163) | void tree_sitter_yaml_external_scanner_destroy(void *payload) {
function tree_sitter_yaml_external_scanner_serialize (line 1168) | unsigned tree_sitter_yaml_external_scanner_serialize(void *payload, char...
function tree_sitter_yaml_external_scanner_deserialize (line 1173) | void tree_sitter_yaml_external_scanner_deserialize(void *payload, const ...
function tree_sitter_yaml_external_scanner_scan (line 1178) | bool tree_sitter_yaml_external_scanner_scan(void *payload, TSLexer *lexe...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterAstro/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterAstro/src/parser.c
function ts_lex (line 360) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 2322) | extern const TSLanguage *tree_sitter_astro(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterAstro/src/scanner.cc
type TokenType (line 14) | enum TokenType {
type Scanner (line 28) | struct Scanner {
method Scanner (line 29) | Scanner() {}
method serialize (line 31) | unsigned serialize(char *buffer) {
method deserialize (line 59) | void deserialize(const char *buffer, unsigned length) {
method string (line 84) | string scan_tag_name(TSLexer *lexer) {
method scan_comment (line 95) | bool scan_comment(TSLexer *lexer) {
method scan_js_backtick_string (line 122) | inline void scan_js_backtick_string(TSLexer *lexer) {
method scan_js_string (line 145) | inline void scan_js_string(TSLexer *lexer) {
method scan_js_expr (line 168) | inline void scan_js_expr(TSLexer *lexer, const string& end) {
method scan_raw_text (line 206) | bool scan_raw_text(TSLexer *lexer) {
method scan_implicit_end_tag (line 245) | bool scan_implicit_end_tag(TSLexer *lexer) {
method scan_start_tag_name (line 285) | bool scan_start_tag_name(TSLexer *lexer) {
method scan_end_tag_name (line 304) | bool scan_end_tag_name(TSLexer *lexer) {
method scan_self_closing_tag_delimiter (line 317) | bool scan_self_closing_tag_delimiter(TSLexer *lexer) {
method scan (line 330) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_astro_external_scanner_scan (line 414) | bool tree_sitter_astro_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_astro_external_scanner_serialize (line 420) | unsigned tree_sitter_astro_external_scanner_serialize(void *payload, cha...
function tree_sitter_astro_external_scanner_deserialize (line 425) | void tree_sitter_astro_external_scanner_deserialize(void *payload, const...
function tree_sitter_astro_external_scanner_destroy (line 430) | void tree_sitter_astro_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterAstro/src/tag.h
type TagType (line 7) | enum TagType {
function is_void (line 312) | struct Tag {
function Tag (line 380) | static inline Tag for_name(const string &name) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterAstro/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterBash/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterBash/src/parser.c
function sym_word_character_set_1 (line 5023) | static inline bool sym_word_character_set_1(int32_t c) {
function sym_word_character_set_2 (line 5041) | static inline bool sym_word_character_set_2(int32_t c) {
function sym_word_character_set_3 (line 5059) | static inline bool sym_word_character_set_3(int32_t c) {
function sym_word_character_set_4 (line 5077) | static inline bool sym_word_character_set_4(int32_t c) {
function sym_word_character_set_5 (line 5093) | static inline bool sym_word_character_set_5(int32_t c) {
function sym_word_character_set_6 (line 5109) | static inline bool sym_word_character_set_6(int32_t c) {
function sym_word_character_set_7 (line 5125) | static inline bool sym_word_character_set_7(int32_t c) {
function sym_word_character_set_8 (line 5141) | static inline bool sym_word_character_set_8(int32_t c) {
function sym_word_character_set_9 (line 5159) | static inline bool sym_word_character_set_9(int32_t c) {
function sym_word_character_set_10 (line 5175) | static inline bool sym_word_character_set_10(int32_t c) {
function sym_word_character_set_11 (line 5189) | static inline bool sym_word_character_set_11(int32_t c) {
function ts_lex (line 5207) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 9026) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 133893) | extern const TSLanguage *tree_sitter_bash(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterBash/src/scanner.cc
type TokenType (line 9) | enum TokenType {
type Scanner (line 27) | struct Scanner {
method skip (line 28) | void skip(TSLexer *lexer) {
method advance (line 32) | void advance(TSLexer *lexer) {
method serialize (line 36) | unsigned serialize(char *buffer) {
method deserialize (line 45) | void deserialize(const char *buffer, unsigned length) {
method scan_heredoc_start (line 59) | bool scan_heredoc_start(TSLexer *lexer) {
method scan_heredoc_end_identifier (line 89) | bool scan_heredoc_end_identifier(TSLexer *lexer) {
method scan_heredoc_content (line 103) | bool scan_heredoc_content(TSLexer *lexer, TokenType middle_type, Token...
method scan (line 170) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_bash_external_scanner_scan (line 377) | bool tree_sitter_bash_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_bash_external_scanner_serialize (line 383) | unsigned tree_sitter_bash_external_scanner_serialize(void *payload, char...
function tree_sitter_bash_external_scanner_deserialize (line 388) | void tree_sitter_bash_external_scanner_deserialize(void *payload, const ...
function tree_sitter_bash_external_scanner_destroy (line 393) | void tree_sitter_bash_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterBash/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterC/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterC/src/parser.c
function ts_lex (line 2336) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 4291) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 75748) | extern const TSLanguage *tree_sitter_c(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterC/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCPP/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCPP/src/scanner.cc
type TokenType (line 10) | enum TokenType {
type Scanner (line 14) | struct Scanner {
method scan (line 15) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_cpp_external_scanner_scan (line 101) | bool tree_sitter_cpp_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_cpp_external_scanner_serialize (line 107) | unsigned tree_sitter_cpp_external_scanner_serialize(void *payload, char ...
function tree_sitter_cpp_external_scanner_deserialize (line 111) | void tree_sitter_cpp_external_scanner_deserialize(void *payload, const c...
function tree_sitter_cpp_external_scanner_destroy (line 114) | void tree_sitter_cpp_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCPP/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCPP/src/tree_sitter/runtime.h
type TSSymbol (line 11) | typedef unsigned short TSSymbol;
type TSLanguage (line 12) | typedef struct TSLanguage TSLanguage;
type TSDocument (line 13) | typedef struct TSDocument TSDocument;
type TSInputEncoding (line 15) | typedef enum {
type TSInput (line 20) | typedef struct {
type TSDebugType (line 27) | typedef enum {
type TSDebugger (line 32) | typedef struct {
type TSInputEdit (line 37) | typedef struct {
type TSPoint (line 43) | typedef struct {
type TSNode (line 48) | typedef struct {
type TSSymbolIterator (line 53) | typedef struct {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCSS/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCSS/src/parser.c
function sym_plain_value_character_set_1 (line 857) | static inline bool sym_plain_value_character_set_1(int32_t c) {
function sym_plain_value_character_set_2 (line 875) | static inline bool sym_plain_value_character_set_2(int32_t c) {
function ts_lex (line 893) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 9323) | extern const TSLanguage *tree_sitter_css(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCSS/src/scanner.c
type TokenType (line 4) | enum TokenType {
function tree_sitter_css_external_scanner_destroy (line 9) | void tree_sitter_css_external_scanner_destroy(void *p) {}
function tree_sitter_css_external_scanner_reset (line 10) | void tree_sitter_css_external_scanner_reset(void *p) {}
function tree_sitter_css_external_scanner_serialize (line 11) | unsigned tree_sitter_css_external_scanner_serialize(void *p, char *buffe...
function tree_sitter_css_external_scanner_deserialize (line 12) | void tree_sitter_css_external_scanner_deserialize(void *p, const char *b...
function tree_sitter_css_external_scanner_scan (line 14) | bool tree_sitter_css_external_scanner_scan(void *payload, TSLexer *lexer...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCSS/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCSharp/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCSharp/src/scanner.c
type TokenType (line 4) | enum TokenType {
function tree_sitter_c_sharp_external_scanner_destroy (line 9) | void tree_sitter_c_sharp_external_scanner_destroy(void *p) {}
function tree_sitter_c_sharp_external_scanner_reset (line 10) | void tree_sitter_c_sharp_external_scanner_reset(void *p) {}
function tree_sitter_c_sharp_external_scanner_serialize (line 11) | unsigned tree_sitter_c_sharp_external_scanner_serialize(void *p, char *b...
function tree_sitter_c_sharp_external_scanner_deserialize (line 12) | void tree_sitter_c_sharp_external_scanner_deserialize(void *p, const cha...
function tree_sitter_c_sharp_external_scanner_scan (line 14) | bool tree_sitter_c_sharp_external_scanner_scan(
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterCSharp/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterComment/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterComment/src/parser.c
function ts_lex (line 129) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 375) | extern const TSLanguage *tree_sitter_comment(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterComment/src/scanner.c
function tree_sitter_comment_external_scanner_destroy (line 11) | void tree_sitter_comment_external_scanner_destroy(void* payload)
function tree_sitter_comment_external_scanner_serialize (line 15) | unsigned tree_sitter_comment_external_scanner_serialize(
function tree_sitter_comment_external_scanner_deserialize (line 22) | void tree_sitter_comment_external_scanner_deserialize(
function tree_sitter_comment_external_scanner_scan (line 29) | bool tree_sitter_comment_external_scanner_scan(
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterComment/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterComment/src/tree_sitter_comment/chars.c
function is_upper (line 3) | bool is_upper(int32_t c)
function is_digit (line 10) | bool is_digit(int32_t c)
function is_newline (line 17) | bool is_newline(int32_t c)
function is_space (line 33) | bool is_space(int32_t c)
function is_internal_char (line 53) | bool is_internal_char(int32_t c)
function is_start_char (line 71) | bool is_start_char(int32_t c)
function is_end_char (line 95) | bool is_end_char(int32_t c)
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterComment/src/tree_sitter_comment/parser.c
function parse_tagname (line 14) | bool parse_tagname(TSLexer* lexer, const bool* valid_symbols)
function parse_text (line 83) | bool parse_text(TSLexer* lexer, const bool* valid_symbols, bool end)
function parse (line 115) | bool parse(TSLexer* lexer, const bool* valid_symbols)
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterComment/src/tree_sitter_comment/tokens.h
type TokenType (line 4) | enum TokenType {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterElixir/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterElixir/src/scanner.cc
type TokenType (line 6) | enum TokenType {
function advance (line 39) | void advance(TSLexer* lexer) {
function skip (line 43) | void skip(TSLexer *lexer) {
function is_whitespace (line 50) | bool is_whitespace(int32_t c) {
function is_inline_whitespace (line 54) | bool is_inline_whitespace(int32_t c) {
function is_newline (line 58) | bool is_newline(int32_t c) {
function is_digit (line 65) | bool is_digit(int32_t c) {
function check_keyword_end (line 69) | bool check_keyword_end(TSLexer* lexer) {
function check_operator_end (line 77) | bool check_operator_end(TSLexer* lexer) {
function is_token_end (line 114) | bool is_token_end(int32_t c) {
type QuotedContentInfo (line 124) | struct QuotedContentInfo {
function find_quoted_token_info (line 156) | int8_t find_quoted_token_info(const bool* valid_symbols) {
function scan_quoted_content (line 174) | bool scan_quoted_content(TSLexer* lexer, const QuotedContentInfo& info) {
function scan_newline (line 221) | bool scan_newline(TSLexer* lexer, const bool* valid_symbols) {
function scan (line 512) | bool scan(TSLexer* lexer, const bool* valid_symbols) {
function tree_sitter_elixir_external_scanner_scan (line 609) | bool tree_sitter_elixir_external_scanner_scan(void* payload, TSLexer* le...
function tree_sitter_elixir_external_scanner_serialize (line 613) | unsigned tree_sitter_elixir_external_scanner_serialize(void* payload, ch...
function tree_sitter_elixir_external_scanner_deserialize (line 617) | void tree_sitter_elixir_external_scanner_deserialize(void* payload, cons...
function tree_sitter_elixir_external_scanner_destroy (line 619) | void tree_sitter_elixir_external_scanner_destroy(void* payload) {}
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterElixir/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterElm/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterElm/src/parser.c
function sym__upper_case_identifier_without_leading_whitespace_character_set_1 (line 1885) | static inline bool sym__upper_case_identifier_without_leading_whitespace...
function sym__upper_case_identifier_without_leading_whitespace_character_set_2 (line 2599) | static inline bool sym__upper_case_identifier_without_leading_whitespace...
function sym__lower_case_identifier_without_leading_whitespace_character_set_1 (line 3113) | static inline bool sym__lower_case_identifier_without_leading_whitespace...
function sym_upper_case_identifier_character_set_1 (line 3211) | static inline bool sym_upper_case_identifier_character_set_1(int32_t c) {
function sym_upper_case_identifier_character_set_2 (line 3975) | static inline bool sym_upper_case_identifier_character_set_2(int32_t c) {
function sym_lower_case_identifier_character_set_1 (line 4689) | static inline bool sym_lower_case_identifier_character_set_1(int32_t c) {
function sym_lower_case_identifier_character_set_2 (line 4819) | static inline bool sym_lower_case_identifier_character_set_2(int32_t c) {
function sym_lower_case_identifier_character_set_3 (line 5595) | static inline bool sym_lower_case_identifier_character_set_3(int32_t c) {
function ts_lex (line 5725) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 6894) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 43570) | extern const TSLanguage *tree_sitter_elm(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterElm/src/scanner.cc
type TokenType (line 14) | enum TokenType
type Scanner (line 24) | struct Scanner
method Scanner (line 26) | Scanner() {}
method serialize (line 28) | unsigned serialize(char *buffer)
method deserialize (line 63) | void deserialize(const char *buffer, unsigned length)
method advance (line 95) | void advance(TSLexer *lexer)
method skip (line 100) | void skip(TSLexer *lexer)
method isElmSpace (line 105) | bool isElmSpace(TSLexer *lexer)
method checkForIn (line 110) | int checkForIn(TSLexer *lexer, const bool *valid_symbols)
method scan_block_comment (line 131) | bool scan_block_comment(TSLexer *lexer)
method advance_to_line_end (line 166) | void advance_to_line_end(TSLexer *lexer)
method scan (line 181) | bool scan(TSLexer *lexer, const bool *valid_symbols)
function tree_sitter_elm_external_scanner_scan (line 483) | bool tree_sitter_elm_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_elm_external_scanner_serialize (line 490) | unsigned tree_sitter_elm_external_scanner_serialize(void *payload, char ...
function tree_sitter_elm_external_scanner_deserialize (line 496) | void tree_sitter_elm_external_scanner_deserialize(void *payload, const c...
function tree_sitter_elm_external_scanner_destroy (line 502) | void tree_sitter_elm_external_scanner_destroy(void *payload)
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterElm/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterGo/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterGo/src/parser.c
function sym_identifier_character_set_1 (line 3375) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 3889) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 4403) | static inline bool sym_identifier_character_set_3(int32_t c) {
function sym_rune_literal_character_set_1 (line 4917) | static inline bool sym_rune_literal_character_set_1(int32_t c) {
function ts_lex (line 4931) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 5903) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 56773) | extern const TSLanguage *tree_sitter_go(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterGo/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHTML/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHTML/src/parser.c
function ts_lex (line 318) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 1891) | extern const TSLanguage *tree_sitter_html(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHTML/src/scanner.cc
type TokenType (line 14) | enum TokenType {
type Scanner (line 26) | struct Scanner {
method Scanner (line 27) | Scanner() {}
method serialize (line 29) | unsigned serialize(char *buffer) {
method deserialize (line 57) | void deserialize(const char *buffer, unsigned length) {
method string (line 82) | string scan_tag_name(TSLexer *lexer) {
method scan_comment (line 93) | bool scan_comment(TSLexer *lexer) {
method scan_raw_text (line 120) | bool scan_raw_text(TSLexer *lexer) {
method scan_implicit_end_tag (line 146) | bool scan_implicit_end_tag(TSLexer *lexer) {
method scan_start_tag_name (line 186) | bool scan_start_tag_name(TSLexer *lexer) {
method scan_end_tag_name (line 205) | bool scan_end_tag_name(TSLexer *lexer) {
method scan_self_closing_tag_delimiter (line 218) | bool scan_self_closing_tag_delimiter(TSLexer *lexer) {
method scan (line 231) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_html_external_scanner_scan (line 289) | bool tree_sitter_html_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_html_external_scanner_serialize (line 295) | unsigned tree_sitter_html_external_scanner_serialize(void *payload, char...
function tree_sitter_html_external_scanner_deserialize (line 300) | void tree_sitter_html_external_scanner_deserialize(void *payload, const ...
function tree_sitter_html_external_scanner_destroy (line 305) | void tree_sitter_html_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHTML/src/tag.h
type TagType (line 7) | enum TagType {
function is_void (line 309) | struct Tag {
function Tag (line 372) | static inline Tag for_name(const string &name) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHTML/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHaskell/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHaskell/src/scanner.c
type Sym (line 98) | typedef enum {
function all_syms (line 153) | static bool all_syms(const bool *syms) {
function debug_valid (line 164) | static void debug_valid(const bool *syms) {
type indent_vec (line 182) | typedef struct {
type State (line 200) | typedef struct {
function State (line 211) | State state_new(TSLexer *l, const bool * restrict vs, indent_vec *is) {
function debug_indents (line 225) | static void debug_indents(indent_vec *indents) {
function debug_state (line 235) | void debug_state(State *state) {
function is_eof (line 248) | static bool is_eof(State *state) { return state->lexer->eof(state->lexer...
function column (line 253) | static uint32_t column(State *state) {
function MARK (line 267) | static void MARK(char *marked_by, bool needs_free, State *state) {
function varid_start_char (line 286) | static bool varid_start_char(const uint32_t c) { return c == '_' || iswl...
function varid_char (line 288) | static bool varid_char(const uint32_t c) {
function quoter_char (line 299) | static bool quoter_char(const uint32_t c) { return varid_char(c) || c ==...
function seq (line 301) | static bool seq(const char * restrict s, State *state) {
function consume_until (line 312) | static void consume_until(char *target, State *state) {
type wchar_vec (line 332) | typedef struct {
function wchar_vec (line 338) | static wchar_vec read_string(bool (*cond)(uint32_t), State *state) {
function isws (line 360) | static bool isws(uint32_t c) {
function token_end (line 370) | static bool token_end(uint32_t c) {
function token (line 388) | static bool token(const char *restrict s, State *state) {
function indent_exists (line 396) | static bool indent_exists(State *state) { return state->indents->len != ...
function keep_layout (line 402) | static bool keep_layout(uint16_t indent, State *state) {
function same_indent (line 409) | static bool same_indent(uint32_t indent, State *state) { return indent_e...
function smaller_indent (line 414) | static bool smaller_indent(uint32_t indent, State *state) {
function indent_lesseq (line 418) | static bool indent_lesseq(uint32_t indent, State *state) { return indent...
function is_newline_where (line 429) | static bool is_newline_where(uint32_t indent, State *state) {
function is_newline (line 441) | static bool is_newline(uint32_t c) {
function uninitialized (line 455) | static bool uninitialized(State *state) { return !indent_exists(state); }
function after_error (line 460) | static bool after_error(State *state) { return all_syms(state->symbols); }
function symbolic (line 487) | static bool symbolic(uint32_t c) {
function valid_symop_two_chars (line 499) | static bool valid_symop_two_chars(uint32_t first_char, uint32_t second_c...
function valid_splice (line 516) | static bool valid_splice(State *state) {
type Symbolic (line 520) | typedef enum {
function Symbolic (line 536) | static Symbolic con_or_var(uint32_t c) { return c == ':' ? S_CON : S_OP; }
function expression_op (line 543) | static bool expression_op(Symbolic type) {
function Symbolic (line 570) | static Symbolic s_symop(wchar_vec s, State *state) {
type Result (line 616) | typedef struct {
function debug_result (line 622) | void debug_result(Result res) {
function Result (line 633) | static Result res_finish(Sym t) { return (Result) {.sym = t, .finished =...
function Result (line 644) | static Result finish(const Sym s, char *restrict desc) {
function Result (line 652) | static Result finish_if_valid(const Sym s, char *restrict desc, State *s...
function push (line 659) | static void push(uint16_t ind, State *state) {
function pop (line 667) | static void pop(State *state) {
function skipspace (line 677) | static void skipspace(State *state) {
function Result (line 693) | static Result layout_end(char *desc, State *state) {
function Result (line 704) | static Result end_or_semicolon(char *desc, State *state) {
function count_indent (line 725) | static uint32_t count_indent(State *state) {
function Result (line 756) | static Result eof(State *state) {
function Result (line 774) | static Result initialize(uint32_t column, State *state) {
function Result (line 785) | static Result initialize_init(State *state) {
function Result (line 803) | static Result dot(State *state) {
function cpp_consume (line 821) | static void cpp_consume(State *state) {
function Result (line 840) | static Result cpp_workaround(State *state) {
function Result (line 862) | static Result cpp(State *state) {
function Result (line 873) | static Result dedent(uint32_t indent, State *state) {
function Result (line 883) | static Result newline_where(uint32_t indent, State *state) {
function Result (line 897) | static Result newline_semicolon(uint32_t indent, State *state) {
function end_on_infix (line 915) | static bool end_on_infix(uint32_t indent, Symbolic type, State *state) {
function Result (line 922) | static Result newline_infix(uint32_t indent, Symbolic type, State *state) {
function Result (line 934) | static Result where(State *state) {
function Result (line 948) | static Result in(State *state) {
function Result (line 960) | static Result else_(State *state) {
function Result (line 968) | static Result qq_start(State *state) {
function Result (line 975) | static Result qq_body(State *state) {
function Result (line 1002) | static Result splice(State *state) {
function Result (line 1011) | static Result unboxed_close(State *state) {
function Result (line 1026) | static Result inline_comment(State *state) {
function Symbolic (line 1047) | static Symbolic read_symop(State *state) {
function Result (line 1055) | static Result symop_marked(Symbolic type, State *state) {
function Result (line 1103) | static Result symop(Symbolic type, State *state) {
function Result (line 1132) | static Result minus(State *state) {
function Result (line 1142) | static Result multiline_comment_success(State *state) {
function Result (line 1153) | static Result multiline_comment(State *state) {
function Result (line 1188) | static Result brace(State *state) {
function Result (line 1200) | static Result comment(State *state) {
function Result (line 1227) | static Result close_layout_in_list(State *state) {
function Result (line 1261) | static Result inline_tokens(State *state) {
function Result (line 1327) | static Result layout_start(uint32_t column, State *state) {
function Result (line 1364) | static Result post_end_semicolon(uint32_t column, State *state) {
function Result (line 1373) | static Result repeat_end(uint32_t column, State *state) {
function Result (line 1383) | static Result newline_indent(uint32_t indent, State *state) {
function Result (line 1394) | static Result newline_token(uint32_t indent, State *state) {
function Result (line 1413) | static Result newline(uint32_t indent, State *state) {
function Result (line 1436) | static Result immediate(uint32_t column, State *state) {
function Result (line 1455) | static Result init(State *state) {
function Result (line 1475) | static Result scan_main(State *state) {
function Result (line 1492) | static Result scan_all(State *state) {
function debug_lookahead (line 1508) | static void debug_lookahead(State *state) {
function eval (line 1536) | static bool eval(Result (*chk)(State *state), State *state) {
function tree_sitter_haskell_external_scanner_scan (line 1572) | bool tree_sitter_haskell_external_scanner_scan(void *indents_v, TSLexer ...
function tree_sitter_haskell_external_scanner_serialize (line 1591) | unsigned tree_sitter_haskell_external_scanner_serialize(void *indents_v,...
function tree_sitter_haskell_external_scanner_deserialize (line 1606) | void tree_sitter_haskell_external_scanner_deserialize(void *indents_v, c...
function tree_sitter_haskell_external_scanner_destroy (line 1619) | void tree_sitter_haskell_external_scanner_destroy(void *indents_v) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterHaskell/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSDoc/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSDoc/src/parser.c
function ts_lex (line 220) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 1843) | extern const TSLanguage *tree_sitter_jsdoc(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSDoc/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSON/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSON/src/parser.c
function ts_lex (line 235) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 960) | extern const TSLanguage *tree_sitter_json(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSON/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSON5/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSON5/src/parser.c
function sym_identifier_character_set_1 (line 206) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 720) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 1234) | static inline bool sym_identifier_character_set_3(int32_t c) {
function ts_lex (line 1748) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 2524) | extern const TSLanguage *tree_sitter_json5(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJSON5/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJava/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJava/src/parser.c
function sym_identifier_character_set_1 (line 3315) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 3829) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 4343) | static inline bool sym_identifier_character_set_3(int32_t c) {
function ts_lex (line 4857) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 5882) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 64508) | extern const TSLanguage *tree_sitter_java(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJava/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJavaScript/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJavaScript/src/parser.c
function sym__glimmer_template_content_character_set_1 (line 2381) | static inline bool sym__glimmer_template_content_character_set_1(int32_t...
function anon_sym_BANG_character_set_1 (line 2397) | static inline bool anon_sym_BANG_character_set_1(int32_t c) {
function sym_identifier_character_set_1 (line 2413) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 2431) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 2449) | static inline bool sym_identifier_character_set_3(int32_t c) {
function sym_identifier_character_set_4 (line 2463) | static inline bool sym_identifier_character_set_4(int32_t c) {
function sym_private_property_identifier_character_set_1 (line 2481) | static inline bool sym_private_property_identifier_character_set_1(int32...
function ts_lex (line 2499) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 3851) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 77414) | extern const TSLanguage *tree_sitter_javascript(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJavaScript/src/scanner.c
type TokenType (line 4) | enum TokenType {
function tree_sitter_javascript_external_scanner_destroy (line 11) | void tree_sitter_javascript_external_scanner_destroy(void *p) {}
function tree_sitter_javascript_external_scanner_reset (line 12) | void tree_sitter_javascript_external_scanner_reset(void *p) {}
function tree_sitter_javascript_external_scanner_serialize (line 13) | unsigned tree_sitter_javascript_external_scanner_serialize(void *p, char...
function tree_sitter_javascript_external_scanner_deserialize (line 14) | void tree_sitter_javascript_external_scanner_deserialize(void *p, const ...
function advance (line 16) | static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
function skip (line 17) | static void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
function scan_template_chars (line 19) | static bool scan_template_chars(TSLexer *lexer) {
function scan_whitespace_and_comments (line 40) | static bool scan_whitespace_and_comments(TSLexer *lexer) {
function scan_automatic_semicolon (line 76) | static bool scan_automatic_semicolon(TSLexer *lexer) {
function scan_ternary_qmark (line 147) | static bool scan_ternary_qmark(TSLexer *lexer) {
function tree_sitter_javascript_external_scanner_scan (line 171) | bool tree_sitter_javascript_external_scanner_scan(void *payload, TSLexer...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJavaScript/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJulia/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJulia/src/scanner.c
type TokenType (line 5) | enum TokenType {
type Delimiter (line 34) | typedef char Delimiter;
type Stack (line 37) | typedef struct {
function Stack (line 42) | static Stack *new_stack() {
function free_stack (line 52) | static void free_stack(Stack *stack) {
function push (line 57) | static void push(Stack *stack, char c, bool triple) {
function Delimiter (line 62) | static Delimiter pop(Stack *stack) {
function serialize_stack (line 67) | static unsigned serialize_stack(Stack *stack, char *buffer) {
function deserialize_stack (line 73) | static void deserialize_stack(Stack *stack, const char *buffer, unsigned...
function advance (line 85) | static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
function mark_end (line 87) | static void mark_end(TSLexer *lexer) { lexer->mark_end(lexer); }
function scan_string_start (line 89) | static bool scan_string_start(TSLexer *lexer, Stack *stack, char start_c...
function scan_string_content (line 106) | static bool scan_string_content(TSLexer *lexer, Stack *stack, bool inter...
function scan_block_comment (line 160) | static bool scan_block_comment(TSLexer *lexer) {
function tree_sitter_julia_external_scanner_scan (line 201) | bool tree_sitter_julia_external_scanner_scan(
function tree_sitter_julia_external_scanner_destroy (line 258) | void tree_sitter_julia_external_scanner_destroy(void *payload) {
function tree_sitter_julia_external_scanner_serialize (line 262) | unsigned tree_sitter_julia_external_scanner_serialize(
function tree_sitter_julia_external_scanner_deserialize (line 269) | void tree_sitter_julia_external_scanner_deserialize(
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterJulia/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLaTeX/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLaTeX/src/scanner.c
type TokenType (line 6) | enum TokenType {
function find_verbatim (line 15) | static bool find_verbatim(TSLexer *lexer, const char *keyword,
function tree_sitter_latex_external_scanner_destroy (line 80) | void tree_sitter_latex_external_scanner_destroy(void *payload) {}
function tree_sitter_latex_external_scanner_serialize (line 82) | unsigned tree_sitter_latex_external_scanner_serialize(void *payload,
function tree_sitter_latex_external_scanner_deserialize (line 87) | void tree_sitter_latex_external_scanner_deserialize(void *payload,
function tree_sitter_latex_external_scanner_scan (line 91) | bool tree_sitter_latex_external_scanner_scan(void *payload, TSLexer *lexer,
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLaTeX/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLanguagesCommon/include/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLua/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLua/src/parser.c
function ts_lex (line 1164) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 1501) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 10795) | extern const TSLanguage *tree_sitter_lua(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLua/src/scanner.c
type TokenType (line 5) | enum TokenType {
function consume (line 15) | static inline void consume(TSLexer *lexer) { lexer->advance(lexer, false...
function skip (line 16) | static inline void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
function consume_char (line 18) | static inline bool consume_char(char c, TSLexer *lexer) {
function consume_and_count_char (line 27) | static inline uint8_t consume_and_count_char(char c, TSLexer *lexer) {
function skip_whitespaces (line 36) | static inline void skip_whitespaces(TSLexer *lexer) {
function tree_sitter_lua_external_scanner_destroy (line 43) | void tree_sitter_lua_external_scanner_destroy(void *payload) {}
type InsideNode (line 45) | enum InsideNode { INSIDE_NONE, INSIDE_COMMENT, INSIDE_STRING }
function reset_state (line 51) | static inline void reset_state() {
function tree_sitter_lua_external_scanner_serialize (line 57) | unsigned tree_sitter_lua_external_scanner_serialize(void *payload, char ...
function tree_sitter_lua_external_scanner_deserialize (line 64) | void tree_sitter_lua_external_scanner_deserialize(void *payload, const c...
function scan_block_start (line 73) | static bool scan_block_start(TSLexer *lexer) {
function scan_block_end (line 86) | static bool scan_block_end(TSLexer *lexer) {
function scan_block_content (line 98) | static bool scan_block_content(TSLexer *lexer) {
function scan_comment_start (line 114) | static bool scan_comment_start(TSLexer *lexer) {
function scan_comment_content (line 129) | static bool scan_comment_content(TSLexer *lexer) {
function scan_string_start (line 152) | static bool scan_string_start(TSLexer *lexer) {
function scan_string_end (line 168) | static bool scan_string_end(TSLexer *lexer) {
function scan_string_content (line 180) | static bool scan_string_content(TSLexer *lexer) {
function tree_sitter_lua_external_scanner_scan (line 198) | bool tree_sitter_lua_external_scanner_scan(void *payload, TSLexer *lexer...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterLua/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdown/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdown/src/parser.c
function ts_lex (line 1571) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 58543) | extern const TSLanguage *tree_sitter_markdown(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdown/src/scanner.c
type TokenType (line 8) | typedef enum {
type Block (line 65) | typedef enum {
function is_punctuation (line 89) | static bool is_punctuation(char c) {
function list_item_indentation (line 99) | static uint8_t list_item_indentation(Block block) {
function roundup_32 (line 175) | static size_t roundup_32(size_t x)
type Scanner (line 190) | typedef struct {
function push_block (line 215) | static void push_block(Scanner *s, Block b)
function Block (line 229) | static inline Block pop_block(Scanner *s)
function Block (line 234) | static inline Block last_block(Scanner *s)
function serialize (line 240) | static unsigned serialize(Scanner *s, char *buffer) {
function deserialize (line 257) | static void deserialize(Scanner *s, const char *buffer, unsigned length) {
function mark_end (line 284) | static void mark_end(Scanner *s, TSLexer *lexer) {
function error (line 299) | static bool error(TSLexer *lexer) {
function advance (line 307) | static size_t advance(Scanner *s, TSLexer *lexer) {
function match (line 323) | static bool match(Scanner *s, TSLexer *lexer, Block block) {
function parse_fenced_code_block (line 390) | static bool parse_fenced_code_block(Scanner *s, const char delimiter, TS...
function parse_star (line 446) | static bool parse_star(Scanner *s, TSLexer *lexer, const bool *valid_sym...
function parse_thematic_break_underscore (line 533) | static bool parse_thematic_break_underscore(Scanner *s, TSLexer *lexer, ...
function parse_block_quote (line 557) | static bool parse_block_quote(Scanner *s, TSLexer *lexer, const bool *va...
function parse_atx_heading (line 571) | static bool parse_atx_heading(Scanner *s, TSLexer *lexer, const bool *va...
function parse_setext_underline (line 589) | static bool parse_setext_underline(Scanner *s, TSLexer *lexer, const boo...
function parse_plus (line 607) | static bool parse_plus(Scanner *s, TSLexer *lexer, const bool *valid_sym...
function parse_ordered_list_marker (line 698) | static bool parse_ordered_list_marker(Scanner *s, TSLexer *lexer, const ...
function parse_minus (line 749) | static bool parse_minus(Scanner *s, TSLexer *lexer, const bool *valid_sy...
function parse_html_block (line 869) | static bool parse_html_block(Scanner *s, TSLexer *lexer, const bool *val...
function parse_pipe_table (line 1075) | static bool parse_pipe_table(Scanner *s, TSLexer *lexer, const bool *val...
function scan (line 1204) | static bool scan(Scanner *s, TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_markdown_external_scanner_scan (line 1461) | bool tree_sitter_markdown_external_scanner_scan(
function tree_sitter_markdown_external_scanner_serialize (line 1471) | unsigned tree_sitter_markdown_external_scanner_serialize(
function tree_sitter_markdown_external_scanner_deserialize (line 1479) | void tree_sitter_markdown_external_scanner_deserialize(
function tree_sitter_markdown_external_scanner_destroy (line 1488) | void tree_sitter_markdown_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdown/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdownInline/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdownInline/src/parser.c
function ts_lex (line 1146) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 74027) | extern const TSLanguage *tree_sitter_markdown_inline(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdownInline/src/scanner.c
type TokenType (line 4) | typedef enum {
function is_punctuation (line 23) | static bool is_punctuation(char c) {
function is_whitespace (line 32) | static bool is_whitespace(char c) {
function error (line 52) | static bool error(TSLexer *lexer) {
type Scanner (line 57) | typedef struct {
function serialize (line 69) | static unsigned serialize(Scanner *s, char *buffer) {
function deserialize (line 80) | static void deserialize(Scanner *s, const char *buffer, unsigned length) {
function parse_leaf_delimiter (line 94) | static bool parse_leaf_delimiter(TSLexer *lexer, uint8_t* delimiter_leng...
function parse_backtick (line 134) | static bool parse_backtick(Scanner *s, TSLexer *lexer, const bool *valid...
function parse_dollar (line 139) | static bool parse_dollar(Scanner *s, TSLexer *lexer, const bool *valid_s...
function parse_star (line 144) | static bool parse_star(Scanner *s, TSLexer *lexer, const bool *valid_sym...
function parse_tilde (line 207) | static bool parse_tilde(Scanner *s, TSLexer *lexer, const bool *valid_sy...
function parse_underscore (line 270) | static bool parse_underscore(Scanner *s, TSLexer *lexer, const bool *val...
function scan (line 316) | static bool scan(Scanner *s, TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_markdown_inline_external_scanner_scan (line 355) | bool tree_sitter_markdown_inline_external_scanner_scan(
function tree_sitter_markdown_inline_external_scanner_serialize (line 364) | unsigned tree_sitter_markdown_inline_external_scanner_serialize(
function tree_sitter_markdown_inline_external_scanner_deserialize (line 372) | void tree_sitter_markdown_inline_external_scanner_deserialize(
function tree_sitter_markdown_inline_external_scanner_destroy (line 381) | void tree_sitter_markdown_inline_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterMarkdownInline/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterOCaml/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterOCaml/src/common/scanner.h
function deserialize (line 16) | struct Scanner {
function advance (line 35) | void advance(TSLexer *lexer) {
function skip (line 39) | void skip(TSLexer *lexer) {
function scan (line 43) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function scan_string (line 96) | void scan_string(TSLexer *lexer) {
function scan_character (line 116) | char scan_character(TSLexer *lexer) {
function scan_left_quoted_string_delimiter (line 179) | bool scan_left_quoted_string_delimiter(TSLexer *lexer) {
function scan_right_quoted_string_delimiter (line 194) | bool scan_right_quoted_string_delimiter(TSLexer *lexer) {
function scan_quoted_string (line 206) | bool scan_quoted_string(TSLexer *lexer) {
function scan_identifier (line 225) | bool scan_identifier(TSLexer *lexer) {
function scan_extattrident (line 236) | bool scan_extattrident(TSLexer *lexer) {
function scan_comment (line 243) | bool scan_comment(TSLexer *lexer) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterOCaml/src/scanner.cc
function tree_sitter_ocaml_external_scanner_destroy (line 9) | void tree_sitter_ocaml_external_scanner_destroy(void *payload) {
function tree_sitter_ocaml_external_scanner_serialize (line 14) | unsigned tree_sitter_ocaml_external_scanner_serialize(void *payload, cha...
function tree_sitter_ocaml_external_scanner_deserialize (line 19) | void tree_sitter_ocaml_external_scanner_deserialize(void *payload, const...
function tree_sitter_ocaml_external_scanner_scan (line 24) | bool tree_sitter_ocaml_external_scanner_scan(void *payload, TSLexer *lex...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterOCaml/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPHP/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPHP/src/parser.c
function sym_escape_sequence_character_set_1 (line 3722) | static inline bool sym_escape_sequence_character_set_1(int32_t c) {
function ts_lex (line 3736) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 6071) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 135499) | extern const TSLanguage *tree_sitter_php(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPHP/src/scanner.cc
type TokenType (line 11) | enum TokenType {
type Heredoc (line 26) | struct Heredoc {
method Heredoc (line 27) | Heredoc() : end_word_indentation_allowed(false) {}
type Scanner (line 33) | struct Scanner {
method Scanner (line 37) | Scanner() : has_leading_whitespace(false) {}
method reset (line 39) | void reset() {
type ScanContentResult (line 43) | enum ScanContentResult {
method serialize (line 48) | unsigned serialize(char *buffer) {
method deserialize (line 68) | void deserialize(const char *buffer, unsigned length) {
method skip (line 88) | void skip(TSLexer *lexer) {
method advance (line 93) | static void advance(TSLexer *lexer) {
method scan_whitespace (line 97) | bool scan_whitespace(TSLexer *lexer) {
method is_valid_name_char (line 120) | static bool is_valid_name_char(TSLexer *lexer) {
method is_escapable_sequence (line 124) | static bool is_escapable_sequence(TSLexer *lexer) {
method scan_nowdoc_string (line 156) | bool scan_nowdoc_string(TSLexer *lexer) {
method scan_encapsed_part_string (line 211) | bool scan_encapsed_part_string(TSLexer *lexer, bool is_after_variable,...
method string (line 339) | string scan_heredoc_word(TSLexer *lexer) {
method scan (line 351) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_php_external_scanner_serialize (line 463) | unsigned tree_sitter_php_external_scanner_serialize(void *payload, char ...
function tree_sitter_php_external_scanner_deserialize (line 468) | void tree_sitter_php_external_scanner_deserialize(void *payload, const c...
function tree_sitter_php_external_scanner_destroy (line 473) | void tree_sitter_php_external_scanner_destroy(void *payload) {
function tree_sitter_php_external_scanner_scan (line 478) | bool tree_sitter_php_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_php_external_scanner_reset (line 485) | void tree_sitter_php_external_scanner_reset(void *p) {}
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPHP/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPerl/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPerl/src/scanner.cc
type TokenType (line 11) | enum TokenType {
type Delimiter (line 24) | struct Delimiter {
method get_end_delimiter (line 26) | int32_t get_end_delimiter() {
method set_end_delimiter (line 30) | void set_end_delimiter(int32_t start_delimiter) {
type Scanner (line 44) | struct Scanner {
method Scanner (line 45) | Scanner() {
method serialize (line 50) | unsigned serialize(char *buffer) {
method deserialize (line 65) | void deserialize(const char *buffer, unsigned length) {
method scan (line 80) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
method scan_nested_delimiters (line 378) | bool scan_nested_delimiters(TSLexer *lexer, const bool *valid_symbols) {
method advance (line 403) | void advance(TSLexer *lexer) {
method skip (line 407) | void skip(TSLexer *lexer) {
method set_end_delimiter (line 411) | void set_end_delimiter(int32_t start_delimiter) {
method get_end_delimiter (line 430) | int32_t get_end_delimiter() {
method parse_start_delimiter (line 436) | bool parse_start_delimiter(TSLexer *lexer, TokenType token_type) {
method run_over_spaces (line 450) | void run_over_spaces(TSLexer *lexer) {
function tree_sitter_perl_external_scanner_destroy (line 470) | void tree_sitter_perl_external_scanner_destroy(void *payload) {
function tree_sitter_perl_external_scanner_serialize (line 475) | unsigned tree_sitter_perl_external_scanner_serialize(
function tree_sitter_perl_external_scanner_deserialize (line 483) | void tree_sitter_perl_external_scanner_deserialize(
function tree_sitter_perl_external_scanner_scan (line 492) | bool tree_sitter_perl_external_scanner_scan(
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPerl/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPython/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPython/src/parser.c
function sym_identifier_character_set_1 (line 4692) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 5494) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 6298) | static inline bool sym_identifier_character_set_3(int32_t c) {
function ts_lex (line 7316) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 8251) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 107049) | extern const TSLanguage *tree_sitter_python(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPython/src/scanner.cc
type TokenType (line 13) | enum TokenType {
type Delimiter (line 26) | struct Delimiter {
method Delimiter (line 37) | Delimiter() : flags(0) {}
method is_format (line 39) | bool is_format() const {
method is_raw (line 43) | bool is_raw() const {
method is_triple (line 47) | bool is_triple() const {
method is_bytes (line 51) | bool is_bytes() const {
method end_character (line 55) | int32_t end_character() const {
method set_format (line 62) | void set_format() {
method set_raw (line 66) | void set_raw() {
method set_triple (line 70) | void set_triple() {
method set_bytes (line 74) | void set_bytes() {
method set_end_character (line 78) | void set_end_character(int32_t character) {
type Scanner (line 97) | struct Scanner {
method Scanner (line 98) | Scanner() {
method serialize (line 103) | unsigned serialize(char *buffer) {
method deserialize (line 126) | void deserialize(const char *buffer, unsigned length) {
method advance (line 147) | void advance(TSLexer *lexer) {
method skip (line 151) | void skip(TSLexer *lexer) {
method scan (line 155) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_python_external_scanner_scan (line 387) | bool tree_sitter_python_external_scanner_scan(void *payload, TSLexer *le...
function tree_sitter_python_external_scanner_serialize (line 393) | unsigned tree_sitter_python_external_scanner_serialize(void *payload, ch...
function tree_sitter_python_external_scanner_deserialize (line 398) | void tree_sitter_python_external_scanner_deserialize(void *payload, cons...
function tree_sitter_python_external_scanner_destroy (line 403) | void tree_sitter_python_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterPython/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterR/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterR/src/parser.c
function ts_lex (line 1004) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 68150) | extern const TSLanguage *tree_sitter_r(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterR/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRegex/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRegex/src/parser.c
function ts_lex (line 487) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 2428) | extern const TSLanguage *tree_sitter_regex(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRegex/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRegex/src/tree_sitter/runtime.h
type TSSymbol (line 11) | typedef unsigned short TSSymbol;
type TSLanguage (line 12) | typedef struct TSLanguage TSLanguage;
type TSDocument (line 13) | typedef struct TSDocument TSDocument;
type TSInputEncoding (line 15) | typedef enum {
type TSInput (line 20) | typedef struct {
type TSDebugType (line 27) | typedef enum {
type TSDebugger (line 32) | typedef struct {
type TSInputEdit (line 37) | typedef struct {
type TSPoint (line 43) | typedef struct {
type TSNode (line 48) | typedef struct {
type TSSymbolIterator (line 53) | typedef struct {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRuby/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRuby/src/scanner.cc
type TokenType (line 14) | enum TokenType {
type Literal (line 53) | struct Literal {
type Heredoc (line 61) | struct Heredoc {
method Heredoc (line 62) | Heredoc() : end_word_indentation_allowed(false), allows_interpolation(...
type Scanner (line 108) | struct Scanner {
method Scanner (line 109) | Scanner() : has_leading_whitespace(false) {}
method reset (line 111) | void reset() {
method serialize (line 116) | unsigned serialize(char *buffer) {
method deserialize (line 153) | void deserialize(const char *buffer, unsigned length) {
method skip (line 188) | void skip(TSLexer *lexer) {
method advance (line 193) | void advance(TSLexer *lexer) {
method scan_whitespace (line 197) | bool scan_whitespace(TSLexer *lexer, const bool *valid_symbols) {
method scan_operator (line 258) | bool scan_operator(TSLexer *lexer) {
method is_iden_char (line 353) | bool is_iden_char(char c) {
method scan_symbol_identifier (line 357) | bool scan_symbol_identifier(TSLexer *lexer) {
method scan_open_delimiter (line 392) | bool scan_open_delimiter(TSLexer *lexer, Literal &literal, const bool ...
method scan_heredoc_word (line 596) | void scan_heredoc_word(TSLexer *lexer, Heredoc *heredoc) {
method scan_heredoc_content (line 629) | bool scan_heredoc_content(TSLexer *lexer) {
method scan_literal_content (line 723) | bool scan_literal_content(TSLexer *lexer) {
method scan_short_interpolation (line 799) | bool scan_short_interpolation(TSLexer *lexer, const bool has_content, ...
method scan (line 836) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_ruby_external_scanner_scan (line 1097) | bool tree_sitter_ruby_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_ruby_external_scanner_serialize (line 1103) | unsigned tree_sitter_ruby_external_scanner_serialize(void *payload, char...
function tree_sitter_ruby_external_scanner_deserialize (line 1108) | void tree_sitter_ruby_external_scanner_deserialize(void *payload, const ...
function tree_sitter_ruby_external_scanner_destroy (line 1113) | void tree_sitter_ruby_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRuby/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRust/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRust/src/parser.c
function sym_identifier_character_set_1 (line 6121) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 6923) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 7727) | static inline bool sym_identifier_character_set_3(int32_t c) {
function sym_identifier_character_set_4 (line 8529) | static inline bool sym_identifier_character_set_4(int32_t c) {
function sym_identifier_character_set_5 (line 9543) | static inline bool sym_identifier_character_set_5(int32_t c) {
function sym_identifier_character_set_6 (line 10561) | static inline bool sym_identifier_character_set_6(int32_t c) {
function sym_identifier_character_set_7 (line 11577) | static inline bool sym_identifier_character_set_7(int32_t c) {
function ts_lex (line 12595) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 13913) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 132515) | extern const TSLanguage *tree_sitter_rust(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRust/src/scanner.c
type TokenType (line 4) | enum TokenType {
function tree_sitter_rust_external_scanner_destroy (line 12) | void tree_sitter_rust_external_scanner_destroy(void *p) {}
function tree_sitter_rust_external_scanner_reset (line 13) | void tree_sitter_rust_external_scanner_reset(void *p) {}
function tree_sitter_rust_external_scanner_serialize (line 14) | unsigned tree_sitter_rust_external_scanner_serialize(void *p, char *buff...
function tree_sitter_rust_external_scanner_deserialize (line 15) | void tree_sitter_rust_external_scanner_deserialize(void *p, const char *...
function advance (line 17) | static void advance(TSLexer *lexer) {
function is_num_char (line 21) | static bool is_num_char(int32_t c) {
function tree_sitter_rust_external_scanner_scan (line 25) | bool tree_sitter_rust_external_scanner_scan(void *payload, TSLexer *lexer,
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterRust/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSCSS/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSCSS/src/parser.c
function sym_identifier_character_set_1 (line 1388) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_single_line_comment_character_set_1 (line 1402) | static inline bool sym_single_line_comment_character_set_1(int32_t c) {
function sym_single_line_comment_character_set_2 (line 1418) | static inline bool sym_single_line_comment_character_set_2(int32_t c) {
function sym_plain_value_character_set_1 (line 1434) | static inline bool sym_plain_value_character_set_1(int32_t c) {
function sym_plain_value_character_set_2 (line 1452) | static inline bool sym_plain_value_character_set_2(int32_t c) {
function sym_plain_value_character_set_3 (line 1470) | static inline bool sym_plain_value_character_set_3(int32_t c) {
function ts_lex (line 1486) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 19268) | extern const TSLanguage *tree_sitter_scss(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSCSS/src/scanner.c
type TokenType (line 4) | enum TokenType {
function tree_sitter_scss_external_scanner_destroy (line 9) | void tree_sitter_scss_external_scanner_destroy(void *p) {}
function tree_sitter_scss_external_scanner_reset (line 10) | void tree_sitter_scss_external_scanner_reset(void *p) {}
function tree_sitter_scss_external_scanner_serialize (line 11) | unsigned tree_sitter_scss_external_scanner_serialize(void *p, char *buff...
function tree_sitter_scss_external_scanner_deserialize (line 12) | void tree_sitter_scss_external_scanner_deserialize(void *p, const char *...
function tree_sitter_scss_external_scanner_scan (line 14) | bool tree_sitter_scss_external_scanner_scan(void *payload, TSLexer *lexe...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSCSS/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSQL/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSQL/src/scanner.cc
type TokenType (line 9) | enum TokenType {
type Scanner (line 15) | struct Scanner {
method skip (line 20) | void skip(TSLexer *lexer) {
method advance (line 24) | void advance(TSLexer *lexer) {
method serialize (line 28) | unsigned serialize(char *buffer) {
method deserialize (line 35) | void deserialize(const char *buffer, unsigned length) {
method scan_dollar_quoted_string_content (line 45) | bool scan_dollar_quoted_string_content(TSLexer *lexer) {
method scan_dollar_quoted_string_tag (line 70) | bool scan_dollar_quoted_string_tag(TSLexer *lexer) {
method scan_dollar_quoted_string_end_tag (line 96) | bool scan_dollar_quoted_string_end_tag(TSLexer *lexer) {
method scan (line 108) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_sql_external_scanner_scan (line 138) | bool tree_sitter_sql_external_scanner_scan(void *payload, TSLexer *lexer,
function tree_sitter_sql_external_scanner_serialize (line 144) | unsigned tree_sitter_sql_external_scanner_serialize(void *payload, char ...
function tree_sitter_sql_external_scanner_deserialize (line 149) | void tree_sitter_sql_external_scanner_deserialize(void *payload, const c...
function tree_sitter_sql_external_scanner_destroy (line 154) | void tree_sitter_sql_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSQL/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/allocator.h
type za_binNode (line 39) | typedef struct za_binNode {
type za_bin (line 45) | typedef struct za_bin {
type za_allocatorNode (line 53) | typedef struct za_allocatorNode {
type za_Allocator (line 61) | typedef struct za_Allocator {
function za_Allocator (line 77) | za_Allocator *za_New() {
function za_Release (line 112) | void za_Release(za_Allocator *allocator) {
function za_Free (line 179) | void za_Free(za_Allocator *allocator, void *ptr) {
function za_bin (line 209) | za_bin *za_findBin(za_Allocator *allocator, size_t size) {
function za_appendChild (line 219) | bool za_appendChild(size_t init_size, struct za_Allocator *allocator) {
function za_innerFree (line 255) | void za_innerFree(void *pointer) { free(pointer); }
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/ekstring.h
type ekstring (line 7) | typedef struct {
function ekstring (line 14) | const ekstring init_string_str(za_Allocator *A, const char *buf,
function ekstring (line 21) | const ekstring init_string_string(const ekstring str) {
function compare_string_string (line 27) | bool compare_string_string(const ekstring s1, const ekstring s2) {
function ekstring (line 32) | const ekstring concat_string_string(const ekstring s1, const ekstring s2) {
function ekstring (line 40) | const ekstring concat_string_char(const ekstring s1, const char c) {
function parse_int (line 54) | const int parse_int(const ekstring s1) { return atoi(s1.buf); }
function destroy_string (line 56) | void destroy_string(const ekstring s) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/parser.c
function aux_sym_attribute_name_token1_character_set_1 (line 628) | static inline bool aux_sym_attribute_name_token1_character_set_1(int32_t...
function ts_lex (line 644) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 5413) | extern const TSLanguage *tree_sitter_svelte(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/scanner.c
type TokenType (line 10) | typedef enum TokenType {
type Scanner (line 25) | typedef struct {
function serialize (line 31) | unsigned serialize(Scanner *scanner, char *buffer) {
function deserialize (line 64) | void deserialize(Scanner *scanner, const char *buffer, unsigned length) {
function ekstring (line 90) | ekstring scan_tag_name(Scanner *scanner, TSLexer *lexer) {
function scan_comment (line 100) | bool scan_comment(TSLexer *lexer) {
function scan_raw_text (line 129) | bool scan_raw_text(Scanner *scanner, TSLexer *lexer) {
function scan_implicit_end_tag (line 160) | bool scan_implicit_end_tag(Scanner *scanner, TSLexer *lexer) {
function scan_start_tag_name (line 200) | bool scan_start_tag_name(Scanner *scanner, TSLexer *lexer) {
function scan_end_tag_name (line 221) | bool scan_end_tag_name(Scanner *scanner, TSLexer *lexer) {
function scan_self_closing_tag_delimiter (line 237) | bool scan_self_closing_tag_delimiter(Scanner *scanner, TSLexer *lexer) {
function scan_word (line 251) | bool scan_word(Scanner *scanner, TSLexer *lexer, ekstring word) {
function scan_raw_text_expr (line 261) | bool scan_raw_text_expr(Scanner *scanner, TSLexer *lexer,
function scan (line 335) | bool scan(Scanner *scanner, TSLexer *lexer, const bool *valid_symbols) {
function deleter (line 398) | void deleter(void *tag, za_Allocator *A) {}
type hashmap_s (line 403) | struct hashmap_s
function tree_sitter_svelte_external_scanner_scan (line 408) | bool tree_sitter_svelte_external_scanner_scan(void *payload, TSLexer *le...
function tree_sitter_svelte_external_scanner_serialize (line 413) | unsigned tree_sitter_svelte_external_scanner_serialize(void *payload,
function tree_sitter_svelte_external_scanner_deserialize (line 418) | void tree_sitter_svelte_external_scanner_deserialize(void *payload,
function tree_sitter_svelte_external_scanner_destroy (line 424) | void tree_sitter_svelte_external_scanner_destroy(void *payload) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/tag.h
type TagType (line 24) | typedef enum {
type Tag (line 154) | typedef struct Tag {
function Tag (line 168) | Tag *initTag(za_Allocator *A) {
function Tag (line 174) | Tag *initTagArgs(za_Allocator *A, TagType type, const ekstring name) {
function compareTags (line 181) | bool compareTags(const Tag *a, const Tag *b) {
function is_void (line 195) | const bool is_void(Tag *tag) { return tag->type < END_OF_VOID_TAGS; }
function findTagType (line 197) | const bool findTagType(const TagType *tt, TagType toFind) {
function findTag (line 204) | const bool findTag(vc_vector *v, Tag *tag) {
function can_contain (line 211) | bool can_contain(const Tag *parent, const Tag *tag) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/uthash.h
type hashmap_element_s (line 51) | struct hashmap_element_s {
type hashmap_s (line 60) | struct hashmap_s {
type hashmap_s (line 81) | struct hashmap_s
type hashmap_s (line 93) | struct hashmap_s
type hashmap_s (line 101) | struct hashmap_s
type hashmap_s (line 110) | struct hashmap_s
type hashmap_s (line 121) | struct hashmap_s
type hashmap_s (line 131) | struct hashmap_s
type hashmap_s (line 143) | struct hashmap_s
type hashmap_element_s (line 145) | struct hashmap_element_s
type hashmap_s (line 152) | struct hashmap_s
type hashmap_s (line 156) | struct hashmap_s
type hashmap_s (line 160) | struct hashmap_s
type hashmap_element_s (line 163) | struct hashmap_element_s
type hashmap_s (line 166) | struct hashmap_s
type hashmap_element_s (line 171) | struct hashmap_element_s
type hashmap_s (line 172) | struct hashmap_s
function hashmap_create (line 188) | int hashmap_create(za_Allocator* A, const unsigned initial_size,
function hashmap_put (line 208) | int hashmap_put(struct hashmap_s *const m, const char *const key,
function TagType (line 234) | TagType hashmap_get(const struct hashmap_s *const m, const char *const key,
function hashmap_remove (line 257) | int hashmap_remove(struct hashmap_s *const m, const char *const key,
type hashmap_s (line 285) | struct hashmap_s
function hashmap_iterate (line 317) | int hashmap_iterate(const struct hashmap_s *const m,
function hashmap_iterate_pairs (line 332) | int hashmap_iterate_pairs(struct hashmap_s *const hashmap,
function hashmap_destroy (line 360) | void hashmap_destroy(struct hashmap_s *const m) {
function hashmap_num_entries (line 365) | unsigned hashmap_num_entries(const struct hashmap_s *const m) {
function hashmap_crc32_helper (line 369) | unsigned hashmap_crc32_helper(const char *const s, const unsigned len) {
function hashmap_hash_helper_int_helper (line 444) | unsigned hashmap_hash_helper_int_helper(const struct hashmap_s *const m,
function hashmap_match_helper (line 465) | int hashmap_match_helper(const struct hashmap_element_s *const element,
function hashmap_hash_helper (line 470) | int hashmap_hash_helper(const struct hashmap_s *const m, const char *con...
function hashmap_rehash_iterator (line 518) | int hashmap_rehash_iterator(void *const new_hash,
function hashmap_rehash_helper (line 531) | int hashmap_rehash_helper(struct hashmap_s *const m) {
function Tag (line 566) | Tag *for_name(za_Allocator *A, struct hashmap_s *m, const ekstring *name) {
type hashmap_s (line 579) | struct hashmap_s
type hashmap_s (line 580) | struct hashmap_s
type hashmap_s (line 581) | struct hashmap_s
type hashmap_s (line 581) | struct hashmap_s
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSvelte/src/vc_vector.h
type vc_vector (line 16) | typedef struct vc_vector {
function vc_vector (line 25) | vc_vector *vc_vector_create(za_Allocator *A, size_t count_elements,
function vc_vector_count (line 50) | size_t vc_vector_count(const vc_vector *vector) { return vector->count; }
function vc_vector_call_deleter (line 53) | void vc_vector_call_deleter(vc_vector *vector, size_t first_index,
function vc_vector_call_deleter_all (line 61) | void vc_vector_call_deleter_all(vc_vector *vector) {
function vc_vector_clear (line 65) | void vc_vector_clear(vc_vector *vector) {
function vc_vector_realloc (line 78) | bool vc_vector_realloc(vc_vector *vector, size_t new_count) {
function vc_vector_resize (line 90) | bool vc_vector_resize(vc_vector *vector, size_t new_count, void *default...
function vc_vector_max_count (line 117) | size_t vc_vector_max_count(const vc_vector *vector) {
function vc_vector_append (line 121) | bool vc_vector_append(vc_vector *vector, const void *values, size_t coun...
function vc_vector_push_back (line 145) | bool vc_vector_push_back(vc_vector *vector, const void *value) {
function vc_vector_pop_back (line 152) | bool vc_vector_pop_back(vc_vector *vector) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSwift/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSwift/src/scanner.c
type TokenType (line 5) | enum TokenType {
type IllegalTerminatorGroup (line 60) | enum IllegalTerminatorGroup {
type IllegalTerminatorGroup (line 67) | enum IllegalTerminatorGroup
type TokenType (line 90) | enum TokenType
function is_cross_semi_token (line 149) | bool is_cross_semi_token(enum TokenType op) {
type ParseDirective (line 192) | enum ParseDirective {
type ScannerState (line 201) | struct ScannerState {
type ScannerState (line 206) | struct ScannerState
function tree_sitter_swift_external_scanner_destroy (line 209) | void tree_sitter_swift_external_scanner_destroy(void *payload) {
function tree_sitter_swift_external_scanner_reset (line 213) | void tree_sitter_swift_external_scanner_reset(void *payload) {
function tree_sitter_swift_external_scanner_serialize (line 218) | unsigned tree_sitter_swift_external_scanner_serialize(void *payload, cha...
function tree_sitter_swift_external_scanner_deserialize (line 228) | void tree_sitter_swift_external_scanner_deserialize(
function advance (line 247) | static void advance(TSLexer *lexer) {
function should_treat_as_wspace (line 251) | static bool should_treat_as_wspace(int32_t character) {
function encountered_op_count (line 255) | static int32_t encountered_op_count(bool *encountered_operator) {
function any_reserved_ops (line 266) | static bool any_reserved_ops(uint8_t *encountered_reserved_ops) {
function is_legal_custom_operator (line 276) | static bool is_legal_custom_operator(
function eat_operators (line 345) | static bool eat_operators(
function eat_comment (line 492) | static enum ParseDirective eat_comment(
function eat_whitespace (line 549) | static enum ParseDirective eat_whitespace(
function eat_raw_str_part (line 658) | static bool eat_raw_str_part(
function tree_sitter_swift_external_scanner_scan (line 747) | bool tree_sitter_swift_external_scanner_scan(
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterSwift/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTOML/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTOML/src/parser.c
function ts_lex (line 506) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 4539) | extern const TSLanguage *tree_sitter_toml(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTOML/src/scanner.c
type TokenType (line 8) | enum TokenType {
function tree_sitter_toml_external_scanner_destroy (line 17) | void tree_sitter_toml_external_scanner_destroy(void *payload) {}
function tree_sitter_toml_external_scanner_serialize (line 18) | unsigned tree_sitter_toml_external_scanner_serialize(void *payload, char...
function tree_sitter_toml_external_scanner_deserialize (line 19) | void tree_sitter_toml_external_scanner_deserialize(void *payload, const ...
function tree_sitter_toml_external_scanner_scan_multiline_string_end (line 21) | bool tree_sitter_toml_external_scanner_scan_multiline_string_end(TSLexer...
function tree_sitter_toml_external_scanner_scan (line 54) | bool tree_sitter_toml_external_scanner_scan(
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTOML/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTSX/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTSX/src/common/scanner.h
type TokenType (line 4) | enum TokenType {
function advance (line 12) | static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
function skip (line 13) | static void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
function scan_template_chars (line 15) | static bool scan_template_chars(TSLexer *lexer) {
function scan_whitespace_and_comments (line 36) | static bool scan_whitespace_and_comments(TSLexer *lexer) {
function scan_automatic_semicolon (line 72) | static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_s...
function scan_ternary_qmark (line 162) | static bool scan_ternary_qmark(TSLexer *lexer) {
function external_scanner_scan (line 198) | static inline bool external_scanner_scan(void *payload, TSLexer *lexer, ...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTSX/src/parser.c
function anon_sym_BANG_character_set_1 (line 4102) | static inline bool anon_sym_BANG_character_set_1(int32_t c) {
function sym__glimmer_template_content_character_set_1 (line 4118) | static inline bool sym__glimmer_template_content_character_set_1(int32_t...
function sym_identifier_character_set_1 (line 4134) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 4152) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 4170) | static inline bool sym_identifier_character_set_3(int32_t c) {
function sym_identifier_character_set_4 (line 4184) | static inline bool sym_identifier_character_set_4(int32_t c) {
function sym_private_property_identifier_character_set_1 (line 4202) | static inline bool sym_private_property_identifier_character_set_1(int32...
function ts_lex (line 4220) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 5930) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 212649) | extern const TSLanguage *tree_sitter_tsx(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTSX/src/scanner.c
function tree_sitter_tsx_external_scanner_destroy (line 4) | void tree_sitter_tsx_external_scanner_destroy(void *p) {}
function tree_sitter_tsx_external_scanner_reset (line 5) | void tree_sitter_tsx_external_scanner_reset(void *p) {}
function tree_sitter_tsx_external_scanner_serialize (line 6) | unsigned tree_sitter_tsx_external_scanner_serialize(void *p, char *buffe...
function tree_sitter_tsx_external_scanner_deserialize (line 7) | void tree_sitter_tsx_external_scanner_deserialize(void *p, const char *b...
function tree_sitter_tsx_external_scanner_scan (line 9) | bool tree_sitter_tsx_external_scanner_scan(void *payload, TSLexer *lexer...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTSX/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTypeScript/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTypeScript/src/common/scanner.h
type TokenType (line 4) | enum TokenType {
function advance (line 12) | static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
function skip (line 13) | static void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
function scan_template_chars (line 15) | static bool scan_template_chars(TSLexer *lexer) {
function scan_whitespace_and_comments (line 36) | static bool scan_whitespace_and_comments(TSLexer *lexer) {
function scan_automatic_semicolon (line 72) | static bool scan_automatic_semicolon(TSLexer *lexer, const bool *valid_s...
function scan_ternary_qmark (line 162) | static bool scan_ternary_qmark(TSLexer *lexer) {
function external_scanner_scan (line 198) | static inline bool external_scanner_scan(void *payload, TSLexer *lexer, ...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTypeScript/src/parser.c
function anon_sym_BANG_character_set_1 (line 8227) | static inline bool anon_sym_BANG_character_set_1(int32_t c) {
function sym__glimmer_template_content_character_set_1 (line 8243) | static inline bool sym__glimmer_template_content_character_set_1(int32_t...
function sym_identifier_character_set_1 (line 8259) | static inline bool sym_identifier_character_set_1(int32_t c) {
function sym_identifier_character_set_2 (line 8277) | static inline bool sym_identifier_character_set_2(int32_t c) {
function sym_identifier_character_set_3 (line 8295) | static inline bool sym_identifier_character_set_3(int32_t c) {
function sym_private_property_identifier_character_set_1 (line 8313) | static inline bool sym_private_property_identifier_character_set_1(int32...
function ts_lex (line 8331) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function ts_lex_keywords (line 9903) | static bool ts_lex_keywords(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 208994) | extern const TSLanguage *tree_sitter_typescript(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTypeScript/src/scanner.c
function tree_sitter_typescript_external_scanner_destroy (line 4) | void tree_sitter_typescript_external_scanner_destroy(void *p) {}
function tree_sitter_typescript_external_scanner_reset (line 5) | void tree_sitter_typescript_external_scanner_reset(void *p) {}
function tree_sitter_typescript_external_scanner_serialize (line 6) | unsigned tree_sitter_typescript_external_scanner_serialize(void *p, char...
function tree_sitter_typescript_external_scanner_deserialize (line 7) | void tree_sitter_typescript_external_scanner_deserialize(void *p, const ...
function tree_sitter_typescript_external_scanner_scan (line 9) | bool tree_sitter_typescript_external_scanner_scan(void *payload, TSLexer...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterTypeScript/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterYAML/include/public.h
type TSLanguage (line 5) | typedef struct TSLanguage TSLanguage;
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterYAML/src/parser.c
function ts_lex (line 2181) | static bool ts_lex(TSLexer *lexer, TSStateId state) {
function TSLanguage (line 38711) | extern const TSLanguage *tree_sitter_yaml(void) {
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterYAML/src/scanner.cc
type TokenType (line 12) | enum TokenType {
type Scanner (line 126) | struct Scanner {
method Scanner (line 144) | Scanner() {
method serialize (line 148) | unsigned serialize(char *buffer) {
method deserialize (line 166) | void deserialize(const char *buffer, unsigned length) {
method adv (line 190) | void adv(TSLexer *lexer) {
method adv_nwl (line 196) | void adv_nwl(TSLexer *lexer) {
method skp (line 203) | void skp(TSLexer *lexer) {
method skp_nwl (line 209) | void skp_nwl(TSLexer *lexer) {
method mrk_end (line 216) | void mrk_end(TSLexer *lexer) {
method init (line 222) | void init() {
method flush (line 230) | void flush() {
method pop_ind (line 235) | void pop_ind() {
method push_ind (line 240) | void push_ind(int16_t typ, int16_t len) {
method is_wsp (line 245) | bool is_wsp(int32_t c) {
method is_nwl (line 249) | bool is_nwl(int32_t c) {
method is_wht (line 253) | bool is_wht(int32_t c) {
method is_ns_dec_digit (line 257) | bool is_ns_dec_digit(int32_t c) {
method is_ns_hex_digit (line 261) | bool is_ns_hex_digit(int32_t c) {
method is_ns_word_char (line 267) | bool is_ns_word_char(int32_t c) {
method is_nb_json (line 274) | bool is_nb_json(int32_t c) {
method is_nb_double_char (line 278) | bool is_nb_double_char(int32_t c) {
method is_nb_single_char (line 282) | bool is_nb_single_char(int32_t c) {
method is_ns_char (line 286) | bool is_ns_char(int32_t c) {
method is_c_indicator (line 295) | bool is_c_indicator(int32_t c) {
method is_c_flow_indicator (line 301) | bool is_c_flow_indicator(int32_t c) {
method is_plain_safe_in_block (line 305) | bool is_plain_safe_in_block(int32_t c) {
method is_plain_safe_in_flow (line 309) | bool is_plain_safe_in_flow(int32_t c) {
method is_ns_uri_char (line 313) | bool is_ns_uri_char(int32_t c) {
method is_ns_tag_char (line 320) | bool is_ns_tag_char(int32_t c) {
method is_ns_anchor_char (line 327) | bool is_ns_anchor_char(int32_t c) {
method scn_uri_esc (line 331) | char scn_uri_esc(TSLexer *lexer) {
method scn_ns_uri_char (line 342) | char scn_ns_uri_char(TSLexer *lexer) {
method scn_ns_tag_char (line 347) | char scn_ns_tag_char(TSLexer *lexer) {
method scn_dir_bgn (line 352) | bool scn_dir_bgn(TSLexer *lexer) {
method scn_dir_yml_ver (line 393) | bool scn_dir_yml_ver(TSLexer *lexer, TSSymbol result_symbol) {
method scn_tag_hdl_tal (line 405) | bool scn_tag_hdl_tal(TSLexer *lexer) {
method scn_dir_tag_hdl (line 414) | bool scn_dir_tag_hdl(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dir_tag_pfx (line 422) | bool scn_dir_tag_pfx(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dir_rsv_prm (line 436) | bool scn_dir_rsv_prm(TSLexer *lexer, TSSymbol result_symbol) {
method scn_tag (line 444) | bool scn_tag(TSLexer *lexer, TSSymbol result_symbol) {
method scn_acr_bgn (line 477) | bool scn_acr_bgn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_acr_ctn (line 485) | bool scn_acr_ctn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_als_bgn (line 491) | bool scn_als_bgn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_als_ctn (line 499) | bool scn_als_ctn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dqt_esc_seq (line 505) | bool scn_dqt_esc_seq(TSLexer *lexer, TSSymbol result_symbol) {
method scn_dqt_str_cnt (line 532) | bool scn_dqt_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
method scn_sqt_str_cnt (line 543) | bool scn_sqt_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
method scn_blk_str_bgn (line 554) | bool scn_blk_str_bgn(TSLexer *lexer, TSSymbol result_symbol) {
method scn_blk_str_cnt (line 599) | bool scn_blk_str_cnt(TSLexer *lexer, TSSymbol result_symbol) {
method scn_pln_cnt (line 618) | char scn_pln_cnt(TSLexer *lexer, bool (Scanner::*is_plain_safe)(int32_...
method scn_drs_doc_end (line 645) | bool scn_drs_doc_end(TSLexer *lexer) {
method scan (line 660) | bool scan(TSLexer *lexer, const bool *valid_symbols) {
function tree_sitter_yaml_external_scanner_destroy (line 961) | void tree_sitter_yaml_external_scanner_destroy(void *payload) {
function tree_sitter_yaml_external_scanner_serialize (line 966) | unsigned tree_sitter_yaml_external_scanner_serialize(void *payload, char...
function tree_sitter_yaml_external_scanner_deserialize (line 971) | void tree_sitter_yaml_external_scanner_deserialize(void *payload, const ...
function tree_sitter_yaml_external_scanner_scan (line 976) | bool tree_sitter_yaml_external_scanner_scan(void *payload, TSLexer *lexe...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterYAML/src/schema.generated.cc
type tree_sitter_yaml (line 3) | namespace tree_sitter_yaml {
type ResultSchema (line 7) | enum ResultSchema {
function adv_sch_stt (line 15) | int8_t adv_sch_stt(int8_t sch_stt, int32_t cur_chr, ResultSchema *rlt_...
FILE: Frameworks/RunestoneEditor/External/RunestoneLanguageSupport/Sources/TreeSitterYAML/src/tree_sitter/parser.h
type TSStateId (line 16) | typedef uint16_t TSStateId;
type TSSymbol (line 19) | typedef uint16_t TSSymbol;
type TSFieldId (line 20) | typedef uint16_t TSFieldId;
type TSLanguage (line 21) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 24) | typedef struct {
type TSFieldMapSlice (line 30) | typedef struct {
type TSSymbolMetadata (line 35) | typedef struct {
type TSLexer (line 41) | typedef struct TSLexer TSLexer;
type TSLexer (line 43) | struct TSLexer {
type TSParseActionType (line 53) | typedef enum {
type TSParseAction (line 60) | typedef union {
type TSLexMode (line 77) | typedef struct {
type TSParseActionEntry (line 82) | typedef union {
type TSLanguage (line 90) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/include/tree_sitter/api.h
type TSStateId (line 39) | typedef uint16_t TSStateId;
type TSSymbol (line 40) | typedef uint16_t TSSymbol;
type TSFieldId (line 41) | typedef uint16_t TSFieldId;
type TSLanguage (line 42) | typedef struct TSLanguage TSLanguage;
type TSParser (line 43) | typedef struct TSParser TSParser;
type TSTree (line 44) | typedef struct TSTree TSTree;
type TSQuery (line 45) | typedef struct TSQuery TSQuery;
type TSQueryCursor (line 46) | typedef struct TSQueryCursor TSQueryCursor;
type TSLookaheadIterator (line 47) | typedef struct TSLookaheadIterator TSLookaheadIterator;
type TSInputEncoding (line 49) | typedef enum {
type TSSymbolType (line 54) | typedef enum {
type TSPoint (line 60) | typedef struct {
type TSRange (line 65) | typedef struct {
type TSInput (line 72) | typedef struct {
type TSLogType (line 78) | typedef enum {
type TSLogger (line 83) | typedef struct {
type TSInputEdit (line 88) | typedef struct {
type TSNode (line 97) | typedef struct {
type TSTreeCursor (line 103) | typedef struct {
type TSQueryCapture (line 109) | typedef struct {
type TSQuantifier (line 114) | typedef enum {
type TSQueryMatch (line 122) | typedef struct {
type TSQueryPredicateStepType (line 129) | typedef enum {
type TSQueryPredicateStep (line 135) | typedef struct {
type TSQueryError (line 140) | typedef enum {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/include/tree_sitter/parser.h
type TSStateId (line 17) | typedef uint16_t TSStateId;
type TSSymbol (line 18) | typedef uint16_t TSSymbol;
type TSFieldId (line 19) | typedef uint16_t TSFieldId;
type TSLanguage (line 20) | typedef struct TSLanguage TSLanguage;
type TSFieldMapEntry (line 23) | typedef struct {
type TSFieldMapSlice (line 29) | typedef struct {
type TSSymbolMetadata (line 34) | typedef struct {
type TSLexer (line 40) | typedef struct TSLexer TSLexer;
type TSLexer (line 42) | struct TSLexer {
type TSParseActionType (line 52) | typedef enum {
type TSParseAction (line 59) | typedef union {
type TSLexMode (line 76) | typedef struct {
type TSParseActionEntry (line 81) | typedef union {
type TSLanguage (line 89) | struct TSLanguage {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/alloc.c
function ts_set_allocator (line 37) | void ts_set_allocator(
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/array.h
type VoidArray (line 130) | typedef Array(void) VoidArray;
function array__delete (line 134) | static inline void array__delete(VoidArray *self) {
function array__erase (line 143) | static inline void array__erase(VoidArray *self, size_t element_size,
function array__reserve (line 152) | static inline void array__reserve(VoidArray *self, size_t element_size, ...
function array__assign (line 163) | static inline void array__assign(VoidArray *self, const VoidArray *other...
function array__swap (line 169) | static inline void array__swap(VoidArray *self, VoidArray *other) {
function array__grow (line 175) | static inline void array__grow(VoidArray *self, uint32_t count, size_t e...
function array__splice (line 185) | static inline void array__splice(VoidArray *self, size_t element_size,
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/atomic.h
function atomic_load (line 9) | static inline size_t atomic_load(const volatile size_t *p) {
function atomic_inc (line 13) | static inline uint32_t atomic_inc(volatile uint32_t *p) {
function atomic_dec (line 18) | static inline uint32_t atomic_dec(volatile uint32_t *p) {
function atomic_load (line 27) | static inline size_t atomic_load(const volatile size_t *p) {
function atomic_inc (line 31) | static inline uint32_t atomic_inc(volatile uint32_t *p) {
function atomic_dec (line 35) | static inline uint32_t atomic_dec(volatile uint32_t *p) {
function atomic_load (line 41) | static inline size_t atomic_load(const volatile size_t *p) {
function atomic_inc (line 49) | static inline uint32_t atomic_inc(volatile uint32_t *p) {
function atomic_dec (line 57) | static inline uint32_t atomic_dec(volatile uint32_t *p) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/clock.h
type TSDuration (line 7) | typedef uint64_t TSDuration;
type TSClock (line 16) | typedef uint64_t TSClock;
function TSDuration (line 18) | static inline TSDuration duration_from_micros(uint64_t micros) {
function duration_to_micros (line 24) | static inline uint64_t duration_to_micros(TSDuration self) {
function TSClock (line 30) | static inline TSClock clock_null(void) {
function TSClock (line 34) | static inline TSClock clock_now(void) {
function TSClock (line 40) | static inline TSClock clock_after(TSClock base, TSDuration duration) {
function clock_is_null (line 44) | static inline bool clock_is_null(TSClock self) {
function clock_is_gt (line 48) | static inline bool clock_is_gt(TSClock self, TSClock other) {
type TSClock (line 62) | typedef struct timespec TSClock;
function TSDuration (line 64) | static inline TSDuration duration_from_micros(uint64_t micros) {
function duration_to_micros (line 68) | static inline uint64_t duration_to_micros(TSDuration self) {
function TSClock (line 72) | static inline TSClock clock_now(void) {
function TSClock (line 78) | static inline TSClock clock_null(void) {
function TSClock (line 82) | static inline TSClock clock_after(TSClock base, TSDuration duration) {
function clock_is_null (line 93) | static inline bool clock_is_null(TSClock self) {
function clock_is_gt (line 97) | static inline bool clock_is_gt(TSClock self, TSClock other) {
type TSClock (line 114) | typedef uint64_t TSClock;
function TSDuration (line 116) | static inline TSDuration duration_from_micros(uint64_t micros) {
function duration_to_micros (line 120) | static inline uint64_t duration_to_micros(TSDuration self) {
function TSClock (line 124) | static inline TSClock clock_null(void) {
function TSClock (line 128) | static inline TSClock clock_now(void) {
function TSClock (line 132) | static inline TSClock clock_after(TSClock base, TSDuration duration) {
function clock_is_null (line 136) | static inline bool clock_is_null(TSClock self) {
function clock_is_gt (line 140) | static inline bool clock_is_gt(TSClock self, TSClock other) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/get_changed_ranges.c
function ts_range_array_add (line 10) | static void ts_range_array_add(
function ts_range_array_intersects (line 30) | bool ts_range_array_intersects(
function ts_range_array_get_changed_ranges (line 46) | void ts_range_array_get_changed_ranges(
type Iterator (line 106) | typedef struct {
function Iterator (line 113) | static Iterator iterator_new(
function iterator_done (line 133) | static bool iterator_done(Iterator *self) {
function Length (line 137) | static Length iterator_start_position(Iterator *self) {
function Length (line 146) | static Length iterator_end_position(Iterator *self) {
function iterator_tree_is_visible (line 156) | static bool iterator_tree_is_visible(const Iterator *self) {
function iterator_get_visible_state (line 170) | static void iterator_get_visible_state(
function iterator_ascend (line 203) | static void iterator_ascend(Iterator *self) {
function iterator_descend (line 210) | static bool iterator_descend(Iterator *self, uint32_t goal_position) {
function iterator_advance (line 253) | static void iterator_advance(Iterator *self) {
type IteratorComparison (line 298) | typedef enum {
function IteratorComparison (line 304) | static IteratorComparison iterator_compare(
function iterator_print_state (line 342) | static inline void iterator_print_state(Iterator *self) {
function ts_subtree_get_changed_ranges (line 357) | unsigned ts_subtree_get_changed_ranges(
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/get_changed_ranges.h
type TSRangeArray (line 11) | typedef Array(TSRange) TSRangeArray;
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/language.c
function ts_language_symbol_count (line 6) | uint32_t ts_language_symbol_count(const TSLanguage *self) {
function ts_language_state_count (line 10) | uint32_t ts_language_state_count(const TSLanguage *self) {
function ts_language_version (line 14) | uint32_t ts_language_version(const TSLanguage *self) {
function ts_language_field_count (line 18) | uint32_t ts_language_field_count(const TSLanguage *self) {
function ts_language_table_entry (line 22) | void ts_language_table_entry(
function TSSymbolMetadata (line 42) | TSSymbolMetadata ts_language_symbol_metadata(
function TSSymbol (line 55) | TSSymbol ts_language_public_symbol(
function TSStateId (line 63) | TSStateId ts_language_next_state(
function TSSymbol (line 100) | TSSymbol ts_language_symbol_for_name(
function TSSymbolType (line 119) | TSSymbolType ts_language_symbol_type(
function TSFieldId (line 145) | TSFieldId ts_language_field_id_for_name(
function TSLookaheadIterator (line 165) | TSLookaheadIterator *ts_lookahead_iterator_new(const TSLanguage *self, T...
function ts_lookahead_iterator_delete (line 172) | void ts_lookahead_iterator_delete(TSLookaheadIterator *self) {
function ts_lookahead_iterator_reset_state (line 176) | bool ts_lookahead_iterator_reset_state(TSLookaheadIterator * self, TSSta...
function TSLanguage (line 183) | const TSLanguage *ts_lookahead_iterator_language(const TSLookaheadIterat...
function ts_lookahead_iterator_reset (line 188) | bool ts_lookahead_iterator_reset(TSLookaheadIterator *self, const TSLang...
function ts_lookahead_iterator_next (line 195) | bool ts_lookahead_iterator_next(TSLookaheadIterator *self) {
function TSSymbol (line 200) | TSSymbol ts_lookahead_iterator_current_symbol(const TSLookaheadIterator ...
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/language.h
type TableEntry (line 13) | typedef struct {
type LookaheadIterator (line 19) | typedef struct {
function ts_language_is_symbol_external (line 43) | static inline bool ts_language_is_symbol_external(const TSLanguage *self...
function TSParseAction (line 47) | static inline const TSParseAction *ts_language_actions(
function ts_language_has_reduce_action (line 59) | static inline bool ts_language_has_reduce_action(
function ts_language_lookup (line 76) | static inline uint16_t ts_language_lookup(
function ts_language_has_actions (line 98) | static inline bool ts_language_has_actions(
function LookaheadIterator (line 112) | static inline LookaheadIterator ts_language_lookaheads(
function ts_lookahead_iterator__next (line 139) | static inline bool ts_lookahead_iterator__next(LookaheadIterator *self) {
function ts_language_state_is_primary (line 185) | static inline bool ts_language_state_is_primary(
function TSSymbol (line 207) | static inline const TSSymbol *ts_language_alias_sequence(
function TSSymbol (line 216) | static inline TSSymbol ts_language_alias_at(
function ts_language_field_map (line 226) | static inline void ts_language_field_map(
function ts_language_aliases_for_symbol (line 243) | static inline void ts_language_aliases_for_symbol(
function ts_language_write_symbol_as_dot_string (line 266) | static inline void ts_language_write_symbol_as_dot_string(
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/length.h
type Length (line 9) | typedef struct {
function length_is_undefined (line 17) | static inline bool length_is_undefined(Length length) {
function Length (line 21) | static inline Length length_min(Length len1, Length len2) {
function Length (line 25) | static inline Length length_add(Length len1, Length len2) {
function Length (line 32) | static inline Length length_sub(Length len1, Length len2) {
function Length (line 39) | static inline Length length_zero(void) {
function Length (line 44) | static inline Length length_saturating_sub(Length len1, Length len2) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/lexer.c
function ts_lexer__eof (line 42) | static bool ts_lexer__eof(const TSLexer *_self) {
function ts_lexer__clear_chunk (line 49) | static void ts_lexer__clear_chunk(Lexer *self) {
function ts_lexer__get_chunk (line 57) | static void ts_lexer__get_chunk(Lexer *self) {
function ts_lexer__get_lookahead (line 74) | static void ts_lexer__get_lookahead(Lexer *self) {
function ts_lexer_goto (line 105) | static void ts_lexer_goto(Lexer *self, Length position) {
function ts_lexer__do_advance (line 159) | static void ts_lexer__do_advance(Lexer *self, bool skip) {
function ts_lexer__advance (line 209) | static void ts_lexer__advance(TSLexer *_self, bool skip) {
function ts_lexer__mark_end (line 224) | static void ts_lexer__mark_end(TSLexer *_self) {
function ts_lexer__get_column (line 248) | static uint32_t ts_lexer__get_column(TSLexer *_self) {
function ts_lexer__is_at_included_range_start (line 277) | static bool ts_lexer__is_at_included_range_start(const TSLexer *_self) {
function ts_lexer_init (line 287) | void ts_lexer_init(Lexer *self) {
function ts_lexer_delete (line 316) | void ts_lexer_delete(Lexer *self) {
function ts_lexer_set_input (line 320) | void ts_lexer_set_input(Lexer *self, TSInput input) {
function ts_lexer_reset (line 328) | void ts_lexer_reset(Lexer *self, Length position) {
function ts_lexer_start (line 334) | void ts_lexer_start(Lexer *self) {
function ts_lexer_finish (line 349) | void ts_lexer_finish(Lexer *self, uint32_t *lookahead_end_byte) {
function ts_lexer_advance_to_end (line 376) | void ts_lexer_advance_to_end(Lexer *self) {
function ts_lexer_mark_end (line 382) | void ts_lexer_mark_end(Lexer *self) {
function ts_lexer_set_included_ranges (line 386) | bool ts_lexer_set_included_ranges(
function TSRange (line 414) | TSRange *ts_lexer_included_ranges(const Lexer *self, uint32_t *count) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/lexer.h
type Lexer (line 13) | typedef struct {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/node.c
type NodeChildIterator (line 6) | typedef struct {
function TSNode (line 17) | TSNode ts_node_new(
function TSNode (line 30) | static inline TSNode ts_node__null(void) {
function ts_node_start_byte (line 36) | uint32_t ts_node_start_byte(TSNode self) {
function TSPoint (line 40) | TSPoint ts_node_start_point(TSNode self) {
function ts_node__alias (line 44) | static inline uint32_t ts_node__alias(const TSNode *self) {
function Subtree (line 48) | static inline Subtree ts_node__subtree(TSNode self) {
function NodeChildIterator (line 54) | static inline NodeChildIterator ts_node_iterate_children(const TSNode *n...
function ts_node_child_iterator_done (line 73) | static inline bool ts_node_child_iterator_done(NodeChildIterator *self) {
function ts_node_child_iterator_next (line 77) | static inline bool ts_node_child_iterator_next(
function ts_node__is_relevant (line 106) | static inline bool ts_node__is_relevant(TSNode self, bool include_anonym...
function ts_node__relevant_child_count (line 120) | static inline uint32_t ts_node__relevant_child_count(
function TSNode (line 136) | static inline TSNode ts_node__child(
function ts_subtree_has_trailing_empty_descendant (line 173) | static bool ts_subtree_has_trailing_empty_descendant(
function TSNode (line 187) | static inline TSNode ts_node__prev_sibling(TSNode self, bool include_ano...
function TSNode (line 248) | static inline TSNode ts_node__next_sibling(TSNode self, bool include_ano...
function TSNode (line 299) | static inline TSNode ts_node__first_child_for_byte(
function TSNode (line 328) | static inline TSNode ts_node__descendant_for_byte_range(
function TSNode (line 367) | static inline TSNode ts_node__descendant_for_point_range(
function ts_node_end_byte (line 408) | uint32_t ts_node_end_byte(TSNode self) {
function TSPoint (line 412) | TSPoint ts_node_end_point(TSNode self) {
function TSSymbol (line 416) | TSSymbol ts_node_symbol(TSNode self) {
function TSLanguage (line 428) | const TSLanguage *ts_node_language(TSNode self) {
function TSSymbol (line 432) | TSSymbol ts_node_grammar_symbol(TSNode self) {
function ts_node_eq (line 445) | bool ts_node_eq(TSNode self, TSNode other) {
function ts_node_is_null (line 449) | bool ts_node_is_null(TSNode self) {
function ts_node_is_extra (line 453) | bool ts_node_is_extra(TSNode self) {
function ts_node_is_named (line 457) | bool ts_node_is_named(TSNode self) {
function ts_node_is_missing (line 464) | bool ts_node_is_missing(TSNode self) {
function ts_node_has_changes (line 468) | bool ts_node_has_changes(TSNode self) {
function ts_node_has_error (line 472) | bool ts_node_has_error(TSNode self) {
function ts_node_is_error (line 476) | bool ts_node_is_error(TSNode self) {
function ts_node_descendant_count (line 481) | uint32_t ts_node_descendant_count(TSNode self) {
function TSStateId (line 485) | TSStateId ts_node_parse_state(TSNode self) {
function TSStateId (line 489) | TSStateId ts_node_next_parse_state(TSNode self) {
function TSNode (line 499) | TSNode ts_node_parent(TSNode self) {
function TSNode (line 530) | TSNode ts_node_child(TSNode self, uint32_t child_index) {
function TSNode (line 534) | TSNode ts_node_named_child(TSNode self, uint32_t child_index) {
function TSNode (line 538) | TSNode ts_node_child_by_field_id(TSNode self, TSFieldId field_id) {
function TSNode (line 665) | TSNode ts_node_child_by_field_name(
function ts_node_child_count (line 678) | uint32_t ts_node_child_count(TSNode self) {
function ts_node_named_child_count (line 687) | uint32_t ts_node_named_child_count(TSNode self) {
function TSNode (line 696) | TSNode ts_node_next_sibling(TSNode self) {
function TSNode (line 700) | TSNode ts_node_next_named_sibling(TSNode self) {
function TSNode (line 704) | TSNode ts_node_prev_sibling(TSNode self) {
function TSNode (line 708) | TSNode ts_node_prev_named_sibling(TSNode self) {
function TSNode (line 712) | TSNode ts_node_first_child_for_byte(TSNode self, uint32_t byte) {
function TSNode (line 716) | TSNode ts_node_first_named_child_for_byte(TSNode self, uint32_t byte) {
function TSNode (line 720) | TSNode ts_node_descendant_for_byte_range(
function TSNode (line 728) | TSNode ts_node_named_descendant_for_byte_range(
function TSNode (line 736) | TSNode ts_node_descendant_for_point_range(
function TSNode (line 744) | TSNode ts_node_named_descendant_for_point_range(
function ts_node_edit (line 752) | void ts_node_edit(TSNode *self, const TSInputEdit *edit) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/parser.c
type TokenCache (line 80) | typedef struct {
type TSParser (line 86) | struct TSParser {
type ErrorStatus (line 110) | typedef struct {
type ErrorComparison (line 117) | typedef enum {
type TSStringInput (line 125) | typedef struct {
function ts_parser__log (line 151) | static void ts_parser__log(TSParser *self) {
function ts_parser__breakdown_top_of_stack (line 170) | static bool ts_parser__breakdown_top_of_stack(
function ts_parser__breakdown_lookahead (line 218) | static void ts_parser__breakdown_lookahead(
function ErrorComparison (line 240) | static ErrorComparison ts_parser__compare_versions(
function ErrorStatus (line 283) | static ErrorStatus ts_parser__version_status(
function ts_parser__better_version_exists (line 298) | static bool ts_parser__better_version_exists(
function ts_parser__restore_external_scanner (line 335) | static void ts_parser__restore_external_scanner(
function ts_parser__can_reuse_first_leaf (line 350) | static bool ts_parser__can_reuse_first_leaf(
function Subtree (line 385) | static Subtree ts_parser__lex(
function Subtree (line 587) | static Subtree ts_parser__get_cached_token(
function ts_parser__set_cached_token (line 608) | static void ts_parser__set_cached_token(
function ts_parser__has_included_range_difference (line 624) | static bool ts_parser__has_included_range_difference(
function Subtree (line 637) | static Subtree ts_parser__reuse_node(
function ts_parser__select_tree (line 720) | static bool ts_parser__select_tree(TSParser *self, Subtree left, Subtree...
function ts_parser__select_children (line 767) | static bool ts_parser__select_children(
function ts_parser__shift (line 792) | static void ts_parser__shift(
function StackVersion (line 815) | static StackVersion ts_parser__reduce(
function ts_parser__accept (line 930) | static void ts_parser__accept(
function ts_parser__do_all_potential_reductions (line 983) | static bool ts_parser__do_all_potential_reductions(
function ts_parser__recover_to_state (line 1073) | static bool ts_parser__recover_to_state(
function ts_parser__recover (line 1132) | static void ts_parser__recover(
function ts_parser__handle_error (line 1309) | static void ts_parser__handle_error(
function ts_parser__advance (line 1407) | static bool ts_parser__advance(
function ts_parser__condense_stack (line 1624) | static unsigned ts_parser__condense_stack(TSParser *self) {
function ts_parser_has_outstanding_parse (line 1724) | static bool ts_parser_has_outstanding_parse(TSParser *self) {
function TSParser (line 1733) | TSParser *ts_parser_new(void) {
function ts_parser_delete (line 1754) | void ts_parser_delete(TSParser *self) {
function TSLanguage (line 1779) | const TSLanguage *ts_parser_language(const TSParser *self) {
function ts_parser_set_language (line 1783) | bool ts_parser_set_language(TSParser *self, const TSLanguage *language) {
function TSLogger (line 1804) | TSLogger ts_parser_logger(const TSParser *self) {
function ts_parser_set_logger (line 1808) | void ts_parser_set_logger(TSParser *self, TSLogger logger) {
function ts_parser_print_dot_graphs (line 1812) | void ts_parser_print_dot_graphs(TSParser *self, int fd) {
function ts_parser_set_cancellation_flag (line 1832) | void ts_parser_set_cancellation_flag(TSParser *self, const size_t *flag) {
function ts_parser_timeout_micros (line 1836) | uint64_t ts_parser_timeout_micros(const TSParser *self) {
function ts_parser_set_timeout_micros (line 1840) | void ts_parser_set_timeout_micros(TSParser *self, uint64_t timeout_micro...
function ts_parser_set_included_ranges (line 1844) | bool ts_parser_set_included_ranges(
function TSRange (line 1852) | const TSRange *ts_parser_included_ranges(const TSParser *self, uint32_t ...
function ts_parser_reset (line 1856) | void ts_parser_reset(TSParser *self) {
function TSTree (line 1877) | TSTree *ts_parser_parse(
function TSTree (line 1987) | TSTree *ts_parser_parse_string(
function TSTree (line 1996) | TSTree *ts_parser_parse_string_encoding(
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/point.h
function TSPoint (line 9) | static inline TSPoint point__new(unsigned row, unsigned column) {
function TSPoint (line 14) | static inline TSPoint point_add(TSPoint a, TSPoint b) {
function TSPoint (line 21) | static inline TSPoint point_sub(TSPoint a, TSPoint b) {
function point_lte (line 28) | static inline bool point_lte(TSPoint a, TSPoint b) {
function point_lt (line 32) | static inline bool point_lt(TSPoint a, TSPoint b) {
function point_gt (line 36) | static inline bool point_gt(TSPoint a, TSPoint b) {
function point_gte (line 40) | static inline bool point_gte(TSPoint a, TSPoint b) {
function point_eq (line 44) | static inline bool point_eq(TSPoint a, TSPoint b) {
function TSPoint (line 48) | static inline TSPoint point_min(TSPoint a, TSPoint b) {
function TSPoint (line 55) | static inline TSPoint point_max(TSPoint a, TSPoint b) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/query.c
type Stream (line 23) | typedef struct {
type QueryStep (line 85) | typedef struct {
type Slice (line 110) | typedef struct {
type SymbolTable (line 118) | typedef struct {
type CaptureQuantifiers (line 126) | typedef Array(uint8_t) CaptureQuantifiers;
type PatternEntry (line 139) | typedef struct {
type QueryPattern (line 145) | typedef struct {
type StepOffset (line 152) | typedef struct {
type QueryState (line 181) | typedef struct {
type CaptureList (line 194) | typedef Array(TSQueryCapture) CaptureList;
type CaptureListPool (line 202) | typedef struct {
type AnalysisStateEntry (line 220) | typedef struct {
type AnalysisState (line 228) | typedef struct {
type AnalysisStateSet (line 235) | typedef Array(AnalysisState *) AnalysisStateSet;
type QueryAnalysis (line 237) | typedef struct {
type AnalysisSubgraphNode (line 253) | typedef struct {
type AnalysisSubgraph (line 260) | typedef struct {
type AnalysisSubgraphArray (line 266) | typedef Array(AnalysisSubgraph) AnalysisSubgraphArray;
type StatePredecessorMap (line 273) | typedef struct {
type TSQuery (line 282) | struct TSQuery {
type TSQueryCursor (line 301) | struct TSQueryCursor {
function stream_advance (line 330) | static bool stream_advance(Stream *self) {
function stream_reset (line 351) | static void stream_reset(Stream *self, const char *input) {
function Stream (line 357) | static Stream stream_new(const char *string, uint32_t length) {
function stream_skip_whitespace (line 368) | static void stream_skip_whitespace(Stream *self) {
function stream_is_ident_start (line 384) | static bool stream_is_ident_start(Stream *self) {
function stream_scan_identifier (line 388) | static void stream_scan_identifier(Stream *stream) {
function stream_offset (line 401) | static uint32_t stream_offset(Stream *self) {
function CaptureListPool (line 409) | static CaptureListPool capture_list_pool_new(void) {
function capture_list_pool_reset (line 418) | static void capture_list_pool_reset(CaptureListPool *self) {
function capture_list_pool_delete (line 426) | static void capture_list_pool_delete(CaptureListPool *self) {
function CaptureList (line 433) | static const CaptureList *capture_list_pool_get(const CaptureListPool *s...
function CaptureList (line 438) | static CaptureList *capture_list_pool_get_mut(CaptureListPool *self, uin...
function capture_list_pool_is_empty (line 443) | static bool capture_list_pool_is_empty(const CaptureListPool *self) {
function capture_list_pool_acquire (line 449) | static uint16_t capture_list_pool_acquire(CaptureListPool *self) {
function capture_list_pool_release (line 473) | static void capture_list_pool_release(CaptureListPool *self, uint16_t id) {
function TSQuantifier (line 483) | static TSQuantifier quantifier_mul(
function TSQuantifier (line 532) | static TSQuantifier quantifier_join(
function TSQuantifier (line 593) | static TSQuantifier quantifier_add(
function CaptureQuantifiers (line 643) | static CaptureQuantifiers capture_quantifiers_new(void) {
function capture_quantifiers_delete (line 648) | static void capture_quantifiers_delete(
function capture_quantifiers_clear (line 655) | static void capture_quantifiers_clear(
function capture_quantifiers_replace (line 662) | static void capture_quantifiers_replace(
function TSQuantifier (line 671) | static TSQuantifier capture_quantifier_for_id(
function capture_quantifiers_add_for_id (line 679) | static void capture_quantifiers_add_for_id(
function capture_quantifiers_add_all (line 692) | static void capture_quantifiers_add_all(
function capture_quantifiers_mul (line 707) | static void capture_quantifiers_mul(
function capture_quantifiers_join_all (line 718) | static void capture_quantifiers_join_all(
function SymbolTable (line 740) | static SymbolTable symbol_table_new(void) {
function symbol_table_delete (line 747) | static void symbol_table_delete(SymbolTable *self) {
function symbol_table_id_for_name (line 752) | static int symbol_table_id_for_name(
function symbol_table_insert_name (line 777) | static uint16_t symbol_table_insert_name(
function QueryStep (line 799) | static QueryStep query_step__new(
function query_step__add_capture (line 825) | static void query_step__add_capture(QueryStep *self, uint16_t capture_id) {
function query_step__remove_capture (line 834) | static void query_step__remove_capture(QueryStep *self, uint16_t capture...
function StatePredecessorMap (line 853) | static inline StatePredecessorMap state_predecessor_map_new(
function state_predecessor_map_delete (line 864) | static inline void state_predecessor_map_delete(StatePredecessorMap *sel...
function state_predecessor_map_add (line 868) | static inline void state_predecessor_map_add(
function TSStateId (line 884) | static inline const TSStateId *state_predecessor_map_get(
function analysis_state__recursion_depth (line 898) | static unsigned analysis_state__recursion_depth(const AnalysisState *sel...
function analysis_state__compare_position (line 912) | static inline int analysis_state__compare_position(
function analysis_state__compare (line 927) | static inline int analysis_state__compare(
function AnalysisStateEntry (line 944) | static inline AnalysisStateEntry *analysis_state__top(AnalysisState *sel...
function analysis_state__has_supertype (line 951) | static inline bool analysis_state__has_supertype(AnalysisState *self, TS...
function AnalysisState (line 964) | static inline AnalysisState *analysis_state_pool__clone_or_reuse(
function analysis_state_set__insert_sorted (line 984) | static inline void analysis_state_set__insert_sorted(
function analysis_state_set__push (line 1005) | static inline void analysis_state_set__push(
function analysis_state_set__clear (line 1015) | static inline void analysis_state_set__clear(AnalysisStateSet *self, Ana...
function analysis_state_set__delete (line 1022) | static inline void analysis_state_set__delete(AnalysisStateSet *self) {
function QueryAnalysis (line 1033) | static inline QueryAnalysis query_analysis__new() {
function query_analysis__delete (line 1045) | static inline void query_analysis__delete(QueryAnalysis *self) {
function analysis_subgraph_node__compare (line 1058) | static inline int analysis_subgraph_node__compare(const AnalysisSubgraph...
function ts_query__pattern_map_search (line 1088) | static inline bool ts_query__pattern_map_search(
function ts_query__pattern_map_insert (line 1128) | static inline void ts_query__pattern_map_insert(
function ts_query__perform_analysis (line 1157) | static void ts_query__perform_analysis(
function ts_query__analyze_patterns (line 1459) | static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_of...
function ts_query__add_negated_fields (line 1957) | static void ts_query__add_negated_fields(
function TSQueryError (line 2009) | static TSQueryError ts_query__parse_string_literal(
function TSQueryError (line 2068) | static TSQueryError ts_query__parse_predicate(
function TSQueryError (line 2172) | static TSQueryError ts_query__parse_pattern(
function TSQuery (line 2671) | TSQuery *ts_query_new(
function ts_query_delete (line 2805) | void ts_query_delete(TSQuery *self) {
function ts_query_pattern_count (line 2826) | uint32_t ts_query_pattern_count(const TSQuery *self) {
function ts_query_capture_count (line 2830) | uint32_t ts_query_capture_count(const TSQuery *self) {
function ts_query_string_count (line 2834) | uint32_t ts_query_string_count(const TSQuery *self) {
function TSQuantifier (line 2846) | TSQuantifier ts_query_capture_quantifier_for_id(
function TSQueryPredicateStep (line 2863) | const TSQueryPredicateStep *ts_query_predicates_for_pattern(
function ts_query_start_byte_for_pattern (line 2876) | uint32_t ts_query_start_byte_for_pattern(
function ts_query_is_pattern_rooted (line 2883) | bool ts_query_is_pattern_rooted(
function ts_query_is_pattern_non_local (line 2896) | bool ts_query_is_pattern_non_local(
function ts_query_is_pattern_guaranteed_at_step (line 2907) | bool ts_query_is_pattern_guaranteed_at_step(
function ts_query__step_is_fallible (line 2924) | bool ts_query__step_is_fallible(
function ts_query_disable_capture (line 2938) | void ts_query_disable_capture(
function ts_query_disable_pattern (line 2954) | void ts_query_disable_pattern(
function TSQueryCursor (line 2973) | TSQueryCursor *ts_query_cursor_new(void) {
function ts_query_cursor_delete (line 2993) | void ts_query_cursor_delete(TSQueryCursor *self) {
function ts_query_cursor_did_exceed_match_limit (line 3001) | bool ts_query_cursor_did_exceed_match_limit(const TSQueryCursor *self) {
function ts_query_cursor_match_limit (line 3005) | uint32_t ts_query_cursor_match_limit(const TSQueryCursor *self) {
function ts_query_cursor_set_match_limit (line 3009) | void ts_query_cursor_set_match_limit(TSQueryCursor *self, uint32_t limit) {
function ts_query_cursor_exec (line 3019) | void ts_query_cursor_exec(
function ts_query_cursor_set_byte_range (line 3063) | void ts_query_cursor_set_byte_range(
function ts_query_cursor_set_point_range (line 3075) | void ts_query_cursor_set_point_range(
function ts_query_cursor__first_in_progress_capture (line 3089) | static bool ts_query_cursor__first_in_progress_capture(
function ts_query_cursor__compare_nodes (line 3145) | int ts_query_cursor__compare_nodes(TSNode left, TSNode right) {
function ts_query_cursor__compare_captures (line 3160) | void ts_query_cursor__compare_captures(
function ts_query_cursor__add_state (line 3217) | static void ts_query_cursor__add_state(
function CaptureList (line 3281) | static CaptureList *ts_query_cursor__prepare_to_capture(
function ts_query_cursor__capture (line 3328) | static void ts_query_cursor__capture(
function QueryState (line 3358) | static QueryState *ts_query_cursor__copy_state(
function ts_query_cursor__should_descend (line 3383) | static inline bool ts_query_cursor__should_descend(
function ts_query_cursor__advance (line 3441) | static inline bool ts_query_cursor__advance(
function ts_query_cursor_next_match (line 3951) | bool ts_query_cursor_next_match(
function ts_query_cursor_remove_match (line 3976) | void ts_query_cursor_remove_match(
function ts_query_cursor_next_capture (line 4007) | bool ts_query_cursor_next_capture(
function ts_query_cursor_set_max_start_depth (line 4134) | void ts_query_cursor_set_max_start_depth(
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/reduce_action.h
type ReduceAction (line 11) | typedef struct {
type ReduceActionSet (line 18) | typedef Array(ReduceAction) ReduceActionSet;
function ts_reduce_action_set_add (line 20) | static inline void ts_reduce_action_set_add(ReduceActionSet *self,
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/reusable_node.h
type StackEntry (line 3) | typedef struct {
type ReusableNode (line 9) | typedef struct {
function ReusableNode (line 14) | static inline ReusableNode reusable_node_new(void) {
function reusable_node_clear (line 18) | static inline void reusable_node_clear(ReusableNode *self) {
function Subtree (line 23) | static inline Subtree reusable_node_tree(ReusableNode *self) {
function reusable_node_byte_offset (line 29) | static inline uint32_t reusable_node_byte_offset(ReusableNode *self) {
function reusable_node_delete (line 35) | static inline void reusable_node_delete(ReusableNode *self) {
function reusable_node_advance (line 39) | static inline void reusable_node_advance(ReusableNode *self) {
function reusable_node_descend (line 62) | static inline bool reusable_node_descend(ReusableNode *self) {
function reusable_node_advance_past_leaf (line 76) | static inline void reusable_node_advance_past_leaf(ReusableNode *self) {
function reusable_node_reset (line 81) | static inline void reusable_node_reset(ReusableNode *self, Subtree tree) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/stack.c
type StackNode (line 20) | typedef struct StackNode StackNode;
type StackLink (line 22) | typedef struct {
type StackNode (line 28) | struct StackNode {
type StackIterator (line 39) | typedef struct {
type StackNodeArray (line 46) | typedef Array(StackNode *) StackNodeArray;
type StackStatus (line 48) | typedef enum {
type StackHead (line 54) | typedef struct {
type Stack (line 63) | struct Stack {
type StackAction (line 72) | typedef unsigned StackAction;
type StackAction (line 79) | typedef StackAction (*StackCallback)(void *, const StackIterator *);
function stack_node_retain (line 81) | static void stack_node_retain(StackNode *self) {
function stack_node_release (line 89) | static void stack_node_release(
function stack__subtree_node_count (line 125) | static uint32_t stack__subtree_node_count(Subtree subtree) {
function StackNode (line 137) | static StackNode *stack_node_new(
function stack__subtree_is_equivalent (line 180) | static bool stack__subtree_is_equivalent(Subtree left, Subtree right) {
function stack_node_add_link (line 199) | static void stack_node_add_link(
function stack_head_delete (line 264) | static void stack_head_delete(
function StackVersion (line 284) | static StackVersion ts_stack__add_version(
function ts_stack__add_slice (line 302) | static void ts_stack__add_slice(
function StackSliceArray (line 322) | static StackSliceArray stack__iter(
function Stack (line 419) | Stack *ts_stack_new(SubtreePool *subtree_pool) {
function ts_stack_delete (line 438) | void ts_stack_delete(Stack *self) {
function ts_stack_version_count (line 457) | uint32_t ts_stack_version_count(const Stack *self) {
function TSStateId (line 461) | TSStateId ts_stack_state(const Stack *self, StackVersion version) {
function Length (line 465) | Length ts_stack_position(const Stack *self, StackVersion version) {
function Subtree (line 469) | Subtree ts_stack_last_external_token(const Stack *self, StackVersion ver...
function ts_stack_set_last_external_token (line 473) | void ts_stack_set_last_external_token(Stack *self, StackVersion version,...
function ts_stack_error_cost (line 480) | unsigned ts_stack_error_cost(const Stack *self, StackVersion version) {
function ts_stack_node_count_since_error (line 491) | unsigned ts_stack_node_count_since_error(const Stack *self, StackVersion...
function ts_stack_push (line 499) | void ts_stack_push(
function StackAction (line 512) | inline StackAction pop_count_callback(void *payload, const StackIterator...
function StackSliceArray (line 521) | StackSliceArray ts_stack_pop_count(Stack *self, StackVersion version, ui...
function StackAction (line 525) | inline StackAction pop_pending_callback(void *payload, const StackIterat...
function StackSliceArray (line 538) | StackSliceArray ts_stack_pop_pending(Stack *self, StackVersion version) {
function StackAction (line 547) | inline StackAction pop_error_callback(void *payload, const StackIterator...
function SubtreeArray (line 561) | SubtreeArray ts_stack_pop_error(Stack *self, StackVersion version) {
function StackAction (line 578) | inline StackAction pop_all_callback(void *payload, const StackIterator *...
function StackSliceArray (line 583) | StackSliceArray ts_stack_pop_all(Stack *self, StackVersion version) {
type SummarizeStackSession (line 587) | typedef struct {
function StackAction (line 592) | inline StackAction summarize_stack_callback(void *payload, const StackIt...
function ts_stack_record_summary (line 610) | void ts_stack_record_summary(Stack *self, StackVersion version, unsigned...
function StackSummary (line 625) | StackSummary *ts_stack_get_summary(Stack *self, StackVersion version) {
function ts_stack_dynamic_precedence (line 629) | int ts_stack_dynamic_precedence(Stack *self, StackVersion version) {
function ts_stack_has_advanced_since_error (line 633) | bool ts_stack_has_advanced_since_error(const Stack *self, StackVersion v...
function ts_stack_remove_version (line 657) | void ts_stack_remove_version(Stack *self, StackVersion version) {
function ts_stack_renumber_version (line 662) | void ts_stack_renumber_version(Stack *self, StackVersion v1, StackVersio...
function ts_stack_swap_versions (line 677) | void ts_stack_swap_versions(Stack *self, StackVersion v1, StackVersion v...
function StackVersion (line 683) | StackVersion ts_stack_copy_version(Stack *self, StackVersion version) {
function ts_stack_merge (line 693) | bool ts_stack_merge(Stack *self, StackVersion version1, StackVersion ver...
function ts_stack_can_merge (line 707) | bool ts_stack_can_merge(Stack *self, StackVersion version1, StackVersion...
function ts_stack_halt (line 719) | void ts_stack_halt(Stack *self, StackVersion version) {
function ts_stack_pause (line 723) | void ts_stack_pause(Stack *self, StackVersion version, Subtree lookahead) {
function ts_stack_is_active (line 730) | bool ts_stack_is_active(const Stack *self, StackVersion version) {
function ts_stack_is_halted (line 734) | bool ts_stack_is_halted(const Stack *self, StackVersion version) {
function ts_stack_is_paused (line 738) | bool ts_stack_is_paused(const Stack *self, StackVersion version) {
function Subtree (line 742) | Subtree ts_stack_resume(Stack *self, StackVersion version) {
function ts_stack_clear (line 751) | void ts_stack_clear(Stack *self) {
function ts_stack_print_dot_graph (line 765) | bool ts_stack_print_dot_graph(Stack *self, const TSLanguage *language, F...
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/stack.h
type Stack (line 13) | typedef struct Stack Stack;
type StackVersion (line 15) | typedef unsigned StackVersion;
type StackSlice (line 18) | typedef struct {
type StackSliceArray (line 22) | typedef Array(StackSlice) StackSliceArray;
type StackSummaryEntry (line 24) | typedef struct {
type StackSummary (line 29) | typedef Array(StackSummaryEntry) StackSummary;
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/subtree.c
type Edit (line 15) | typedef struct {
function ts_external_scanner_state_init (line 26) | void ts_external_scanner_state_init(ExternalScannerState *self, const ch...
function ExternalScannerState (line 36) | ExternalScannerState ts_external_scanner_state_copy(const ExternalScanne...
function ts_external_scanner_state_delete (line 45) | void ts_external_scanner_state_delete(ExternalScannerState *self) {
function ts_external_scanner_state_eq (line 59) | bool ts_external_scanner_state_eq(const ExternalScannerState *self, cons...
function ts_subtree_array_copy (line 67) | void ts_subtree_array_copy(SubtreeArray self, SubtreeArray *dest) {
function ts_subtree_array_clear (line 80) | void ts_subtree_array_clear(SubtreePool *pool, SubtreeArray *self) {
function ts_subtree_array_delete (line 87) | void ts_subtree_array_delete(SubtreePool *pool, SubtreeArray *self) {
function ts_subtree_array_remove_trailing_extras (line 92) | void ts_subtree_array_remove_trailing_extras(
function ts_subtree_array_reverse (line 109) | void ts_subtree_array_reverse(SubtreeArray *self) {
function SubtreePool (line 120) | SubtreePool ts_subtree_pool_new(uint32_t capacity) {
function ts_subtree_pool_delete (line 126) | void ts_subtree_pool_delete(SubtreePool *self) {
function SubtreeHeapData (line 136) | static SubtreeHeapData *ts_subtree_pool_allocate(SubtreePool *self) {
function ts_subtree_pool_free (line 144) | static void ts_subtree_pool_free(SubtreePool *self, SubtreeHeapData *tre...
function ts_subtree_can_inline (line 154) | static inline bool ts_subtree_can_inline(Length padding, Length size, ui...
function Subtree (line 164) | Subtree ts_subtree_new_leaf(
function ts_subtree_set_symbol (line 224) | void ts_subtree_set_symbol(
function Subtree (line 242) | Subtree ts_subtree_new_error(
function MutableSubtree (line 258) | MutableSubtree ts_subtree_clone(Subtree self) {
function MutableSubtree (line 282) | MutableSubtree ts_subtree_make_mut(SubtreePool *pool, Subtree self) {
function ts_subtree__compress (line 290) | static void ts_subtree__compress(
function ts_subtree_balance (line 336) | void ts_subtree_balance(Subtree self, SubtreePool *pool, const TSLanguag...
function ts_subtree_summarize_children (line 369) | void ts_subtree_summarize_children(
function MutableSubtree (line 505) | MutableSubtree ts_subtree_new_node(
function Subtree (line 548) | Subtree ts_subtree_new_error_node(
function Subtree (line 564) | Subtree ts_subtree_new_missing_leaf(
function ts_subtree_retain (line 583) | void ts_subtree_retain(Subtree self) {
function ts_subtree_release (line 590) | void ts_subtree_release(SubtreePool *pool, Subtree self) {
function ts_subtree_compare (line 621) | int ts_subtree_compare(Subtree left, Subtree right) {
function ts_subtree_set_has_changes (line 638) | static inline void ts_subtree_set_has_changes(MutableSubtree *self) {
function Subtree (line 646) | Subtree ts_subtree_edit(Subtree self, const TSInputEdit *input_edit, Sub...
function Subtree (line 802) | Subtree ts_subtree_last_external_token(Subtree tree) {
function ts_subtree__write_char_to_string (line 816) | static size_t ts_subtree__write_char_to_string(char *str, size_t n, int3...
function ts_subtree__write_to_string (line 835) | static size_t ts_subtree__write_to_string(
function ts_subtree__print_dot_graph (line 955) | void ts_subtree__print_dot_graph(const Subtree *self, uint32_t start_off...
function ts_subtree_print_dot_graph (line 1010) | void ts_subtree_print_dot_graph(Subtree self, const TSLanguage *language...
function ExternalScannerState (line 1017) | const ExternalScannerState *ts_subtree_external_scanner_state(Subtree se...
function ts_subtree_external_scanner_state_eq (line 1031) | bool ts_subtree_external_scanner_state_eq(Subtree self, Subtree other) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/subtree.h
type ExternalScannerState (line 31) | typedef struct {
type SubtreeInlineData (line 50) | typedef struct SubtreeInlineData SubtreeInlineData;
type SubtreeInlineData (line 70) | struct SubtreeInlineData {
type MutableSubtree (line 163) | typedef union {
type SubtreeArray (line 168) | typedef Array(Subtree) SubtreeArray;
type MutableSubtreeArray (line 169) | typedef Array(MutableSubtree) MutableSubtreeArray;
type SubtreePool (line 171) | typedef struct {
function TSSymbol (line 217) | static inline TSSymbol ts_subtree_symbol(Subtree self) { return SUBTREE_...
function ts_subtree_visible (line 218) | static inline bool ts_subtree_visible(Subtree self) { return SUBTREE_GET...
function ts_subtree_named (line 219) | static inline bool ts_subtree_named(Subtree self) { return SUBTREE_GET(s...
function ts_subtree_extra (line 220) | static inline bool ts_subtree_extra(Subtree self) { return SUBTREE_GET(s...
function ts_subtree_has_changes (line 221) | static inline bool ts_subtree_has_changes(Subtree self) { return SUBTREE...
function ts_subtree_missing (line 222) | static inline bool ts_subtree_missing(Subtree self) { return SUBTREE_GET...
function ts_subtree_is_keyword (line 223) | static inline bool ts_subtree_is_keyword(Subtree self) { return SUBTREE_...
function TSStateId (line 224) | static inline TSStateId ts_subtree_parse_state(Subtree self) { return SU...
function ts_subtree_lookahead_bytes (line 225) | static inline uint32_t ts_subtree_lookahead_bytes(Subtree self) { return...
function ts_subtree_alloc_size (line 231) | static inline size_t ts_subtree_alloc_size(uint32_t child_count) {
function ts_subtree_set_extra (line 240) | static inline void ts_subtree_set_extra(MutableSubtree *self, bool is_ex...
function TSSymbol (line 248) | static inline TSSymbol ts_subtree_leaf_symbol(Subtree self) {
function TSStateId (line 254) | static inline TSStateId ts_subtree_leaf_parse_state(Subtree self) {
function Length (line 260) | static inline Length ts_subtree_padding(Subtree self) {
function Length (line 269) | static inline Length ts_subtree_size(Subtree self) {
function Length (line 278) | static inline Length ts_subtree_total_size(Subtree self) {
function ts_subtree_total_bytes (line 282) | static inline uint32_t ts_subtree_total_bytes(Subtree self) {
function ts_subtree_child_count (line 286) | static inline uint32_t ts_subtree_child_count(Subtree self) {
function ts_subtree_repeat_depth (line 290) | static inline uint32_t ts_subtree_repeat_depth(Subtree self) {
function ts_subtree_is_repetition (line 294) | static inline uint32_t ts_subtree_is_repetition(Subtree self) {
function ts_subtree_visible_descendant_count (line 300) | static inline uint32_t ts_subtree_visible_descendant_count(Subtree self) {
function ts_subtree_visible_child_count (line 306) | static inline uint32_t ts_subtree_visible_child_count(Subtree self) {
function ts_subtree_error_cost (line 314) | static inline uint32_t ts_subtree_error_cost(Subtree self) {
function ts_subtree_dynamic_precedence (line 322) | static inline int32_t ts_subtree_dynamic_precedence(Subtree self) {
function ts_subtree_production_id (line 326) | static inline uint16_t ts_subtree_production_id(Subtree self) {
function ts_subtree_fragile_left (line 334) | static inline bool ts_subtree_fragile_left(Subtree self) {
function ts_subtree_fragile_right (line 338) | static inline bool ts_subtree_fragile_right(Subtree self) {
function ts_subtree_has_external_tokens (line 342) | static inline bool ts_subtree_has_external_tokens(Subtree self) {
function ts_subtree_has_external_scanner_state_change (line 346) | static inline bool ts_subtree_has_external_scanner_state_change(Subtree ...
function ts_subtree_depends_on_column (line 350) | static inline bool ts_subtree_depends_on_column(Subtree self) {
function ts_subtree_is_fragile (line 354) | static inline bool ts_subtree_is_fragile(Subtree self) {
function ts_subtree_is_error (line 358) | static inline bool ts_subtree_is_error(Subtree self) {
function ts_subtree_is_eof (line 362) | static inline bool ts_subtree_is_eof(Subtree self) {
function Subtree (line 366) | static inline Subtree ts_subtree_from_mut(MutableSubtree self) {
function MutableSubtree (line 372) | static inline MutableSubtree ts_subtree_to_mut_unsafe(Subtree self) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/tree.c
function TSTree (line 9) | TSTree *ts_tree_new(
function TSTree (line 22) | TSTree *ts_tree_copy(const TSTree *self) {
function ts_tree_delete (line 27) | void ts_tree_delete(TSTree *self) {
function TSNode (line 37) | TSNode ts_tree_root_node(const TSTree *self) {
function TSNode (line 41) | TSNode ts_tree_root_node_with_offset(
function TSLanguage (line 50) | const TSLanguage *ts_tree_language(const TSTree *self) {
function ts_tree_edit (line 54) | void ts_tree_edit(TSTree *self, const TSInputEdit *edit) {
function TSRange (line 94) | TSRange *ts_tree_included_ranges(const TSTree *self, uint32_t *length) {
function TSRange (line 101) | TSRange *ts_tree_get_changed_ranges(const TSTree *old_tree, const TSTree...
function ts_tree_print_dot_graph (line 128) | void ts_tree_print_dot_graph(const TSTree *self, int fd) {
function ts_tree_print_dot_graph (line 137) | void ts_tree_print_dot_graph(const TSTree *self, int file_descriptor) {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/tree.h
type ParentCacheEntry (line 10) | typedef struct {
type TSTree (line 17) | struct TSTree {
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/tree_cursor.c
type CursorChildIterator (line 7) | typedef struct {
function ts_tree_cursor_is_entry_visible (line 19) | static inline bool ts_tree_cursor_is_entry_visible(const TreeCursor *sel...
function CursorChildIterator (line 35) | static inline CursorChildIterator ts_tree_cursor_iterate_children(const ...
function ts_tree_cursor_child_iterator_next (line 61) | static inline bool ts_tree_cursor_child_iterator_next(
function Length (line 104) | static inline Length length_backtrack(Length a, Length b) {
function ts_tree_cursor_child_iterator_previous (line 116) | static inline bool ts_tree_cursor_child_iterator_previous(
function TSTreeCursor (line 153) | TSTreeCursor ts_tree_cursor_new(TSNode node) {
function ts_tree_cursor_reset (line 159) | void ts_tree_cursor_reset(TSTreeCursor *_self, TSNode node) {
function ts_tree_cursor_init (line 163) | void ts_tree_cursor_init(TreeCursor *self, TSNode node) {
function ts_tree_cursor_delete (line 178) | void ts_tree_cursor_delete(TSTreeCursor *_self) {
function TreeCursorStep (line 185) | TreeCursorStep ts_tree_cursor_goto_first_child_internal(TSTreeCursor *_s...
function ts_tree_cursor_goto_first_child (line 203) | bool ts_tree_cursor_goto_first_child(TSTreeCursor *self) {
function TreeCursorStep (line 217) | TreeCursorStep ts_tree_cursor_goto_last_child_internal(TSTreeCursor *_se...
function ts_tree_cursor_goto_last_child (line 244) | bool ts_tree_cursor_goto_last_child(TSTreeCursor *self) {
function ts_tree_cursor_goto_first_child_for_byte_and_point (line 258) | static inline int64_t ts_tree_cursor_goto_first_child_for_byte_and_point(
function ts_tree_cursor_goto_first_child_for_byte (line 300) | int64_t ts_tree_cursor_goto_first_child_for_byte(TSTreeCursor *self, uin...
function ts_tree_cursor_goto_first_child_for_point (line 304) | int64_t ts_tree_cursor_goto_first_child_for_point(TSTreeCursor *self, TS...
function TreeCursorStep (line 308) | TreeCursorStep ts_tree_cursor_goto_sibling_internal(
function TreeCursorStep (line 343) | TreeCursorStep ts_tree_cursor_goto_next_sibling_internal(TSTreeCursor *_...
function ts_tree_cursor_goto_next_sibling (line 347) | bool ts_tree_cursor_goto_next_sibling(TSTreeCursor *self) {
function TreeCursorStep (line 359) | TreeCursorStep ts_tree_cursor_goto_previous_sibling_internal(TSTreeCurso...
function ts_tree_cursor_goto_previous_sibling (line 395) | bool ts_tree_cursor_goto_previous_sibling(TSTreeCursor *self) {
function ts_tree_cursor_goto_parent (line 407) | bool ts_tree_cursor_goto_parent(TSTreeCursor *_self) {
function ts_tree_cursor_goto_descendant (line 418) | void ts_tree_cursor_goto_descendant(
function ts_tree_cursor_current_descendant_index (line 469) | uint32_t ts_tree_cursor_current_descendant_index(const TSTreeCursor *_se...
function TSNode (line 475) | TSNode ts_tree_cursor_current_node(const TSTreeCursor *_self) {
function ts_tree_cursor_current_status (line 497) | void ts_tree_cursor_current_status(
function ts_tree_cursor_current_depth (line 617) | uint32_t ts_tree_cursor_current_depth(const TSTreeCursor *_self) {
function TSNode (line 628) | TSNode ts_tree_cursor_parent_node(const TSTreeCursor *_self) {
function TSFieldId (line 655) | TSFieldId ts_tree_cursor_current_field_id(const TSTreeCursor *_self) {
function TSTreeCursor (line 696) | TSTreeCursor ts_tree_cursor_copy(const TSTreeCursor *_cursor) {
function ts_tree_cursor_reset_to (line 706) | void ts_tree_cursor_reset_to(TSTreeCursor *_dst, const TSTreeCursor *_sr...
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/tree_cursor.h
type TreeCursorEntry (line 6) | typedef struct {
type TreeCursor (line 14) | typedef struct {
type TreeCursorStep (line 19) | typedef enum {
function Subtree (line 39) | static inline Subtree ts_tree_cursor_current_subtree(const TSTreeCursor ...
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/unicode.h
function ts_decode_utf8 (line 26) | static inline uint32_t ts_decode_utf8(
function ts_decode_utf16 (line 36) | static inline uint32_t ts_decode_utf16(
FILE: Frameworks/RunestoneEditor/External/TreeSitter/Sources/TreeSitter/src/unicode/umachine.h
type UBool (line 260) | typedef int8_t UBool;
type UChar (line 371) | typedef char16_t UChar;
type UCHAR_TYPE (line 373) | typedef UCHAR_TYPE UChar;
type UChar (line 375) | typedef char16_t UChar;
type UChar (line 377) | typedef uint16_t UChar;
type wchar_t (line 400) | typedef wchar_t OldUChar;
type __CHAR16_TYPE__ (line 402) | typedef __CHAR16_TYPE__ OldUChar;
type OldUChar (line 404) | typedef uint16_t OldUChar;
type UChar32 (line 424) | typedef int32_t UChar32;
FILE: LandingPage/mdx-components.tsx
type MDXComponents (line 3) | type MDXComponents = Record<
function useMDXComponents (line 8) | function useMDXComponents(components: MDXComponents): MDXComponents {
FILE: LandingPage/src/app/docs/documents/[...slug]/page.tsx
type PageProps (line 10) | interface PageProps {
function generateStaticParams (line 16) | async function generateStaticParams() {
function generateMetadata (line 20) | async function generateMetadata({
function DocPage (line 49) | async function DocPage({ params }: PageProps) {
FILE: LandingPage/src/app/docs/layout.tsx
function DocsRootLayout (line 21) | function DocsRootLayout({
FILE: LandingPage/src/app/docs/page.tsx
function DocsHomePage (line 14) | function DocsHomePage() {
FILE: LandingPage/src/app/layout.tsx
function RootLayout (line 80) | function RootLayout({
FILE: LandingPage/src/app/page.tsx
function LandingPage (line 11) | function LandingPage() {
FILE: LandingPage/src/app/template.tsx
function Template (line 5) | function Template({ children }: { children: React.ReactNode }) {
FILE: LandingPage/src/components/animations/FadeIn.tsx
type FadeInProps (line 6) | interface FadeInProps {
function FadeIn (line 16) | function FadeIn({
FILE: LandingPage/src/components/animations/StaggerContainer.tsx
type StaggerContainerProps (line 6) | interface StaggerContainerProps {
function StaggerContainer (line 14) | function StaggerContainer({
FILE: LandingPage/src/components/docs/MobileNav.tsx
type MobileNavProps (line 8) | interface MobileNavProps {
function MobileNav (line 12) | function MobileNav({ items }: MobileNavProps) {
FILE: LandingPage/src/components/docs/Sidebar.tsx
type SidebarProps (line 7) | interface SidebarProps {
function Sidebar (line 11) | function Sidebar({ items }: SidebarProps) {
FILE: LandingPage/src/components/sections/FAQSection.tsx
function FAQItem (line 8) | function FAQItem({
function FAQSection (line 64) | function FAQSection() {
FILE: LandingPage/src/components/sections/FeaturesSection.tsx
function RotatingText (line 16) | function RotatingText() {
function GlassIcon (line 47) | function GlassIcon({
function FeatureCard (line 73) | function FeatureCard({
function FeaturesSection (line 108) | function FeaturesSection() {
FILE: LandingPage/src/components/sections/Footer.tsx
function Footer (line 4) | function Footer() {
FILE: LandingPage/src/components/sections/HeroSection.tsx
function HeroSection (line 4) | function HeroSection() {
FILE: LandingPage/src/components/sections/Navigation.tsx
function Navigation (line 7) | function Navigation() {
FILE: LandingPage/src/components/sections/TeamSection.tsx
function TeamCard (line 6) | function TeamCard({
function TeamSection (line 63) | function TeamSection() {
FILE: LandingPage/src/components/sections/TestimonialsSection.tsx
function StarRating (line 4) | function StarRating() {
function Testimonial (line 17) | function Testimonial({
function TestimonialsSection (line 40) | function TestimonialsSection() {
FILE: Resources/DevKit/scripts/apple-resign-scan.py
function scan_binaries (line 8) | def scan_binaries(app_path: str) -> list[str]:
FILE: Resources/DevKit/scripts/find_inconsistent_keys.py
function find_inconsistent_keys (line 11) | def find_inconsistent_keys(xcstrings_path):
function main (line 46) | def main():
FILE: Resources/DevKit/scripts/fix_inconsistent_keys.py
function fix_inconsistent_keys (line 12) | def fix_inconsistent_keys(xcstrings_path, dry_run=False):
function main (line 70) | def main():
FILE: Resources/DevKit/scripts/i18n_tools.py
function default_file_path (line 18) | def default_file_path() -> str:
function load_strings (line 33) | def load_strings(file_path: str) -> Dict[str, Any]:
function save_strings (line 46) | def save_strings(file_path: str, data: Dict[str, Any]) -> None:
function should_translate (line 58) | def should_translate(entry: Dict[str, Any]) -> bool:
function merge_new_strings (line 63) | def merge_new_strings(strings: Dict[str, Any], new_strings: Dict[str, Di...
function collect_languages (line 102) | def collect_languages(strings: Dict[str, Any]) -> set:
function update_missing_translations (line 111) | def update_missing_translations(
function apply_translation_map (line 185) | def apply_translation_map(
function find_untranslated (line 217) | def find_untranslated(
function prune_stale_strings (line 251) | def prune_stale_strings(data: Dict[str, Any]) -> List[str]:
function find_incomplete_translations (line 262) | def find_incomplete_translations(
function print_update_summary (line 295) | def print_update_summary(file_path: str, counts: Dict[str, int]) -> None:
function print_apply_summary (line 302) | def print_apply_summary(applied: int, file_path: str, target_language: s...
FILE: Resources/DevKit/scripts/select_newest_xcode.py
function log (line 13) | def log(message: str) -> None:
function version_key (line 17) | def version_key(value: str) -> tuple:
function discover_xcodes (line 24) | def discover_xcodes() -> list[Path]:
function read_metadata (line 42) | def read_metadata(bundle: Path):
function select_newest (line 69) | def select_newest(candidates):
function main (line 75) | def main() -> int:
Copy disabled (too large)
Download .json
Condensed preview — 1245 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (62,049K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yml",
"chars": 2727,
"preview": "name: \"🐛 Bug Report\"\ndescription: \"Report crashes, regressions, or incorrect behavior in FlowDown\"\ntitle: \"[Bug] Short s"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 196,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Q&A / Discussions\n url: https://github.com/Lakr233/FlowDown/disc"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 2017,
"preview": "name: \"✨ Feature Request\"\ndescription: \"Propose new capabilities, UX improvements, or model-related needs\"\ntitle: \"[Feat"
},
{
"path": ".github/ISSUE_TEMPLATE/improvement.yml",
"chars": 1271,
"preview": "name: \"🔧 Improvement / Chore\"\ndescription: \"Track minor fixes, refactors, docs, or performance improvements\"\ntitle: \"[Im"
},
{
"path": ".github/workflows/ci.yml",
"chars": 3131,
"preview": "name: Build\n\non:\n pull_request:\n paths:\n - \"FlowDown/**\"\n - \"Frameworks/**\"\n - \"FlowDownUnitTests/**\""
},
{
"path": ".github/workflows/housekeeping.yml",
"chars": 7040,
"preview": "name: Housekeeping\n\non:\n schedule:\n - cron: \"0 8 * * *\" # daily at 8:00 UTC\n workflow_dispatch:\n\npermissions:\n con"
},
{
"path": ".github/workflows/release-notarize.yml",
"chars": 4264,
"preview": "name: Notarize Release\n\non:\n push:\n tags:\n - \"*.*.*\"\n\npermissions:\n contents: write\n\njobs:\n notarize:\n nam"
},
{
"path": ".github/workflows/test.yml",
"chars": 4593,
"preview": "name: Test\n\n# This workflow runs unit tests on pull requests, and online E2E tests\n# when the FLOWDOWN_ONLINE_E2E_TOKEN "
},
{
"path": ".gitignore",
"chars": 6266,
"preview": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n"
},
{
"path": ".gitmodules",
"chars": 263,
"preview": "[submodule \"Frameworks/ChatClientKit\"]\n\tpath = Frameworks/ChatClientKit\n\turl = https://github.com/Lakr233/ChatClientKit."
},
{
"path": ".swift-format-list",
"chars": 296,
"preview": "# Include-only list for SwiftFormat.\n# One path per line, relative to repo root. Blank lines and comments are ignored.\n\n"
},
{
"path": "AGENTS.md",
"chars": 14296,
"preview": "# FlowDown Agent Guide\n\nThis file provides guidance to AI coding agents working inside this repository.\n\n## Overview\n\nFl"
},
{
"path": "Examples/ModelExchange/Assets.xcassets/AccentColor.colorset/Contents.json",
"chars": 123,
"preview": "{\n \"colors\" : [\n {\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }"
},
{
"path": "Examples/ModelExchange/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1429,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"platform\" : \"ios\",\n \"size\" : \"1024x1024\"\n },\n {\n "
},
{
"path": "Examples/ModelExchange/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Examples/ModelExchange/Info.plist",
"chars": 1750,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Examples/ModelExchange/main.swift",
"chars": 9410,
"preview": "//\n// main.swift\n// ModelExchange\n//\n// Created by qaq on 8/12/2025.\n//\n\nimport FlowDownModelExchange\nimport SwiftUI\n"
},
{
"path": "Examples/ModelExchange.xcodeproj/project.pbxproj",
"chars": 15110,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 77;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Examples/ModelExchange.xcodeproj/xcshareddata/xcschemes/ModelExchange.xcscheme",
"chars": 2935,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"2640\"\n version = \"1.7\">\n <BuildAction\n "
},
{
"path": "FlowDown/Application/AppDelegate+Menu.swift",
"chars": 12351,
"preview": "//\n// AppDelegate+Menu.swift\n// FlowDown\n//\n// Created by Alan Ye on 6/27/25.\n//\n\nimport AlertController\nimport Order"
},
{
"path": "FlowDown/Application/AppDelegate.swift",
"chars": 6969,
"preview": "//\n// AppDelegate.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2024/12/31.\n//\n\nimport AlertController\nimport ChatClientK"
},
{
"path": "FlowDown/Application/AppEnvironment.swift",
"chars": 2921,
"preview": "//\n// AppEnvironment.swift\n// FlowDown\n//\n// Created by OpenAI Code Assistant on 2/17/25.\n//\n\nimport Foundation\nimpor"
},
{
"path": "FlowDown/Application/RecoveryMode.swift",
"chars": 5392,
"preview": "//\n// RecoveryMode.swift\n// FlowDown\n//\n// Created by qaq on 9/12/2025.\n//\n\nimport Foundation\nimport SwiftUI\nimport U"
},
{
"path": "FlowDown/Application/SceneDelegate.swift",
"chars": 7880,
"preview": "//\n// SceneDelegate.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2024/12/31.\n//\n\nimport Combine\nimport ConfigurableKit\ni"
},
{
"path": "FlowDown/Application/Value+DialTuneMode.swift",
"chars": 2224,
"preview": "//\n// Value+DialTuneMode.swift\n// FlowDown\n//\n// Created by AI on 1/6/26.\n//\n\nimport Combine\nimport ConfigurableKit\ni"
},
{
"path": "FlowDown/Application/Value+EditorBehavior.swift",
"chars": 2749,
"preview": "//\n// Value+EditorBehavior.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/22/25.\n//\n\nimport Combine\nimport ConfigurableK"
},
{
"path": "FlowDown/Application/Value+LiveActivity.swift",
"chars": 1812,
"preview": "//\n// Value+LiveActivity.swift\n// FlowDown\n//\n// Created by AI on 1/6/26.\n//\n\nimport Combine\nimport ConfigurableKit\ni"
},
{
"path": "FlowDown/Application/Value+MLX.swift",
"chars": 3435,
"preview": "//\n// Value+MLX.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/31/25.\n//\n\nimport Combine\nimport ConfigurableKit\nimport F"
},
{
"path": "FlowDown/Application/Value+MarkdownTheme.swift",
"chars": 1859,
"preview": "//\n// Value+MarkdownTheme.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/26/25.\n//\n\nimport Combine\nimport ConfigurableKi"
},
{
"path": "FlowDown/Application/Value+Memory.swift",
"chars": 3876,
"preview": "//\n// Value+Memory.swift\n// FlowDown\n//\n// Created by GPT-5 Codex on 11/6/25.\n//\n\nimport ConfigurableKit\nimport Found"
},
{
"path": "FlowDown/Application/Value+ScrubberConfiguration.swift",
"chars": 4584,
"preview": "//\n// Value+ScrubberConfiguration.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/22/25.\n//\n\nimport Combine\nimport Config"
},
{
"path": "FlowDown/Application/Value+UserInterfaceStyle.swift",
"chars": 3740,
"preview": "//\n// Value+UserInterfaceStyle.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/26/25.\n//\n\nimport Combine\nimport Configura"
},
{
"path": "FlowDown/Backend/Audio/SoundEffectPlayer.swift",
"chars": 4904,
"preview": "//\n// SoundEffectPlayer.swift\n// FlowDown\n//\n// Created by AI on 1/6/26.\n//\n\nimport AVFoundation\nimport ConfigurableK"
},
{
"path": "FlowDown/Backend/ChatTemplate/ChatTemplate.swift",
"chars": 599,
"preview": "//\n// ChatTemplate.swift\n// FlowDown\n//\n// Created by 秋星桥 on 6/28/25.\n//\n\nimport Foundation\nimport UIKit\n\nstruct Chat"
},
{
"path": "FlowDown/Backend/ChatTemplate/ChatTemplateManager.swift",
"chars": 18706,
"preview": "//\n// ChatTemplateManager.swift\n// FlowDown\n//\n// Created by 秋星桥 on 6/28/25.\n//\n\nimport ChatClientKit\nimport Combine\n"
},
{
"path": "FlowDown/Backend/Conversation/ConversationManager+CRUD.swift",
"chars": 6548,
"preview": "//\n// ConversationManager+CRUD.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/31/25.\n//\n\nimport Combine\nimport Foundatio"
},
{
"path": "FlowDown/Backend/Conversation/ConversationManager+Compress.swift",
"chars": 6010,
"preview": "//\n// ConversationManager+Compress.swift\n// FlowDown\n//\n// Created by 秋星桥 on 6/30/25.\n//\n\nimport ChatClientKit\nimport"
},
{
"path": "FlowDown/Backend/Conversation/ConversationManager+EditorObject.swift",
"chars": 2088,
"preview": "//\n// ConversationManager+EditorObject.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/31/25.\n//\n\nimport AlertController\n"
},
{
"path": "FlowDown/Backend/Conversation/ConversationManager+Export.swift",
"chars": 3707,
"preview": "//\n// ConversationManager+Export.swift\n// FlowDown\n//\n// Created by 秋星桥 on 6/30/25.\n//\n\nimport Foundation\nimport Stor"
},
{
"path": "FlowDown/Backend/Conversation/ConversationManager+Menu.swift",
"chars": 23891,
"preview": "//\n// ConversationManager+Menu.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/5/25.\n//\n\nimport AlertController\nimport Fo"
},
{
"path": "FlowDown/Backend/Conversation/ConversationManager+Search.swift",
"chars": 2617,
"preview": "//\n// ConversationManager+Search.swift\n// FlowDown\n//\n// Created by Alan Ye on 7/8/25.\n//\n\nimport Foundation\nimport S"
},
{
"path": "FlowDown/Backend/Conversation/ConversationManager.swift",
"chars": 2520,
"preview": "//\n// ConversationManager.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/31/25.\n//\n\nimport Combine\nimport ConfigurableKi"
},
{
"path": "FlowDown/Backend/Conversation/ConversationSummarizer.swift",
"chars": 7440,
"preview": "//\n// ConversationSummarizer.swift\n// FlowDown\n//\n// Created by Alan Ye on 3/23/26.\n//\n\nimport ChatClientKit\nimport F"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/ConversationSession+PreprocessAttachments.swift",
"chars": 2419,
"preview": "//\n// ConversationSession+PreprocessAttachments.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatCli"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/ConversationSession.swift",
"chars": 13583,
"preview": "//\n// Created by ktiays on 2025/2/12.\n// Copyright (c) 2025 ktiays. All rights reserved.\n//\n\nimport Combine\nimport Fou"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/ConversationSessionManager.swift",
"chars": 6556,
"preview": "//\n// ConversationSessionManager.swift\n// FlowDown\n//\n// Created by ktiays on 2025/2/12.\n//\n\nimport ChatClientKit\nimp"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSession+BuildMessages.swift",
"chars": 11341,
"preview": "//\n// ConversationSession+BuildMessages.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\ni"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSession+Cancel.swift",
"chars": 1271,
"preview": "//\n// ConversationSession+Cancel.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2025/3/25.\n//\n\nimport Combine\nimport Found"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSession+Execute.swift",
"chars": 11145,
"preview": "//\n// ConversationSession+Execute.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/25/25.\n//\n\nimport AlertController\nimpor"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSession+ExecuteOnce.swift",
"chars": 17088,
"preview": "//\n// ConversationSession+ExecuteOnce.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\nimp"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSession+FixReference.swift",
"chars": 3528,
"preview": "//\n// ConversationSession+FixReference.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\nim"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSession+SystemPrompt.swift",
"chars": 1675,
"preview": "//\n// ConversationSession+SystemPrompt.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\nim"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSession+Trim.swift",
"chars": 6935,
"preview": "//\n// ConversationSession+Trim.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\nimport Fou"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/Execute/ConversationSystemPromptBuilder.swift",
"chars": 5133,
"preview": "//\n// ConversationSystemPromptBuilder.swift\n// FlowDown\n//\n// Created by GPT-5 Codex on 4/12/26.\n//\n\nimport ChatClien"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/PostAction/ConversationSession+Icon.swift",
"chars": 4194,
"preview": "//\n// ConversationSession+Icon.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/18/25.\n//\n\nimport ChatClientKit\nimport Fou"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/PostAction/ConversationSession+Metadata.swift",
"chars": 6470,
"preview": "//\n// ConversationSession+Metadata.swift\n// FlowDown\n//\n// Created by Codex on 4/12/26.\n//\n\nimport ChatClientKit\nimpo"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/PostAction/ConversationSession+Rename.swift",
"chars": 801,
"preview": "//\n// ConversationSession+Rename.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\nimport F"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/PostAction/ConversationSession+Title.swift",
"chars": 4219,
"preview": "//\n// ConversationSession+Title.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/18/25.\n//\n\nimport ChatClientKit\nimport Fo"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/PostAction/ModelResponseSanitizer.swift",
"chars": 1083,
"preview": "import Foundation\n\nenum ModelResponseSanitizer {\n private static let reasoningPatterns: [NSRegularExpression] = {\n "
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/PreAction/ConversationSession+Images.swift",
"chars": 7316,
"preview": "//\n// ConversationSession+Images.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/20/25.\n//\n\nimport ChatClientKit\nimport C"
},
{
"path": "FlowDown/Backend/Conversation/Pipeline/PreAction/ConversationSession+WebSearch.swift",
"chars": 23241,
"preview": "//\n// ConversationSession+WebSearch.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\nimpor"
},
{
"path": "FlowDown/Backend/Conversation/RewriteAction.swift",
"chars": 4928,
"preview": "//\n// RewriteAction.swift\n// FlowDown\n//\n// Created by 秋星桥 on 6/30/25.\n//\n\nimport AlertController\nimport ChatClientKi"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationManifest+Case.Content.swift",
"chars": 2314,
"preview": "//\n// EvaluationManifest+Case.Content.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\n"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationManifest+Case.Result.swift",
"chars": 948,
"preview": "//\n// EvaluationManifest+Case.Result.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport Foundation\n\next"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationManifest+Case.Verifier.swift",
"chars": 10864,
"preview": "//\n// EvaluationManifest+Case.Verifier.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationManifest+Case.swift",
"chars": 1635,
"preview": "//\n// EvaluationManifest+Case.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport Foundation\n\nextension "
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationManifest+Suite.swift",
"chars": 1342,
"preview": "//\n// EvaluationManifest+Suite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport Foundation\n\nextension"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationManifest.swift",
"chars": 1912,
"preview": "//\n// EvaluationManifest.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport Foundation\n\nclass Evaluatio"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationOptions.swift",
"chars": 1328,
"preview": "//\n// EvaluationOptions.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport Foundation\n\nclass Evaluation"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationSession.swift",
"chars": 14357,
"preview": "//\n// EvaluationSession.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Foundat"
},
{
"path": "FlowDown/Backend/Evaluation/EvaluationSessionManager.swift",
"chars": 5660,
"preview": "//\n// EvaluationSessionManager.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport Foundation\nimport OSL"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/InstructionFollowingSuite.swift",
"chars": 7249,
"preview": "//\n// InstructionFollowingSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/ProgrammingCSuite.swift",
"chars": 7918,
"preview": "//\n// ProgrammingCSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Foundat"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/ProgrammingGoSuite.swift",
"chars": 7397,
"preview": "//\n// ProgrammingGoSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Founda"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/ProgrammingPythonSuite.swift",
"chars": 7696,
"preview": "//\n// ProgrammingPythonSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Fo"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/ProgrammingRustSuite.swift",
"chars": 7245,
"preview": "//\n// ProgrammingRustSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Foun"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/ProgrammingSwiftSuite.swift",
"chars": 7601,
"preview": "//\n// ProgrammingSwiftSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Fou"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/ProgrammingWebSuite.swift",
"chars": 7526,
"preview": "//\n// ProgrammingWebSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Found"
},
{
"path": "FlowDown/Backend/Evaluation/Manifests/ToolCallingSuite.swift",
"chars": 16816,
"preview": "//\n// ToolCallingSuite.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\nimport Foundati"
},
{
"path": "FlowDown/Backend/LiveActivity/LiveActivityService.swift",
"chars": 4622,
"preview": "//\n// LiveActivityService.swift\n// FlowDown\n//\n// Created by AI on 1/6/26.\n//\n\nimport Foundation\n\n#if canImport(Activ"
},
{
"path": "FlowDown/Backend/LiveActivity/WidgetsAttributes.swift",
"chars": 555,
"preview": "//\n// WidgetsAttributes.swift\n// FlowDown\n//\n// Created by qaq on 7/1/2026.\n//\n\n#if canImport(ActivityKit) && os(iOS)"
},
{
"path": "FlowDown/Backend/MCPService/MCPConnection.swift",
"chars": 2759,
"preview": "//\n// MCPConnection.swift\n// FlowDown\n//\n// Created by Alan Ye on 7/10/25.\n//\n\nimport Combine\nimport Foundation\nimpor"
},
{
"path": "FlowDown/Backend/MCPService/MCPError.swift",
"chars": 1347,
"preview": "//\n// MCPError.swift\n// FlowDown\n//\n// Created by Alan Ye on 7/10/25.\n//\n\nimport Foundation\n\nenum MCPError: Swift.Err"
},
{
"path": "FlowDown/Backend/MCPService/MCPService+Tools.swift",
"chars": 1508,
"preview": "//\n// MCPService+Tools.swift\n// FlowDown\n//\n// Created by Alan Ye on 7/10/25.\n//\n\nimport AlertController\nimport ChatC"
},
{
"path": "FlowDown/Backend/MCPService/MCPService.swift",
"chars": 10074,
"preview": "//\n// MCPService.swift\n// FlowDown\n//\n// Created by LiBr on 6/29/25.\n//\n\nimport Combine\nimport Foundation\nimport MCP\n"
},
{
"path": "FlowDown/Backend/MCPService/MCPServiceActor.swift",
"chars": 431,
"preview": "// MCPServiceActor.swift\n// FlowDown\n//\n// Created by Copilot on 2024/7/11.\n//\n\nimport Foundation\n\nactor MCPServiceAc"
},
{
"path": "FlowDown/Backend/MCPService/MCPTool.swift",
"chars": 12202,
"preview": "//\n// MCPTool.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/10/25.\n//\n\nimport AlertController\nimport ChatClientKit\nimpo"
},
{
"path": "FlowDown/Backend/MCPService/MCPToolInfo.swift",
"chars": 944,
"preview": "//\n// MCPToolInfo.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/10/25.\n//\n\nimport Foundation\nimport MCP\nimport Storage\n"
},
{
"path": "FlowDown/Backend/MCPService/MCPTransportManager.swift",
"chars": 961,
"preview": "//\n// MCPTransportManager.swift\n// FlowDown\n//\n// Created by Alan Ye on 7/10/25.\n//\n\nimport Foundation\nimport MCP\nimp"
},
{
"path": "FlowDown/Backend/MCPService/ModelContextServer+DisplayName.swift",
"chars": 581,
"preview": "import Foundation\nimport Storage\n\nextension ModelContextServer {\n var displayName: String {\n if !name.isEmpty "
},
{
"path": "FlowDown/Backend/Model/BalancedEmitter.swift",
"chars": 2632,
"preview": "//\n// BalancedEmitter.swift\n// FlowDown\n//\n// Created by qaq on 9/12/2025.\n//\n\nimport Foundation\n\nactor BalancedEmitt"
},
{
"path": "FlowDown/Backend/Model/CloudModelResponseFormat+Display.swift",
"chars": 2504,
"preview": "//\n// CloudModelResponseFormat+Display.swift\n// FlowDown\n//\n// Created by GPT-5 Codex on 2025/12/06.\n//\n\nimport Found"
},
{
"path": "FlowDown/Backend/Model/ModelExchangeCoordinator.swift",
"chars": 6898,
"preview": "import AlertController\nimport FlowDownModelExchange\nimport Storage\nimport UIKit\n\nfinal class ModelExchangeCoordinator {\n"
},
{
"path": "FlowDown/Backend/Model/ModelManager+AAPL.swift",
"chars": 2370,
"preview": "//\n// ModelManager+AAPL.swift\n// FlowDown\n//\n// Created by Alan Ye on 6/30/25.\n// Updated by GPT-5 Codex on 11/11/25"
},
{
"path": "FlowDown/Backend/Model/ModelManager+Cloud.swift",
"chars": 7956,
"preview": "//\n// ModelManager+Cloud.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/28/25.\n//\n\nimport CommonCrypto\nimport Foundation"
},
{
"path": "FlowDown/Backend/Model/ModelManager+Hub.swift",
"chars": 13321,
"preview": "//\n// ModelManager+Hub.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/27/25.\n//\n\nimport Combine\nimport CryptoKit\nimport "
},
{
"path": "FlowDown/Backend/Model/ModelManager+Inference.swift",
"chars": 20578,
"preview": "//\n// ModelManager+Inference.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/29/25.\n//\n\nimport ChatClientKit\nimport Found"
},
{
"path": "FlowDown/Backend/Model/ModelManager+Local.swift",
"chars": 11379,
"preview": "//\n// ModelManager+Local.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/27/25.\n//\n\nimport Combine\nimport CryptoKit\nimpor"
},
{
"path": "FlowDown/Backend/Model/ModelManager+Menu.swift",
"chars": 10651,
"preview": "//\n// ModelManager+Menu.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/3/25.\n//\n\nimport AlertController\nimport ChatClien"
},
{
"path": "FlowDown/Backend/Model/ModelManager+Parms.swift",
"chars": 16318,
"preview": "//\n// ModelManager+Parms.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/2/25.\n//\n\nimport AlertController\nimport Configur"
},
{
"path": "FlowDown/Backend/Model/ModelManager.swift",
"chars": 15796,
"preview": "//\n// ModelManager.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/27/25.\n//\n\nimport AlertController\nimport ChatClientKit"
},
{
"path": "FlowDown/Backend/Model/PollinationsService.swift",
"chars": 2373,
"preview": "//\n// PollinationsService.swift\n// FlowDown\n//\n// Created by AI Assistant on 11/4/25.\n//\n\nimport Foundation\nimport St"
},
{
"path": "FlowDown/Backend/ModelTools/AttachmentDataParser.swift",
"chars": 2151,
"preview": "//\n// AttachmentDataParser.swift\n// FlowDown\n//\n// Created by GPT-5 Codex on 2025/12/06.\n//\n\nimport Foundation\n\nenum "
},
{
"path": "FlowDown/Backend/ModelTools/CalendarTools/AddCalendarTool.swift",
"chars": 12393,
"preview": "//\n// AddCalendarTool.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/27/25.\n//\n\nimport AlertController\nimport ChatClient"
},
{
"path": "FlowDown/Backend/ModelTools/CalendarTools/QueryCalendarTool.swift",
"chars": 16495,
"preview": "//\n// QueryCalendarTool.swift\n// FlowDown\n//\n// Created on 2/28/25.\n//\n\nimport AlertController\nimport ChatClientKit\ni"
},
{
"path": "FlowDown/Backend/ModelTools/LocationTools/LocationTool.swift",
"chars": 11611,
"preview": "//\n// LocationTool.swift\n// FlowDown\n//\n// Created on 2/28/25.\n//\n\nimport AlertController\nimport ChatClientKit\nimport"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MTDeleteMemoryTool.swift",
"chars": 2511,
"preview": "//\n// MTDeleteMemoryTool.swift\n// FlowDown\n//\n// Created by Alan Ye on 8/14/25.\n//\n\nimport ChatClientKit\nimport Confi"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MTListMemoriesTool.swift",
"chars": 2080,
"preview": "//\n// MTListMemoriesTool.swift\n// FlowDown\n//\n// Created by Alan Ye on 8/14/25.\n//\n\nimport ChatClientKit\nimport Confi"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MTRecallMemoryTool.swift",
"chars": 1534,
"preview": "//\n// MTRecallMemoryTool.swift\n// FlowDown\n//\n// Created by Alan Ye on 8/14/25.\n//\n\nimport ChatClientKit\nimport Confi"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MTStoreMemoryTool.swift",
"chars": 2677,
"preview": "//\n// MTStoreMemoryTool.swift\n// FlowDown\n//\n// Created by Alan Ye on 8/14/25.\n//\n\nimport ChatClientKit\nimport Config"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MTUpdateMemoryTool.swift",
"chars": 2747,
"preview": "//\n// MTUpdateMemoryTool.swift\n// FlowDown\n//\n// Created by Alan Ye on 8/14/25.\n//\n\nimport ChatClientKit\nimport Confi"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MemoryExtractor.swift",
"chars": 6633,
"preview": "//\n// MemoryExtractor.swift\n// FlowDown\n//\n// Created by Alan Ye on 3/23/26.\n//\n\nimport ChatClientKit\nimport Foundati"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MemoryStore+Prompt.swift",
"chars": 1690,
"preview": "//\n// MemoryStore+Prompt.swift\n// FlowDown\n//\n// Created by qaq on 7/11/2025.\n//\n\nimport Foundation\n\nnonisolated exte"
},
{
"path": "FlowDown/Backend/ModelTools/MemoryTools/MemoryStore.swift",
"chars": 14468,
"preview": "//\n// MemoryStore.swift\n// FlowDown\n//\n// Created by Alan Ye on 8/14/25.\n//\n\nimport Combine\nimport Foundation\nimport "
},
{
"path": "FlowDown/Backend/ModelTools/ModelTools.swift",
"chars": 1325,
"preview": "//\n// ModelTools.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/27/25.\n//\n\nimport ChatClientKit\nimport ConfigurableKit\ni"
},
{
"path": "FlowDown/Backend/ModelTools/ModelToolsManager.swift",
"chars": 14077,
"preview": "//\n// ModelToolsManager.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/27/25.\n//\n\nimport AlertController\nimport AVFounda"
},
{
"path": "FlowDown/Backend/ModelTools/Supplement/MTWebSearchTool.swift",
"chars": 4194,
"preview": "//\n// MTWebSearchTool.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport ChatClientKit\nimport Configurable"
},
{
"path": "FlowDown/Backend/ModelTools/URLTools/URLTool.swift",
"chars": 6371,
"preview": "//\n// URLTool.swift\n// FlowDown\n//\n// Created on 2025/3/1.\n//\n\nimport AlertController\nimport ChatClientKit\nimport Con"
},
{
"path": "FlowDown/Backend/ModelTools/WebTools/WebScraperTool.swift",
"chars": 3497,
"preview": "//\n// WebScraperTool.swift\n// FlowDown\n//\n// Created on 2/28/25.\n//\n\nimport ChatClientKit\nimport ConfigurableKit\nimpo"
},
{
"path": "FlowDown/Backend/Shortcuts/InferenceIntentHandler.swift",
"chars": 19328,
"preview": "//\n// InferenceIntentHandler.swift\n// FlowDown\n//\n// Created by qaq on 4/11/2025.\n//\n\nimport AppIntents\nimport ChatCl"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/ClassifyContentIntent.swift",
"chars": 10464,
"preview": "import AppIntents\nimport Foundation\n\nstruct ClassifyContentIntent: AppIntent {\n static var title: LocalizedStringReso"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/CreateNewConversationIntent.swift",
"chars": 1410,
"preview": "//\n// CreateNewConversationIntent.swift\n// FlowDown\n//\n// Created by qaq on 12/11/2025.\n//\n\nimport AppIntents\nimport "
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/FillConversationMessageIntent.swift",
"chars": 4012,
"preview": "//\n// FillConversationMessageIntent.swift\n// FlowDown\n//\n// Created by qaq on 12/11/2025.\n//\n\nimport AppIntents\nimpor"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/GenerateNewConversationLinkIntent.swift",
"chars": 1417,
"preview": "import AppIntents\nimport Foundation\n\nstruct GenerateNewConversationLinkIntent: AppIntent {\n static var title: Localiz"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/GenerateResponseIntent.swift",
"chars": 4151,
"preview": "import AppIntents\nimport ChatClientKit\nimport Foundation\nimport UIKit\nimport UniformTypeIdentifiers\n\nstruct GenerateResp"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/GetLatestConversationDetailsIntent.swift",
"chars": 972,
"preview": "import AppIntents\nimport Foundation\n\nstruct GetLatestConversationDetailsIntent: AppIntent {\n static var title: Locali"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/ImproveWritingIntent.swift",
"chars": 6213,
"preview": "import AppIntents\nimport Foundation\n\nstruct ImproveWritingMoreProfessionalIntent: AppIntent {\n static var title: Loca"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/OpenAppIntent.swift",
"chars": 721,
"preview": "//\n// OpenAppIntent.swift\n// FlowDown\n//\n// Created by qaq on 8/11/2025.\n//\n\nimport AppIntents\nimport Foundation\n\nstr"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/SearchConversationsIntent.swift",
"chars": 5714,
"preview": "import AppIntents\nimport Foundation\nimport Storage\n\nstruct SearchConversationsIntent: AppIntent {\n static var title: "
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/SetConversationModelIntent.swift",
"chars": 1253,
"preview": "import AppIntents\nimport Foundation\n\nstruct SetConversationModelIntent: AppIntent {\n static var title: LocalizedStrin"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/ShowAndSendConversationIntent.swift",
"chars": 1756,
"preview": "//\n// ShowAndSendConversationIntent.swift\n// FlowDown\n//\n// Created by qaq on 12/11/2025.\n//\n\nimport AppIntents\nimpor"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/ShowConversationIntent.swift",
"chars": 1432,
"preview": "//\n// ShowConversationIntent.swift\n// FlowDown\n//\n// Created by qaq on 12/11/2025.\n//\n\nimport AppIntents\nimport Found"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/SummarizeIntent.swift",
"chars": 3862,
"preview": "import AppIntents\nimport Foundation\n\nstruct SummarizeTextIntent: AppIntent {\n static var title: LocalizedStringResour"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/TranscribeAudioIntent.swift",
"chars": 2808,
"preview": "import AppIntents\nimport Foundation\nimport UniformTypeIdentifiers\n\n@available(iOS 18.0, macCatalyst 18.0, *)\nstruct Tran"
},
{
"path": "FlowDown/Backend/Shortcuts/Intent/TranslateTextIntent.swift",
"chars": 4474,
"preview": "import AppIntents\nimport Foundation\n\nenum TranslationLanguage: String, AppEnum, CaseIterable {\n case arabic = \"العربي"
},
{
"path": "FlowDown/Backend/Shortcuts/ModelShortcutEntities.swift",
"chars": 9179,
"preview": "import AppIntents\nimport ChatClientKit\nimport Foundation\nimport Storage\n\nenum ShortcutsEntities {\n struct Conversatio"
},
{
"path": "FlowDown/Backend/Shortcuts/ShortcutError.swift",
"chars": 1526,
"preview": "//\n// ShortcutError.swift\n// FlowDown\n//\n// Created by qaq on 7/11/2025.\n//\n\nimport AppIntents\nimport Foundation\n\nenu"
},
{
"path": "FlowDown/Backend/Shortcuts/ShortcutUtilities.swift",
"chars": 3234,
"preview": "import AppIntents\nimport Foundation\nimport Storage\nimport UIKit\n\nenum ShortcutUtilitiesError: LocalizedError {\n case "
},
{
"path": "FlowDown/Backend/Shortcuts/Shortcuts.swift",
"chars": 3601,
"preview": "import AppIntents\n\nstruct Shortcuts: AppShortcutsProvider {\n static var shortcutTileColor: ShortcutTileColor {\n "
},
{
"path": "FlowDown/Backend/Storage/SettingsBackup.swift",
"chars": 4691,
"preview": "import ConfigurableKit\nimport Foundation\n\nprivate let settingsBackupDateFormatter: DateFormatter = {\n let formatter ="
},
{
"path": "FlowDown/Backend/Storage/Storage+Export.swift",
"chars": 1546,
"preview": "//\n// Storage+Export.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/5/25.\n//\n\nimport Foundation\nimport Storage\nimport ZI"
},
{
"path": "FlowDown/Backend/Supplement/AnchorVersion.swift",
"chars": 464,
"preview": "// this file is generated by the build script\nimport Foundation\n\nenum AnchorVersion {\n static let version: String = B"
},
{
"path": "FlowDown/Backend/Supplement/AudioTranscoder.swift",
"chars": 19070,
"preview": "@preconcurrency import AVFoundation\nimport CoreMedia\nimport Foundation\nimport UniformTypeIdentifiers\n\nenum AudioTranscod"
},
{
"path": "FlowDown/Backend/Supplement/ChatSelection.swift",
"chars": 3804,
"preview": "//\n// ChatSelection.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2025/10/31.\n//\n\nimport Combine\nimport Foundation\nimport"
},
{
"path": "FlowDown/Backend/Supplement/DisposableExporter.swift",
"chars": 3738,
"preview": "import Foundation\nimport UIKit\n\nfinal class DisposableExporter: NSObject {\n enum RunMode {\n case file\n "
},
{
"path": "FlowDown/Backend/Supplement/KeyboardNavigationDelegate.swift",
"chars": 241,
"preview": "//\n// KeyboardNavigationDelegate.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/9/25.\n//\n\nimport Foundation\n\nprotocol Ke"
},
{
"path": "FlowDown/Backend/UpdateManager/UpdateManager.swift",
"chars": 9344,
"preview": "import AlertController\nimport Combine\nimport DpkgVersion\nimport Foundation\nimport UIKit\n\nprotocol URLSessioning {\n fu"
},
{
"path": "FlowDown/BundledResources/Emoji.json",
"chars": 382112,
"preview": "[\n {\n \"emoji\": \"😀\",\n \"description\": \"grinning face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\"grinni"
},
{
"path": "FlowDown/BundledResources/OpenSourceLicenses.md",
"chars": 535185,
"preview": "# Open Source License\n\n\n\n## swift-transformers\n\n Apache License\n "
},
{
"path": "FlowDown/BundledResources/en.lproj/PrivacyPolicy.md",
"chars": 1710,
"preview": "# Privacy Policy\n\n## Overview\n\nFlowDown respects your privacy and is committed to protecting your personal information. "
},
{
"path": "FlowDown/BundledResources/zh-Hans.lproj/PrivacyPolicy.md",
"chars": 693,
"preview": "# 隐私政策\n\n## 概述\n\n浮望尊重您的隐私,并致力于保护您的个人信息。本隐私政策解释了我们的数据收集和处理做法。\n\n## 与浮望团队相关的隐私政策\n\n- **无数据收集**:浮望开发者不收集、存储或传输任何您的个人信息或使用数据。\n- "
},
{
"path": "FlowDown/Configuration/AppGroup.swift",
"chars": 528,
"preview": "//\n// AppGroup.swift\n// FlowDown\n//\n// Created by qaq on 13/12/2025.\n//\n\nimport Foundation\n\nenum AppGroup {\n stati"
},
{
"path": "FlowDown/Configuration/Base.xcconfig",
"chars": 878,
"preview": "//\n// BaseConfig.xcconfig\n// FlowDown\n//\n// Created by king on 2025/10/9.\n//\n\n//\n// Configuration settings file forma"
},
{
"path": "FlowDown/Configuration/Development.xcconfig",
"chars": 260,
"preview": "//\n// Development.xcconfig\n// FlowDown\n//\n// Created by qaq on 2025/12/11.\n//\n\n#include \"Base.xcconfig\"\n\nCLOUDKIT_CON"
},
{
"path": "FlowDown/Configuration/Release.xcconfig",
"chars": 249,
"preview": "//\n// Release.xcconfig\n// FlowDown\n//\n// Created by qaq on 2025/12/11.\n//\n\n#include \"Base.xcconfig\"\n\nCLOUDKIT_CONTAIN"
},
{
"path": "FlowDown/Configuration/Version.xcconfig",
"chars": 257,
"preview": "//\n// Version.xcconfig\n// FlowDown\n//\n// Created by qaq on 2025/12/11.\n//\n\n//\n// Configuration settings file format d"
},
{
"path": "FlowDown/DerivedSources/DerivedSourcesReadme.swift",
"chars": 190,
"preview": "//\n// DerivedSourcesReadme.swift\n// FlowDown\n//\n// Created by qaq on 22/10/2025.\n//\n\nimport Foundation\n\n/*\n\n Files ar"
},
{
"path": "FlowDown/Extension/Combine.swift",
"chars": 689,
"preview": "//\n// Combine.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2025/1/7.\n//\n\nimport Combine\n\nextension Publisher {\n func "
},
{
"path": "FlowDown/Extension/ConfigurableView.swift",
"chars": 3003,
"preview": "//\n// ConfigurableView.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/28/25.\n//\n\nimport ConfigurableKit\nimport UIKit\n\ncl"
},
{
"path": "FlowDown/Extension/Errors.swift",
"chars": 365,
"preview": "//\n// Errors.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2025/1/9.\n//\n\nimport Foundation\n\nenum Errors {\n static func"
},
{
"path": "FlowDown/Extension/GlassEffect/LegacyGlassBackdropView.swift",
"chars": 3424,
"preview": "//\n// LegacyGlassBackdropView.swift\n// FlowDown\n//\n// Created by Codex on 2026/3/16.\n//\n\nimport UIKit\n\nfinal class Le"
},
{
"path": "FlowDown/Extension/GlassEffect/PrivateBlurEngine.swift",
"chars": 8853,
"preview": "//\n// PrivateBlurEngine.swift\n// FlowDown\n//\n// Created by Codex on 2026/3/16.\n//\n\nimport UIKit\n\nenum PrivateBlurEngi"
},
{
"path": "FlowDown/Extension/Indicator.swift",
"chars": 5394,
"preview": "//\n// Indicator.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/29/25.\n//\n\nimport AlertController\nimport Foundation\nimpor"
},
{
"path": "FlowDown/Extension/MarkdownParser+MathPlaceholderRepair.swift",
"chars": 4202,
"preview": "//\n// MarkdownParser+MathPlaceholderRepair.swift\n// FlowDown\n//\n// Created by Codex on 2026/2/22.\n//\n\nimport Markdown"
},
{
"path": "FlowDown/Extension/NSAttributedString+Search.swift",
"chars": 1160,
"preview": "//\n// NSAttributedString+Search.swift\n// FlowDown\n//\n// Created by Alan Ye on 7/8/25.\n//\n\nimport UIKit\n\nextension NSA"
},
{
"path": "FlowDown/Extension/NSNumber.swift",
"chars": 280,
"preview": "//\n// NSNumber.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/10/25.\n//\n\nimport Foundation\n\nextension NSNumber {\n var"
},
{
"path": "FlowDown/Extension/SequentialOperator.swift",
"chars": 392,
"preview": "//\n// Created by ktiays on 2025/2/20.\n// Copyright (c) 2025 ktiays. All rights reserved.\n//\n\nimport Foundation\n\npreced"
},
{
"path": "FlowDown/Extension/String.swift",
"chars": 1253,
"preview": "//\n// String.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/2/25.\n//\n\nimport Foundation\nimport UIKit\n\nextension String {"
},
{
"path": "FlowDown/Extension/UIApplication.swift",
"chars": 580,
"preview": "//\n// UIApplication.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/31/25.\n//\n\nimport UIKit\n\nextension UIApplication {\n "
},
{
"path": "FlowDown/Extension/UIBezierPath.swift",
"chars": 9750,
"preview": "//\n// UIBezierPath.swift\n// ContinuousCorners\n//\n// Created by Noah Hilt on 9/26/18.\n// Copyright © 2018 Melted. All"
},
{
"path": "FlowDown/Extension/UIFont.swift",
"chars": 752,
"preview": "//\n// UIFont.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2024/12/31.\n//\n\nimport UIKit\n\nextension UIFont {\n static le"
},
{
"path": "FlowDown/Extension/UIView.swift",
"chars": 3799,
"preview": "//\n// UIView.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2025/1/2.\n//\n\nimport SnapKit\nimport UIKit\n\n// MARK: - Glass Ef"
},
{
"path": "FlowDown/Extension/UIViewController.swift",
"chars": 1631,
"preview": "//\n// UIViewController.swift\n// FlowDown\n//\n// Created by qaq on 8/12/2025.\n//\n\nimport UIKit\n\nextension UIViewControl"
},
{
"path": "FlowDown/Extension/UIViewControllerHolder.swift",
"chars": 182,
"preview": "//\n// UIViewControllerHolder.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/27/25.\n//\n\nimport Foundation\n\nclass UIViewCo"
},
{
"path": "FlowDown/Extension/Withable.swift",
"chars": 843,
"preview": "//\n// Withable.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2024/12/31.\n//\n\nimport Foundation\n\npublic protocol Withable "
},
{
"path": "FlowDown/Interface/ChatView/ChatView+Delegates.swift",
"chars": 15240,
"preview": "//\n// ChatView+Delegates.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/31/25.\n//\n\nimport AlertController\nimport ChatCli"
},
{
"path": "FlowDown/Interface/ChatView/ChatView+HeaderVisualEffect.swift",
"chars": 13100,
"preview": "//\n// ChatView+HeaderVisualEffect.swift\n// FlowDown\n//\n// Created by GitHub Copilot on 2026/3/15.\n//\n\nimport UIKit\n\np"
},
{
"path": "FlowDown/Interface/ChatView/ChatView+Parms.swift",
"chars": 1647,
"preview": "//\n// ChatView+Parms.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/2/25.\n//\n\nimport ConfigurableKit\nimport Foundation\n\n"
},
{
"path": "FlowDown/Interface/ChatView/ChatView.swift",
"chars": 21997,
"preview": "//\n// ChatView.swift\n// FlowDown\n//\n// Created by 秋星桥 on 1/20/25.\n//\n\nimport Combine\nimport ConfigurableKit\nimport Gl"
},
{
"path": "FlowDown/Interface/ConversationCaptureView/ConversationCaptureView.swift",
"chars": 8388,
"preview": "//\n// ConversationCaptureView.swift\n// FlowDown\n//\n// Created by 秋星桥 on 3/19/25.\n//\n\nimport GlyphixTextFx\nimport Lite"
},
{
"path": "FlowDown/Interface/ConversationSearchController/ConversationSearchController+Cell.swift",
"chars": 6440,
"preview": "//\n// ConversationSearchController+Cell.swift\n// FlowDown\n//\n// Created by Alan Ye on 7/8/25.\n//\n\nimport Storage\nimpo"
},
{
"path": "FlowDown/Interface/ConversationSearchController/ConversationSearchController.swift",
"chars": 1990,
"preview": "//\n// ConversationSearchController.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/5/25.\n// Implemented by Alan Ye on 7/"
},
{
"path": "FlowDown/Interface/ConversationSearchController/KeyboardNavigationSearchBar.swift",
"chars": 1185,
"preview": "//\n// KeyboardNavigationSearchBar.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/9/25.\n//\n\nimport UIKit\n\nclass KeyboardN"
},
{
"path": "FlowDown/Interface/ConversationSearchController/SearchContentController+HolderViews.swift",
"chars": 3669,
"preview": "//\n// SearchContentController+HolderViews.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/9/25.\n//\n\nimport UIKit\n\nextensi"
},
{
"path": "FlowDown/Interface/ConversationSearchController/SearchContentController+SearchBar.swift",
"chars": 1312,
"preview": "//\n// SearchContentController+SearchBar.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/9/25.\n//\n\nimport UIKit\n\nextension"
},
{
"path": "FlowDown/Interface/ConversationSearchController/SearchContentController+Shortcuts.swift",
"chars": 345,
"preview": "//\n// SearchContentController+Shortcuts.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/9/25.\n//\n\nextension SearchContent"
},
{
"path": "FlowDown/Interface/ConversationSearchController/SearchContentController+TableView.swift",
"chars": 1611,
"preview": "//\n// SearchContentController+TableView.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/9/25.\n//\n\nimport UIKit\n\nextension"
},
{
"path": "FlowDown/Interface/ConversationSearchController/SearchContentController.swift",
"chars": 6758,
"preview": "//\n// SearchContentController.swift\n// FlowDown\n//\n// Created by 秋星桥 on 7/9/25.\n//\n\nimport Combine\nimport UIKit\n\nclas"
},
{
"path": "FlowDown/Interface/ConversationSearchController/SearchResult.swift",
"chars": 660,
"preview": "//\n// SearchResult.swift\n// Storage\n//\n// Created by Alan Ye on 7/8/25.\n//\n\nimport Foundation\nimport Storage\n\nstruct "
},
{
"path": "FlowDown/Interface/ConversationSelectionView/ConversationSelectionView+Cell.swift",
"chars": 4080,
"preview": "//\n// ConversationSelectionView+Cell.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/5/25.\n//\n\nimport AlertController\nimp"
},
{
"path": "FlowDown/Interface/ConversationSelectionView/ConversationSelectionView+Delegate.swift",
"chars": 3897,
"preview": "//\n// ConversationSelectionView+Delegate.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/5/25.\n//\n\nimport Storage\nimport "
},
{
"path": "FlowDown/Interface/ConversationSelectionView/ConversationSelectionView.swift",
"chars": 8289,
"preview": "//\n// ConversationSelectionView.swift\n// FlowDown\n//\n// Created by 秋星桥 on 2/3/25.\n//\n\nimport Combine\nimport Foundatio"
},
{
"path": "FlowDown/Interface/ConversationSelectionView/SectionDateHeaderView.swift",
"chars": 1274,
"preview": "//\n// SectionDateHeaderView.swift\n// FlowDown\n//\n// Created by 秋星桥 on 6/28/25.\n//\n\nimport SnapKit\nimport UIKit\n\nclass"
},
{
"path": "FlowDown/Interface/EmojiPicker/EmojiPicker+Cell.swift",
"chars": 1978,
"preview": "//\n// EmojiPicker+Cell.swift\n// Kimis\n//\n// Created by Lakr Aream on 2022/5/5.\n//\n\nimport UIKit\n\nextension EmojiPicke"
},
{
"path": "FlowDown/Interface/EmojiPicker/EmojiPicker+Data.swift",
"chars": 6335,
"preview": "//\n// EmojiPicker+Data.swift\n// Kimis\n//\n// Created by Lakr Aream on 2022/5/5.\n//\n\nimport UIKit\n\nextension EmojiPicke"
},
{
"path": "FlowDown/Interface/EmojiPicker/EmojiPicker+Provider.swift",
"chars": 1504,
"preview": "//\n// EmojiPicker+Provider.swift\n// Kimis\n//\n// Created by Lakr Aream on 2022/5/20.\n//\n\nimport ConfigurableKit\nimport"
},
{
"path": "FlowDown/Interface/EmojiPicker/EmojiPicker.swift",
"chars": 5487,
"preview": "//\n// EmojiPicker.swift\n// Kimis\n//\n// Created by Lakr Aream on 2022/5/5.\n//\n\nimport AlignedCollectionViewFlowLayout\n"
},
{
"path": "FlowDown/Interface/Evaluation/EvaluationAssistantController/EvaluationAssistantController.swift",
"chars": 16474,
"preview": "//\n// EvaluationAssistantController.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport AlertController\n"
},
{
"path": "FlowDown/Interface/Evaluation/EvaluationCaseDetailController/EvaluationCaseDetailController.swift",
"chars": 18515,
"preview": "//\n// EvaluationCaseDetailController.swift\n// FlowDown\n//\n// Created by qaq on 18/12/2025.\n//\n\nimport ChatClientKit\ni"
},
{
"path": "FlowDown/Interface/Evaluation/EvaluationCaseDetailController/EvaluationMenuFactory.swift",
"chars": 4273,
"preview": "//\n// EvaluationMenuFactory.swift\n// FlowDown\n//\n// Created by qaq on 19/12/2025.\n//\n\nimport UIKit\n\nenum EvaluationMe"
}
]
// ... and 1045 more files (download for full content)
About this extraction
This page contains the full source code of the Lakr233/FlowDown-Beta GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1245 files (252.6 MB), approximately 15.0M tokens, and a symbol index with 2218 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.