276d2bb6-619d-4888-ba11-8a6.../README.md
徐翔宇 4e22618364 v0.1.0: initial 划词侠 — AI Text Actions plugin for MioIsland
Quick AI actions on clipboard or selected text. Four actions:
- 翻译 (中/英/日)
- 总结 (3-bullet Chinese)
- 改语气 (正式/口语/友好/严谨)
- 邮件回复

Powered by DeepSeek with Server-Sent Events streaming for
typewriter feedback (~600ms first byte). Two source modes:
clipboard (no permission) and selected-text via NSAccessibility
(graceful fallback to clipboard + permission banner if denied).

Five-state UI machine: idle → input → loading (cancellable) →
result → missing-config. Last 20 actions persisted to UserDefaults.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 20:21:17 +08:00

84 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 划词侠 — AI Text Actions for MioIsland
Quick AI actions on any clipboard or selected text. Translate,
summarize, rewrite tone, or draft an email reply — all powered by
DeepSeek with streaming output for instant feedback.
## Features
- **One-shot actions** — 翻译(中/英/日) / 总结 / 改语气(正式/口语/友好/严谨) / 邮件回复.
- **Streaming output** — typewriter effect via Server-Sent Events.
Long replies start showing within ~600ms instead of after the
full completion lands.
- **Two text sources** — clipboard (works without permissions) or
selected text via NSAccessibility (requires the user to grant
Accessibility permission). Falls back gracefully with a banner
explaining the System Settings → Privacy step.
- **History** — last 20 actions persisted in UserDefaults; tap to
re-copy the result without re-running the model.
- **Five-state UI** — idle, input, loading (cancellable), result,
missing-config. Each transition is animated.
## Configuration
Drop your DeepSeek API key into
`~/.config/codeisland/clipper-config.json`:
```json
{
"deepseek_api_key": "sk-...",
"default_translate_target": "zh"
}
```
Get a key at https://platform.deepseek.com/ — DeepSeek's pricing is
roughly **¥0.001/1k tokens for input, ¥0.002/1k for output** (~1/100
of GPT-4), so a typical 划词侠 session costs less than a fraction of
a cent.
Without the file, the panel shows a friendly missing-config state
with the file path one click away on the clipboard.
## Requirements
- macOS 15.0+
- MioIsland v2.2.0+
- DeepSeek API key (for actual AI calls; UI works without it)
- Optional: Accessibility permission (for selected-text source)
## Building from source
```bash
./build.sh # produce build/clipper.bundle + build/clipper.zip
./build.sh install # build + copy to ~/.config/codeisland/plugins/
```
Restart MioIsland (Cmd+Q + reopen) to load the new build.
## Structure
```
Sources/
├── MioPlugin.swift # protocol (verbatim from host)
├── ClipperPlugin.swift # principal class
├── ui/
│ ├── ExpandedView.swift # 380×520 panel, state machine
│ ├── ActionGrid.swift # 2×2 action buttons + sub-options
│ ├── SourcePreview.swift # truncated input preview
│ ├── ResultView.swift # scrollable streaming output
│ ├── PermissionBanner.swift # AX permission hint
│ └── Theme.swift # design tokens
├── data/
│ ├── DeepSeekClient.swift # actor + URLSession + SSE streaming
│ ├── TextSource.swift # clipboard / selection providers
│ └── ClipperConfig.swift # config loader
└── engine/
├── ClipperStore.swift # @MainActor state machine + history
├── HistoryStore.swift # UserDefaults, last 20 actions
└── ClipperDebugLog.swift # /tmp/clipper-plugin.log
```
## License
MIT — see [LICENSE](LICENSE).