Showing preview only (1,438K chars total). Download the full file or copy to clipboard to get everything.
Repository: Lakr233/ActionBee
Branch: main
Commit: b9807306513d
Files: 286
Total size: 1.3 MB
Directory structure:
gitextract_cxsqbwhp/
├── .gitignore
├── .gitmodules
├── .root
├── App/
│ └── Action/
│ ├── Action/
│ │ ├── Action.entitlements
│ │ ├── Application/
│ │ │ ├── Action.entitlements
│ │ │ ├── ActionApp.swift
│ │ │ ├── AppDelegate.swift
│ │ │ ├── AppSetup.swift
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AccentColor.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Avatar.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── License.txt
│ │ │ ├── en.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ └── zh-Hans.lproj/
│ │ │ └── Localizable.strings
│ │ ├── Backend/
│ │ │ ├── Action/
│ │ │ │ ├── ActionManager+Artifact.swift
│ │ │ │ ├── ActionManager+Event.swift
│ │ │ │ ├── ActionManager+History.swift
│ │ │ │ ├── ActionManager+Module.swift
│ │ │ │ ├── ActionManager.swift
│ │ │ │ ├── ActionModuleTemplates/
│ │ │ │ │ ├── ActionManager+Template.swift
│ │ │ │ │ ├── Template+Executable.swift
│ │ │ │ │ ├── Template+Node.swift
│ │ │ │ │ ├── Template+Python.swift
│ │ │ │ │ └── Template+Swift.swift
│ │ │ │ └── ActionTemplates/
│ │ │ │ └── .templates
│ │ │ ├── Config/
│ │ │ │ └── Config.swift
│ │ │ ├── Executor/
│ │ │ │ └── Executor.swift
│ │ │ ├── PasteboardManager/
│ │ │ │ ├── PasteboardManager+Event.swift
│ │ │ │ └── PasteboardManager.swift
│ │ │ └── StatusBarManager/
│ │ │ └── StatusBarManager.swift
│ │ ├── Extension/
│ │ │ ├── AES.swift
│ │ │ ├── Data.swift
│ │ │ ├── DispatchQueue.swift
│ │ │ ├── Notification.swift
│ │ │ ├── Result.swift
│ │ │ ├── Throttle.swift
│ │ │ ├── UserDefault.swift
│ │ │ └── View.swift
│ │ └── Interface/
│ │ ├── ActionModule/
│ │ │ ├── ModuleCreateView.swift
│ │ │ ├── ModuleEditView.swift
│ │ │ ├── ModuleElementView.swift
│ │ │ ├── ModuleImportView.swift
│ │ │ └── ModuleManageView.swift
│ │ ├── Effect/
│ │ │ └── RandomCodeTextView.swift
│ │ ├── Generic/
│ │ │ ├── ApplicationView.swift
│ │ │ ├── DiagnosticLogView.swift
│ │ │ ├── HistoryView.swift
│ │ │ ├── LicenseView.swift
│ │ │ ├── MainView.swift
│ │ │ ├── SettingView.swift
│ │ │ ├── SidebarView.swift
│ │ │ └── WelcomeView.swift
│ │ ├── Menubar/
│ │ │ ├── Menubar.swift
│ │ │ └── MenubarView.swift
│ │ └── Toast/
│ │ └── Toast.swift
│ └── Action.xcodeproj/
│ └── project.pbxproj
├── App.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── External/
│ ├── AuxiliaryExecute/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ ├── Sources/
│ │ │ └── AuxiliaryExecute/
│ │ │ ├── AuxiliaryExecute+Async.swift
│ │ │ ├── AuxiliaryExecute+Shell.swift
│ │ │ ├── AuxiliaryExecute+Spawn.swift
│ │ │ └── AuxiliaryExecute.swift
│ │ └── Tests/
│ │ └── AuxiliaryExecuteTests/
│ │ └── AuxiliaryExecuteTests.swift
│ ├── Colorful/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ └── Sources/
│ │ └── Colorful/
│ │ ├── Colorful.swift
│ │ ├── ColorfulView.swift
│ │ └── PointRandomization.swift
│ ├── KeychainAccess/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── Examples/
│ │ │ └── Example-iOS/
│ │ │ ├── Example-iOS/
│ │ │ │ ├── AccountsViewController.swift
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.xib
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Example-iOS.entitlements
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ └── InputViewController.swift
│ │ │ └── Example-iOS.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── Example-iOS.xcscheme
│ │ ├── KeychainAccess.podspec
│ │ ├── KeychainAccess.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ ├── LICENSE
│ │ ├── Lib/
│ │ │ ├── Certificates/
│ │ │ │ ├── KeychainAccess_Tests.provisionprofile.enc
│ │ │ │ ├── apple.cer
│ │ │ │ ├── developer_id_app.p12.enc
│ │ │ │ ├── iOS_Development.mobileprovision.enc
│ │ │ │ ├── ios_developer.p12.enc
│ │ │ │ └── tvOS_Development.mobileprovision.enc
│ │ │ ├── Configurations/
│ │ │ │ ├── Base.xcconfig
│ │ │ │ ├── Debug.xcconfig
│ │ │ │ ├── KeychainAccess.xcconfig
│ │ │ │ ├── Release.xcconfig
│ │ │ │ ├── TestHost.xcconfig
│ │ │ │ └── Tests.xcconfig
│ │ │ ├── Gemfile
│ │ │ ├── KeychainAccess/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Keychain.swift
│ │ │ │ └── KeychainAccess.h
│ │ │ ├── KeychainAccess.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ ├── KeychainAccess.xcscheme
│ │ │ │ └── TestHost.xcscheme
│ │ │ ├── KeychainAccessTests/
│ │ │ │ ├── EnumTests.swift
│ │ │ │ ├── ErrorTypeTests.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── KeychainAccessTests.swift
│ │ │ │ └── SharedCredentialTests.swift
│ │ │ ├── Rakefile
│ │ │ ├── Scripts/
│ │ │ │ ├── add_key.sh
│ │ │ │ └── decode_cert.sh
│ │ │ ├── TestHost/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestHost.entitlements
│ │ │ └── TestHost-MacCatalyst/
│ │ │ ├── KeychainAccessTests-MacCatalyst/
│ │ │ │ ├── EnumTests.swift
│ │ │ │ ├── ErrorTypeTests.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── KeychainAccessTests.swift
│ │ │ ├── TestHost-MacCatalyst/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SceneDelegate.swift
│ │ │ │ ├── TestHost-MacCatalyst.entitlements
│ │ │ │ └── ViewController.swift
│ │ │ └── TestHost-MacCatalyst.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── TestHost-MacCatalyst.xcscheme
│ │ ├── Package.swift
│ │ ├── Package@swift-5.3.swift
│ │ ├── README.md
│ │ └── Sources/
│ │ └── Keychain.swift
│ └── SymbolPicker/
│ ├── .gitignore
│ ├── LICENSE
│ ├── Package.swift
│ ├── README.md
│ └── Sources/
│ └── SymbolPicker/
│ ├── Resources/
│ │ ├── en.lproj/
│ │ │ └── Localizable.strings
│ │ ├── sfsymbols.txt
│ │ └── zh_CN.lproj/
│ │ └── Localizable.strings
│ └── SymbolPicker.swift
├── LICENSE
├── README.md
└── Resources/
├── ModuleSample/
│ ├── Module Export - Link Cleaner/
│ │ ├── .ActionManifest.plist
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ ├── Definition/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Definition/
│ │ │ │ └── Definition.swift
│ │ │ ├── compile.sh
│ │ │ └── launch.sh
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── Source/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ └── Sources/
│ │ └── Source/
│ │ ├── CleanerRule/
│ │ │ ├── CleanerRule.swift
│ │ │ ├── Rule+BiliBili.swift
│ │ │ └── Rule+Twitter.swift
│ │ └── Source.swift
│ ├── Module Export - Multiline Init Formatter/
│ │ ├── .ActionManifest.plist
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ ├── Definition/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Definition/
│ │ │ │ └── Definition.swift
│ │ │ ├── compile.sh
│ │ │ └── launch.sh
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── Source/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ └── Sources/
│ │ └── Source/
│ │ └── Source.swift
│ ├── Module Export - Quick SFImage/
│ │ ├── .ActionManifest.plist
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ ├── Definition/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Definition/
│ │ │ │ └── Definition.swift
│ │ │ ├── compile.sh
│ │ │ └── launch.sh
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── Source/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ └── Sources/
│ │ └── Source/
│ │ └── Source.swift
│ └── Module Export - Speak Dictionary/
│ ├── .ActionManifest.plist
│ ├── .gitignore
│ ├── .supplement/
│ │ ├── Binary/
│ │ │ └── CommandLineBridge/
│ │ │ ├── CommandLineBridge/
│ │ │ │ └── main.swift
│ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── CommandLineBridge.xcscheme
│ │ ├── Communicator/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Communicator/
│ │ │ ├── Communicator.h
│ │ │ ├── Communicator.m
│ │ │ └── include/
│ │ │ └── Communicator.h
│ │ ├── Definition/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Definition/
│ │ │ └── Definition.swift
│ │ ├── compile.sh
│ │ └── launch.sh
│ ├── App.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── Source/
│ ├── .gitignore
│ ├── Package.swift
│ └── Sources/
│ └── Source/
│ └── Source.swift
├── ModuleTemplate/
│ ├── .templates
│ ├── Executable/
│ │ ├── ActionBeeModule.exec
│ │ └── Put your binary here
│ ├── ExecutableSwift/
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ └── Definition/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Definition/
│ │ │ └── Definition.swift
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ ├── Source/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Source/
│ │ │ └── Source.swift
│ │ └── compile.command
│ ├── SourceNode/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ └── compile.sh
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── global.d.ts
│ │ │ └── index.ts
│ │ └── tsconfig.json
│ ├── SourcePython/
│ │ └── main.py
│ └── SourceSwift/
│ ├── .gitignore
│ ├── .supplement/
│ │ ├── Binary/
│ │ │ └── CommandLineBridge/
│ │ │ ├── CommandLineBridge/
│ │ │ │ └── main.swift
│ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── CommandLineBridge.xcscheme
│ │ ├── Communicator/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Communicator/
│ │ │ ├── Communicator.h
│ │ │ ├── Communicator.m
│ │ │ └── include/
│ │ │ └── Communicator.h
│ │ ├── Definition/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Definition/
│ │ │ └── Definition.swift
│ │ ├── compile.sh
│ │ └── launch.sh
│ ├── App.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── Source/
│ ├── .gitignore
│ ├── Package.swift
│ └── Sources/
│ └── Source/
│ └── Source.swift
└── Scripts/
├── NewlineDeduplicate.swift
├── PackTemplates.sh
├── UpdateGitHub.sh
└── UpdateLicenses.sh
================================================
FILE CONTENTS
================================================
================================================
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*
*.ActionTemplatePackage
================================================
FILE: .gitmodules
================================================
[submodule "External/Colorful"]
path = External/Colorful
url = https://github.com/Lakr233/Colorful
[submodule "External/AuxiliaryExecute"]
path = External/AuxiliaryExecute
url = https://github.com/Lakr233/AuxiliaryExecute
[submodule "External/SymbolPicker"]
path = External/SymbolPicker
url = https://github.com/xnth97/SymbolPicker
[submodule "External/KeychainAccess"]
path = External/KeychainAccess
url = https://github.com/kishikawakatsumi/KeychainAccess
================================================
FILE: .root
================================================
================================================
FILE: App/Action/Action/Action.entitlements
================================================
<?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/>
</plist>
================================================
FILE: App/Action/Action/Application/Action.entitlements
================================================
<?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/>
</plist>
================================================
FILE: App/Action/Action/Application/ActionApp.swift
================================================
//
// ActionApp.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import SwiftUI
@main
struct ActionApp: App {
static let bootTime: Date = .init()
@AppStorage("wiki.qaq.agreeToLicense")
static var agreeToLicense: Bool = false
static let documentDirectory: URL = {
let availableDirectories = FileManager
.default
.urls(for: .documentDirectory, in: .userDomainMask)
#if DEBUG
return availableDirectories[0]
.appendingPathComponent("ActionBee.Debug")
#else
return availableDirectories[0]
.appendingPathComponent("ActionBee")
#endif
}()
init() {
_ = ActionApp.bootTime
applicationSetup()
}
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
MainView()
}
.windowToolbarStyle(.unifiedCompact)
.commands { SidebarCommands() }
.commands { CommandGroup(replacing: CommandGroupPlacement.newItem) {} }
}
}
================================================
FILE: App/Action/Action/Application/AppDelegate.swift
================================================
//
// AppDelegate.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import AppKit
import SwiftUI
class AppDelegate: NSObject, NSApplicationDelegate {
func switchDockIconMode() {
let windowCount = NSApp
.windows
.filter { self.filteringSpecialWindow($0) }
.count
if !StatusBarManager.shared.hasWindowOpened,
windowCount == 0,
!Menubar.shared.popover.isShown
{
NSApp.setActivationPolicy(.accessory)
} else {
NSApp.setActivationPolicy(.regular)
}
}
private func filteringSpecialWindow(_ window: NSWindow) -> Bool {
let list = ["NSStatusBarWindow", "_NSPopoverWindow"]
for item in list {
guard let clz = NSClassFromString(item) else { continue }
if window.isKind(of: clz.self) { return false }
}
return true
}
}
================================================
FILE: App/Action/Action/Application/AppSetup.swift
================================================
//
// ApplicationSetup.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import AppKit
extension ActionApp {
static let appBundleIdentifier: String = Bundle
.main
.bundleIdentifier ?? "wiki.qaq.unknown"
static let appVersion: String =
Bundle
.main
.infoDictionary?["CFBundleShortVersionString"] as? String
?? "unknown"
func applicationSetup() {
assert(Thread.isMainThread)
assert(getuid() != 0)
print(
"""
\(ActionApp.appBundleIdentifier) - \(ActionApp.appVersion)
Location:
[*] \(Bundle.main.bundleURL.path)
[*] \(Self.documentDirectory.path)
Environment: uid \(getuid()) gid \(getgid())
"""
)
disableDebuggerIfNeeded()
_ = AXUIElementCreateSystemWide()
_ = Executor.shared
_ = PasteboardManager.shared
_ = StatusBarManager.shared
let timer = Timer(timeInterval: 0.5, repeats: true) { _ in
appDelegate.switchDockIconMode()
}
RunLoop.current.add(timer, forMode: .common)
#if DEBUG
let debuggerTimer = Timer(timeInterval: 1, repeats: true) { _ in
_ = 0
}
RunLoop.current.add(debuggerTimer, forMode: .common)
#endif
}
private func disableDebuggerIfNeeded() {
#if !DEBUG
do {
typealias ptrace = @convention(c) (_ request: Int, _ pid: Int, _ addr: Int, _ data: Int) -> AnyObject
let open = dlopen("/usr/lib/system/libsystem_kernel.dylib", RTLD_NOW)
if unsafeBitCast(open, to: Int.self) > 0x1024 {
let result = dlsym(open, "ptrace")
if let result = result {
let target = unsafeBitCast(result, to: ptrace.self)
_ = target(0x1F, 0, 0, 0)
}
}
}
#endif
}
}
================================================
FILE: App/Action/Action/Application/Assets.xcassets/AccentColor.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.227",
"green" : "0.533",
"red" : "0.910"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.455",
"green" : "0.659",
"red" : "0.910"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: App/Action/Action/Application/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"filename" : "icon_16x16.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "icon_16x16@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "icon_32x32.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "icon_32x32@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "icon_128x128.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "icon_128x128@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "icon_256x256.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "icon_256x256@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "icon_512x512.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "icon_512x512@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: App/Action/Action/Application/Assets.xcassets/Avatar.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "Avatar.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: App/Action/Action/Application/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: App/Action/Action/Application/License.txt
================================================
MIT License
Copyright (c) 2022 Lakr Aream
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
==========
AuxiliaryExecute
MIT License
Copyright (c) 2021 Lakr Aream
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
==========
Colorful
MIT License
Copyright (c) 2021 Lakr Aream
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
==========
KeychainAccess
The MIT License (MIT)
Copyright (c) 2014 kishikawa katsumi
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
==========
SymbolPicker
MIT License
Copyright (c) 2022 Yubo Qin & Lakr Aream
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
==========
Updated: 2022-08-30
================================================
FILE: App/Action/Action/Application/en.lproj/Localizable.strings
================================================
/*
Localizable.strings
Action
Created by 维安雨轩 on 2022/08/19.
*/
================================================
FILE: App/Action/Action/Application/zh-Hans.lproj/Localizable.strings
================================================
/*
Localizable.strings
Action
Created by 维安雨轩 on 2022/08/19.
*/
//ModuleManageView.swift
"Create an action by click plus button on toolbar to process your pasteboard event. Format text, clean up links, speak when copy from special app, send to your device, etc etc. Choose an language you are familiar with to get start." = "通过点击工具栏上的加号按钮创建一个自动化来处理你的剪贴板事件。\n如格式化文本、清理链接或从设定应用中复制时,发送至你的设备等。\n现在快选择一种你熟悉的语言来开始吧。";
"Add Action" = "添加自动化模块";
"Import Action" = "导入自动化模块";
"Module" = "模块";
"You are about to import an Action Module which is untrusted with no signature. Importing malicious modules can pose unknown risks and there is no sandbox nor container dealing with it." = "你正在导入一个没有签名的不受信任的自动化模块。导入恶意模块可能会带来未知风险,在运行这个模块时并不会通过沙盒或容器来处理它。";
"Trust And Import" = "信任并导入";
"Cancel" = "取消";
"Failed to import this module" = "导入模块失败";
// ModuleImportView.swift
"You are about to import an untrusted module" = "您正在导入一个不受信任的模块";
"Importing malicious module may damage your system, you are in charge to review this module." = "导入恶意模块可能会损坏你的系统,您需要负责审查这个模块。";
"Trust & Import" = "信任并导入";
"OK" = "成功";
// ModuleElementView.swift
"Error" = "出错了";
// ModuleCreateView.swift
"Create Action" = "创建自动化模块";
"Module Name" = "模块名称";
"Language" = "语言";
"Next" = "继续";
// ModuleEditView.swift
"Edit Action" = "编辑自动化模块";
"Save" = "保存";
"Compiling Source" = "正在编译模块...";
"Compile Finished" = "编译完成";
"Broken Module" = "损坏的模块";
"Delete" = "删除";
"Close" = "关闭";
"Enabled" = "启用";
"Name" = "名称";
"Timeout: " = "超时:";
"Enable In App" = "在应用程序中启用";
"Enabled for All Apps" = "为所有应用程序启用";
"This pasteboard action will only run if copying from these apps" = "此自动化只有在从这些应用程序复制时才会运行";
"Coding" = "编辑";
"Edit Code" = "编辑代码";
"Show in Finder" = "在 Finder 中显示";
"Export" = "导出";
"Module Template: %@" = "模板: %@";
"Unknown" = "未知";
"No Build Hint" = "没有构建提示";
"You should recompile, click save, this module each time you edit it" = "在每次编辑该模块时,点击保存将会重新编译。";
"Unable to compile this action: %@" = "无法编译这个自动化模块: %@";
"Are you sure you want to delete this module? This operation can not be undone." = "您确定要删除这个模块吗?\n确定后将无法撤销。";
"Select Application" = "选择应用程序";
"Failed to load this module" = "加载此模块失败";
"Module Export - %@" = "导出模块 - %@";
"Unnamed" = "未命名";
// ContentView.swift
"Toggle Sidebar" = "切换侧边栏";
// SidebarView.swift
"App" = "应用";
"Welcome" = "欢迎";
"Action" = "自动化";
"Module" = "模块";
"History" = "历史";
"Misc" = "其他";
"Setting" = "设置";
"Diagnostic" = "诊断";
// WelcomeView.swift
"Welcome to Action Bee" = "欢迎使用 Action Bee";
"A programmable pasteboard action trigger." = "一个可编程的剪贴板触发器";
// HistoryView.swift
"No History Was Found" = "暂无历史记录";
"Clear History" = "清除历史记录";
"Are you sure you want to delete all history records? This operation can not be undone." = "你确定要删除所有历史记录吗?\n确定后将无法撤销。";
"Pasteboard Event" = "剪贴板事件";
"Length: %lld Action Candidates: %lld" = "剪贴长度: %lld 共执行模块: %lld";
"Deleted Action" = "被删除的动作";
" Post Action: %@" = " 动作: %@";
" Content: %@" = " 内容: %@";
// SettingView.swift
"Pasteboard Deduplicate" = "阻拦重复执行";
"Pasteboard content matches previous will not generate event if on" = "如剪贴板的内容与之前的相匹配,开启后,将不会执行事件。";
"Silent Mode" = "静默模式";
"Do not show popover after action triggered" = "动作触发后不弹出窗口";
"Toast Mode" = "Toast 模式";
"Use toast instead of popover on menubar" = "在屏幕上显示简易提示框而不是弹出式菜单";
"Reduced UI Effects" = "减少 UI 视觉效果";
"Turning off visual effects does not affect app's core functionality" = "关闭视觉效果并不会影响应用程序的核心功能";
"Application" = "应用";
"Get Source Code" = "获取源代码";
"License" = "许可证";
// MenubarView.swift
"ActionBee is ready to accept pasteboard events." = "ActionBee 已准备好处理剪贴板事件。";
// LicenseView.swift
"Software License" = "软件许可证";
"I understand and agree to this license." = "我理解并同意此许可。";
"Done" = "同意";
================================================
FILE: App/Action/Action/Backend/Action/ActionManager+Artifact.swift
================================================
//
// ActionManager+Artifact.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import Foundation
private let artifactPathExtension = "ActionBeeArtifact"
extension ActionManager {
struct ModuleArtifact: Codable {
let id: Action.ID
let signature: String
init?(id: Action.ID, copyingArtifactAt atUrl: URL) {
self.id = id
let targetDir = Self.obtainArtifactUrlForAction(withId: id)
do {
try? FileManager.default.removeItem(at: targetDir)
var isDir = ObjCBool(false)
guard FileManager.default.fileExists(atPath: atUrl.path, isDirectory: &isDir) else {
return nil
}
if isDir.boolValue {
try FileManager.default.copyItem(at: atUrl, to: targetDir)
} else {
try FileManager.default.createDirectory(at: targetDir, withIntermediateDirectories: true)
let name = atUrl.lastPathComponent
let target = targetDir.appendingPathComponent(name)
try FileManager.default.copyItem(at: atUrl, to: target)
}
signature = try Self.generatePackageSignature(at: targetDir)
} catch {
print("[E] \(error.localizedDescription)")
return nil
}
}
static func deletingDotFiles(at atUrl: URL) throws {
let enumerator = FileManager.default.enumerator(atPath: atUrl.path)
while let subPath = enumerator?.nextObject() as? String {
let url = atUrl.appendingPathComponent(subPath)
var shouldClean = false
if subPath == ".DS_Store" { shouldClean = true }
if subPath.hasPrefix("._") { shouldClean = true }
if shouldClean {
print("[*] deleting dot files inside artifact \(url.path)")
try FileManager.default.removeItem(at: url)
}
}
}
static func generatePackageSignature(at atUrl: URL) throws -> String {
try deletingDotFiles(at: atUrl)
var signatureDic = [String: String]()
let enumerator = FileManager.default.enumerator(atPath: atUrl.path)
while let subPath = enumerator?.nextObject() as? String {
let path = atUrl.appendingPathComponent(subPath)
var isDir = ObjCBool(false)
guard FileManager
.default
.fileExists(atPath: path.path, isDirectory: &isDir)
else {
throw GenericActionError.brokenResources
}
let data = try Data(contentsOf: path)
let hash = data.sha256()
signatureDic[subPath] = hash
}
var hasher = String()
let valueArray = signatureDic.sorted { $0.key < $1.key }
for (key, value) in valueArray {
hasher += key
hasher += value
hasher += "\n"
}
guard let signature = hasher.data(using: .utf8)?.sha256() else {
throw GenericActionError.unknown
}
return signature
}
static func obtainArtifactUrlForAction(withId: Action.ID) -> URL {
ActionManager.shared
.actionArtifactBaseUrl
.appendingPathComponent(withId.uuidString)
.appendingPathExtension(artifactPathExtension)
}
func obtainArtifactUrl() -> URL {
Self.obtainArtifactUrlForAction(withId: id)
}
func validateSignature() -> Bool {
do {
let testSignature = try Self.generatePackageSignature(at: obtainArtifactUrl())
return signature == testSignature
} catch {
print("[E] \(error.localizedDescription)")
return false
}
}
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionManager+Event.swift
================================================
//
// ActionManager+Event.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import Cocoa
import Foundation
private let decoder = JSONDecoder()
private let encoder = JSONEncoder()
extension ActionManager {
struct ActionRecipeData: Codable {
let postAction: PostAction
let postContent: String
let continueQueue: Bool
enum PostAction: String, Codable {
case overwrite
case speak
case none
func humanReadableDescription() -> String {
switch self {
case .overwrite: return "Overwrite Pasteboard"
case .speak: return "Speak Message"
case .none: return "None"
}
}
}
init(postAction: PostAction, postContent: String, continueQueue: Bool) {
self.postAction = postAction
self.postContent = postContent
self.continueQueue = continueQueue
}
func compileBase64() -> String? {
(try? encoder.encode(self))?.base64EncodedString()
}
static func retrieve(withData data: Data) -> Self? {
try? decoder.decode(Self.self, from: data)
}
}
func handle(pasteboardEvent event: PasteboardManager.PEvent) {
assert(!Thread.isMainThread)
var actionCandidates: [Action] = []
DispatchQueue.withMainAndWait {
actionCandidates = self.actions
}
actionCandidates = actionCandidates
.filter { enabledActions.contains($0.id) }
.filter { !initialingAciton.contains($0.id) }
.filter {
if $0.enabledAppList.isEmpty {
return true
}
guard let appBundleIdentifier = event.app?.bundleIdentifier else {
return false
}
return $0.enabledAppList.contains(appBundleIdentifier)
}
.sorted { a, b in
guard a.priority == b.priority else {
return a.priority < b.priority
}
return a.name < b.name
}
guard !actionCandidates.isEmpty else {
print("[-] no action candidate found, ignoring pasteboard event")
return
}
print("[*] pasteboard event resolved \(actionCandidates.count) candidates")
DispatchQueue.withMainAndWait {
self.actionRunning = true
self.actionRunningHint = "Resolved \(actionCandidates.count) Action Candidates"
Menubar.shared.switchTitle(status: .running)
}
var successAction: [HistoryElement.SuccessRecord] = []
var failedAction: [HistoryElement.FailureRecord] = []
var shouldShowResultWindow = false
defer {
let history = HistoryElement(
event: event,
actionCandidates: actionCandidates.map(\.id),
succeedAction: successAction,
failedAction: failedAction
)
DispatchQueue.withMainAndWait {
self.histories.append(history)
self.actionRunning = false
self.actionRunningHint = ""
Menubar.shared.switchTitle(status: .ready)
if shouldShowResultWindow, !Config.shared.silentMode {
if Config.shared.toastMode {
var image = "checkmark.circle.fill"
if !failedAction.isEmpty {
image = "checkmark.circle.trianglebadge.exclamationmark"
}
Toast.post(systemIcon: image, message: "ActionBee Completed")
} else {
Menubar.shared.showPopover()
}
}
}
}
for action in actionCandidates {
DispatchQueue.withMainAndWait {
self.actionRunningHint = "Executing Action - \(action.name)"
}
let recipe = action.template
.obtainTemplateDetails()
.executeModule(
id: action.id,
withPasteboardEvent: event
) { print($0) }
switch recipe {
case let .success(recipe):
successAction.append(.init(
action: action.id,
recipeAction: recipe.postAction.humanReadableDescription(),
recipeContent: recipe.postContent
))
resolvePostAction(recipe)
if recipe.postAction != .none { shouldShowResultWindow = true }
guard recipe.continueQueue else { return }
case let .failure(failure):
shouldShowResultWindow = true
failedAction.append(.init(action: action.id, errorHint: failure.message))
print("[E] error executing aciton: \(failure.message)")
continue
}
}
}
func resolvePostAction(_ object: ActionRecipeData) {
assert(!Thread.isMainThread)
switch object.postAction {
case .none: break
case .speak:
DispatchQueue.global().async {
Executor.shared.speak(object.postContent)
}
case .overwrite:
NSPasteboard.general.prepareForNewContents()
NSPasteboard.general.setString(object.postContent, forType: .string)
}
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionManager+History.swift
================================================
//
// ActionManager+History.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import Foundation
extension ActionManager {
struct HistoryElement: Codable, Identifiable, Hashable, Equatable {
var id: UUID = .init()
let date: Date
let event: PasteboardManager.PEvent
let actionCandidates: [Action.ID]
struct SuccessRecord: Codable, Identifiable, Hashable, Equatable {
var id: UUID = .init()
let action: Action.ID
let recipeAction: String
let recipeContent: String
}
let succeedAction: [SuccessRecord]
struct FailureRecord: Codable, Identifiable, Hashable, Equatable {
var id: UUID = .init()
let action: Action.ID
let errorHint: String
}
let failedAction: [FailureRecord]
init(
id: UUID = .init(),
date: Date = .init(),
event: PasteboardManager.PEvent,
actionCandidates: [ActionManager.Action.ID] = [],
succeedAction: [ActionManager.HistoryElement.SuccessRecord] = [],
failedAction: [ActionManager.HistoryElement.FailureRecord] = []
) {
self.id = id
self.date = date
self.event = event
self.actionCandidates = actionCandidates
self.succeedAction = succeedAction
self.failedAction = failedAction
}
func search(with key: String) -> Bool {
if event.app?.name.lowercased().contains(key) ?? false { return true }
if event.app?.bundleIdentifier.lowercased().contains(key) ?? false { return true }
if event.content.lowercased().contains(key) { return true }
if date.formatted(date: .complete, time: .complete).lowercased().contains(key) {
return true
}
return false
}
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionManager+Module.swift
================================================
//
// ActionManager+Module.swift
// Action
//
// Created by Lakr Aream on 2022/7/26.
//
import Foundation
/*
Action will be compiled into ActionManifest.plist
into project root dir
so the project dir looks like: eg swift
.
├── .build
│ └── cli <- binary
├── App.xcworkspace
└── compile.sh <- emit binary, called each time when compile
// user editable
├── Source
│ ├── Package.swift
│ └── Sources
│ └── Source
│ └── Source.swift <- user code
// program granted
├── .ActionManifest.plist <- exported definition of this action
*/
extension ActionManager {
struct Action: Codable, Equatable, Hashable, Identifiable {
var id: UUID
var name: String
var icon: String
var priority: Int // lower first-er P0~
var timeout: Int
var template: ActionManager.ModuleTemplateIdentifier
// will only run if copy from these apps
var enabledAppList: [String] = []
// keep for future usage
var attachment: [String: String]
init(
id: UUID = .init(),
name: String,
icon: String = "text.append",
priority: Int = 100,
timeout: Int = 5,
template: ActionManager.ModuleTemplateIdentifier,
enabledAppList: [String] = [],
attachment: [String: String] = [:]
) {
self.id = id
self.name = name
self.icon = icon
self.priority = priority
self.timeout = timeout
self.template = template
self.enabledAppList = enabledAppList
self.attachment = attachment
}
}
func updateActionModuleManifest(onActionId: Action.ID? = nil) {
if let id = onActionId {
guard let action = self[id] else {
return
}
try? compileManifestAndSave(forAction: action)
}
for action in actions {
try? compileManifestAndSave(forAction: action)
}
}
func compileManifestAndSave(forAction action: Action) throws {
let actionModuleDir = actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
let manifestUrl = actionModuleDir
.appendingPathComponent(actionManifestFileName)
.appendingPathExtension(actionManifestExtension)
guard FileManager.default.fileExists(atPath: actionModuleBaseUrl.path) else {
return
}
let data = try actionManifestEncoder.encode(action)
try data.write(to: manifestUrl, options: .atomic)
}
func deleteModule(withId id: Action.ID) {
print("[*] deleting module \(id)")
let moduleUrl = actionModuleBaseUrl
.appendingPathComponent(id.uuidString)
try? FileManager.default.removeItem(at: moduleUrl)
actions = actions.filter { $0.id != id }
enabledActions = enabledActions.filter { $0 != id }
invalidateArtifactCache(forAction: id)
}
func issueCompile(forAction actionId: Action.ID, output: @escaping (String) -> Void) -> Result<Void, GenericActionError> {
assert(!Thread.isMainThread)
guard let action = self[actionId] else {
return .failure(.brokenResources)
}
let result = action.template
.obtainTemplateDetails()
.compileModule(id: actionId, output: output)
return result
}
func registerArtifact(forAction actionId: Action.ID, artifact: URL) {
print("[*] copying artifact at path \(artifact.path) for action \(actionId)")
try? FileManager.default.createDirectory(
at: ActionManager.shared.actionArtifactBaseUrl,
withIntermediateDirectories: true
)
guard let object = ModuleArtifact(id: actionId, copyingArtifactAt: artifact) else {
return
}
print("[*] registering artifact \(actionId) with signature \(object.signature)")
guard Thread.isMainThread else {
DispatchQueue.withMainAndWait {
self.artifacts[object.id] = object
}
return
}
artifacts[object.id] = object
}
func invalidateArtifactCache(forAction actionId: Action.ID) {
print("[*] invalidating artifact cache for \(actionId)")
if let value = artifacts[actionId] {
try? FileManager.default.removeItem(at: value.obtainArtifactUrl())
}
if Thread.isMainThread {
artifacts.removeValue(forKey: actionId)
} else {
DispatchQueue.withMainAndWait {
self.artifacts.removeValue(forKey: actionId)
}
}
}
func importModule(at: URL) -> Result<Action.ID, Error> {
print("[*] importing module at \(at.path)")
let manifest = at
.appendingPathComponent(actionManifestFileName)
.appendingPathExtension(actionManifestExtension)
do {
let data = try Data(contentsOf: manifest)
let action = try actionManifestDecoder.decode(Action.self, from: data)
let target = actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
print("[*] manifest returns id \(action.id)")
try? FileManager.default.removeItem(at: target)
try FileManager.default.copyItem(at: at, to: target)
invalidateArtifactCache(forAction: action.id)
DispatchQueue.withMainAndWait {
self[action.id] = action
self.enabledActions.append(action.id)
}
updateActionModuleManifest(onActionId: action.id)
return .success(action.id)
} catch {
return .failure(error)
}
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionManager.swift
================================================
//
// ActionManager.swift
// Action
//
// Created by Lakr Aream on 2022/7/26.
//
import Combine
import Foundation
final class ActionManager: ObservableObject {
static let shared = ActionManager()
private init() {
#if DEBUG
for item in ModuleTemplateIdentifier.allCases {
_ = item.obtainTemplateDetails().getTemplateBundleURL()
}
#endif
var buildAction: [Action.ID: Action] = [:]
for action in actionsStore {
buildAction[action.id] = action
}
// now clean the items inside the dir if not exists in plist
do {
let actionIds = buildAction.keys.map(\.uuidString)
let list = (
try? FileManager
.default
.contentsOfDirectory(atPath: actionModuleBaseUrl.path)
) ?? []
var deleteList = [String]()
deleteList += list.filter { !actionIds.contains($0) }
deleteList += actionIds.filter { !list.contains($0) }
for element in deleteList {
let url = actionModuleBaseUrl.appendingPathComponent(element)
try? FileManager.default.removeItem(at: url)
if let id = UUID(uuidString: element) {
buildAction.removeValue(forKey: id)
}
print("[-] removing unregistered action module file at path \(url.path)")
}
}
actions = buildAction.values
.sorted { $0.name < $1.name }
updateActionModuleManifest()
enabledActions = Array(Set(enabledActionsStore))
for action in actions {
print("[+] loading module \(action.name) - \(action.id.uuidString)")
}
artifacts = artifactsStore
for artifact in artifacts {
let found = actions.contains { $0.id == artifact.key }
if found {
print("[+] loading artifact \(artifact.key.uuidString)")
DispatchQueue.global().async {
guard artifact.value.validateSignature() else {
print("[E] artifact signature mismatch!")
self.invalidateArtifactCache(forAction: artifact.key)
return
}
}
} else {
DispatchQueue.global().async {
self.invalidateArtifactCache(forAction: artifact.key)
}
}
}
histories = historiesStore
.sorted { $0.date < $1.date }
}
var actionModuleBaseUrl: URL {
let ret = ActionApp
.documentDirectory
.appendingPathComponent("ActionModules")
try? FileManager.default.createDirectory(
at: ret,
withIntermediateDirectories: true
)
return ret
}
var actionArtifactBaseUrl: URL {
let ret = ActionApp
.documentDirectory
.appendingPathComponent("ActionArtifact")
try? FileManager.default.createDirectory(
at: ret,
withIntermediateDirectories: true
)
return ret
}
let actionManifestFileName = ".ActionManifest"
let actionManifestExtension = "plist"
let actionManifestEncoder = PropertyListEncoder()
let actionManifestDecoder = PropertyListDecoder()
@EncryptedCodableDefaultsWrapper(key: "wiki.qaq.ActionManager.actionsStoreKey", defaultValue: [Action]())
private var actionsStore
@Published var actions: [Action] = [] {
didSet { DispatchQueue.global().async { self.actionsStore = self.actions } }
}
@Published var initialingAciton: Set<Action.ID> = []
subscript(actionId: UUID) -> Action? {
get {
actions.first { $0.id == actionId }
}
set {
assert(Thread.isMainThread)
guard let newValue = newValue else {
deleteModule(withId: actionId)
return
}
let idx = actions.firstIndex { $0.id == newValue.id }
if let idx = idx {
actions[idx] = newValue
} else {
actions = (
actions + [newValue]
)
.sorted { $0.name < $1.name }
}
}
}
@EncryptedCodableDefaultsWrapper(key: "wiki.qaq.ActionManager.enabledActions", defaultValue: [])
private var enabledActionsStore: [Action.ID]
@Published var enabledActions = [Action.ID]() {
didSet { DispatchQueue.global().async { self.enabledActionsStore = self.enabledActions } }
}
@EncryptedCodableDefaultsWrapper(key: "wiki.qaq.ActionManager.artifactsStore", defaultValue: [Action.ID: ModuleArtifact]())
private var artifactsStore
@Published var artifacts: [Action.ID: ModuleArtifact] = [:] {
didSet { DispatchQueue.global().async { self.artifactsStore = self.artifacts } }
}
@EncryptedCodableDefaultsWrapper(key: "wiki.qaq.ActionManager.historiesStore", defaultValue: [HistoryElement]())
private var historiesStore
@Published var histories: [HistoryElement] = [] {
didSet {
let historyLimit = 500
guard histories.count < historyLimit else {
DispatchQueue.main.async {
self.histories.removeFirst(self.histories.count - historyLimit)
}
return
}
DispatchQueue.global().async { self.historiesStore = self.histories }
}
}
@Published var actionRunning = false
@Published var actionRunningHint = ""
}
================================================
FILE: App/Action/Action/Backend/Action/ActionModuleTemplates/ActionManager+Template.swift
================================================
//
// ActionManager+ModuleTemplate.swift
// Action
//
// Created by Lakr Aream on 2022/8/15.
//
import Cocoa
import Foundation
protocol ModuleTemplate {
func getLanguage() -> String
func getTemplateBundleName() -> String
func getBuildHint() -> String
func getTemplateBundleURL() -> URL
func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError>
func compileModule(
id: ActionManager.Action.ID,
output: @escaping (String) -> Void
) -> Result<Void, ActionManager.GenericActionError>
func executeModule(
id: ActionManager.Action.ID,
withPasteboardEvent event: PasteboardManager.PEvent,
output: @escaping (String) -> Void
) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError>
}
extension ModuleTemplate {
func getTemplateBundleURL() -> URL {
Bundle.main.url(
forResource: getTemplateBundleName(),
withExtension: "ActionTemplatePackage",
subdirectory: "ActionTemplates"
)!
}
}
extension ActionManager {
enum GenericActionError: Error {
case permissionDenied
case compilerError
case brokenResources
case designatedEditorMissing
case unauthorizedModificationDetected
case invalidResponse
case unknown
var message: String {
switch self {
case .permissionDenied: return "Permission denied for requires resources."
case .compilerError: return "Compiler returned an error, check your source."
case .brokenResources: return "Resources for this module was not found."
case .designatedEditorMissing: return "The designated editor app for this module was not found, please edit it in Finder yourself."
case .unauthorizedModificationDetected: return "The requires resource was modified by unauthorized event."
case .invalidResponse: return "Invalid respond."
case .unknown: return "Unknown error occurred."
}
}
}
enum ModuleTemplateIdentifier: String, Codable, CaseIterable, Hashable, Equatable {
case executable
case executableSwift
case swift
case node
case python
func obtainTemplateDetails() -> ModuleTemplate {
switch self {
case .executable: return ModuleTemplateExecutable()
case .executableSwift: return ModuleTemplateExecutableSwift()
case .swift: return ModuleTemplateSwift()
case .node: return ModuleTemplateNode()
case .python: return ModuleTemplatePython()
}
}
}
func createAction(withName name: String, withModuleTemplate template: ModuleTemplateIdentifier) -> UUID? {
let actionUUID = UUID()
let templateBundleUrl = template
.obtainTemplateDetails()
.getTemplateBundleURL()
let extractTarget = actionModuleBaseUrl
.appendingPathComponent(actionUUID.uuidString)
let action = Action(id: actionUUID, name: name, template: template)
print("[*] creating module at \(extractTarget.path)")
do {
try FileManager.default.createDirectory(at: extractTarget, withIntermediateDirectories: true)
try Executor.shared.unarchiveTar(at: templateBundleUrl, toDest: extractTarget)
try compileManifestAndSave(forAction: action)
} catch {
return nil
}
DispatchQueue.withMainAndWait {
self.actions = (
self.actions + [action]
)
.sorted { $0.name < $1.name }
self.enabledActions.append(action.id)
}
return actionUUID
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Executable.swift
================================================
//
// Template+Executable.swift
// Action
//
// Created by Lakr Aream on 2022/8/17.
//
import AuxiliaryExecute
import Cocoa
import Foundation
extension ActionManager {
class ModuleTemplateExecutable: ModuleTemplate {
func getLanguage() -> String { "Binary Executable" }
func getTemplateBundleName() -> String { "Executable" }
func getBuildHint() -> String { "Compile your binary, name it ActionBeeModule.exec, and put it here." }
struct ArgumentData: Codable {
let focusAppID: String?
let focusAppName: String?
let pasteboardContent: String
init(focusAppID: String?, focusAppName: String?, pasteboardContent: String) {
self.focusAppID = focusAppID
self.focusAppName = focusAppName
self.pasteboardContent = pasteboardContent
}
func compileBase64() -> String? {
(try? JSONEncoder().encode(self))?.base64EncodedString()
}
}
func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {
guard let action = ActionManager.shared[id] else {
return .failure(GenericActionError.brokenResources)
}
let target = ActionManager.shared.actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
guard FileManager.default.fileExists(atPath: target.path) else {
return .failure(GenericActionError.brokenResources)
}
guard NSWorkspace.shared.open(target) else {
return .failure(GenericActionError.designatedEditorMissing)
}
return .success
}
func compileModule(id: ActionManager.Action.ID, output _: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {
assert(!Thread.isMainThread)
guard let action = ActionManager.shared[id] else {
return .failure(.brokenResources)
}
let target = ActionManager.shared.actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
.appendingPathComponent("ActionBeeModule.exec")
guard FileManager.default.fileExists(atPath: target.path) else {
return .failure(.brokenResources)
}
guard FileManager.default.isExecutableFile(atPath: target.path) else {
return .failure(.permissionDenied)
}
ActionManager.shared.registerArtifact(forAction: action.id, artifact: target)
return .success
}
func executeModule(id: ActionManager.Action.ID, withPasteboardEvent event: PasteboardManager.PEvent, output: @escaping (String) -> Void) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError> {
assert(!Thread.isMainThread)
guard let action = ActionManager.shared[id],
let artifact = ActionManager.shared.artifacts[id]
else {
return .failure(.brokenResources)
}
guard artifact.validateSignature() else {
return .failure(.unauthorizedModificationDetected)
}
guard let argument = ArgumentData(
focusAppID: event.app?.bundleIdentifier,
focusAppName: event.app?.name,
pasteboardContent: event.content
)
.compileBase64()
else {
return .failure(.brokenResources)
}
print("[*] executing action \(id.uuidString)")
var resultData: ActionRecipeData?
let binary = artifact
.obtainArtifactUrl()
.appendingPathComponent("cli")
.path
let recipe = AuxiliaryExecute.spawn(
command: binary,
environment: ["Communicator_Message": argument],
timeout: Double(action.timeout),
output: output
)
var lastLine = recipe.stderr
.trimmingCharacters(in: .whitespacesAndNewlines)
.components(separatedBy: "\n")
.last?
.trimmingCharacters(in: .whitespaces)
?? ""
let prefix = "ActionBee-Result-Recipe://"
if lastLine.hasPrefix(prefix) {
lastLine.removeFirst(prefix.count)
}
if let base64 = Data(base64Encoded: lastLine) {
resultData = ActionRecipeData.retrieve(withData: base64)
}
guard let result = resultData else {
return .failure(.invalidResponse)
}
return .success(result)
}
}
class ModuleTemplateExecutableSwift: ModuleTemplateExecutable {
override func getLanguage() -> String { "Binary Executable - Swift" }
override func getTemplateBundleName() -> String { "ExecutableSwift" }
override func getBuildHint() -> String { "Compile your binary, name it ActionBeeModule.exec, and put it here." }
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Node.swift
================================================
//
// Template+Node.swift
// Action
//
// Created by Innei on 2022/8/21.
//
import AuxiliaryExecute
import Foundation
extension ActionManager {
class ModuleTemplateNode: ModuleTemplateExecutable {
override func getLanguage() -> String { "Source - Node" }
override func getTemplateBundleName() -> String { "SourceNode" }
override func getBuildHint() -> String { "To build Node Module, node and it's tool is required. Install them yourself." }
override func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {
let url = ActionManager.shared
.actionModuleBaseUrl
.appendingPathComponent(id.uuidString)
let recipe = AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", "code \(url.path)"]
)
guard recipe.exitCode == 0 else {
return .failure(.designatedEditorMissing)
}
return .success
}
override func compileModule(id: ActionManager.Action.ID, output: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {
guard let action = ActionManager.shared[id] else {
return .failure(.brokenResources)
}
let temporaryDir = URL(fileURLWithPath: NSTemporaryDirectory())
.appendingPathComponent(UUID().uuidString)
try? FileManager.default.removeItem(at: temporaryDir)
defer {
try? FileManager.default.removeItem(at: temporaryDir)
}
do {
output("[*] starting compiler at \(temporaryDir.path)\n")
let userSrc = ActionManager.shared
.actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
let targetSrc = temporaryDir
output("[*] copying user source from \(userSrc.path) to \(targetSrc.path)\n")
try FileManager.default.copyItem(at: userSrc, to: targetSrc)
FileManager.default.createFile(
atPath: temporaryDir.appendingPathComponent(".action").path,
contents: nil
)
} catch {
output("[E] \(error.localizedDescription)")
return .failure(.permissionDenied)
}
output("[*] calling compiler script\n")
let compileScript = temporaryDir
.appendingPathComponent(".supplement")
.appendingPathComponent("compile.sh")
let recipe = executeZshScript(atLocation: compileScript, output: output)
guard recipe.exitCode == 0 else {
return .failure(.compilerError)
}
let artifactLocation = temporaryDir
.appendingPathComponent("dist")
// .appendingPathComponent("index.js")
guard FileManager.default.fileExists(atPath: artifactLocation.path) else {
return .failure(.permissionDenied)
}
output("[*] compiled binary at \(artifactLocation.path)\n")
ActionManager.shared.registerArtifact(forAction: action.id, artifact: artifactLocation)
return .success
}
override func executeModule(id: ActionManager.Action.ID, withPasteboardEvent event: PasteboardManager.PEvent, output: @escaping (String) -> Void) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError> {
assert(!Thread.isMainThread)
guard let action = ActionManager.shared[id],
let artifact = ActionManager.shared.artifacts[id]
else {
return .failure(.brokenResources)
}
guard artifact.validateSignature() else {
return .failure(.unauthorizedModificationDetected)
}
let script = artifact
.obtainArtifactUrl()
.appendingPathComponent("index.js")
guard let argument = ArgumentData(
focusAppID: event.app?.bundleIdentifier,
focusAppName: event.app?.name,
pasteboardContent: event.content
)
.compileBase64()
else {
return .failure(.brokenResources)
}
print("[*] executing action \(id.uuidString)")
var resultData: ActionRecipeData?
let recipe = AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", "node \(script.path)"],
environment: ["Communicator_Message": argument],
timeout: Double(action.timeout),
output: output
)
var lastLine = recipe.stderr
.trimmingCharacters(in: .whitespacesAndNewlines)
.components(separatedBy: "\n")
.last?
.trimmingCharacters(in: .whitespaces)
?? ""
let prefix = "ActionBee-Result-Recipe://"
if lastLine.hasPrefix(prefix) {
lastLine.removeFirst(prefix.count)
}
if let base64 = Data(base64Encoded: lastLine) {
resultData = ActionRecipeData.retrieve(withData: base64)
}
guard let result = resultData else {
return .failure(.invalidResponse)
}
return .success(result)
}
func executeZshScript(atLocation: URL, output: @escaping (String) -> Void = { _ in }) -> AuxiliaryExecute.ExecuteRecipe {
AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", atLocation.path],
output: output
)
}
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Python.swift
================================================
//
// Template+Python.swift
// Action
//
// Created by Lakr Aream on 2022/8/30.
//
import AuxiliaryExecute
import Foundation
extension ActionManager {
class ModuleTemplatePython: ModuleTemplateExecutable {
override func getLanguage() -> String { "Source - Python" }
override func getTemplateBundleName() -> String { "SourcePython" }
override func getBuildHint() -> String { "To build Python Module, python 3 and it's tool is required. Install them yourself." }
override func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {
let url = ActionManager.shared
.actionModuleBaseUrl
.appendingPathComponent(id.uuidString)
let recipe = AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", "code \(url.path)"]
)
guard recipe.exitCode == 0 else {
return .failure(.designatedEditorMissing)
}
return .success
}
override func compileModule(id: ActionManager.Action.ID, output _: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {
guard let action = ActionManager.shared[id] else {
return .failure(.brokenResources)
}
let actionUrl = ActionManager.shared
.actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
ActionManager.shared.registerArtifact(forAction: action.id, artifact: actionUrl)
return .success
}
override func executeModule(id: ActionManager.Action.ID, withPasteboardEvent event: PasteboardManager.PEvent, output: @escaping (String) -> Void) -> Result<ActionManager.ActionRecipeData, ActionManager.GenericActionError> {
assert(!Thread.isMainThread)
guard let action = ActionManager.shared[id],
let artifact = ActionManager.shared.artifacts[id]
else {
return .failure(.brokenResources)
}
guard artifact.validateSignature() else {
return .failure(.unauthorizedModificationDetected)
}
let script = artifact
.obtainArtifactUrl()
.appendingPathComponent("main.py")
guard let argument = ArgumentData(
focusAppID: event.app?.bundleIdentifier,
focusAppName: event.app?.name,
pasteboardContent: event.content
)
.compileBase64()
else {
return .failure(.brokenResources)
}
print("[*] executing action \(id.uuidString)")
var resultData: ActionRecipeData?
let recipe = AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", "python3 \(script.path)"],
environment: ["Communicator_Message": argument],
timeout: Double(action.timeout),
output: output
)
var lastLine = recipe.stderr
.trimmingCharacters(in: .whitespacesAndNewlines)
.components(separatedBy: "\n")
.last?
.trimmingCharacters(in: .whitespaces)
?? ""
let prefix = "ActionBee-Result-Recipe://"
if lastLine.hasPrefix(prefix) {
lastLine.removeFirst(prefix.count)
}
if let base64 = Data(base64Encoded: lastLine) {
resultData = ActionRecipeData.retrieve(withData: base64)
}
guard let result = resultData else {
return .failure(.invalidResponse)
}
return .success(result)
}
func executeZshScript(atLocation: URL, output: @escaping (String) -> Void = { _ in }) -> AuxiliaryExecute.ExecuteRecipe {
AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", atLocation.path],
output: output
)
}
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Swift.swift
================================================
//
// ModuleTemplate+Swift.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import AuxiliaryExecute
import Cocoa
extension ActionManager {
class ModuleTemplateSwift: ModuleTemplateExecutable {
override func getLanguage() -> String { "Source - Swift" }
override func getTemplateBundleName() -> String { "SourceSwift" }
override func getBuildHint() -> String { "To build Swift Module, Xcode and it's tool xcode-build is required. Install Xcode yourself." }
override func openDesignatedEditor(id: ActionManager.Action.ID) -> Result<Void, ActionManager.GenericActionError> {
guard let action = ActionManager.shared[id] else {
return .failure(GenericActionError.brokenResources)
}
let target = ActionManager.shared.actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
.appendingPathComponent("App.xcworkspace")
guard FileManager.default.fileExists(atPath: target.path) else {
return .failure(GenericActionError.brokenResources)
}
guard NSWorkspace.shared.open(target) else {
return .failure(GenericActionError.designatedEditorMissing)
}
return .success
}
override func compileModule(id: ActionManager.Action.ID, output: @escaping (String) -> Void) -> Result<Void, ActionManager.GenericActionError> {
assert(!Thread.isMainThread)
guard let action = ActionManager.shared[id] else {
return .failure(.brokenResources)
}
let temporaryDir = URL(fileURLWithPath: NSTemporaryDirectory())
.appendingPathComponent(UUID().uuidString)
try? FileManager.default.removeItem(at: temporaryDir)
defer {
try? FileManager.default.removeItem(at: temporaryDir)
}
do {
output("[*] starting compiler at \(temporaryDir.path)\n")
try FileManager.default.createDirectory(at: temporaryDir, withIntermediateDirectories: true)
try Executor.shared.unarchiveTar(at: getTemplateBundleURL(), toDest: temporaryDir)
let validatedSourcePathComponents = "Source"
let userSrc = ActionManager.shared
.actionModuleBaseUrl
.appendingPathComponent(action.id.uuidString)
.appendingPathComponent(validatedSourcePathComponents)
let targetSrc = temporaryDir
.appendingPathComponent(validatedSourcePathComponents)
output("[*] copying user source from \(userSrc.path) to \(targetSrc.path)\n")
try FileManager.default.removeItem(at: targetSrc)
try FileManager.default.copyItem(at: userSrc, to: targetSrc)
FileManager.default.createFile(
atPath: temporaryDir.appendingPathComponent(".action").path,
contents: nil
)
} catch {
output("[E] \(error.localizedDescription)")
return .failure(.permissionDenied)
}
output("[*] calling compiler script\n")
let compileScript = temporaryDir
.appendingPathComponent(".supplement")
.appendingPathComponent("compile.sh")
let recipe = executeZshScript(atLocation: compileScript, output: output)
guard recipe.exitCode == 0 else {
return .failure(.compilerError)
}
let binaryLocation = temporaryDir
.appendingPathComponent(".build")
.appendingPathComponent("cli")
guard FileManager.default.fileExists(atPath: binaryLocation.path) else {
return .failure(.permissionDenied)
}
output("[*] compiled binary at \(binaryLocation.path)\n")
ActionManager.shared.registerArtifact(forAction: action.id, artifact: binaryLocation)
return .success
}
func executeZshScript(atLocation: URL, output: @escaping (String) -> Void = { _ in }) -> AuxiliaryExecute.ExecuteRecipe {
AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", atLocation.path],
output: output
)
}
}
}
================================================
FILE: App/Action/Action/Backend/Action/ActionTemplates/.templates
================================================
================================================
FILE: App/Action/Action/Backend/Config/Config.swift
================================================
//
// Config.swift
// Action
//
// Created by Lakr Aream on 2022/8/17.
//
import Combine
import Foundation
class Config: ObservableObject {
static let shared = Config()
private init() {
reducedEffects = reducedEffectsStore
pasteboardDeduplicate = pasteboardDeduplicateStore
silentMode = silentModeStore
toastMode = toastModeStore
}
@UserDefaultsWrapper(key: "wiki.qaq.config.reducedEffects", defaultValue: false)
private var reducedEffectsStore
@Published var reducedEffects: Bool = false {
didSet { reducedEffectsStore = reducedEffects }
}
@UserDefaultsWrapper(key: "wiki.qaq.config.pasteboardDeduplicate", defaultValue: true)
private var pasteboardDeduplicateStore
@Published var pasteboardDeduplicate: Bool = true {
didSet { pasteboardDeduplicateStore = pasteboardDeduplicate }
}
@UserDefaultsWrapper(key: "wiki.qaq.config.silentMode", defaultValue: false)
private var silentModeStore
@Published var silentMode: Bool = true {
didSet { silentModeStore = silentMode }
}
@UserDefaultsWrapper(key: "wiki.qaq.config.toastMode", defaultValue: false)
private var toastModeStore
@Published var toastMode: Bool = true {
didSet { toastModeStore = toastMode }
}
}
================================================
FILE: App/Action/Action/Backend/Executor/Executor.swift
================================================
//
// Executor.swift
// Action
//
// Created by Lakr Aream on 2022/7/26.
//
import AuxiliaryExecute
import Foundation
final class Executor {
static let shared = Executor()
let executorDir = ActionApp
.documentDirectory
.appendingPathComponent("Executor")
private init() {
let whoami = "/usr/bin/whoami"
let receipt = AuxiliaryExecute.spawn(command: whoami)
let username = receipt.stdout.trimmingCharacters(in: .whitespacesAndNewlines)
guard receipt.exitCode == 0, !username.isEmpty /* , username != "root" */ else {
fatalError("Malformed application permission")
}
print("[*] whoami \(username)")
do {
let findEnv = AuxiliaryExecute.spawn(
command: "/bin/zsh",
args: ["-c", "source ~/.zshrc 1>/dev/null 2>/dev/null && echo $PATH"]
)
let env = findEnv.stdout.trimmingCharacters(in: .whitespacesAndNewlines)
print("[*] setting up env PATH value \(findEnv.stdout)")
let envPathBuilder = env.components(separatedBy: ":")
.filter { FileManager.default.fileExists(atPath: $0) }
let origPathBuilder = (
ProcessInfo
.processInfo
.environment["PATH"] ?? ""
)
.components(separatedBy: ":")
.filter { FileManager.default.fileExists(atPath: $0) }
let newPath = Array(Set(envPathBuilder + origPathBuilder))
.joined(separator: ":")
setenv("PATH", newPath, 1)
}
try? FileManager.default.createDirectory(at: executorDir, withIntermediateDirectories: true)
}
enum ExecutorError: Error {
case unknown
}
func obtainXcodeCommandLineToolLocation() -> URL? {
let receipt = AuxiliaryExecute.spawn(
command: "/usr/bin/xcode-select",
args: ["--print-path"]
)
let path = receipt
.stdout
.trimmingCharacters(in: .whitespacesAndNewlines)
guard path != "/",
path.hasPrefix("/"),
FileManager.default.fileExists(atPath: path)
else {
return nil
}
return URL(fileURLWithPath: path)
}
func unarchiveTar(at: URL, toDest: URL) throws {
let receipt = AuxiliaryExecute.spawn(
command: "/usr/bin/tar",
args: ["-xf", at.path, "--directory", toDest.path]
)
guard receipt.exitCode == 0 else {
throw ExecutorError.unknown
}
}
func speak(_ str: String) {
AuxiliaryExecute.spawn(
command: "/usr/bin/say",
args: [str]
)
}
}
================================================
FILE: App/Action/Action/Backend/PasteboardManager/PasteboardManager+Event.swift
================================================
//
// PasteboardManager+Event.swift
// Action
//
// Created by Lakr Aream on 2022/7/26.
//
import Foundation
extension PasteboardManager {
struct PEvent: Codable, Equatable, Hashable {
let content: String
let app: AppInfo?
init(content: String, app: PasteboardManager.AppInfo?) {
self.content = content
self.app = app
}
}
struct AppInfo: Codable, Equatable, Hashable {
let name: String
let bundleIdentifier: String
init(name: String, bundleIdentifier: String) {
self.name = name
self.bundleIdentifier = bundleIdentifier
}
}
}
================================================
FILE: App/Action/Action/Backend/PasteboardManager/PasteboardManager.swift
================================================
//
// PasteboardManager.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import AppKit
final class PasteboardManager {
static let shared = PasteboardManager()
private init() {
print("[*] setting up Pasteboard Manager")
Thread(
target: self,
selector: #selector(startMonitorThread),
object: nil
)
.start()
}
let systemPasteboard = NSPasteboard.general
private var monitorThread: Thread?
private var monitorRunLoop: RunLoop?
private var accessQueue = DispatchQueue(label: "wiki.qaq.PasteboardManager.accessQueue")
private var executeQueue = DispatchQueue(label: "wiki.qaq.PasteboardManager.executeQueue")
private var previousPasteboardChangeCount: Int?
private var previousPasteboardEvent: PEvent?
var eventBlockaded: Bool = false
@objc private func startMonitorThread() {
monitorThread = Thread.current
monitorRunLoop = RunLoop.current
defer {
self.monitorThread = nil
self.monitorRunLoop = nil
}
let timer = Timer(timeInterval: 0.25, repeats: true) { _ in
self.accessQueue.async { self.checkPasteboard() }
}
RunLoop.current.add(timer, forMode: .common)
CFRunLoopRun()
}
func clearLastEvent() {
print("[*] clearing previous pasteboard event")
accessQueue.async {
self.previousPasteboardEvent = nil
}
}
func requestCheckPasteboard() {
accessQueue.async { self.checkPasteboard() }
}
private func checkPasteboard() {
guard systemPasteboard.changeCount != previousPasteboardChangeCount else {
return
}
let newChangeCount = systemPasteboard.changeCount
print("[*] NSPasteboard has changeCount \(newChangeCount) previous at \(previousPasteboardChangeCount ?? -1)")
previousPasteboardChangeCount = newChangeCount
guard let copied = systemPasteboard.string(forType: .string) else {
print("[?] system pasteboard does not returns as string > ignoring")
return
}
let app: AppInfo? = obtainRunningApplication()
let event = PEvent(content: copied, app: app)
print("[*] PasteboardEvent content len \(copied.count) from \(app?.name ?? "nil")")
var shouldDispatchEvent = false
if let previousEvent = previousPasteboardEvent,
previousEvent != event || !Config.shared.pasteboardDeduplicate
{
shouldDispatchEvent = true
} else {
print("[*] event content did not change, ignore dispatch")
}
previousPasteboardEvent = event
if shouldDispatchEvent { prepareWorkflow(forPasteboardEvent: event) }
}
private func obtainRunningApplication() -> AppInfo? {
if let axApp = obtainRunningApplicationUsingAXElement() {
return axApp
}
if let currentApplication = NSWorkspace.shared.menuBarOwningApplication,
let name = currentApplication.localizedName,
let bundleIdentifier = currentApplication.bundleIdentifier
{
return AppInfo(name: name, bundleIdentifier: bundleIdentifier)
}
if let currentApplication = NSWorkspace.shared.frontmostApplication,
let name = currentApplication.localizedName,
let bundleIdentifier = currentApplication.bundleIdentifier
{
return AppInfo(name: name, bundleIdentifier: bundleIdentifier)
}
return nil
}
private func obtainRunningApplicationUsingAXElement() -> AppInfo? {
let systemWideElement: AXUIElement = AXUIElementCreateSystemWide()
var focusedElement: AnyObject?
AXUIElementCopyAttributeValue(
systemWideElement,
kAXFocusedUIElementAttribute as CFString,
&focusedElement
)
guard let element = focusedElement else { return nil }
var pid: pid_t = 0
AXUIElementGetPid(element as! AXUIElement, &pid)
guard pid > 0 else { return nil }
let runningApp = NSRunningApplication(processIdentifier: pid)
if let name = runningApp?.localizedName,
let bundleIdentifier = runningApp?.bundleIdentifier
{
return AppInfo(name: name, bundleIdentifier: bundleIdentifier)
}
return nil
}
private func prepareWorkflow(forPasteboardEvent pasteboardEvent: PEvent) {
assert(!Thread.isMainThread)
guard !eventBlockaded else {
print("[*] this pasteboard has been blockaded due to other process exists")
return
}
PasteboardManager.shared.eventBlockaded = true
defer {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
PasteboardManager.shared.eventBlockaded = false
}
}
print("[*] calling workflow manager to resolve event")
print(" content length \(pasteboardEvent.content.count)")
print(" from \(pasteboardEvent.app?.bundleIdentifier ?? "unknown") (\(pasteboardEvent.app?.name ?? "nope"))")
ActionManager.shared.handle(pasteboardEvent: pasteboardEvent)
}
}
================================================
FILE: App/Action/Action/Backend/StatusBarManager/StatusBarManager.swift
================================================
//
// StatusBarManager.swift
// Action
//
// Created by Lakr Aream on 2022/7/26.
//
import Foundation
final class StatusBarManager {
var hasWindowOpened: Bool = false
static let shared = StatusBarManager()
private init() {}
}
================================================
FILE: App/Action/Action/Extension/AES.swift
================================================
//
// AES.swift
// PTFoundation
//
// Created by Lakr Aream on 12/15/20.
//
import CommonCrypto
import Foundation
import KeychainAccess
private var bundleId: String {
guard let id = Bundle.main.bundleIdentifier,
!id.isEmpty
else {
fatalError("AES Engine requires bundle identifier to work")
}
return id
}
private let keychainServiceID = "wiki.qaq.ActionBee.kcAccess"
private let keychainMainKeyID = "wiki.qaq.ActionBee.keychainMainKeyID"
private let keychainLabel = "ActionBee Main Crypto Key"
private let keychainComment = "ActionBee requires this crypto key to access your encrypted data and sign sensitive information."
public struct AES {
private let key: Data
private let iv: Data
public static let shared: AES = {
#if DEBUG
var keyBuilder = ""
#if os(macOS)
let platformExpert = IOServiceGetMatchingService(
kIOMainPortDefault,
IOServiceMatching("IOPlatformExpertDevice")
)
guard platformExpert > 0 else {
fatalError()
}
guard let serialNumber = (
IORegistryEntryCreateCFProperty(
platformExpert,
kIOPlatformSerialNumberKey as CFString,
kCFAllocatorDefault,
0
)
.takeUnretainedValue() as? String
)
else {
fatalError()
}
IOObjectRelease(platformExpert)
keyBuilder = serialNumber
#else
keyBuilder = "0xdeadbeef & 0xbadf00d & 0xdeadbeef & 0xbadf00d & 0xdeadbeef & 0xbadf00d"
#endif
let key = keyBuilder + keyBuilder + keyBuilder
guard let aes = AES(key: key, iv: key) else {
fatalError("failed to initialize crypto engine")
}
return aes
#else
let keychain = Keychain(service: keychainServiceID)
var retry = 3
var key: String?
repeat {
defer { retry -= 1 }
do {
let main = try keychain.getString(keychainMainKeyID)
if let main = main, main.count > 2 {
key = main
break
} else {
try keychain.remove(keychainMainKeyID)
let new = UUID().uuidString
key = new
try keychain
.label(keychainLabel)
.comment(keychainComment)
.set(new, key: keychainMainKeyID)
break
}
} catch {
continue
}
} while retry > 0
guard let key = key else {
fatalError("failed to load crypto keys")
}
guard let aes = AES(key: key, iv: key) else {
fatalError("failed to initialize crypto engine")
}
return aes
#endif
}()
internal init?(key initKey: String, iv initIV: String) {
if initKey.count < kCCKeySizeAES128 || initIV.count < kCCBlockSizeAES128 {
return nil
}
var initKey = initKey
while initKey.count < 32 {
initKey += initKey
}
while initKey.count > 32 {
initKey.removeLast()
}
guard initKey.count == kCCKeySizeAES128 || initKey.count == kCCKeySizeAES256,
let keyData = initKey.data(using: .utf8)
else {
return nil
}
var initIV = initIV
while initIV.count < kCCBlockSizeAES128 {
initIV += initIV
}
while initIV.count > kCCBlockSizeAES128 {
initIV.removeLast()
}
guard initIV.count == kCCBlockSizeAES128, let ivData = initIV.data(using: .utf8) else {
return nil
}
key = keyData
iv = ivData
}
// MARK: - API
public func encrypt(data: Data) -> Data? {
crypt(data: data, option: CCOperation(kCCEncrypt))
}
public func decrypt(data: Data) -> Data? {
crypt(data: data, option: CCOperation(kCCDecrypt))
}
// MARK: - INTERNAL
private func crypt(data: Data?, option: CCOperation) -> Data? {
guard let data = data else { return nil }
let cryptLength = data.count + kCCBlockSizeAES128
var cryptData = Data(count: cryptLength)
let keyLength = key.count
let options = CCOptions(kCCOptionPKCS7Padding)
var bytesLength = Int(0)
let status = cryptData.withUnsafeMutableBytes { cryptBytes in
data.withUnsafeBytes { dataBytes in
iv.withUnsafeBytes { ivBytes in
key.withUnsafeBytes { keyBytes in
CCCrypt(option, CCAlgorithm(kCCAlgorithmAES), options, keyBytes.baseAddress, keyLength, ivBytes.baseAddress, dataBytes.baseAddress, data.count, cryptBytes.baseAddress, cryptLength, &bytesLength)
}
}
}
}
guard UInt32(status) == UInt32(kCCSuccess) else {
assertionFailure()
return nil
}
cryptData.removeSubrange(bytesLength ..< cryptData.count)
return cryptData
}
}
================================================
FILE: App/Action/Action/Extension/Data.swift
================================================
//
// Data.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import CommonCrypto
import Foundation
extension Data {
func sha256() -> String {
var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
withUnsafeBytes {
_ = CC_SHA256($0.baseAddress, CC_LONG(count), &digest)
}
let hexBytes = digest.map { String(format: "%02hhx", $0) }
let sha256Hex = hexBytes.joined()
return sha256Hex
}
}
================================================
FILE: App/Action/Action/Extension/DispatchQueue.swift
================================================
//
// DispatchQueue.swift
// Action
//
// Created by Lakr Aream on 2022/8/15.
//
import Foundation
extension DispatchQueue {
static func withMainAndWait(block: @escaping () -> Void) {
assert(!Thread.isMainThread)
guard !Thread.isMainThread else {
block()
return
}
let sem = DispatchSemaphore(value: 0)
DispatchQueue.main.async {
block()
sem.signal()
}
sem.wait()
}
}
================================================
FILE: App/Action/Action/Extension/Notification.swift
================================================
//
// Notification.swift
// Action
//
// Created by Lakr Aream on 2022/8/15.
//
import Foundation
extension Notification.Name {
static let editAction = Notification.Name("wiki.qaq.editAction")
}
================================================
FILE: App/Action/Action/Extension/Result.swift
================================================
//
// Result.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import Foundation
public extension Result where Success == Void {
static var success: Result { .success(()) }
}
================================================
FILE: App/Action/Action/Extension/Throttle.swift
================================================
// SwiftThrottle.swift
// Twitter @Lakr233
//
// Created by Lakr Aream on 12/12/20.
//
import Foundation
/*
This throttle is intended to prevent the program from crashing with
too many requests or is used for saving computer resources.
** Swift Throttle is not designed for operations that require high time accuracy **
*/
// MARK: - THROTTLE
public class Throttle {
// MARK: - PROPERTY
/// Setup with these values to control the throttle behave
/// - minimumDelay >= 0.5 second is suggested
public private(set) var minimumDelay: TimeInterval
public private(set) var workingQueue: DispatchQueue
/// lock when dispatch job to execution
private var executeLock = NSLock()
/// These value controls throttle behavior
public private(set) var lastExecute: Date?
public private(set) var lastRequestWasCanceled: Bool = false
public private(set) var scheduled: Bool = false
/// Lock when setting jobs, required by thread safe design
private var _assignmentLock = NSLock()
private var _assignment: (() -> Void)?
public private(set) var assignment: (() -> Void)? {
set {
_assignmentLock.lock()
defer { _assignmentLock.unlock() }
_assignment = newValue
}
get {
_assignmentLock.lock()
defer { _assignmentLock.unlock() }
return _assignment
}
}
// MARK: - INIT
/// Create a throttle
/// - Parameters:
/// - minimumDelay: in second
/// - queue: the queue that job will executed on, default to main
public init(minimumDelay delay: TimeInterval,
queue: DispatchQueue = DispatchQueue.main)
{
minimumDelay = delay
workingQueue = queue
#if DEBUG
if minimumDelay < 0.5 {
// we suggest minimumDelay to be at least 0.5 second
debugPrint("[SwiftThrottle] "
+ "minimumDelay(\(minimumDelay) less then 0.5s will be inaccurate"
+ ", last callback not guaranteed")
}
#endif
}
// MARK: - API
/// Update property minimumDelay
/// - Parameter interval: in second
public func updateMinimumDelay(interval: Double) {
executeLock.lock()
minimumDelay = interval
executeLock.unlock()
}
/// Assign job to throttle
/// - Parameter job: call block
public func throttle(job: (() -> Void)?) {
realThrottle(job: job, useAssignment: false)
}
// MARK: - BACKEND
/// Check nothing but execute
/// - Parameter capturedJob: block to execute
private func releaseExec(capturedJob: @escaping (() -> Void)) {
lastExecute = Date()
workingQueue.async {
capturedJob()
}
}
/// Throttle is working here
/// - Parameters:
/// - job: block that was required to execute
/// - useAssignment: shall we overwrite assigned job?
private func realThrottle(job: (() -> Void)?, useAssignment: Bool) {
// lock down every thing when resigning job
executeLock.lock()
defer { self.executeLock.unlock() }
// if called from rescheduled job, cancel job overwrite
var capturedJobDecision: (() -> Void)?
if !useAssignment {
// resign job every time calling from user
assignment = job
capturedJobDecision = job
} else {
capturedJobDecision = assignment
}
guard let capturedJob = capturedJobDecision else { return }
// MARK: LOCK BEGIN
if let lastExec = lastExecute {
// executed before, value negative
let timeBetween = -lastExec.timeIntervalSinceNow
if timeBetween < minimumDelay {
// The throttle will be reprogrammed once for future execution
lastRequestWasCanceled = true
if !scheduled {
scheduled = true
let dispatchTime = Double(minimumDelay - timeBetween + 0.01)
// Preventing trigger failures
// This is where the inaccuracy comes from
workingQueue.asyncAfter(deadline: .now() + dispatchTime) {
self.realThrottle(job: nil, useAssignment: true)
self.scheduled = false
}
}
} else {
// Throttle release to execution
releaseExec(capturedJob: capturedJob)
}
}
else // never called before, release to execution
{
releaseExec(capturedJob: capturedJob)
}
// MARK: LOCK END
}
}
================================================
FILE: App/Action/Action/Extension/UserDefault.swift
================================================
//
// UserDefault.swift
// Action
//
// Created by Lakr Aream on 2022/8/15.
//
import Foundation
#if DEBUG
private let keyPrefix = "debug."
#else
private let keyPrefix = ""
#endif
@propertyWrapper
struct UserDefaultsWrapper<Value> {
let key: String
let defaultValue: Value
var storage: UserDefaults = .standard
init(key: String, defaultValue: Value, storage: UserDefaults = .standard) {
self.key = keyPrefix + key
self.defaultValue = defaultValue
self.storage = storage
}
var wrappedValue: Value {
get {
let value = storage.value(forKey: key) as? Value
return value ?? defaultValue
}
set {
storage.setValue(newValue, forKey: key)
}
}
}
extension UserDefaultsWrapper where Value: ExpressibleByNilLiteral {
init(key: String, storage: UserDefaults = .standard) {
self.init(key: key, defaultValue: nil, storage: storage)
}
}
private let documentEncoder = PropertyListEncoder()
private let documentDecoder = PropertyListDecoder()
@propertyWrapper
struct CodableDefaultsWrapper<Value: Codable> {
let key: String
let defaultValue: Value
var storage: UserDefaults = .standard
init(key: String, defaultValue: Value, storage: UserDefaults = .standard) {
self.key = keyPrefix + key
self.defaultValue = defaultValue
self.storage = storage
}
var wrappedValue: Value {
get {
guard let data = storage.value(forKey: key) as? Data,
let value = try? documentDecoder.decode(Value.self, from: data)
else {
return defaultValue
}
return value
}
set {
guard let data = try? documentEncoder.encode(newValue) else {
return
}
storage.setValue(data, forKey: key)
}
}
}
@propertyWrapper
struct EncryptedCodableDefaultsWrapper<Value: Codable> {
let key: String
let defaultValue: Value
var storage: UserDefaults = .standard
init(key: String, defaultValue: Value, storage: UserDefaults = .standard) {
self.key = keyPrefix + key
self.defaultValue = defaultValue
self.storage = storage
}
var wrappedValue: Value {
get {
guard let data = storage.value(forKey: key) as? Data,
let decrypted = AES.shared.decrypt(data: data),
let value = try? documentDecoder.decode(Value.self, from: decrypted)
else {
return defaultValue
}
return value
}
set {
guard let data = try? documentEncoder.encode(newValue),
let encrypt = AES.shared.encrypt(data: data)
else {
return
}
storage.setValue(encrypt, forKey: key)
}
}
}
extension EncryptedCodableDefaultsWrapper where Value: ExpressibleByNilLiteral {
init(key: String, storage: UserDefaults = .standard) {
self.init(key: key, defaultValue: nil, storage: storage)
}
}
================================================
FILE: App/Action/Action/Extension/View.swift
================================================
//
// View.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import SwiftUI
extension View {
func usePreferredContentSize() -> some View {
frame(
minWidth: 400, idealWidth: 500, maxWidth: .infinity,
minHeight: 300, idealHeight: 350, maxHeight: .infinity,
alignment: .center
)
}
}
================================================
FILE: App/Action/Action/Interface/ActionModule/ModuleCreateView.swift
================================================
//
// ModuleCreateView.swift
// Action
//
// Created by Lakr Aream on 2022/7/26.
//
import SwiftUI
struct ModuleCreateSheet: View {
@Environment(\.presentationMode) var presentationMode
@State var moduleName: String = "Module - 0x\(Int.random(in: 100_000 ... 999_999))"
@State var selectedTemplate: ActionManager.ModuleTemplateIdentifier = .swift
@State var showProgress: Bool = false
var body: some View {
VStack(alignment: .leading, spacing: 6) {
if showProgress {
ProgressView()
.frame(maxWidth: .infinity, maxHeight: .infinity)
} else {
Label("Create Action", systemImage: "doc.badge.gearshape.fill")
.font(.system(.headline, design: .rounded))
Divider()
TextField("Module Name", text: $moduleName)
Picker("Language", selection: $selectedTemplate) {
ForEach(ActionManager.ModuleTemplateIdentifier.allCases, id: \.self) { template in
Text(template.obtainTemplateDetails().getLanguage())
}
}
Divider()
HStack {
Button("Cancel") {
presentationMode.wrappedValue.dismiss()
}
.keyboardShortcut(.cancelAction)
Spacer()
Button("Next") {
callCreate()
}
.buttonStyle(.borderedProminent)
.keyboardShortcut(.defaultAction)
}
}
}
.padding()
.frame(width: 300, alignment: .center)
}
func callCreate() {
showProgress = true
DispatchQueue.global().async {
var actionId: UUID?
defer {
DispatchQueue.main.async {
presentationMode.wrappedValue.dismiss()
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
if let id = actionId {
ActionManager.shared.initialingAciton.insert(id)
NotificationCenter.default.post(name: .editAction, object: id)
}
}
}
print("[*] \(moduleName) \(selectedTemplate)")
actionId = ActionManager.shared.createAction(
withName: moduleName,
withModuleTemplate: selectedTemplate
)
}
}
}
================================================
FILE: App/Action/Action/Interface/ActionModule/ModuleEditView.swift
================================================
//
// ModuleEditView.swift
// Action
//
// Created by Lakr Aream on 2022/8/15.
//
import SwiftUI
import SymbolPicker
struct ModuleEditView: View {
let id: UUID
@Environment(\.presentationMode) var presentationMode
@State var editingAction: ActionManager.Action? = nil
@State var actionEnabled: Bool = true
@State var openSymbolPicker: Bool = false
@State var openCompileView: Bool = false
@State var hoverApplication: String? = nil
@State var compileLog: String = ""
@State var compilerFinished: Bool = false
var body: some View {
VStack(alignment: .leading, spacing: 8) {
if editingAction == nil {
brokenModule
} else {
HStack {
Label("Edit Action", systemImage: "slider.horizontal.3")
.font(.system(.headline, design: .rounded))
Spacer()
Button {
delete()
} label: {
Image(systemName: "trash")
.font(.system(.headline, design: .rounded))
.foregroundColor(.accentColor)
}
.buttonStyle(.plain)
}
Divider()
basicMetaBlock
enableForAppsBlock
editCodeBlock
Divider()
HStack {
Button("Cancel") {
presentationMode.wrappedValue.dismiss()
}
.keyboardShortcut(.cancelAction)
Spacer()
Button("Save") {
finalizeEdit()
}
.buttonStyle(.borderedProminent)
.keyboardShortcut(.defaultAction)
}
}
}
.onAppear {
editingAction = ActionManager.shared[id]
actionEnabled = ActionManager.shared.enabledActions.contains(id)
}
.opacity(openCompileView ? 0 : 1)
.overlay(compileOverlay)
.padding()
.frame(width: 500, alignment: .center)
}
var compileOverlay: some View {
VStack(alignment: .leading) {
if !compilerFinished { ProgressView().padding(.top, 20) }
Spacer().frame(height: 20)
Text(compilerFinished ? "Compile Finished" : "Compiling Source")
.font(.headline)
Spacer().frame(height: 6)
if !compilerFinished { RandomCodeTextView() }
Divider()
ScrollView(.vertical, showsIndicators: true) {
VStack(alignment: .leading, spacing: 4) {
ForEach(Array(
compileLog
.components(separatedBy: "\n")
.reversed()
.enumerated()
), id: \.offset) { _, log in
Text(log).textSelection(.enabled)
}
.font(.system(.footnote, design: .monospaced))
.opacity(0.5)
}
}
Button("Cancel") {
compileLog = ""
openCompileView = false
}
.opacity(compilerFinished ? 1 : 0)
}
.opacity(openCompileView ? 1 : 0)
}
var brokenModule: some View {
VStack {
Image(systemName: "xmark.seal.fill")
.font(.system(size: 36, weight: .semibold, design: .rounded))
.foregroundColor(.pink)
.frame(width: 80, height: 80)
Text("Broken Module")
.font(.headline)
Divider()
HStack {
Button("Delete") {
ActionManager.shared.deleteModule(withId: id)
}
Button("Close") {
presentationMode.wrappedValue.dismiss()
}
.buttonStyle(.borderedProminent)
}
}
.padding()
}
var actionIcon: String {
guard let icon = editingAction?.icon,
!icon.isEmpty
else {
return "text.append"
}
return icon
}
var basicMetaBlock: some View {
Group {
Toggle("Enabled", isOn: $actionEnabled)
.font(.system(.headline, design: .rounded))
HStack {
Button {
openSymbolPicker = true
} label: {
Image(systemName: actionIcon)
}
TextField("Name", text: Binding<String>(
get: {
editingAction?.name ?? ""
},
set: { newValue in
editingAction?.name = newValue
}
))
Text("Timeout: ")
TextField("Name", text: Binding<String>(
get: {
String(editingAction?.timeout ?? 5)
},
set: { newValue in
editingAction?.timeout = Int(newValue) ?? 5
}
))
.frame(width: 26)
Text("s")
}
Text("ID: \(editingAction?.id.uuidString ?? "0x4422DEADBEEF")")
.textSelection(.enabled)
.font(.system(.footnote, design: .monospaced))
}
.sheet(isPresented: $openSymbolPicker) {
SymbolPicker(symbol: Binding<String>(
get: {
actionIcon
},
set: { newValue in
editingAction?.icon = newValue
}
))
}
}
var enableForAppsBlock: some View {
Group {
HStack {
Text("Enable In App")
.font(.system(.headline, design: .rounded))
Spacer()
Button {
addApp()
} label: {
Image(systemName: "plus")
.foregroundColor(.accentColor)
.font(.system(.headline, design: .rounded))
}
.buttonStyle(.plain)
}
if let appList = editingAction?.enabledAppList,
!appList.isEmpty
{
ScrollView(.horizontal, showsIndicators: false) {
HStack {
ForEach(appList, id: \.self) { appId in
ApplicationView(appId: appId)
.blur(radius: hoverApplication == appId ? 6 : 0)
.overlay {
Button {
editingAction?.enabledAppList = editingAction?
.enabledAppList
.filter { $0 != appId }
?? []
} label: {
Image(systemName: "xmark")
.foregroundColor(.white)
.font(.system(.headline, design: .rounded))
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.black.opacity(0.5))
.cornerRadius(4)
}
.buttonStyle(.plain)
.opacity(hoverApplication == appId ? 1 : 0)
}
.animation(.interactiveSpring(), value: hoverApplication)
.onHover { hover in
if hover {
hoverApplication = appId
} else {
hoverApplication = nil
}
}
}
}
}
.frame(height: 26)
} else {
Button {
addApp()
} label: {
Label("Enabled for All Apps", systemImage: "app.badge.checkmark")
.font(.system(.subheadline, design: .rounded))
.frame(height: 26)
.frame(maxWidth: .infinity)
.background(Color.accentColor.opacity(0.1))
.cornerRadius(4)
}
.buttonStyle(.plain)
}
Text("This pasteboard action will only run if copying from these apps")
.textSelection(.enabled)
.font(.system(.footnote))
}
}
var editCodeBlock: some View {
Group {
Text("Coding")
.font(.system(.headline, design: .rounded))
HStack(spacing: 8) {
Button("Edit Code") {
editModule()
}
.buttonStyle(.borderedProminent)
Button("Show in Finder") {
showInFinder()
}
Button("Export") {
exportModule()
}
}
VStack(alignment: .leading, spacing: 2) {
Text("Module Template: \(editingAction?.template.obtainTemplateDetails().getLanguage() ?? "Unknown")")
Text(editingAction?.template.obtainTemplateDetails().getBuildHint() ?? "No Build Hint")
.underline()
Text("You should recompile, click save, this module each time you edit it")
}
.textSelection(.enabled)
.font(.system(.footnote))
}
}
func finalizeEdit() {
guard ActionManager.shared[id] != nil else {
presentationMode.wrappedValue.dismiss()
return
}
guard let action = editingAction else {
presentationMode.wrappedValue.dismiss()
return
}
ActionManager.shared.invalidateArtifactCache(forAction: id)
ActionManager.shared.enabledActions = ActionManager.shared
.enabledActions
.filter { $0 != id }
guard actionEnabled else {
presentationMode.wrappedValue.dismiss()
return
}
ActionManager.shared.enabledActions += [id]
ActionManager.shared.initialingAciton.remove(id)
compile { result in
switch result {
case .success:
ActionManager.shared[id] = action
presentationMode.wrappedValue.dismiss()
case let .failure(failure):
compilerFinished = true
let alert = NSAlert()
alert.alertStyle = .critical
alert.messageText = "Unable to compile this action: \(failure.message)"
if let window = NSApp.keyWindow {
alert.beginSheetModal(for: window)
} else {
alert.runModal()
}
}
}
}
func delete() {
let alert = NSAlert()
alert.messageText = NSLocalizedString("Are you sure you want to delete this module? This operation can not be undone.", comment: "")
alert.alertStyle = .critical
alert.addButton(withTitle: NSLocalizedString("Delete", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
guard let window = NSApp.keyWindow else {
return
}
alert.beginSheetModal(for: window) { resp in
guard resp == .alertFirstButtonReturn else {
return
}
presentationMode.wrappedValue.dismiss()
DispatchQueue.main.async {
ActionManager.shared[id] = nil
}
}
}
func addApp() {
let openPanel = NSOpenPanel()
openPanel.prompt = NSLocalizedString("Select Application", comment: "")
openPanel.allowedContentTypes = [.application]
openPanel.allowsMultipleSelection = true
openPanel.canChooseDirectories = true
openPanel.treatsFilePackagesAsDirectories = true
openPanel.directoryURL = URL(fileURLWithPath: "/Applications/")
guard let window = NSApp.keyWindow else {
return
}
openPanel.beginSheetModal(for: window) { resp in
guard resp == .OK else {
return
}
var buildId: Set<String> = []
for id in editingAction?.enabledAppList ?? [] {
buildId.insert(id)
}
for url in openPanel.urls {
guard let bundle = Bundle(path: url.path),
let id = bundle.bundleIdentifier
else {
continue
}
buildId.insert(id)
}
editingAction?.enabledAppList = Array(buildId).sorted()
}
}
func showInFinder() {
let url = ActionManager
.shared
.actionModuleBaseUrl
.appendingPathComponent(editingAction?.id.uuidString ?? "")
guard NSWorkspace.shared.open(url) else {
let alert = NSAlert()
alert.alertStyle = .critical
alert.messageText = NSLocalizedString("Failed to load this module", comment: "")
if let window = NSApp.keyWindow {
alert.beginSheetModal(for: window)
}
return
}
}
func editModule() {
let result = editingAction?.template.obtainTemplateDetails()
.openDesignatedEditor(id: id)
if case let .failure(failure) = result {
let alert = NSAlert()
alert.alertStyle = .critical
alert.messageText = failure.message
if let window = NSApp.keyWindow {
alert.beginSheetModal(for: window)
}
}
}
func exportModule() {
let panel = NSSavePanel()
panel.nameFieldStringValue = "Module Export - \(editingAction?.name ?? "Unnamed")"
guard let window = NSApp.keyWindow else {
return
}
panel.beginSheetModal(for: window) { resp in
guard resp == .OK,
let url = panel.url
else {
return
}
ActionManager.shared.updateActionModuleManifest(onActionId: id)
try? FileManager.default.removeItem(at: url)
try? FileManager.default.copyItem(
at: ActionManager.shared.actionModuleBaseUrl.appendingPathComponent(id.uuidString),
to: url
)
}
}
func compile(completion: @escaping (Result<Void, ActionManager.GenericActionError>) -> Void = { _ in }) {
openCompileView = true
guard let action = editingAction else {
openCompileView = false
completion(.failure(.brokenResources))
return
}
DispatchQueue.global().async {
let result = ActionManager.shared.issueCompile(forAction: action.id) { str in
DispatchQueue.withMainAndWait {
compileLog.append(str)
}
}
DispatchQueue.main.async {
completion(result)
}
}
}
}
================================================
FILE: App/Action/Action/Interface/ActionModule/ModuleElementView.swift
================================================
//
// ModuleElementView.swift
// Action
//
// Created by Lakr Aream on 2022/8/15.
//
import SwiftUI
struct ModuleElementView: View {
let id: UUID
let notificationPublisher = NotificationCenter
.default
.publisher(for: .editAction)
.receive(on: RunLoop.main)
@StateObject var actionManager = ActionManager.shared
@State var openEdit: Bool = false
var gradientColor: Gradient {
if actionManager.enabledActions.contains(id) {
if actionManager.artifacts[id] == nil {
return Gradient(colors: [.pink, .red])
} else {
return Gradient(colors: [.yellow, .orange])
}
} else {
return Gradient(colors: [.gray, .black.opacity(0.8)])
}
}
var body: some View {
Button {
openEdit = true
} label: {
LinearGradient(
gradient: gradientColor,
startPoint: .topTrailing,
endPoint: .bottomTrailing
)
.overlay { Color.orange.opacity(0.5) }
.overlay { content }
.cornerRadius(8)
.clipped()
.frame(width: 140, height: 80)
}
.overlay {
if actionManager.artifacts[id] == nil {
Image(systemName: "xmark.octagon.fill")
.foregroundColor(.white)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
.padding(4)
}
}
.buttonStyle(.plain)
.onHover { hover in
if hover {
NSCursor.pointingHand.push()
} else {
NSCursor.pop()
}
}
.onReceive(notificationPublisher) { notification in
guard let notificationId = notification.object as? UUID,
notificationId == id
else {
return
}
openEdit = true
}
.sheet(isPresented: $openEdit) {
ModuleEditView(id: id)
}
}
var content: some View {
Group {
if let action = actionManager[id] {
VStack(spacing: 4) {
Image(systemName: action.icon)
.font(.system(.headline, design: .rounded))
.foregroundColor(.white)
.frame(maxWidth: .infinity, alignment: .leading)
Spacer()
Text(action.name)
.font(.system(.headline, design: .rounded))
.lineLimit(3)
.foregroundColor(.white)
.frame(maxWidth: .infinity, alignment: .leading)
}
.background(
Image(systemName: action.icon)
.font(.system(size: 48, weight: .semibold, design: .rounded))
.foregroundColor(.white)
.opacity(0.1)
.offset(x: 50, y: 10)
)
.padding(8)
} else {
Text("Error").font(.headline)
}
}
}
}
================================================
FILE: App/Action/Action/Interface/ActionModule/ModuleImportView.swift
================================================
//
// ModuleImportView.swift
// Action
//
// Created by Lakr Aream on 2022/8/18.
//
import SwiftUI
struct ModuleImportView: View {
let url: URL
@Environment(\.presentationMode) var presentationMode
@State var openEdit: Bool = false
@State var editingAction: ActionManager.Action.ID? = nil
var body: some View {
VStack(alignment: .leading, spacing: 12) {
Image(systemName: "exclamationmark.triangle.fill")
.font(.system(size: 42, weight: .semibold, design: .rounded))
.foregroundColor(.pink)
Text("You are about to import an untrusted module")
.font(.system(.headline))
.foregroundColor(.pink)
Text("Importing malicious module may damage your system, you are in charge to review this module.")
.font(.system(.footnote))
.foregroundColor(.pink)
HStack {
Button("Trust & Import") {
startImport()
}
.keyboardShortcut(.defaultAction)
.tint(.pink)
.buttonStyle(.borderedProminent)
Button("Cancel") {
presentationMode.wrappedValue.dismiss()
}
.keyboardShortcut(.cancelAction)
}
Divider()
Text(url.path)
.underline()
.font(.system(.footnote, design: .monospaced))
.opacity(0.5)
.onHover { if $0 { NSCursor.pointingHand.push() } else { NSCursor.pop() }}
.onTapGesture { NSWorkspace.shared.open(url) }
}
.padding()
.sheet(isPresented: $openEdit) {
ModuleEditView(id: editingAction ?? .init())
}
.onChange(of: openEdit) { newValue in
if newValue == false, editingAction != nil {
presentationMode.wrappedValue.dismiss()
}
}
.frame(width: 400)
}
func startImport() {
DispatchQueue.global().async {
let result = ActionManager.shared.importModule(at: url)
DispatchQueue.main.async {
switch result {
case let .success(action):
openEdit = true
editingAction = action
case let .failure(failure):
guard let window = NSApp.keyWindow else {
presentationMode.wrappedValue.dismiss()
return
}
let alert = NSAlert()
alert.alertStyle = .critical
alert.messageText = failure.localizedDescription
alert.addButton(withTitle: "OK")
alert.beginSheetModal(for: window) { _ in
presentationMode.wrappedValue.dismiss()
}
}
}
}
}
}
================================================
FILE: App/Action/Action/Interface/ActionModule/ModuleManageView.swift
================================================
//
// ModuleManageView.swift
// Action
//
// Created by Lakr Aream on 2022/7/26.
//
import SwiftUI
struct ModuleManageView: View {
@ObservedObject var actionManager = ActionManager.shared
@State var searchKey: String = ""
@State var openCreate: Bool = false
@State var importQueue: [URL]? = nil
@State var importingItem: URL? = nil
var actions: [ActionManager.Action] {
if searchKey.isEmpty {
return actionManager.actions
} else {
let key = searchKey.lowercased()
return actionManager
.actions
.filter { $0.name.lowercased().contains(key) }
}
}
var body: some View {
GeometryReader { r in
if actionManager.actions.isEmpty {
VStack(spacing: 12) {
Image(systemName: "arrow.up")
.font(.system(size: 26, weight: .regular, design: .rounded))
Text("Create an action by click plus button on toolbar to process your pasteboard event. Format text, clean up links, speak when copy from special app, send to your device, etc etc. Choose an language you are familiar with to get start.")
.font(.system(.subheadline))
}
.padding()
.frame(maxWidth: .infinity, maxHeight: .infinity)
} else {
ScrollView {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 140, maximum: 140))], alignment: .leading, spacing: 8) {
ForEach(actions, id: \.hashValue) { action in
ModuleElementView(id: action.id)
}
}
.padding(10)
.animation(.interactiveSpring(), value: r.size)
.animation(.interactiveSpring(), value: searchKey)
}
}
}
.sheet(isPresented: $openCreate) { ModuleCreateSheet() }
.sheet(
isPresented: Binding<Bool>(
get: { importingItem != nil },
set: { opened in
importingItem = nil
if !opened {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
if !(importQueue?.isEmpty ?? true) {
importQueue?.removeFirst()
}
checkImportQueue()
}
}
}
)
) {
ModuleImportView(url: importingItem ?? URL(fileURLWithPath: "/bad/"))
}
.searchable(text: $searchKey)
.toolbar {
ToolbarItem {
Button {
openCreate = true
} label: {
Label("Add Action", systemImage: "plus")
}
.keyboardShortcut("n", modifiers: .command)
}
ToolbarItem {
Button {
importActions()
} label: {
Label("Import Action", systemImage: "square.and.arrow.down")
}
}
}
.navigationTitle("Module")
.usePreferredContentSize()
}
func checkImportQueue() {
guard let newValue = importQueue else {
return
}
guard !newValue.isEmpty else {
importQueue = nil
importingItem = nil
return
}
importingItem = newValue.first
}
func importActions() {
let panel = NSOpenPanel()
panel.canChooseDirectories = true
panel.canChooseFiles = false
panel.resolvesAliases = true
panel.treatsFilePackagesAsDirectories = true
panel.allowsMultipleSelection = true
guard let window = NSApp.keyWindow else {
return
}
panel.beginSheetModal(for: window) { resp in
guard resp == .OK,
!panel.urls.isEmpty
else {
return
}
self.importQueue = panel.urls
self.checkImportQueue()
}
}
func importModule(at: URL) {
assert(!Thread.isMainThread)
let sem = DispatchSemaphore(value: 0)
DispatchQueue.main.async {
guard let window = NSApp.keyWindow else {
sem.signal()
return
}
let alert = NSAlert()
alert.alertStyle = .critical
alert.messageText = "You are about to import an Action Module which is untrusted with no signature. Importing malicious modules can pose unknown risks and there is no sandbox nor container dealing with it."
alert.informativeText = at.path
alert.addButton(withTitle: "Trust And Import")
alert.addButton(withTitle: "Cancel")
alert.beginSheetModal(for: window) { resp in
guard resp == .alertFirstButtonReturn else {
sem.signal()
return
}
DispatchQueue.global().async {
let result = actionManager.importModule(at: at)
if case let .failure(failure) = result {
print(failure.localizedDescription)
let sem2 = DispatchSemaphore(value: 0)
DispatchQueue.main.async {
let alert = NSAlert()
alert.alertStyle = .critical
alert.messageText = "Failed to import this module"
alert.informativeText = failure.localizedDescription
alert.beginSheetModal(for: window) { _ in sem2.signal() }
}
sem2.wait()
}
sem.signal()
}
}
}
sem.wait()
}
}
================================================
FILE: App/Action/Action/Interface/Effect/RandomCodeTextView.swift
================================================
//
// RandomCodeTextView.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import SwiftUI
struct RandomCodeTextView: View {
@State var code = "Made with love by @Lakr233 "
let timer = Timer
.publish(every: 0.1, on: .main, in: .common)
.autoconnect()
var body: some View {
Text(code)
.font(.system(.footnote, design: .monospaced))
.lineLimit(1)
.onReceive(timer) { _ in
if code.count > 50 { code = "" }
for _ in 0 ... Int.random(in: 1 ... 3) {
if let c = "`1234567890-=qwertyuiop[]asdfghjkl;'\\zxcvbnm,./".randomElement() {
code += String(c)
}
}
}
}
}
================================================
FILE: App/Action/Action/Interface/Generic/ApplicationView.swift
================================================
//
// ApplicationView.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import SwiftUI
struct ApplicationView: View {
let appId: String
var body: some View {
Group {
if let url = NSWorkspace
.shared
.urlForApplication(withBundleIdentifier: appId),
let bundle = Bundle(url: url)
{
HStack(spacing: 4) {
Image(nsImage: NSWorkspace.shared.icon(forFile: url.path))
.resizable()
.antialiased(true)
.frame(width: 24, height: 24)
.cornerRadius(4)
.clipped()
VStack(alignment: .leading, spacing: 2) {
Text(bundle.infoDictionary?[kCFBundleNameKey as String] as? String ?? "Unknown Name")
.font(.system(size: 10, weight: .semibold, design: .rounded))
.lineLimit(1)
Text(appId)
.font(.system(size: 6, weight: .semibold, design: .monospaced))
.lineLimit(1)
}
}
} else {
HStack(spacing: 4) {
Image(systemName: "questionmark.app.dashed")
.font(.system(size: 16, weight: .regular, design: .rounded))
Text(appId)
.font(.system(size: 10, weight: .semibold, design: .rounded))
}
}
}
.frame(height: 26)
}
}
================================================
FILE: App/Action/Action/Interface/Generic/DiagnosticLogView.swift
================================================
//
// DiagnosticLogView.swift
// Action
//
// Created by Lakr Aream on 2022/8/15.
//
import SwiftUI
class Logger: ObservableObject {
fileprivate static let shared = Logger()
private let logCountLimitation = 4096
private init() {
logs.reserveCapacity(logCountLimitation + 1)
}
struct Log: Identifiable, Equatable {
var id: UUID = .init()
var message: String
}
@Published var logs: [Log] = []
private var logsLock = NSLock()
fileprivate func append(_ str: String) {
DispatchQueue.global().async { [self] in
logsLock.lock()
var read = logs
read.append(.init(message: str))
if read.count > logCountLimitation {
read.removeFirst(read.count - logCountLimitation)
}
DispatchQueue.withMainAndWait {
self.logs = read
}
logsLock.unlock()
}
}
}
// overwrite print function
func print(_ str: String) {
let str = str.trimmingCharacters(in: .newlines)
Swift.print(str)
Logger.shared.append(str)
}
struct DiagnosticLogView: View {
@StateObject var logger = Logger.shared
@State var highlight: Logger.Log.ID?
@State var searchKey: String = ""
var logs: [Logger.Log] {
if searchKey.count > 0 {
let key = searchKey.lowercased()
return logger
.logs
.filter { $0.message.lowercased().contains(key) }
} else {
return logger.logs
}
}
var body: some View {
ScrollView(.vertical, showsIndicators: true) {
ScrollViewReader { reader in
LazyVStack(alignment: .leading, spacing: 0) {
ForEach(logs) { log in
ScrollView(.horizontal, showsIndicators: false) {
Text(log.message)
.textSelection(.enabled)
}
.frame(maxWidth: .infinity)
.padding(2)
.background(
RoundedRectangle(cornerRadius: 4)
.foregroundColor(.accentColor)
.opacity(highlight == log.id ? 0.1 : 0)
.animation(.interactiveSpring(), value: highlight)
)
.tag(log.id)
.onHover { hover in
if hover {
highlight = log.id
} else {
highlight = nil
}
}
}
.font(.system(size: 10, weight: .regular, design: .monospaced))
}
.padding(10)
.onChange(of: logger.logs) { newValue in
guard let id = newValue.last?.id else {
return
}
withAnimation(.interactiveSpring()) {
reader.scrollTo(id)
}
}
}
}
.searchable(text: $searchKey)
.toolbar {
ToolbarItem {
Button {
let panel = NSSavePanel()
panel.nameFieldStringValue = "ActionBee Diagnostic \(Int(Date().timeIntervalSince1970)).log"
guard let window = NSApp.keyWindow else {
return
}
panel.beginSheetModal(for: window) { resp in
guard resp == .OK, let url = panel.url else {
return
}
let logs = logger.logs.map(\.message).joined(separator: "\n")
try? logs.write(toFile: url.path, atomically: true, encoding: .utf8)
}
} label: {
Label("Share", systemImage: "square.and.arrow.up")
}
}
}
.navigationTitle("Diagnostic")
.usePreferredContentSize()
}
}
================================================
FILE: App/Action/Action/Interface/Generic/HistoryView.swift
================================================
//
// HistoryView.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import SwiftUI
struct HistoryView: View {
@StateObject var actionManager = ActionManager.shared
@State var searchKey = ""
@State var hoverId: ActionManager.HistoryElement.ID? = nil
var histories: [ActionManager.HistoryElement] {
if searchKey.isEmpty {
return actionManager.histories
}
let key = searchKey.lowercased()
return actionManager
.histories
.filter { $0.search(with: key) }
}
var body: some View {
Group {
if histories.isEmpty {
VStack(spacing: 12) {
Image(systemName: "rectangle.dashed.badge.record")
.font(.system(size: 26, weight: .regular, design: .rounded))
Text("No History Was Found")
.font(.system(.footnote))
}
.padding()
.frame(maxWidth: .infinity, maxHeight: .infinity)
} else {
ScrollView {
LazyVStack(spacing: 2) {
ForEach(histories.reversed()) { record in
HStack(alignment: .top, spacing: 6) {
Text("> ")
.font(.system(.subheadline, design: .rounded))
Divider()
HistoryRecordView(record: record)
}
.frame(maxWidth: .infinity)
.padding(2)
.background(Color.accentColor.opacity(record.id == hoverId ? 0.1 : 0))
.cornerRadius(8)
.onHover { hover in
hoverId = hover ? record.id : nil
}
}
}
.padding(10)
}
.animation(.interactiveSpring(), value: hoverId)
.animation(.interactiveSpring(), value: searchKey)
}
}
.toolbar {
ToolbarItem {
Button { clearHistory() } label: {
Label("Clear History", systemImage: "xmark.circle")
}
}
}
.searchable(text: $searchKey)
.navigationTitle("History")
.usePreferredContentSize()
}
func clearHistory() {
let alert = NSAlert()
alert.alertStyle = .critical
alert.messageText = NSLocalizedString("Are you sure you want to delete all history records? This operation can not be undone.", comment: "")
alert.addButton(withTitle: NSLocalizedString("Delete", comment: ""))
alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
guard let window = NSApp.keyWindow else {
return
}
alert.beginSheetModal(for: window) { resp in
guard resp == .alertFirstButtonReturn else {
return
}
actionManager.histories = []
}
}
}
struct HistoryRecordView: View {
let record: ActionManager.HistoryElement
var body: some View {
VStack(alignment: .leading, spacing: 4) {
Text("Pasteboard Event")
.font(.system(.subheadline, design: .monospaced))
.bold()
Text("Length: \(record.event.content.count) Action Candidates: \(record.actionCandidates.count)")
if !record.succeedAction.isEmpty {
Divider()
ForEach(record.succeedAction) { item in
Text("+ [\(ActionManager.shared[item.action]?.name ?? "Deleted Action")]")
Text(" Post Action: \(item.recipeAction)")
ScrollView(.horizontal, showsIndicators: false) {
Text(" Content: \(item.recipeContent)").lineLimit(1)
}
}
.foregroundColor(.blue)
}
if !record.failedAction.isEmpty {
Divider()
ForEach(record.failedAction) { item in
Text("- [\(ActionManager.shared[item.action]?.name ?? "Deleted Action")]")
Text(" \(item.errorHint)")
}
.foregroundColor(.pink)
}
Divider()
Text(record.date.formatted(date: .complete, time: .complete))
.opacity(0.5)
}
.font(.system(.footnote, design: .monospaced))
.frame(maxWidth: .infinity, alignment: .leading)
}
}
================================================
FILE: App/Action/Action/Interface/Generic/LicenseView.swift
================================================
//
// LicenseView.swift
// Action
//
// Created by Lakr Aream on 2022/8/17.
//
import SwiftUI
struct LicenseView: View {
@State var agreed = false
@Environment(\.presentationMode) var presentationMode
var licenseText: String {
guard let url = Bundle.main.url(forResource: "License", withExtension: "txt"),
let text = try? String(contentsOfFile: url.path)
else {
return "This app's bundle is broken, do not use it."
}
return text
}
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Label("Software License", systemImage: "flag.2.crossed")
.font(.system(.headline, design: .rounded))
Divider()
ScrollView {
Text(licenseText)
.font(.system(.subheadline, design: .rounded))
}
.frame(maxHeight: 250)
Divider()
HStack {
Toggle("I understand and agree to this license.", isOn: $agreed)
Spacer()
Button("Done") {
ActionApp.agreeToLicense = agreed
presentationMode.wrappedValue.dismiss()
}
.disabled(!agreed)
.buttonStyle(.borderedProminent)
.keyboardShortcut(.defaultAction)
}
}
.padding()
.task {
agreed = ActionApp.agreeToLicense
}
.onChange(of: agreed) { newValue in
if !newValue {
ActionApp.agreeToLicense = false
}
}
.frame(width: 450, alignment: .center)
}
}
================================================
FILE: App/Action/Action/Interface/Generic/MainView.swift
================================================
//
// ContentView.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import SwiftUI
struct MainView: View {
@State var openArgumentsSeet: Bool = false
var body: some View {
NavigationView {
SidebarView()
WelcomeView()
}
.navigationTitle("Action Bee")
.toolbar {
ToolbarItem(placement: .navigation) {
Button {
NSApp.keyWindow?.firstResponder?.tryToPerform(
#selector(NSSplitViewController.toggleSidebar(_:)),
with: nil
)
} label: {
Label("Toggle Sidebar", systemImage: "sidebar.leading")
}
}
}
.sheet(isPresented: $openArgumentsSeet) {
LicenseView()
}
.task {
_ = Menubar.shared
}
.task {
checkRequirements()
}
.onChange(of: openArgumentsSeet) { newValue in
if !newValue { checkRequirements() }
}
}
func checkRequirements() {
guard ActionApp.agreeToLicense else {
openArgumentsSeet = true
return
}
}
}
================================================
FILE: App/Action/Action/Interface/Generic/SettingView.swift
================================================
//
// SettingView.swift
// Action
//
// Created by Lakr Aream on 2022/8/17.
//
import SwiftUI
struct SettingView: View {
@StateObject var config = Config.shared
@State var showLicense = false
var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 10) {
Section {
Toggle("Pasteboard Deduplicate", isOn: $config.pasteboardDeduplicate)
.font(.subheadline)
Text("Pasteboard content matches previous will not generate event if on")
.font(.footnote)
Toggle("Silent Mode", isOn: $config.silentMode)
.font(.subheadline)
Text("Do not show popover after action triggered")
.font(.footnote)
Toggle("Toast Mode", isOn: $config.toastMode)
.font(.subheadline)
.disabled(config.silentMode)
Text("Use toast instead of popover on menubar")
.font(.footnote)
.opacity(config.silentMode ? 0.25 : 1)
Toggle("Reduced UI Effects", isOn: $config.reducedEffects)
.font(.subheadline)
Text("Turning off visual effects does not affect app's core functionality")
.font(.footnote)
} header: {
Text("Application")
.font(.system(.headline, design: .rounded))
} footer: {
Divider()
}
Label("EOF", systemImage: "text.append")
.font(.system(.caption2, design: .rounded))
}
.padding(10)
}
.toolbar {
ToolbarItem {
Button {
NSWorkspace.shared.open(URL(string: "https://github.com/Lakr233/ActionBee")!)
} label: {
Label("Get Source Code", systemImage: "chevron.left.forwardslash.chevron.right")
}
}
ToolbarItem {
Button {
showLicense = true
} label: {
Label("License", systemImage: "flag.2.crossed")
}
.sheet(isPresented: $showLicense) {
LicenseView()
}
}
}
.navigationTitle("Setting")
.usePreferredContentSize()
}
}
================================================
FILE: App/Action/Action/Interface/Generic/SidebarView.swift
================================================
//
// SidebarView.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import SwiftUI
#if DEBUG
private let stubNavigationTarget: some View = Text("Hello World")
.usePreferredContentSize()
#endif
struct SidebarView: View {
var body: some View {
List {
Section("App") {
NavigationLink {
WelcomeView()
} label: {
Label("Welcome", systemImage: "sun.min.fill")
}
}
Section("Action") {
NavigationLink {
ModuleManageView()
} label: {
Label("Module", systemImage: "tray.full")
}
NavigationLink {
HistoryView()
} label: {
Label("History", systemImage: "clock")
}
}
Section("Misc") {
NavigationLink {
SettingView()
} label: {
Label("Setting", systemImage: "gear")
}
NavigationLink {
DiagnosticLogView()
} label: {
Label("Diagnostic", systemImage: "heart.text.square")
}
}
}
.listStyle(SidebarListStyle())
}
}
================================================
FILE: App/Action/Action/Interface/Generic/WelcomeView.swift
================================================
//
// WelcomeView.swift
// Action
//
// Created by Lakr Aream on 2022/7/25.
//
import Colorful
import SwiftUI
struct WelcomeView: View {
@State var config = Config.shared
var version: String {
var ret = "Version: " +
(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown")
+ " Build: " +
(Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown")
#if DEBUG
ret = "👾 \(ret) 👾"
#endif
return ret
}
var body: some View {
ZStack {
if !config.reducedEffects {
ColorfulView(colors: [.accentColor], colorCount: 4)
.ignoresSafeArea()
}
VStack(spacing: 4) {
Image("Avatar")
.antialiased(true)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 128, height: 128)
Spacer().frame(height: 16)
Text("Welcome to Action Bee")
.font(.system(.headline, design: .rounded))
Text("A programmable pasteboard action trigger.")
.font(.system(.body, design: .rounded))
Spacer().frame(height: 24)
}
VStack {
Spacer()
Text(version)
.font(.system(size: 12, weight: .semibold, design: .rounded))
.opacity(0.5)
}
}
.padding()
.navigationTitle("Action Bee")
.usePreferredContentSize()
}
}
================================================
FILE: App/Action/Action/Interface/Menubar/Menubar.swift
================================================
//
// Menubar.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import Cocoa
import SwiftUI
class Menubar: ObservableObject {
static let shared = Menubar()
var popover: NSPopover
var statusItem: NSStatusItem?
var eventMonitor: EventMonitor?
private init() {
let statusItem = NSStatusBar
.system
.statusItem(withLength: NSStatusItem.variableLength)
statusItem.button?.action = #selector(togglePopover(sender:))
self.statusItem = statusItem
let buildPopover = NSPopover()
popover = buildPopover
let view = MenubarView()
buildPopover.contentViewController = NSHostingController(rootView: view)
eventMonitor = EventMonitor(mask: [.leftMouseDown, .rightMouseDown], handler: mouseEventHandler)
statusItem.button?.title = "🎉"
statusItem.button?.target = self
}
func showPopover(_: AnyObject? = nil) {
if let statusBarButton = statusItem?.button {
popover.show(relativeTo: statusBarButton.bounds, of: statusBarButton, preferredEdge: NSRectEdge.maxY)
eventMonitor?.start()
}
}
func hidePopover(_ sender: AnyObject? = nil) {
popover.performClose(sender)
eventMonitor?.stop()
}
func mouseEventHandler(_ event: NSEvent?) {
if popover.isShown, let event = event {
hidePopover(event)
}
}
@objc
func togglePopover(sender: AnyObject) {
if popover.isShown {
hidePopover(sender)
} else {
showPopover(sender)
}
}
enum TitleType: String {
case ready = "🎉"
case running = "💨"
}
private let titleThrottle = Throttle(minimumDelay: 0.5, queue: .main)
func switchTitle(status: TitleType) {
titleThrottle.throttle {
self.statusItem?.button?.title = status.rawValue
}
}
}
extension Menubar {
class EventMonitor {
private var monitor: Any?
private let mask: NSEvent.EventTypeMask
private let handler: (NSEvent?) -> Void
public init(mask: NSEvent.EventTypeMask, handler: @escaping (NSEvent?) -> Void) {
self.mask = mask
self.handler = handler
}
deinit {
stop()
}
public func start() {
monitor = NSEvent.addGlobalMonitorForEvents(matching: mask, handler: handler) as! NSObject
}
public func stop() {
if monitor != nil {
NSEvent.removeMonitor(monitor!)
monitor = nil
}
}
}
}
================================================
FILE: App/Action/Action/Interface/Menubar/MenubarView.swift
================================================
//
// MenubarView.swift
// Action
//
// Created by Lakr Aream on 2022/8/16.
//
import Colorful
import SwiftUI
struct MenubarView: View {
@StateObject var menubar = Menubar.shared
@StateObject var actionManager = ActionManager.shared
var lastHistory: ActionManager.HistoryElement? {
if let last = actionManager.histories.last,
last.date > ActionApp.bootTime
{
return last
}
return nil
}
var body: some View {
ZStack {
if actionManager.actionRunning {
ZStack {
VStack(spacing: 20) {
ProgressView()
Text(actionManager.actionRunningHint)
.font(.system(.subheadline, design: .monospaced))
}
}
.frame(width: 400, height: 200)
} else if let lastHistory = lastHistory {
VStack {
Spacer().frame(height: 16)
Image(
systemName: lastHistory.failedAction.isEmpty
? "checkmark.circle.fill"
: "checkmark.circle.trianglebadge.exclamationmark"
)
.foregroundColor(lastHistory.failedAction.isEmpty ? .green : .orange)
.font(.system(size: 36, weight: .semibold, design: .rounded))
Spacer().frame(height: 16)
HistoryRecordView(record: lastHistory)
Divider().hidden()
}
.padding()
.frame(width: 400)
} else {
VStack(alignment: .leading, spacing: 8) {
Image("Avatar")
.antialiased(true)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 50, height: 50)
HStack {
Image(systemName: "circle.fill")
.font(.headline)
.foregroundColor(.green)
Text("ActionBee is ready to accept pasteboard events.")
.font(.headline)
}
RandomCodeTextView()
Divider().hidden()
}
.padding()
.frame(width: 400, height: 200)
}
}
}
}
================================================
FILE: App/Action/Action/Interface/Toast/Toast.swift
================================================
//
// Toast.swift
// Action
//
// Created by Lakr Aream on 2022/8/17.
//
import Cocoa
import Foundation
import SwiftUI
private class ToastWindow: NSWindow {
init(with screen: NSScreen) {
super.init(
contentRect: screen.frame,
styleMask: [.borderless, .fullSizeContentView],
backing: .buffered,
defer: false
)
isOpaque = false
alphaValue = 1
titleVisibility = .hidden
titlebarAppearsTransparent = true
backgroundColor = .clear
ignoresMouseEvents = true
isMovable = false
isMovableByWindowBackground = false
// .fullScreenAuxiliary .stationary .canJoinAllSpaces
collectionBehavior = NSWindow.CollectionBehavior(rawValue: 273)
styleMask = .borderless
// The standard ScreenSaverView class actually sets the window
// level to 2002, not the 1000 defined by NSScreenSaverWindowLevel
// and kCGScreenSaverWindowLevel
/// https://github.com/genekogan/ofxScreenGrab/blob/master/src/macGlutfix.m
level = NSWindow.Level(rawValue: 2005)
setFrameOrigin(screen.frame.origin)
makeKeyAndOrderFront(nil)
hasShadow = false
}
}
private class ToastWindowController: NSWindowController {
init(with screen: NSScreen, systemIcon: String, message: String) {
super.init(window: ToastWindow(with: screen))
contentViewController = NSHostingController(
rootView: ToastView(systemIcon: systemIcon, message: message)
)
}
@available(*, unavailable)
required init(coder _: NSCoder) {
fatalError()
}
}
struct ToastView: View {
let systemIcon: String
let message: String
@State var opacity: Double = 1
var body: some View {
GeometryReader { _ in
HStack {
Spacer()
VStack {
Spacer()
Spacer()
Spacer()
Spacer()
content
Spacer()
}
Spacer()
}
}
.opacity(opacity)
.animation(.interactiveSpring(), value: opacity)
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
opacity = 0
}
}
}
var content: some View {
VStack(alignment: .center, spacing: 12) {
Image(systemName: systemIcon)
.font(.system(size: 36, weight: .bold, design: .rounded))
Text(message)
.font(.system(.headline, design: .rounded))
}
.padding()
.background(.regularMaterial)
.cornerRadius(8)
}
}
enum Toast {
static func post(systemIcon: String, message: String) {
guard let screen = NSScreen.main else {
return
}
let windowController = ToastWindowController(
with: screen,
systemIcon: systemIcon,
message: message
)
windowController.window?.setFrameOrigin(screen.frame.origin)
windowController.window?.setContentSize(screen.frame.size)
windowController.window?.makeKeyAndOrderFront(nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
windowController.window?.close()
}
}
}
================================================
FILE: App/Action/Action.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
13C6C62128AF1BF0008ADA60 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 13C6C62328AF1BF0008ADA60 /* Localizable.strings */; };
1F6BCF0628B219B400C2B417 /* Template+Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F6BCF0528B219B400C2B417 /* Template+Node.swift */; };
5001740128AA557100FF9B99 /* UserDefault.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5001740028AA557100FF9B99 /* UserDefault.swift */; };
5001740528AA818500FF9B99 /* DiagnosticLogView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5001740428AA818500FF9B99 /* DiagnosticLogView.swift */; };
5006F55E28A9663100C8ADBE /* Notification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5006F55D28A9663100C8ADBE /* Notification.swift */; };
5006F56028A9683C00C8ADBE /* DispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5006F55F28A9683C00C8ADBE /* DispatchQueue.swift */; };
502D1F0A28A8F88D0022CCD3 /* ActionTemplates in Resources */ = {isa = PBXBuildFile; fileRef = 502D1F0928A8F88D0022CCD3 /* ActionTemplates */; };
502E87A328AA954500CAB5E1 /* ModuleEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502E87A228AA954500CAB5E1 /* ModuleEditView.swift */; };
502E87A528AA95BF00CAB5E1 /* ModuleElementView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502E87A428AA95BF00CAB5E1 /* ModuleElementView.swift */; };
5030D80828ABDD72001A96B5 /* ActionManager+History.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80728ABDD72001A96B5 /* ActionManager+History.swift */; };
5030D80A28ABE953001A96B5 /* HistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80928ABE953001A96B5 /* HistoryView.swift */; };
5030D80C28ABEF64001A96B5 /* ApplicationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80B28ABEF64001A96B5 /* ApplicationView.swift */; };
5030D80E28ABFA82001A96B5 /* SettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80D28ABFA82001A96B5 /* SettingView.swift */; };
5030D81028AC0045001A96B5 /* LicenseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D80F28AC0045001A96B5 /* LicenseView.swift */; };
5030D81228AC01A7001A96B5 /* License.txt in Resources */ = {isa = PBXBuildFile; fileRef = 5030D81128AC01A7001A96B5 /* License.txt */; };
5030D81628AC090A001A96B5 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5030D81528AC090A001A96B5 /* Config.swift */; };
503976FA28AE143600588622 /* ModuleImportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 503976F928AE143600588622 /* ModuleImportView.swift */; };
5053CF85288F724E00A92822 /* Executor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF84288F724E00A92822 /* Executor.swift */; };
5053CF87288F764000A92822 /* ModuleManageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF86288F764000A92822 /* ModuleManageView.swift */; };
5053CF8A288F76E700A92822 /* PasteboardManager+Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF89288F76E700A92822 /* PasteboardManager+Event.swift */; };
5053CF91288F776000A92822 /* ActionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF90288F776000A92822 /* ActionManager.swift */; };
5053CF93288F788B00A92822 /* ActionManager+Module.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF92288F788B00A92822 /* ActionManager+Module.swift */; };
5053CF9A288F9A5E00A92822 /* ModuleCreateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053CF99288F9A5E00A92822 /* ModuleCreateView.swift */; };
5053CF9C288F9D8700A92822 /* SymbolPicker in Frameworks */ = {isa = PBXBuildFile; productRef = 5053CF9B288F9D8700A92822 /* SymbolPicker */; };
505A10A828A95EC200D46DB3 /* ActionManager+Template.swift in Sources */ = {isa = PBXBuildFile; fileRef = 505A10A728A95EC200D46DB3 /* ActionManager+Template.swift */; };
5067392628AB786A003A6A9C /* Template+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067392528AB786A003A6A9C /* Template+Swift.swift */; };
5067392B28AB7A51003A6A9C /* ActionManager+Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067392A28AB7A51003A6A9C /* ActionManager+Event.swift */; };
5067392D28AB7D6C003A6A9C /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067392C28AB7D6C003A6A9C /* Result.swift */; };
5067393228AB8E55003A6A9C /* RandomCodeTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393128AB8E55003A6A9C /* RandomCodeTextView.swift */; };
5067393428ABA328003A6A9C /* ActionManager+Artifact.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393328ABA328003A6A9C /* ActionManager+Artifact.swift */; };
5067393628ABA422003A6A9C /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 5067393528ABA422003A6A9C /* KeychainAccess */; };
5067393828ABA445003A6A9C /* AES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393728ABA445003A6A9C /* AES.swift */; };
5067393C28ABA89D003A6A9C /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067393B28ABA89D003A6A9C /* Data.swift */; };
5067394128ABC9C3003A6A9C /* Menubar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067394028ABC9C3003A6A9C /* Menubar.swift */; };
5067394328ABCB18003A6A9C /* MenubarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5067394228ABCB18003A6A9C /* MenubarView.swift */; };
507137EC288E934000C23E7F /* ActionApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507137EB288E934000C23E7F /* ActionApp.swift */; };
507137EE288E934000C23E7F /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507137ED288E934000C23E7F /* MainView.swift */; };
507137F0288E934100C23E7F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 507137EF288E934100C23E7F /* Assets.xcassets */; };
507137FC288E935A00C23E7F /* AuxiliaryExecute in Frameworks */ = {isa = PBXBuildFile; productRef = 507137FB288E935A00C23E7F /* AuxiliaryExecute */; };
507137FE288E935A00C23E7F /* Colorful in Frameworks */ = {isa = PBXBuildFile; productRef = 507137FD288E935A00C23E7F /* Colorful */; };
50713803288E976600C23E7F /* AppSetup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50713802288E976600C23E7F /* AppSetup.swift */; };
50713808288E9C0C00C23E7F /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50713807288E9C0C00C23E7F /* View.swift */; };
5071380A288E9C8100C23E7F /* WelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50713809288E9C8100C23E7F /* WelcomeView.swift */; };
5071380C288E9C8800C23E7F /* SidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5071380B288E9C8800C23E7F /* SidebarView.swift */; };
5071380E288E9D8A00C23E7F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5071380D288E9D8A00C23E7F /* AppDelegate.swift */; };
50A7D7FE28ACCB4C004F0B34 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A7D7FD28ACCB4C004F0B34 /* Throttle.swift */; };
50A7D80128ACCE23004F0B34 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A7D80028ACCE23004F0B34 /* Toast.swift */; };
50A7D80328ACD14B004F0B34 /* Template+Executable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A7D80228ACD14B004F0B34 /* Template+Executable.swift */; };
50BCF6AC288EE81000A97B4C /* PasteboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BCF6AB288EE81000A97B4C /* PasteboardManager.swift */; };
50BCF6AE288F01EF00A97B4C /* StatusBarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50BCF6AD288F01EF00A97B4C /* StatusBarManager.swift */; };
50E5204228BE04FC00C3228F /* Template+Python.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E5204128BE04FC00C3228F /* Template+Python.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
13C6C62228AF1BF0008ADA60 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
13C6C62428AF1DEB008ADA60 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
1F6BCF0528B219B400C2B417 /* Template+Node.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Template+Node.swift"; sourceTree = "<group>"; };
5001740028AA557100FF9B99 /* UserDefault.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefault.swift; sourceTree = "<group>"; };
5001740428AA818500FF9B99 /* DiagnosticLogView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagnosticLogView.swift; sourceTree = "<group>"; };
5006F55D28A9663100C8ADBE /* Notification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Notification.swift; sourceTree = "<group>"; };
5006F55F28A9683C00C8ADBE /* DispatchQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DispatchQueue.swift; sourceTree = "<group>"; };
502D1F0928A8F88D0022CCD3 /* ActionTemplates */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ActionTemplates; sourceTree = "<group>"; };
502E87A228AA954500CAB5E1 /* ModuleEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleEditView.swift; sourceTree = "<group>"; };
502E87A428AA95BF00CAB5E1 /* ModuleElementView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleElementView.swift; sourceTree = "<group>"; };
5030D80728ABDD72001A96B5 /* ActionManager+History.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActionManager+History.swift"; sourceTree = "<group>"; };
5030D80928ABE953001A96B5 /* HistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryView.swift; sourceTree = "<group>"; };
5030D80B28ABEF64001A96B5 /* ApplicationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationView.swift; sourceTree = "<group>"; };
5030D80D28ABFA82001A96B5 /* SettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingView.swift; sourceTree = "<group>"; };
5030D80F28AC0045001A96B5 /* LicenseView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicenseView.swift; sourceTree = "<group>"; };
5030D81128AC01A7001A96B5 /* License.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = License.txt; sourceTree = "<group>"; };
5030D81528AC090A001A96B5 /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = "<group>"; };
503976F928AE143600588622 /* ModuleImportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleImportView.swift; sourceTree = "<group>"; };
5053CF84288F724E00A92822 /* Executor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Executor.swift; sourceTree = "<group>"; };
5053CF86288F764000A92822 /* ModuleManageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleManageView.swift; sourceTree = "<group>"; };
5053CF89288F76E700A92822 /* PasteboardManager+Event.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PasteboardManager+Event.swift"; sourceTree = "<group>"; };
5053CF90288F776000A92822 /* ActionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionManager.swift; sourceTree = "<group>"; };
5053CF92288F788B00A92822 /* ActionManager+Module.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActionManager+Module.swift"; sourceTree = "<group>"; };
5053CF99288F9A5E00A92822 /* ModuleCreateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModuleCreateView.swift; sourceTree = "<group>"; };
505A10A728A95EC200D46DB3 /* ActionManager+Template.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActionManager+Template.swift"; sourceTree = "<group>"; };
5067392528AB786A003A6A9C /* Template+Swift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Template+Swift.swift"; sourceTree = "<group>"; };
5067392A28AB7A51003A6A9C /* ActionManager+Event.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActionManager+Event.swift"; sourceTree = "<group>"; };
5067392C28AB7D6C003A6A9C /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
5067393128AB8E55003A6A9C /* RandomCodeTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomCodeTextView.swift; sourceTree = "<group>"; };
5067393328ABA328003A6A9C /* ActionManager+Artifact.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActionManager+Artifact.swift"; sourceTree = "<group>"; };
5067393728ABA445003A6A9C /* AES.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AES.swift; sourceTree = "<group>"; };
5067393B28ABA89D003A6A9C /* Data.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Data.swift; sourceTree = "<group>"; };
5067394028ABC9C3003A6A9C /* Menubar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Menubar.swift; sourceTree = "<group>"; };
5067394228ABCB18003A6A9C /* MenubarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenubarView.swift; sourceTree = "<group>"; };
507137E8288E934000C23E7F /* Action.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Action.app; sourceTree = BUILT_PRODUCTS_DIR; };
507137EB288E934000C23E7F /* ActionApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionApp.swift; sourceTree = "<group>"; };
507137ED288E934000C23E7F /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; };
507137EF288E934100C23E7F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
507137F4288E934100C23E7F /* Action.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Action.entitlements; sourceTree = "<group>"; };
50713802288E976600C23E7F /* AppSetup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppSetup.swift; sourceTree = "<group>"; };
50713807288E9C0C00C23E7F /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = "<group>"; };
50713809288E9C8100C23E7F /* WelcomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeView.swift; sourceTree = "<group>"; };
5071380B288E9C8800C23E7F /* SidebarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SidebarView.swift; sourceTree = "<group>"; };
5071380D288E9D8A00C23E7F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
50A7D7FD28ACCB4C004F0B34 /* Throttle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Throttle.swift; sourceTree = "<group>"; };
50A7D80028ACCE23004F0B34 /* Toast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toast.swift; sourceTree = "<group>"; };
50A7D80228ACD14B004F0B34 /* Template+Executable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Template+Executable.swift"; sourceTree = "<group>"; };
50BCF6AB288EE81000A97B4C /* PasteboardManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteboardManager.swift; sourceTree = "<group>"; };
50BCF6AD288F01EF00A97B4C /* StatusBarManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarManager.swift; sourceTree = "<group>"; };
50E5204128BE04FC00C3228F /* Template+Python.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Template+Python.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
507137E5288E934000C23E7F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
507137FE288E935A00C23E7F /* Colorful in Frameworks */,
507137FC288E935A00C23E7F /* AuxiliaryExecute in Frameworks */,
5053CF9C288F9D8700A92822 /* SymbolPicker in Frameworks */,
5067393628ABA422003A6A9C /* KeychainAccess in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
502E87A628AA95DF00CAB5E1 /* ActionModule */ = {
isa = PBXGroup;
children = (
5053CF86288F764000A92822 /* ModuleManageView.swift */,
503976F928AE143600588622 /* ModuleImportView.swift */,
502E87A428AA95BF00CAB5E1 /* ModuleElementView.swift */,
5053CF99288F9A5E00A92822 /* ModuleCreateView.swift */,
502E87A228AA954500CAB5E1 /* ModuleEditView.swift */,
);
path = ActionModule;
sourceTree = "<group>";
};
502E87A728AA95E800CAB5E1 /* Generic */ = {
isa = PBXGroup;
children = (
507137ED288E934000C23E7F /* MainView.swift */,
5071380B288E9C8800C23E7F /* SidebarView.swift */,
50713809288E9C8100C23E7F /* WelcomeView.swift */,
5030D80928ABE953001A96B5 /* HistoryView.swift */,
5030D80D28ABFA82001A96B5 /* SettingView.swift */,
5001740428AA818500FF9B99 /* DiagnosticLogView.swift */,
5030D80F28AC0045001A96B5 /* LicenseView.swift */,
5030D80B28ABEF64001A96B5 /* ApplicationView.swift */,
);
path = Generic;
sourceTree = "<group>";
};
5030D81428AC08FC001A96B5 /* Config */ = {
isa = PBXGroup;
children = (
5030D81528AC090A001A96B5 /* Config.swift */,
);
path = Config;
sourceTree = "<group>";
};
5053CF88288F76CC00A92822 /* PasteboardManager */ = {
isa = PBXGroup;
children = (
50BCF6AB288EE81000A97B4C /* PasteboardManager.swift */,
5053CF89288F76E700A92822 /* PasteboardManager+Event.swift */,
);
path = PasteboardManager;
sourceTree = "<group>";
};
5053CF8B288F770B00A92822 /* StatusBarManager */ = {
isa = PBXGroup;
children = (
50BCF6AD288F01EF00A97B4C /* StatusBarManager.swift */,
);
path = StatusBarManager;
sourceTree = "<group>";
};
5053CF8C288F771500A92822 /* Executor */ = {
isa = PBXGroup;
children = (
5053CF84288F724E00A92822 /* Executor.swift */,
);
path = Executor;
sourceTree = "<group>";
};
5053CF8D288F771C00A92822 /* Action */ = {
isa = PBXGroup;
children = (
5053CF90288F776000A92822 /* ActionManager.swift */,
5030D80728ABDD72001A96B5 /* ActionManager+History.swift */,
5053CF92288F788B00A92822 /* ActionManager+Module.swift */,
5067393328ABA328003A6A9C /* ActionManager+Artifact.swift */,
5067392A28AB7A51003A6A9C /* ActionManager+Event.swift */,
5067392728AB78CD003A6A9C /* ActionModuleTemplates */,
502D1F0928A8F88D0022CCD3 /* ActionTemplates */,
);
path = Action;
sourceTree = "<group>";
};
5067392728AB78CD003A6A9C /* ActionModuleTemplates */ = {
isa = PBXGroup;
children = (
505A10A728A95EC200D46DB3 /* ActionManager+Template.swift */,
50A7D80228ACD14B004F0B34 /* Template+Executable.swift */,
5067392528AB786A003A6A9C /* Template+Swift.swift */,
1F6BCF0528B219B400C2B417 /* Template+Node.swift */,
50E5204128BE04FC00C3228F /* Template+Python.swift */,
);
path = ActionModuleTemplates;
sourceTree = "<group>";
};
5067393028AB8E42003A6A9C /* Effect */ = {
isa = PBXGroup;
children = (
5067393128AB8E55003A6A9C /* RandomCodeTextView.swift */,
);
path = Effect;
sourceTree = "<group>";
};
5067393F28ABC9B1003A6A9C /* Menubar */ = {
isa = PBXGroup;
children = (
5067394028ABC9C3003A6A9C /* Menubar.swift */,
5067394228ABCB18003A6A9C /* MenubarView.swift */,
);
path = Menubar;
sourceTree = "<group>";
};
507137DF288E934000C23E7F = {
isa = PBXGroup;
children = (
507137EA288E934000C23E7F /* Action */,
507137E9288E934000C23E7F /* Products */,
507137FA288E935A00C23E7F /* Frameworks */,
);
sourceTree = "<group>";
};
507137E9288E934000C23E7F /* Products */ = {
isa = PBXGroup;
children = (
507137E8288E934000C23E7F /* Action.app */,
);
name = Products;
sourceTree = "<group>";
};
507137EA288E934000C23E7F /* Action */ = {
isa = PBXGroup;
children = (
50713801288E975200C23E7F /* Application */,
50BCF6AA288EE7F900A97B4C /* Backend */,
50713805288E9B5200C23E7F /* Interface */,
50713806288E9C0100C23E7F /* Extension */,
);
path = Action;
sourceTree = "<group>";
};
507137FA288E935A00C23E7F /* Frameworks */ = {
isa = PBXGroup;
children = (
);
name = Frameworks;
sourceTree = "<group>";
};
50713801288E975200C23E7F /* Application */ = {
isa = PBXGroup;
children = (
13C6C62328AF1BF0008ADA60 /* Localizable.strings */,
507137EB288E934000C23E7F /* ActionApp.swift */,
507137F4288E934100C23E7F /* Action.entitlements */,
507137EF288E934100C23E7F /* Assets.xcassets */,
5030D81128AC01A7001A96B5 /* License.txt */,
50713802288E976600C23E7F /* AppSetup.swift */,
5071380D288E9D8A00C23E7F /* AppDelegate.swift */,
);
path = Application;
sourceTree = "<group>";
};
50713805288E9B5200C23E7F /* Interface */ = {
isa = PBXGroup;
children = (
502E87A628AA95DF00CAB5E1 /* ActionModule */,
5067393028AB8E42003A6A9C /* Effect */,
502E87A728AA95E800CAB5E1 /* Generic */,
5067393F28ABC9B1003A6A9C /* Menubar */,
50A7D7FF28ACCE18004F0B34 /* Toast */,
);
path = Interface;
sourceTree = "<group>";
};
50713806288E9C0100C23E7F /* Extension */ = {
isa = PBXGroup;
children = (
5067393728ABA445003A6A9C /* AES.swift */,
5067393B28ABA89D003A6A9C /* Data.swift */,
5006F55F28A9683C00C8ADBE /* DispatchQueue.swift */,
5006F55D28A9663100C8ADBE /* Notification.swift */,
5067392C28AB7D6C003A6A9C /* Result.swift */,
5001740028AA557100FF9B99 /* UserDefault.swift */,
50713807288E9C0C00C23E7F /* View.swift */,
50A7D7FD28ACCB4C004F0B34 /* Throttle.swift */,
);
path = Extension;
sourceTree = "<group>";
};
50A7D7FF28ACCE18004F0B34 /* Toast */ = {
isa = PBXGroup;
children = (
50A7D80028ACCE23004F0B34 /* Toast.swift */,
);
path = Toast;
sourceTree = "<group>";
};
50BCF6AA288EE7F900A97B4C /* Backend */ = {
isa = PBXGroup;
children = (
5053CF8D288F771C00A92822 /* Action */,
5030D81428AC08FC001A96B5 /* Config */,
5053CF8C288F771500A92822 /* Executor */,
5053CF88288F76CC00A92822 /* PasteboardManager */,
5053CF8B288F770B00A92822 /* StatusBarManager */,
);
path = Backend;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
507137E7288E934000C23E7F /* Action */ = {
isa = PBXNativeTarget;
buildConfigurationList = 507137F7288E934100C23E7F /* Build configuration list for PBXNativeTarget "Action" */;
buildPhases = (
507137FF288E93A600C23E7F /* Swift Format */,
502D1F0B28A8FA910022CCD3 /* Update Action Templates */,
5030D81328AC022A001A96B5 /* Scan License */,
507137E4288E934000C23E7F /* Sources */,
507137E5288E934000C23E7F /* Frameworks */,
507137E6288E934000C23E7F /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Action;
packageProductDependencies = (
507137FB288E935A00C23E7F /* AuxiliaryExecute */,
507137FD288E935A00C23E7F /* Colorful */,
5053CF9B288F9D8700A92822 /* SymbolPicker */,
5067393528ABA422003A6A9C /* KeychainAccess */,
);
productName = Action;
productReference = 507137E8288E934000C23E7F /* Action.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
507137E0288E934000C23E7F /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1340;
LastUpgradeCheck = 1400;
TargetAttributes = {
507137E7288E934000C23E7F = {
CreatedOnToolsVersion = 13.4.1;
};
};
};
buildConfigurationList = 507137E3288E934000C23E7F /* Build configuration list for PBXProject "Action" */;
compatibilityVersion = "Xcode 13.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
"zh-Hans",
);
mainGroup = 507137DF288E934000C23E7F;
productRefGroup = 507137E9288E934000C23E7F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
507137E7288E934000C23E7F /* Action */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
507137E6288E934000C23E7F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
502D1F0A28A8F88D0022CCD3 /* ActionTemplates in Resources */,
13C6C62128AF1BF0008ADA60 /* Localizable.strings in Resources */,
507137F0288E934100C23E7F /* Assets.xcassets in Resources */,
5030D81228AC01A7001A96B5 /* License.txt in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
502D1F0B28A8FA910022CCD3 /* Update Action Templates */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Update Action Templates";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "$SOURCE_ROOT/../../Resources/Scripts/PackTemplates.sh\n";
};
5030D81328AC022A001A96B5 /* Scan License */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Scan License";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "$SOURCE_ROOT/../../Resources/Scripts/UpdateLicenses.sh\n";
};
507137FF288E93A600C23E7F /* Swift Format */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "Swift Format";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "cd $SOURCE_ROOT\npwd\n\nif ! command -v \"swiftformat\" &> /dev/null\nthen\n echo \"swiftformat could not be found, skipping\"\n exit 0\nfi\n\nswiftformat . --swiftversion 5.6\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
507137E4288E934000C23E7F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50E5204228BE04FC00C3228F /* Template+Python.swift in Sources */,
50BCF6AE288F01EF00A97B4C /* StatusBarManager.swift in Sources */,
503976FA28AE143600588622 /* ModuleImportView.swift in Sources */,
5067393C28ABA89D003A6A9C /* Data.swift in Sources */,
5030D81028AC0045001A96B5 /* LicenseView.swift in Sources */,
50A7D80328ACD14B004F0B34 /* Template+Executable.swift in Sources */,
5053CF8A288F76E700A92822 /* PasteboardManager+Event.swift in Sources */,
5006F56028A9683C00C8ADBE /* DispatchQueue.swift in Sources */,
5030D80E28ABFA82001A96B5 /* SettingView.swift in Sources */,
5001740528AA818500FF9B99 /* DiagnosticLogView.swift in Sources */,
5071380A288E9C8100C23E7F /* WelcomeView.swift in Sources */,
5030D80A28ABE953001A96B5 /* HistoryView.swift in Sources */,
5030D80828ABDD72001A96B5 /* ActionManager+History.swift in Sources */,
502E87A328AA954500CAB5E1 /* ModuleEditView.swift in Sources */,
5067392628AB786A003A6A9C /* Template+Swift.swift in Sources */,
50713808288E9C0C00C23E7F /* View.swift in Sources */,
507137EE288E934000C23E7F /* MainView.swift in Sources */,
5001740128AA557100FF9B99 /* UserDefault.swift in Sources */,
50A7D80128ACCE23004F0B34 /* Toast.swift in Sources */,
50A7D7FE28ACCB4C004F0B34 /* Throttle.swift in Sources */,
5067393828ABA445003A6A9C /* AES.swift in Sources */,
50713803288E976600C23E7F /* AppSetup.swift in Sources */,
5071380E288E9D8A00C23E7F /* AppDelegate.swift in Sources */,
5053CF85288F724E00A92822 /* Executor.swift in Sources */,
5067392D28AB7D6C003A6A9C /* Result.swift in Sources */,
5067394128ABC9C3003A6A9C /* Menubar.swift in Sources */,
5053CF91288F776000A92822 /* ActionManager.swift in Sources */,
5053CF93288F788B00A92822 /* ActionManager+Module.swift in Sources */,
5030D80C28ABEF64001A96B5 /* ApplicationView.swift in Sources */,
5067392B28AB7A51003A6A9C /* ActionManager+Event.swift in Sources */,
507137EC288E934000C23E7F /* ActionApp.swift in Sources */,
5067394328ABCB18003A6A9C /* MenubarView.swift in Sources */,
5006F55E28A9663100C8ADBE /* Notification.swift in Sources */,
5067393228AB8E55003A6A9C /* RandomCodeTextView.swift in Sources */,
5071380C288E9C8800C23E7F /* SidebarView.swift in Sources */,
5030D81628AC090A001A96B5 /* Config.swift in Sources */,
5067393428ABA328003A6A9C /* ActionManager+Artifact.swift in Sources */,
50BCF6AC288EE81000A97B4C /* PasteboardManager.swift in Sources */,
5053CF87288F764000A92822 /* ModuleManageView.swift in Sources */,
502E87A528AA95BF00CAB5E1 /* ModuleElementView.swift in Sources */,
5053CF9A288F9A5E00A92822 /* ModuleCreateView.swift in Sources */,
505A10A828A95EC200D46DB3 /* ActionManager+Template.swift in Sources */,
1F6BCF0628B219B400C2B417 /* Template+Node.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
13C6C62328AF1BF0008ADA60 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
13C6C62228AF1BF0008ADA60 /* en */,
13C6C62428AF1DEB008ADA60 /* zh-Hans */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
507137F5288E934100C23E7F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
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;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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;
MACOSX_DEPLOYMENT_TARGET = 12.3;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
507137F6288E934100C23E7F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
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;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
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;
MACOSX_DEPLOYMENT_TARGET = 12.3;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
};
name = Release;
};
507137F8288E934100C23E7F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Action/Action.entitlements;
CODE_SIGN_IDENTITY = "-";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 4;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = M4Z5DVY94F;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Action Bee";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Lakr Aream. All Rights Reserved.";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = wiki.qaq.Action;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
507137F9288E934100C23E7F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Action/Action.entitlements;
CODE_SIGN_IDENTITY = "-";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 4;
DEAD_CODE_STRIPPING = YES;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = M4Z5DVY94F;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Action Bee";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 Lakr Aream. All Rights Reserved.";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.5;
PRODUCT_BUNDLE_IDENTIFIER = wiki.qaq.Action;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
507137E3288E934000C23E7F /* Build configuration list for PBXProject "Action" */ = {
isa = XCConfigurationList;
buildConfigurations = (
507137F5288E934100C23E7F /* Debug */,
507137F6288E934100C23E7F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
507137F7288E934100C23E7F /* Build configuration list for PBXNativeTarget "Action" */ = {
isa = XCConfigurationList;
buildConfigurations = (
507137F8288E934100C23E7F /* Debug */,
507137F9288E934100C23E7F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCSwiftPackageProductDependency section */
5053CF9B288F9D8700A92822 /* SymbolPicker */ = {
isa = XCSwiftPackageProductDependency;
productName = SymbolPicker;
};
5067393528ABA422003A6A9C /* KeychainAccess */ = {
isa = XCSwiftPackageProductDependency;
productName = KeychainAccess;
};
507137FB288E935A00C23E7F /* AuxiliaryExecute */ = {
isa = XCSwiftPackageProductDependency;
productName = AuxiliaryExecute;
};
507137FD288E935A00C23E7F /* Colorful */ = {
isa = XCSwiftPackageProductDependency;
productName = Colorful;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 507137E0288E934000C23E7F /* Project object */;
}
================================================
FILE: App.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:App/Action/Action.xcodeproj">
</FileRef>
<FileRef
location = "group:External/AuxiliaryExecute">
</FileRef>
<FileRef
location = "group:External/Colorful">
</FileRef>
<FileRef
location = "group:External/KeychainAccess">
</FileRef>
<FileRef
location = "group:External/SymbolPicker">
</FileRef>
</Workspace>
================================================
FILE: App.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: External/AuxiliaryExecute/.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*
================================================
FILE: External/AuxiliaryExecute/LICENSE
================================================
MIT License
Copyright (c) 2
gitextract_cxsqbwhp/
├── .gitignore
├── .gitmodules
├── .root
├── App/
│ └── Action/
│ ├── Action/
│ │ ├── Action.entitlements
│ │ ├── Application/
│ │ │ ├── Action.entitlements
│ │ │ ├── ActionApp.swift
│ │ │ ├── AppDelegate.swift
│ │ │ ├── AppSetup.swift
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AccentColor.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Avatar.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── License.txt
│ │ │ ├── en.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ └── zh-Hans.lproj/
│ │ │ └── Localizable.strings
│ │ ├── Backend/
│ │ │ ├── Action/
│ │ │ │ ├── ActionManager+Artifact.swift
│ │ │ │ ├── ActionManager+Event.swift
│ │ │ │ ├── ActionManager+History.swift
│ │ │ │ ├── ActionManager+Module.swift
│ │ │ │ ├── ActionManager.swift
│ │ │ │ ├── ActionModuleTemplates/
│ │ │ │ │ ├── ActionManager+Template.swift
│ │ │ │ │ ├── Template+Executable.swift
│ │ │ │ │ ├── Template+Node.swift
│ │ │ │ │ ├── Template+Python.swift
│ │ │ │ │ └── Template+Swift.swift
│ │ │ │ └── ActionTemplates/
│ │ │ │ └── .templates
│ │ │ ├── Config/
│ │ │ │ └── Config.swift
│ │ │ ├── Executor/
│ │ │ │ └── Executor.swift
│ │ │ ├── PasteboardManager/
│ │ │ │ ├── PasteboardManager+Event.swift
│ │ │ │ └── PasteboardManager.swift
│ │ │ └── StatusBarManager/
│ │ │ └── StatusBarManager.swift
│ │ ├── Extension/
│ │ │ ├── AES.swift
│ │ │ ├── Data.swift
│ │ │ ├── DispatchQueue.swift
│ │ │ ├── Notification.swift
│ │ │ ├── Result.swift
│ │ │ ├── Throttle.swift
│ │ │ ├── UserDefault.swift
│ │ │ └── View.swift
│ │ └── Interface/
│ │ ├── ActionModule/
│ │ │ ├── ModuleCreateView.swift
│ │ │ ├── ModuleEditView.swift
│ │ │ ├── ModuleElementView.swift
│ │ │ ├── ModuleImportView.swift
│ │ │ └── ModuleManageView.swift
│ │ ├── Effect/
│ │ │ └── RandomCodeTextView.swift
│ │ ├── Generic/
│ │ │ ├── ApplicationView.swift
│ │ │ ├── DiagnosticLogView.swift
│ │ │ ├── HistoryView.swift
│ │ │ ├── LicenseView.swift
│ │ │ ├── MainView.swift
│ │ │ ├── SettingView.swift
│ │ │ ├── SidebarView.swift
│ │ │ └── WelcomeView.swift
│ │ ├── Menubar/
│ │ │ ├── Menubar.swift
│ │ │ └── MenubarView.swift
│ │ └── Toast/
│ │ └── Toast.swift
│ └── Action.xcodeproj/
│ └── project.pbxproj
├── App.xcworkspace/
│ ├── contents.xcworkspacedata
│ └── xcshareddata/
│ └── IDEWorkspaceChecks.plist
├── External/
│ ├── AuxiliaryExecute/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ ├── Sources/
│ │ │ └── AuxiliaryExecute/
│ │ │ ├── AuxiliaryExecute+Async.swift
│ │ │ ├── AuxiliaryExecute+Shell.swift
│ │ │ ├── AuxiliaryExecute+Spawn.swift
│ │ │ └── AuxiliaryExecute.swift
│ │ └── Tests/
│ │ └── AuxiliaryExecuteTests/
│ │ └── AuxiliaryExecuteTests.swift
│ ├── Colorful/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── Package.swift
│ │ ├── README.md
│ │ └── Sources/
│ │ └── Colorful/
│ │ ├── Colorful.swift
│ │ ├── ColorfulView.swift
│ │ └── PointRandomization.swift
│ ├── KeychainAccess/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── Examples/
│ │ │ └── Example-iOS/
│ │ │ ├── Example-iOS/
│ │ │ │ ├── AccountsViewController.swift
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.xib
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Example-iOS.entitlements
│ │ │ │ ├── Images.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ └── InputViewController.swift
│ │ │ └── Example-iOS.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── Example-iOS.xcscheme
│ │ ├── KeychainAccess.podspec
│ │ ├── KeychainAccess.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ ├── LICENSE
│ │ ├── Lib/
│ │ │ ├── Certificates/
│ │ │ │ ├── KeychainAccess_Tests.provisionprofile.enc
│ │ │ │ ├── apple.cer
│ │ │ │ ├── developer_id_app.p12.enc
│ │ │ │ ├── iOS_Development.mobileprovision.enc
│ │ │ │ ├── ios_developer.p12.enc
│ │ │ │ └── tvOS_Development.mobileprovision.enc
│ │ │ ├── Configurations/
│ │ │ │ ├── Base.xcconfig
│ │ │ │ ├── Debug.xcconfig
│ │ │ │ ├── KeychainAccess.xcconfig
│ │ │ │ ├── Release.xcconfig
│ │ │ │ ├── TestHost.xcconfig
│ │ │ │ └── Tests.xcconfig
│ │ │ ├── Gemfile
│ │ │ ├── KeychainAccess/
│ │ │ │ ├── Info.plist
│ │ │ │ ├── Keychain.swift
│ │ │ │ └── KeychainAccess.h
│ │ │ ├── KeychainAccess.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ ├── KeychainAccess.xcscheme
│ │ │ │ └── TestHost.xcscheme
│ │ │ ├── KeychainAccessTests/
│ │ │ │ ├── EnumTests.swift
│ │ │ │ ├── ErrorTypeTests.swift
│ │ │ │ ├── Info.plist
│ │ │ │ ├── KeychainAccessTests.swift
│ │ │ │ └── SharedCredentialTests.swift
│ │ │ ├── Rakefile
│ │ │ ├── Scripts/
│ │ │ │ ├── add_key.sh
│ │ │ │ └── decode_cert.sh
│ │ │ ├── TestHost/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ └── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Info.plist
│ │ │ │ └── TestHost.entitlements
│ │ │ └── TestHost-MacCatalyst/
│ │ │ ├── KeychainAccessTests-MacCatalyst/
│ │ │ │ ├── EnumTests.swift
│ │ │ │ ├── ErrorTypeTests.swift
│ │ │ │ ├── Info.plist
│ │ │ │ └── KeychainAccessTests.swift
│ │ │ ├── TestHost-MacCatalyst/
│ │ │ │ ├── AppDelegate.swift
│ │ │ │ ├── Assets.xcassets/
│ │ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Base.lproj/
│ │ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ │ └── Main.storyboard
│ │ │ │ ├── Info.plist
│ │ │ │ ├── SceneDelegate.swift
│ │ │ │ ├── TestHost-MacCatalyst.entitlements
│ │ │ │ └── ViewController.swift
│ │ │ └── TestHost-MacCatalyst.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── TestHost-MacCatalyst.xcscheme
│ │ ├── Package.swift
│ │ ├── Package@swift-5.3.swift
│ │ ├── README.md
│ │ └── Sources/
│ │ └── Keychain.swift
│ └── SymbolPicker/
│ ├── .gitignore
│ ├── LICENSE
│ ├── Package.swift
│ ├── README.md
│ └── Sources/
│ └── SymbolPicker/
│ ├── Resources/
│ │ ├── en.lproj/
│ │ │ └── Localizable.strings
│ │ ├── sfsymbols.txt
│ │ └── zh_CN.lproj/
│ │ └── Localizable.strings
│ └── SymbolPicker.swift
├── LICENSE
├── README.md
└── Resources/
├── ModuleSample/
│ ├── Module Export - Link Cleaner/
│ │ ├── .ActionManifest.plist
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ ├── Definition/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Definition/
│ │ │ │ └── Definition.swift
│ │ │ ├── compile.sh
│ │ │ └── launch.sh
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── Source/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ └── Sources/
│ │ └── Source/
│ │ ├── CleanerRule/
│ │ │ ├── CleanerRule.swift
│ │ │ ├── Rule+BiliBili.swift
│ │ │ └── Rule+Twitter.swift
│ │ └── Source.swift
│ ├── Module Export - Multiline Init Formatter/
│ │ ├── .ActionManifest.plist
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ ├── Definition/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Definition/
│ │ │ │ └── Definition.swift
│ │ │ ├── compile.sh
│ │ │ └── launch.sh
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── Source/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ └── Sources/
│ │ └── Source/
│ │ └── Source.swift
│ ├── Module Export - Quick SFImage/
│ │ ├── .ActionManifest.plist
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ ├── Definition/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Definition/
│ │ │ │ └── Definition.swift
│ │ │ ├── compile.sh
│ │ │ └── launch.sh
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── Source/
│ │ ├── .gitignore
│ │ ├── Package.swift
│ │ └── Sources/
│ │ └── Source/
│ │ └── Source.swift
│ └── Module Export - Speak Dictionary/
│ ├── .ActionManifest.plist
│ ├── .gitignore
│ ├── .supplement/
│ │ ├── Binary/
│ │ │ └── CommandLineBridge/
│ │ │ ├── CommandLineBridge/
│ │ │ │ └── main.swift
│ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── CommandLineBridge.xcscheme
│ │ ├── Communicator/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Communicator/
│ │ │ ├── Communicator.h
│ │ │ ├── Communicator.m
│ │ │ └── include/
│ │ │ └── Communicator.h
│ │ ├── Definition/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Definition/
│ │ │ └── Definition.swift
│ │ ├── compile.sh
│ │ └── launch.sh
│ ├── App.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── Source/
│ ├── .gitignore
│ ├── Package.swift
│ └── Sources/
│ └── Source/
│ └── Source.swift
├── ModuleTemplate/
│ ├── .templates
│ ├── Executable/
│ │ ├── ActionBeeModule.exec
│ │ └── Put your binary here
│ ├── ExecutableSwift/
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ ├── Binary/
│ │ │ │ └── CommandLineBridge/
│ │ │ │ ├── CommandLineBridge/
│ │ │ │ │ └── main.swift
│ │ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ │ ├── project.pbxproj
│ │ │ │ └── xcshareddata/
│ │ │ │ └── xcschemes/
│ │ │ │ └── CommandLineBridge.xcscheme
│ │ │ ├── Communicator/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Package.swift
│ │ │ │ └── Sources/
│ │ │ │ └── Communicator/
│ │ │ │ ├── Communicator.h
│ │ │ │ ├── Communicator.m
│ │ │ │ └── include/
│ │ │ │ └── Communicator.h
│ │ │ └── Definition/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Definition/
│ │ │ └── Definition.swift
│ │ ├── App.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ ├── Source/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Source/
│ │ │ └── Source.swift
│ │ └── compile.command
│ ├── SourceNode/
│ │ ├── .eslintrc.js
│ │ ├── .gitignore
│ │ ├── .supplement/
│ │ │ └── compile.sh
│ │ ├── package.json
│ │ ├── src/
│ │ │ ├── global.d.ts
│ │ │ └── index.ts
│ │ └── tsconfig.json
│ ├── SourcePython/
│ │ └── main.py
│ └── SourceSwift/
│ ├── .gitignore
│ ├── .supplement/
│ │ ├── Binary/
│ │ │ └── CommandLineBridge/
│ │ │ ├── CommandLineBridge/
│ │ │ │ └── main.swift
│ │ │ └── CommandLineBridge.xcodeproj/
│ │ │ ├── project.pbxproj
│ │ │ └── xcshareddata/
│ │ │ └── xcschemes/
│ │ │ └── CommandLineBridge.xcscheme
│ │ ├── Communicator/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Communicator/
│ │ │ ├── Communicator.h
│ │ │ ├── Communicator.m
│ │ │ └── include/
│ │ │ └── Communicator.h
│ │ ├── Definition/
│ │ │ ├── .gitignore
│ │ │ ├── Package.swift
│ │ │ └── Sources/
│ │ │ └── Definition/
│ │ │ └── Definition.swift
│ │ ├── compile.sh
│ │ └── launch.sh
│ ├── App.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── Source/
│ ├── .gitignore
│ ├── Package.swift
│ └── Sources/
│ └── Source/
│ └── Source.swift
└── Scripts/
├── NewlineDeduplicate.swift
├── PackTemplates.sh
├── UpdateGitHub.sh
└── UpdateLicenses.sh
SYMBOL INDEX (10 symbols across 3 files)
FILE: Resources/ModuleTemplate/SourceNode/src/global.d.ts
type ActionBeeMessageEvent (line 2) | interface ActionBeeMessageEvent {
type ActionBeeAction (line 8) | type ActionBeeAction = 'none' | 'overwrite' | 'speak'
FILE: Resources/ModuleTemplate/SourceNode/src/index.ts
function finalizeResult (line 5) | function finalizeResult(
function moduleMain (line 20) | function moduleMain() {
FILE: Resources/ModuleTemplate/SourcePython/main.py
class PasteboardEvent (line 12) | class PasteboardEvent:
method __init__ (line 13) | def __init__(self, focusAppID, focusAppName, pasteboardContent):
class ActionBeeRecipe (line 19) | class ActionBeeRecipe:
method __init__ (line 20) | def __init__(self, postAction, postContent, continueQueue):
method finalizeAndSend (line 25) | def finalizeAndSend(self):
function SolutionMain (line 33) | def SolutionMain(event: PasteboardEvent) -> ActionBeeRecipe:
Condensed preview — 286 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,457K chars).
[
{
"path": ".gitignore",
"chars": 1518,
"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": 466,
"preview": "[submodule \"External/Colorful\"]\n\tpath = External/Colorful\n\turl = https://github.com/Lakr233/Colorful\n[submodule \"Externa"
},
{
"path": ".root",
"chars": 0,
"preview": ""
},
{
"path": "App/Action/Action/Action.entitlements",
"chars": 181,
"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": "App/Action/Action/Application/Action.entitlements",
"chars": 181,
"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": "App/Action/Action/Application/ActionApp.swift",
"chars": 1087,
"preview": "//\n// ActionApp.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\n@main\nstruct ActionApp:"
},
{
"path": "App/Action/Action/Application/AppDelegate.swift",
"chars": 919,
"preview": "//\n// AppDelegate.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport AppKit\nimport SwiftUI\n\nclass A"
},
{
"path": "App/Action/Action/Application/AppSetup.swift",
"chars": 2036,
"preview": "//\n// ApplicationSetup.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport AppKit\n\nextension ActionA"
},
{
"path": "App/Action/Action/Application/Assets.xcassets/AccentColor.colorset/Contents.json",
"chars": 695,
"preview": "{\n \"colors\" : [\n {\n \"color\" : {\n \"color-space\" : \"srgb\",\n \"components\" : {\n \"alpha\" : \"1"
},
{
"path": "App/Action/Action/Application/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1301,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"icon_16x16.png\",\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\",\n \"size\" : "
},
{
"path": "App/Action/Action/Application/Assets.xcassets/Avatar.imageset/Contents.json",
"chars": 304,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"Avatar.png\",\n \"idiom\" : \"universal\",\n \"scale\" : \"1x\"\n },\n {\n "
},
{
"path": "App/Action/Action/Application/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "App/Action/Action/Application/License.txt",
"chars": 5502,
"preview": "MIT License\n\nCopyright (c) 2022 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "App/Action/Action/Application/en.lproj/Localizable.strings",
"chars": 75,
"preview": "/* \n Localizable.strings\n Action\n\n Created by 维安雨轩 on 2022/08/19.\n \n*/\n"
},
{
"path": "App/Action/Action/Application/zh-Hans.lproj/Localizable.strings",
"chars": 3767,
"preview": "/* \n Localizable.strings\n Action\n\n Created by 维安雨轩 on 2022/08/19.\n \n*/\n\n//ModuleManageView.swift\n\n\"Create an action "
},
{
"path": "App/Action/Action/Backend/Action/ActionManager+Artifact.swift",
"chars": 4068,
"preview": "//\n// ActionManager+Artifact.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport Foundation\n\nprivate"
},
{
"path": "App/Action/Action/Backend/Action/ActionManager+Event.swift",
"chars": 5554,
"preview": "//\n// ActionManager+Event.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport Cocoa\nimport Foundatio"
},
{
"path": "App/Action/Action/Backend/Action/ActionManager+History.swift",
"chars": 1929,
"preview": "//\n// ActionManager+History.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport Foundation\n\nextensio"
},
{
"path": "App/Action/Action/Backend/Action/ActionManager+Module.swift",
"chars": 5863,
"preview": "//\n// ActionManager+Module.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/26.\n//\n\nimport Foundation\n\n/*\n\n Acti"
},
{
"path": "App/Action/Action/Backend/Action/ActionManager.swift",
"chars": 5676,
"preview": "//\n// ActionManager.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/26.\n//\n\nimport Combine\nimport Foundation\n\nf"
},
{
"path": "App/Action/Action/Backend/Action/ActionModuleTemplates/ActionManager+Template.swift",
"chars": 3801,
"preview": "//\n// ActionManager+ModuleTemplate.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/15.\n//\n\nimport Cocoa\nimport "
},
{
"path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Executable.swift",
"chars": 5193,
"preview": "//\n// Template+Executable.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/17.\n//\n\nimport AuxiliaryExecute\nimpor"
},
{
"path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Node.swift",
"chars": 5852,
"preview": "//\n// Template+Node.swift\n// Action\n//\n// Created by Innei on 2022/8/21.\n//\n\nimport AuxiliaryExecute\nimport Foundatio"
},
{
"path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Python.swift",
"chars": 4140,
"preview": "//\n// Template+Python.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/30.\n//\n\nimport AuxiliaryExecute\nimport Fo"
},
{
"path": "App/Action/Action/Backend/Action/ActionModuleTemplates/Template+Swift.swift",
"chars": 4424,
"preview": "//\n// ModuleTemplate+Swift.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport AuxiliaryExecute\nimpo"
},
{
"path": "App/Action/Action/Backend/Action/ActionTemplates/.templates",
"chars": 0,
"preview": ""
},
{
"path": "App/Action/Action/Backend/Config/Config.swift",
"chars": 1310,
"preview": "//\n// Config.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/17.\n//\n\nimport Combine\nimport Foundation\n\nclass Co"
},
{
"path": "App/Action/Action/Backend/Executor/Executor.swift",
"chars": 2753,
"preview": "//\n// Executor.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/26.\n//\n\nimport AuxiliaryExecute\nimport Foundatio"
},
{
"path": "App/Action/Action/Backend/PasteboardManager/PasteboardManager+Event.swift",
"chars": 662,
"preview": "//\n// PasteboardManager+Event.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/26.\n//\n\nimport Foundation\n\nextens"
},
{
"path": "App/Action/Action/Backend/PasteboardManager/PasteboardManager.swift",
"chars": 5255,
"preview": "//\n// PasteboardManager.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport AppKit\n\nfinal class Past"
},
{
"path": "App/Action/Action/Backend/StatusBarManager/StatusBarManager.swift",
"chars": 245,
"preview": "//\n// StatusBarManager.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/26.\n//\n\nimport Foundation\n\nfinal class S"
},
{
"path": "App/Action/Action/Extension/AES.swift",
"chars": 5552,
"preview": "//\n// AES.swift\n// PTFoundation\n//\n// Created by Lakr Aream on 12/15/20.\n//\n\nimport CommonCrypto\nimport Foundation\nim"
},
{
"path": "App/Action/Action/Extension/Data.swift",
"chars": 487,
"preview": "//\n// Data.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport CommonCrypto\nimport Foundation\n\nexten"
},
{
"path": "App/Action/Action/Extension/DispatchQueue.swift",
"chars": 486,
"preview": "//\n// DispatchQueue.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/15.\n//\n\nimport Foundation\n\nextension Dispat"
},
{
"path": "App/Action/Action/Extension/Notification.swift",
"chars": 204,
"preview": "//\n// Notification.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/15.\n//\n\nimport Foundation\n\nextension Notific"
},
{
"path": "App/Action/Action/Extension/Result.swift",
"chars": 195,
"preview": "//\n// Result.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport Foundation\n\npublic extension Result"
},
{
"path": "App/Action/Action/Extension/Throttle.swift",
"chars": 4741,
"preview": "// SwiftThrottle.swift\n// Twitter @Lakr233\n//\n// Created by Lakr Aream on 12/12/20.\n//\n\nimport Foundation\n\n/*\n\n This "
},
{
"path": "App/Action/Action/Extension/UserDefault.swift",
"chars": 3128,
"preview": "//\n// UserDefault.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/15.\n//\n\nimport Foundation\n\n#if DEBUG\n priv"
},
{
"path": "App/Action/Action/Extension/View.swift",
"chars": 356,
"preview": "//\n// View.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\nextension View {\n func us"
},
{
"path": "App/Action/Action/Interface/ActionModule/ModuleCreateView.swift",
"chars": 2563,
"preview": "//\n// ModuleCreateView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/26.\n//\n\nimport SwiftUI\n\nstruct ModuleCre"
},
{
"path": "App/Action/Action/Interface/ActionModule/ModuleEditView.swift",
"chars": 15818,
"preview": "//\n// ModuleEditView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/15.\n//\n\nimport SwiftUI\nimport SymbolPicker"
},
{
"path": "App/Action/Action/Interface/ActionModule/ModuleElementView.swift",
"chars": 3238,
"preview": "//\n// ModuleElementView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/15.\n//\n\nimport SwiftUI\n\nstruct ModuleEl"
},
{
"path": "App/Action/Action/Interface/ActionModule/ModuleImportView.swift",
"chars": 2969,
"preview": "//\n// ModuleImportView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/18.\n//\n\nimport SwiftUI\n\nstruct ModuleImp"
},
{
"path": "App/Action/Action/Interface/ActionModule/ModuleManageView.swift",
"chars": 6032,
"preview": "//\n// ModuleManageView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/26.\n//\n\nimport SwiftUI\n\nstruct ModuleMan"
},
{
"path": "App/Action/Action/Interface/Effect/RandomCodeTextView.swift",
"chars": 769,
"preview": "//\n// RandomCodeTextView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport SwiftUI\n\nstruct RandomC"
},
{
"path": "App/Action/Action/Interface/Generic/ApplicationView.swift",
"chars": 1628,
"preview": "//\n// ApplicationView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport SwiftUI\n\nstruct Applicatio"
},
{
"path": "App/Action/Action/Interface/Generic/DiagnosticLogView.swift",
"chars": 4222,
"preview": "//\n// DiagnosticLogView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/15.\n//\n\nimport SwiftUI\n\nclass Logger: O"
},
{
"path": "App/Action/Action/Interface/Generic/HistoryView.swift",
"chars": 4699,
"preview": "//\n// HistoryView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport SwiftUI\n\nstruct HistoryView: V"
},
{
"path": "App/Action/Action/Interface/Generic/LicenseView.swift",
"chars": 1676,
"preview": "//\n// LicenseView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/17.\n//\n\nimport SwiftUI\n\nstruct LicenseView: V"
},
{
"path": "App/Action/Action/Interface/Generic/MainView.swift",
"chars": 1234,
"preview": "//\n// ContentView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\nstruct MainView: View"
},
{
"path": "App/Action/Action/Interface/Generic/SettingView.swift",
"chars": 2542,
"preview": "//\n// SettingView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/17.\n//\n\nimport SwiftUI\n\nstruct SettingView: V"
},
{
"path": "App/Action/Action/Interface/Generic/SidebarView.swift",
"chars": 1372,
"preview": "//\n// SidebarView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport SwiftUI\n\n#if DEBUG\n private"
},
{
"path": "App/Action/Action/Interface/Generic/WelcomeView.swift",
"chars": 1639,
"preview": "//\n// WelcomeView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/7/25.\n//\n\nimport Colorful\nimport SwiftUI\n\nstruc"
},
{
"path": "App/Action/Action/Interface/Menubar/Menubar.swift",
"chars": 2634,
"preview": "//\n// Menubar.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport Cocoa\nimport SwiftUI\n\nclass Menuba"
},
{
"path": "App/Action/Action/Interface/Menubar/MenubarView.swift",
"chars": 2502,
"preview": "//\n// MenubarView.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/16.\n//\n\nimport Colorful\nimport SwiftUI\n\nstruc"
},
{
"path": "App/Action/Action/Interface/Toast/Toast.swift",
"chars": 3389,
"preview": "//\n// Toast.swift\n// Action\n//\n// Created by Lakr Aream on 2022/8/17.\n//\n\nimport Cocoa\nimport Foundation\nimport Swift"
},
{
"path": "App/Action/Action.xcodeproj/project.pbxproj",
"chars": 39132,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "App.xcworkspace/contents.xcworkspacedata",
"chars": 461,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:App/Action/Act"
},
{
"path": "App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"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": "External/AuxiliaryExecute/.gitignore",
"chars": 1494,
"preview": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n"
},
{
"path": "External/AuxiliaryExecute/LICENSE",
"chars": 1068,
"preview": "MIT License\n\nCopyright (c) 2021 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "External/AuxiliaryExecute/Package.swift",
"chars": 577,
"preview": "// swift-tools-version:5.5\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
},
{
"path": "External/AuxiliaryExecute/README.md",
"chars": 1201,
"preview": "# AuxiliaryExecute\n\nA Swift wrapper for system shell over posix_spawn with search path and env support.\n\n## Usage\n\n```\ni"
},
{
"path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute+Async.swift",
"chars": 3272,
"preview": "//\n// AuxiliaryExecute+Spawn.swift\n// AuxiliaryExecute\n//\n// Created by Cyandev on 2022/1/10.\n//\n\n#if swift(>=5.5)\n\n "
},
{
"path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute+Shell.swift",
"chars": 7341,
"preview": "//\n// AuxiliaryExecute+Shell.swift\n// AuxiliaryExecute\n//\n// Created by Lakr Aream on 2021/12/6.\n//\n\nimport Foundatio"
},
{
"path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute+Spawn.swift",
"chars": 11332,
"preview": "//\n// AuxiliaryExecute+Spawn.swift\n// AuxiliaryExecute\n//\n// Created by Lakr Aream on 2021/12/6.\n//\n\nimport Foundatio"
},
{
"path": "External/AuxiliaryExecute/Sources/AuxiliaryExecute/AuxiliaryExecute.swift",
"chars": 4831,
"preview": "//\n// AuxiliaryExecute.swift\n// MyYearWithGit\n//\n// Created by Lakr Aream on 2021/11/27.\n//\n\nimport Foundation\n\n/// E"
},
{
"path": "External/AuxiliaryExecute/Tests/AuxiliaryExecuteTests/AuxiliaryExecuteTests.swift",
"chars": 3303,
"preview": "@testable import AuxiliaryExecute\nimport XCTest\n\nfinal class AuxiliaryExecuteTests: XCTestCase {\n func testMain() thr"
},
{
"path": "External/Colorful/.gitignore",
"chars": 125,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/xcode/package.xcworkspace/contents.xcworkspac"
},
{
"path": "External/Colorful/LICENSE",
"chars": 1066,
"preview": "MIT License\n\nCopyright (c) 2021 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "External/Colorful/Package.swift",
"chars": 370,
"preview": "// swift-tools-version:5.3\n\nimport PackageDescription\n\nlet package = Package(\n name: \"Colorful\",\n platforms: [\n "
},
{
"path": "External/Colorful/README.md",
"chars": 572,
"preview": "# Colorful\n\nA SwiftUI implementation of AppleCard's animated colorful blur background.\n\n## Preview\n\n 201"
},
{
"path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/AppDelegate.swift",
"chars": 1744,
"preview": "//\n// AppDelegate.swift\n// Example\n//\n// Created by kishikawa katsumi on 2014/12/25.\n// Copyright (c) 2014 kishikawa"
},
{
"path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Base.lproj/LaunchScreen.xib",
"chars": 1362,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" versi"
},
{
"path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Base.lproj/Main.storyboard",
"chars": 19062,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Example-iOS.entitlements",
"chars": 316,
"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": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Images.xcassets/AppIcon.appiconset/Contents.json",
"chars": 848,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/Info.plist",
"chars": 1205,
"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": "External/KeychainAccess/Examples/Example-iOS/Example-iOS/InputViewController.swift",
"chars": 2777,
"preview": "//\n// InputViewController.swift\n// Example\n//\n// Created by kishikawa katsumi on 2014/12/26.\n// Copyright (c) 2014 k"
},
{
"path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS.xcodeproj/project.pbxproj",
"chars": 16719,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "External/KeychainAccess/Examples/Example-iOS/Example-iOS.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme",
"chars": 4284,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1200\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "External/KeychainAccess/KeychainAccess.podspec",
"chars": 1698,
"preview": "Pod::Spec.new do |s|\n s.name = 'KeychainAccess'\n s.version = '4.2.2'\n s.summary = 'Keyc"
},
{
"path": "External/KeychainAccess/KeychainAccess.xcworkspace/contents.xcworkspacedata",
"chars": 367,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Lib/KeychainAc"
},
{
"path": "External/KeychainAccess/KeychainAccess.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"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": "External/KeychainAccess/LICENSE",
"chars": 1085,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 kishikawa katsumi\n\nPermission is hereby granted, free of charge, to any person"
},
{
"path": "External/KeychainAccess/Lib/Certificates/KeychainAccess_Tests.provisionprofile.enc",
"chars": 10230,
"preview": "U2FsdGVkX18WxFfapSdab5VH8V0ALvJ1p4DGQkV6PkLcteNXpYJVZYP7ibe0xSo8\neEXjFyvV6Gx/O+FW90M40ejNOoG5qgTchrGR4mym4ECWHtaxijlIsr8"
},
{
"path": "External/KeychainAccess/Lib/Certificates/developer_id_app.p12.enc",
"chars": 4355,
"preview": "U2FsdGVkX1/4QHYY+F1WXNzik0JkRjHnbPBKxSmoGF9U1obIxXuwJFkrXbbl94H2\n5QXAAk9u4jNH0lT04yUqvEWhU3e3g2C5AxVPxvh0rCVRhePshHlEozF"
},
{
"path": "External/KeychainAccess/Lib/Certificates/iOS_Development.mobileprovision.enc",
"chars": 12220,
"preview": "U2FsdGVkX19cf2MW5JJE/5KsHZyCu4ZjhPpcntHNbx65ZWlReP6R/XjwT/efUlKt\ne860B2eljMtgwCbf+BCXQ21i72LSY8z8J/dd3qqcwF+n2U53zvaN3S1"
},
{
"path": "External/KeychainAccess/Lib/Certificates/ios_developer.p12.enc",
"chars": 8475,
"preview": "U2FsdGVkX1/A9JqBXQY1nHIgQ22pp/7/eETLbgBOMJgqmSZP79CPn1brO+WrYJe4\n4UcW1ZYnJYyIz+tINiie2XGQqLExiFh9cgI/aJRvKt4Aq0B7VZ/wk1b"
},
{
"path": "External/KeychainAccess/Lib/Certificates/tvOS_Development.mobileprovision.enc",
"chars": 10270,
"preview": "U2FsdGVkX19sMm4dCPgcgTnND1wPKUERPjbnGI40mBJnBBi5mimAk6o1qbZ5ciBA\n/StXHcQHcZxl+YNP/jcku6q0VI9zxdl7O5pBv2b4dSOlJAg35Jf0BE0"
},
{
"path": "External/KeychainAccess/Lib/Configurations/Base.xcconfig",
"chars": 1635,
"preview": "ALWAYS_SEARCH_USER_PATHS = NO;\nCLANG_ANALYZER_NONNULL = YES\nCLANG_CXX_LANGUAGE_STANDARD = gnu++0x;\nCLANG_CXX_LIBRARY = l"
},
{
"path": "External/KeychainAccess/Lib/Configurations/Debug.xcconfig",
"chars": 279,
"preview": "#include \"Base.xcconfig\"\n\nBITCODE_GENERATION_MODE = marker;\nMTL_ENABLE_DEBUG_INFO = YES;\nCOPY_PHASE_STRIP = NO;\nENABLE_T"
},
{
"path": "External/KeychainAccess/Lib/Configurations/KeychainAccess.xcconfig",
"chars": 1171,
"preview": "SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator watchos watchsimulator appletvos appletvsimulator;\nTARGETED_DEVICE"
},
{
"path": "External/KeychainAccess/Lib/Configurations/Release.xcconfig",
"chars": 266,
"preview": "#include \"Base.xcconfig\"\n\nBITCODE_GENERATION_MODE = bitcode;\nDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\nENABLE_NS_ASS"
},
{
"path": "External/KeychainAccess/Lib/Configurations/TestHost.xcconfig",
"chars": 1398,
"preview": "SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator;\nTARGETED_DEVICE_FAMILY = 1,2,3;\nSUPPOR"
},
{
"path": "External/KeychainAccess/Lib/Configurations/Tests.xcconfig",
"chars": 1244,
"preview": "SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator;\nTARGETED_DEVICE_FAMILY = 1,2;\nSUPPORTS"
},
{
"path": "External/KeychainAccess/Lib/Gemfile",
"chars": 70,
"preview": "source 'https://rubygems.org'\n\ngem 'rake'\ngem 'xcpretty'\ngem 'xcjobs'\n"
},
{
"path": "External/KeychainAccess/Lib/KeychainAccess/Info.plist",
"chars": 808,
"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": "External/KeychainAccess/Lib/KeychainAccess/Keychain.swift",
"chars": 123497,
"preview": "//\n// Keychain.swift\n// KeychainAccess\n//\n// Created by kishikawa katsumi on 2014/12/24.\n// Copyright (c) 2014 kishi"
},
{
"path": "External/KeychainAccess/Lib/KeychainAccess/KeychainAccess.h",
"chars": 1391,
"preview": "//\n// KeychainAccess.h\n// KeychainAccess\n//\n// Created by kishikawa katsumi on 2014/12/24.\n// Copyright (c) 2014 kis"
},
{
"path": "External/KeychainAccess/Lib/KeychainAccess.xcodeproj/project.pbxproj",
"chars": 20181,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "External/KeychainAccess/Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/KeychainAccess.xcscheme",
"chars": 4748,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1200\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "External/KeychainAccess/Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/TestHost.xcscheme",
"chars": 3233,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1200\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "External/KeychainAccess/Lib/KeychainAccessTests/EnumTests.swift",
"chars": 13515,
"preview": "//\n// EnumTests.swift\n// KeychainAccessTests\n//\n// Created by kishikawa katsumi on 10/12/15.\n// Copyright © 2015 kis"
},
{
"path": "External/KeychainAccess/Lib/KeychainAccessTests/ErrorTypeTests.swift",
"chars": 101154,
"preview": "//\n// ErrorTypeTests.swift\n// KeychainAccessTests\n//\n// Created by kishikawa katsumi on 10/12/15.\n// Copyright © 201"
},
{
"path": "External/KeychainAccess/Lib/KeychainAccessTests/Info.plist",
"chars": 735,
"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": "External/KeychainAccess/Lib/KeychainAccessTests/KeychainAccessTests.swift",
"chars": 91760,
"preview": "//\n// KeychainAccessTests.swift\n// KeychainAccessTests\n//\n// Created by kishikawa katsumi on 2014/12/24.\n// Copyrigh"
},
{
"path": "External/KeychainAccess/Lib/KeychainAccessTests/SharedCredentialTests.swift",
"chars": 3048,
"preview": "//\n// SharedCredentialTests.swift\n// KeychainAccessTests\n//\n// Created by kishikawa katsumi on 10/12/15.\n// Copyrigh"
},
{
"path": "External/KeychainAccess/Lib/Rakefile",
"chars": 12886,
"preview": "require 'xcjobs'\nrequire 'json'\n\ndef xcode_version\n `xcodebuild -version`.split(\"\\n\").first.scan(/\\d+/).join('.')\nend\n\n"
},
{
"path": "External/KeychainAccess/Lib/Scripts/add_key.sh",
"chars": 918,
"preview": "#!/bin/sh\n\nsecurity create-keychain -p travis build.keychain\nsecurity default-keychain -s build.keychain\nsecurity unlock"
},
{
"path": "External/KeychainAccess/Lib/Scripts/decode_cert.sh",
"chars": 348,
"preview": "#!/bin/sh\n\nCERT_DIR=\"./Lib/Certificates\"\nFILES=('ios_developer.p12' 'developer_id_app.p12' 'iOS_Development.mobileprovis"
},
{
"path": "External/KeychainAccess/Lib/TestHost/AppDelegate.swift",
"chars": 1967,
"preview": "//\n// AppDelegate.swift\n// TestHost\n//\n// Created by kishikawa katsumi on 7/10/16.\n// Copyright © 2016 kishikawa kat"
},
{
"path": "External/KeychainAccess/Lib/TestHost/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1495,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "External/KeychainAccess/Lib/TestHost/Info.plist",
"chars": 1481,
"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": "External/KeychainAccess/Lib/TestHost/TestHost.entitlements",
"chars": 376,
"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": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/EnumTests.swift",
"chars": 13515,
"preview": "//\n// EnumTests.swift\n// KeychainAccessTests\n//\n// Created by kishikawa katsumi on 10/12/15.\n// Copyright © 2015 kis"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/ErrorTypeTests.swift",
"chars": 101154,
"preview": "//\n// ErrorTypeTests.swift\n// KeychainAccessTests\n//\n// Created by kishikawa katsumi on 10/12/15.\n// Copyright © 201"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/Info.plist",
"chars": 727,
"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": "External/KeychainAccess/Lib/TestHost-MacCatalyst/KeychainAccessTests-MacCatalyst/KeychainAccessTests.swift",
"chars": 91760,
"preview": "//\n// KeychainAccessTests.swift\n// KeychainAccessTests\n//\n// Created by kishikawa katsumi on 2014/12/24.\n// Copyrigh"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/AppDelegate.swift",
"chars": 1797,
"preview": "//\n// AppDelegate.swift\n// TestHost-MacCatalyst\n//\n// Created by Kishikawa Katsumi on 2019/10/21.\n// Copyright © 201"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Assets.xcassets/Contents.json",
"chars": 62,
"preview": "{\n \"info\" : {\n \"version\" : 1,\n \"author\" : \"xcode\"\n }\n}"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Base.lproj/LaunchScreen.storyboard",
"chars": 1665,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Base.lproj/Main.storyboard",
"chars": 1604,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/Info.plist",
"chars": 2005,
"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": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/SceneDelegate.swift",
"chars": 1340,
"preview": "//\n// SceneDelegate.swift\n// TestHost-MacCatalyst\n//\n// Created by Kishikawa Katsumi on 2019/10/21.\n// Copyright © 2"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/TestHost-MacCatalyst.entitlements",
"chars": 495,
"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": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst/ViewController.swift",
"chars": 1366,
"preview": "//\n// ViewController.swift\n// TestHost-MacCatalyst\n//\n// Created by Kishikawa Katsumi on 2019/10/21.\n// Copyright © "
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst.xcodeproj/project.pbxproj",
"chars": 21389,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "External/KeychainAccess/Lib/TestHost-MacCatalyst/TestHost-MacCatalyst.xcodeproj/xcshareddata/xcschemes/TestHost-MacCatalyst.xcscheme",
"chars": 2957,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1200\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "External/KeychainAccess/Package.swift",
"chars": 530,
"preview": "// swift-tools-version:5.0\n\n// Package.swift\n// KeychainAccess\n//\n// Created by kishikawa katsumi on 2015/12/4.\n// C"
},
{
"path": "External/KeychainAccess/Package@swift-5.3.swift",
"chars": 554,
"preview": "// swift-tools-version:5.3\n\n// Package.swift\n// KeychainAccess\n//\n// Created by kishikawa katsumi on 2015/12/4.\n// C"
},
{
"path": "External/KeychainAccess/README.md",
"chars": 19249,
"preview": "# KeychainAccess\n\n[](https://tra"
},
{
"path": "External/KeychainAccess/Sources/Keychain.swift",
"chars": 123497,
"preview": "//\n// Keychain.swift\n// KeychainAccess\n//\n// Created by kishikawa katsumi on 2014/12/24.\n// Copyright (c) 2014 kishi"
},
{
"path": "External/SymbolPicker/.gitignore",
"chars": 2192,
"preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
},
{
"path": "External/SymbolPicker/LICENSE",
"chars": 1078,
"preview": "MIT License\n\nCopyright (c) 2022 Yubo Qin & Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtai"
},
{
"path": "External/SymbolPicker/Package.swift",
"chars": 728,
"preview": "// swift-tools-version:5.5\n// The swift-tools-version declares the minimum version of Swift required to build this packa"
},
{
"path": "External/SymbolPicker/README.md",
"chars": 1651,
"preview": "# SymbolPicker\n\nA simple and cross-platform SFSymbol picker for SwiftUI\n\n\nimpo"
},
{
"path": "LICENSE",
"chars": 1067,
"preview": "MIT License\n\nCopyright (c) 2022 Lakr Aream\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "README.md",
"chars": 2410,
"preview": "# ActionBee\n\nActionBee is a programmable pasteboard action trigger.\n\n\n"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.gitignore",
"chars": 1495,
"preview": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
"chars": 1207,
"preview": "//\n// main.swift\n// CommandLineBridge\n//\n// Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Defini"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
"chars": 11009,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
"chars": 3258,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1400\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/.gitignore",
"chars": 165,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Package.swift",
"chars": 372,
"preview": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Sources/Communicator/Communicator.h",
"chars": 258,
"preview": "//\n// Communicator.h\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface "
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Sources/Communicator/Communicator.m",
"chars": 906,
"preview": "//\n// Communicator.m\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
"chars": 258,
"preview": "//\n// Communicator.h\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface "
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Definition/.gitignore",
"chars": 165,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Definition/Package.swift",
"chars": 364,
"preview": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/Definition/Sources/Definition/Definition.swift",
"chars": 1422,
"preview": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: "
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/compile.sh",
"chars": 1310,
"preview": "#!/bin/bash\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho "
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/.supplement/launch.sh",
"chars": 57,
"preview": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\n.build/cli"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/App.xcworkspace/contents.xcworkspacedata",
"chars": 411,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Source\">\n </"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"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": "Resources/ModuleSample/Module Export - Link Cleaner/Source/.gitignore",
"chars": 165,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Package.swift",
"chars": 459,
"preview": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/CleanerRule/CleanerRule.swift",
"chars": 753,
"preview": "//\n// DomainRule.swift\n//\n//\n// Created by Lakr Aream on 2022/8/17.\n//\n\nimport Foundation\n\nlet cleaners: [CleanerRule]"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/CleanerRule/Rule+BiliBili.swift",
"chars": 1825,
"preview": "//\n// File.swift\n//\n//\n// Created by Lakr Aream on 2022/8/18.\n//\n\nimport Foundation\n\nclass BiliBili: CleanerRule {\n "
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/CleanerRule/Rule+Twitter.swift",
"chars": 522,
"preview": "//\n// CleanerRule+Twitter.swift\n//\n//\n// Created by Lakr Aream on 2022/8/17.\n//\n\nimport Foundation\n\nclass Twitter: Cle"
},
{
"path": "Resources/ModuleSample/Module Export - Link Cleaner/Source/Sources/Source/Source.swift",
"chars": 3439,
"preview": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\nimport Cocoa\n\npublic enum A"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.gitignore",
"chars": 1495,
"preview": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
"chars": 1207,
"preview": "//\n// main.swift\n// CommandLineBridge\n//\n// Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Defini"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
"chars": 11009,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
"chars": 3258,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1400\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/.gitignore",
"chars": 165,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Package.swift",
"chars": 372,
"preview": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Sources/Communicator/Communicator.h",
"chars": 258,
"preview": "//\n// Communicator.h\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface "
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Sources/Communicator/Communicator.m",
"chars": 737,
"preview": "//\n// Communicator.m\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
"chars": 258,
"preview": "//\n// Communicator.h\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface "
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Definition/.gitignore",
"chars": 165,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Definition/Package.swift",
"chars": 364,
"preview": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/Definition/Sources/Definition/Definition.swift",
"chars": 1422,
"preview": "import Foundation\n\nprivate let decoder = JSONDecoder()\nprivate let encoder = JSONEncoder()\n\npublic struct ArgumentData: "
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/compile.sh",
"chars": 1310,
"preview": "#!/bin/bash\n\n# this compiler script is designed to issue binary to ./.build/cli\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\necho "
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/.supplement/launch.sh",
"chars": 57,
"preview": "#!/bin/bash\n\nset -e\n\ncd \"$(dirname \"$0\")\"/../\n\n.build/cli"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/App.xcworkspace/contents.xcworkspacedata",
"chars": 411,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Source\">\n </"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"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": "Resources/ModuleSample/Module Export - Multiline Init Formatter/Source/.gitignore",
"chars": 165,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/Source/Package.swift",
"chars": 459,
"preview": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Resources/ModuleSample/Module Export - Multiline Init Formatter/Source/Sources/Source/Source.swift",
"chars": 1119,
"preview": "// ActionBee\n//\n// Executable Source Template - v1.0\n//\n\nimport Definition\nimport Foundation\n\n/*\n\n ⚠️\n\n Only changes wit"
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.gitignore",
"chars": 1495,
"preview": "!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n!default.xcworkspace\n*.dSYM\n*.dSYM.zip\n*.hmap\n"
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Binary/CommandLineBridge/CommandLineBridge/main.swift",
"chars": 1207,
"preview": "//\n// main.swift\n// CommandLineBridge\n//\n// Created by Lakr Aream on 2022/8/13.\n//\n\nimport Communicator\nimport Defini"
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/project.pbxproj",
"chars": 11009,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 55;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Binary/CommandLineBridge/CommandLineBridge.xcodeproj/xcshareddata/xcschemes/CommandLineBridge.xcscheme",
"chars": 3258,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1400\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/.gitignore",
"chars": 165,
"preview": ".DS_Store\n/.build\n/Packages\n/*.xcodeproj\nxcuserdata/\nDerivedData/\n.swiftpm/config/registries.json\n.swiftpm/xcode/package"
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Package.swift",
"chars": 372,
"preview": "// swift-tools-version: 5.5\n// The swift-tools-version declares the minimum version of Swift required to build this pack"
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Sources/Communicator/Communicator.h",
"chars": 258,
"preview": "//\n// Communicator.h\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface "
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Sources/Communicator/Communicator.m",
"chars": 737,
"preview": "//\n// Communicator.m\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import \"Communicator.h\"\n\nNSData *argumentData"
},
{
"path": "Resources/ModuleSample/Module Export - Quick SFImage/.supplement/Communicator/Sources/Communicator/include/Communicator.h",
"chars": 258,
"preview": "//\n// Communicator.h\n// \n//\n// Created by Lakr Aream on 2022/8/14.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface "
}
]
// ... and 86 more files (download for full content)
About this extraction
This page contains the full source code of the Lakr233/ActionBee GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 286 files (1.3 MB), approximately 352.7k tokens, and a symbol index with 10 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.