wisp-ai 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wisp_ai-0.1.0/LICENSE +21 -0
- wisp_ai-0.1.0/PKG-INFO +212 -0
- wisp_ai-0.1.0/README.md +168 -0
- wisp_ai-0.1.0/pyproject.toml +115 -0
- wisp_ai-0.1.0/pyproject.toml.orig +108 -0
- wisp_ai-0.1.0/src/wisp/__init__.py +3 -0
- wisp_ai-0.1.0/src/wisp/__main__.py +3 -0
- wisp_ai-0.1.0/src/wisp/agent/__init__.py +1 -0
- wisp_ai-0.1.0/src/wisp/agent/configuration.py +50 -0
- wisp_ai-0.1.0/src/wisp/agent/context.py +238 -0
- wisp_ai-0.1.0/src/wisp/agent/execution.py +217 -0
- wisp_ai-0.1.0/src/wisp/agent/harness.py +705 -0
- wisp_ai-0.1.0/src/wisp/agent/loop.py +1657 -0
- wisp_ai-0.1.0/src/wisp/agent/messages.py +436 -0
- wisp_ai-0.1.0/src/wisp/agent/mode.py +21 -0
- wisp_ai-0.1.0/src/wisp/agent/prompt.py +462 -0
- wisp_ai-0.1.0/src/wisp/agent/transcript.py +117 -0
- wisp_ai-0.1.0/src/wisp/auth/__init__.py +17 -0
- wisp_ai-0.1.0/src/wisp/auth/openai_codex.py +251 -0
- wisp_ai-0.1.0/src/wisp/auth/storage.py +423 -0
- wisp_ai-0.1.0/src/wisp/cli/__init__.py +706 -0
- wisp_ai-0.1.0/src/wisp/cli/auth.py +85 -0
- wisp_ai-0.1.0/src/wisp/cli/options.py +92 -0
- wisp_ai-0.1.0/src/wisp/cli/output.py +156 -0
- wisp_ai-0.1.0/src/wisp/cli/rpc.py +124 -0
- wisp_ai-0.1.0/src/wisp/cli/rpc_transport.py +231 -0
- wisp_ai-0.1.0/src/wisp/cli/skills.py +99 -0
- wisp_ai-0.1.0/src/wisp/cli/tools.py +17 -0
- wisp_ai-0.1.0/src/wisp/cli/trust.py +170 -0
- wisp_ai-0.1.0/src/wisp/cli/types.py +26 -0
- wisp_ai-0.1.0/src/wisp/cli/update.py +57 -0
- wisp_ai-0.1.0/src/wisp/coding/__init__.py +25 -0
- wisp_ai-0.1.0/src/wisp/coding/compaction.py +759 -0
- wisp_ai-0.1.0/src/wisp/coding/configuration.py +83 -0
- wisp_ai-0.1.0/src/wisp/coding/costs.py +188 -0
- wisp_ai-0.1.0/src/wisp/coding/session.py +2029 -0
- wisp_ai-0.1.0/src/wisp/coding/stats.py +253 -0
- wisp_ai-0.1.0/src/wisp/coding/tool_execution.py +869 -0
- wisp_ai-0.1.0/src/wisp/config.py +351 -0
- wisp_ai-0.1.0/src/wisp/events.py +1839 -0
- wisp_ai-0.1.0/src/wisp/extensions/__init__.py +1 -0
- wisp_ai-0.1.0/src/wisp/extensions/builtin.py +127 -0
- wisp_ai-0.1.0/src/wisp/mcp/__init__.py +5 -0
- wisp_ai-0.1.0/src/wisp/mcp/config.py +168 -0
- wisp_ai-0.1.0/src/wisp/mcp/runtime.py +364 -0
- wisp_ai-0.1.0/src/wisp/mcp/tool.py +201 -0
- wisp_ai-0.1.0/src/wisp/mcp/transport.py +151 -0
- wisp_ai-0.1.0/src/wisp/openai_compatible.py +118 -0
- wisp_ai-0.1.0/src/wisp/providers/__init__.py +94 -0
- wisp_ai-0.1.0/src/wisp/providers/anthropic.py +756 -0
- wisp_ai-0.1.0/src/wisp/providers/auth.py +98 -0
- wisp_ai-0.1.0/src/wisp/providers/base.py +232 -0
- wisp_ai-0.1.0/src/wisp/providers/catalog.py +611 -0
- wisp_ai-0.1.0/src/wisp/providers/continuations.py +61 -0
- wisp_ai-0.1.0/src/wisp/providers/data/catalog.toml +513 -0
- wisp_ai-0.1.0/src/wisp/providers/deepseek.py +128 -0
- wisp_ai-0.1.0/src/wisp/providers/events.py +139 -0
- wisp_ai-0.1.0/src/wisp/providers/fake.py +119 -0
- wisp_ai-0.1.0/src/wisp/providers/google.py +628 -0
- wisp_ai-0.1.0/src/wisp/providers/openai.py +644 -0
- wisp_ai-0.1.0/src/wisp/providers/openai_codex.py +676 -0
- wisp_ai-0.1.0/src/wisp/providers/openai_compatible.py +603 -0
- wisp_ai-0.1.0/src/wisp/providers/retry.py +21 -0
- wisp_ai-0.1.0/src/wisp/providers/xai.py +53 -0
- wisp_ai-0.1.0/src/wisp/py.typed +0 -0
- wisp_ai-0.1.0/src/wisp/retry.py +193 -0
- wisp_ai-0.1.0/src/wisp/rpc/__init__.py +73 -0
- wisp_ai-0.1.0/src/wisp/rpc/client.py +550 -0
- wisp_ai-0.1.0/src/wisp/rpc/commands.py +314 -0
- wisp_ai-0.1.0/src/wisp/rpc/configuration.py +164 -0
- wisp_ai-0.1.0/src/wisp/rpc/coordinator.py +474 -0
- wisp_ai-0.1.0/src/wisp/rpc/errors.py +9 -0
- wisp_ai-0.1.0/src/wisp/rpc/execution.py +3803 -0
- wisp_ai-0.1.0/src/wisp/rpc/host.py +715 -0
- wisp_ai-0.1.0/src/wisp/runtime/__init__.py +35 -0
- wisp_ai-0.1.0/src/wisp/runtime/api.py +368 -0
- wisp_ai-0.1.0/src/wisp/runtime/builtin_commands.py +211 -0
- wisp_ai-0.1.0/src/wisp/runtime/commands.py +181 -0
- wisp_ai-0.1.0/src/wisp/runtime/event_bus.py +35 -0
- wisp_ai-0.1.0/src/wisp/runtime/extensions.py +138 -0
- wisp_ai-0.1.0/src/wisp/runtime/registry.py +274 -0
- wisp_ai-0.1.0/src/wisp/sdk.py +510 -0
- wisp_ai-0.1.0/src/wisp/sessions/__init__.py +91 -0
- wisp_ai-0.1.0/src/wisp/sessions/branching.py +72 -0
- wisp_ai-0.1.0/src/wisp/sessions/entries.py +472 -0
- wisp_ai-0.1.0/src/wisp/sessions/errors.py +43 -0
- wisp_ai-0.1.0/src/wisp/sessions/jsonl.py +2822 -0
- wisp_ai-0.1.0/src/wisp/sessions/replay.py +350 -0
- wisp_ai-0.1.0/src/wisp/settings.py +485 -0
- wisp_ai-0.1.0/src/wisp/skills/__init__.py +27 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/github-pr-delivery/SKILL.md +107 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/github-pr-delivery/references/ci.md +115 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/github-pr-delivery/references/preflight-and-packaging.md +46 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/github-pr-delivery/references/readiness.md +21 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/github-pr-delivery/references/review.md +83 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/wisp-development/SKILL.md +49 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/wisp-development/references/architecture.md +41 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/wisp-development/references/authoring.md +29 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/wisp-development/references/extension-api.md +28 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/wisp-development/references/runtime-invariants.md +69 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/wisp-development/references/safety.md +28 -0
- wisp_ai-0.1.0/src/wisp/skills/bundled/wisp-development/references/verification.md +33 -0
- wisp_ai-0.1.0/src/wisp/skills/discovery.py +950 -0
- wisp_ai-0.1.0/src/wisp/skills/filesystem.py +240 -0
- wisp_ai-0.1.0/src/wisp/skills/invocation.py +93 -0
- wisp_ai-0.1.0/src/wisp/skills/lifecycle.py +35 -0
- wisp_ai-0.1.0/src/wisp/skills/loading.py +250 -0
- wisp_ai-0.1.0/src/wisp/skills/metadata.py +336 -0
- wisp_ai-0.1.0/src/wisp/skills/models.py +90 -0
- wisp_ai-0.1.0/src/wisp/skills/package.py +14 -0
- wisp_ai-0.1.0/src/wisp/skills/prompt.py +71 -0
- wisp_ai-0.1.0/src/wisp/skills/tool.py +86 -0
- wisp_ai-0.1.0/src/wisp/tool_presentation.py +39 -0
- wisp_ai-0.1.0/src/wisp/tool_types.py +18 -0
- wisp_ai-0.1.0/src/wisp/tools/__init__.py +20 -0
- wisp_ai-0.1.0/src/wisp/tools/approval.py +97 -0
- wisp_ai-0.1.0/src/wisp/tools/base.py +54 -0
- wisp_ai-0.1.0/src/wisp/tools/builtin.py +39 -0
- wisp_ai-0.1.0/src/wisp/tools/common.py +74 -0
- wisp_ai-0.1.0/src/wisp/tools/context.py +75 -0
- wisp_ai-0.1.0/src/wisp/tools/file_ops.py +914 -0
- wisp_ai-0.1.0/src/wisp/tools/paths.py +155 -0
- wisp_ai-0.1.0/src/wisp/tools/policy.py +52 -0
- wisp_ai-0.1.0/src/wisp/tools/process.py +1559 -0
- wisp_ai-0.1.0/src/wisp/tools/process_manager.py +992 -0
- wisp_ai-0.1.0/src/wisp/tools/result.py +49 -0
- wisp_ai-0.1.0/src/wisp/tools/search.py +1409 -0
- wisp_ai-0.1.0/src/wisp/tools/secure_fs.py +355 -0
- wisp_ai-0.1.0/src/wisp/tools/selection.py +66 -0
- wisp_ai-0.1.0/src/wisp/tools/shell.py +464 -0
- wisp_ai-0.1.0/src/wisp/tools/summary.py +162 -0
- wisp_ai-0.1.0/src/wisp/tools/truncation.py +99 -0
- wisp_ai-0.1.0/src/wisp/tools/utf8.py +84 -0
- wisp_ai-0.1.0/src/wisp/trust.py +200 -0
- wisp_ai-0.1.0/src/wisp/trust_flow.py +63 -0
- wisp_ai-0.1.0/src/wisp/tui/__init__.py +57 -0
- wisp_ai-0.1.0/src/wisp/tui/app.py +186 -0
- wisp_ai-0.1.0/src/wisp/tui/auth_commands.py +366 -0
- wisp_ai-0.1.0/src/wisp/tui/commands.py +245 -0
- wisp_ai-0.1.0/src/wisp/tui/compact_echo.py +106 -0
- wisp_ai-0.1.0/src/wisp/tui/connect_widget.py +303 -0
- wisp_ai-0.1.0/src/wisp/tui/connections.py +53 -0
- wisp_ai-0.1.0/src/wisp/tui/context_widget.py +288 -0
- wisp_ai-0.1.0/src/wisp/tui/decision_content.py +343 -0
- wisp_ai-0.1.0/src/wisp/tui/diagnostics.py +94 -0
- wisp_ai-0.1.0/src/wisp/tui/diff_presentation.py +644 -0
- wisp_ai-0.1.0/src/wisp/tui/diff_rendering.py +336 -0
- wisp_ai-0.1.0/src/wisp/tui/diff_viewer.py +245 -0
- wisp_ai-0.1.0/src/wisp/tui/file_index.py +397 -0
- wisp_ai-0.1.0/src/wisp/tui/file_result_presentation.py +496 -0
- wisp_ai-0.1.0/src/wisp/tui/file_suggest.py +559 -0
- wisp_ai-0.1.0/src/wisp/tui/history.py +262 -0
- wisp_ai-0.1.0/src/wisp/tui/incremental_markdown.py +181 -0
- wisp_ai-0.1.0/src/wisp/tui/input_types.py +125 -0
- wisp_ai-0.1.0/src/wisp/tui/launch.py +166 -0
- wisp_ai-0.1.0/src/wisp/tui/live.py +562 -0
- wisp_ai-0.1.0/src/wisp/tui/mcp.py +41 -0
- wisp_ai-0.1.0/src/wisp/tui/overlay.py +274 -0
- wisp_ai-0.1.0/src/wisp/tui/presentation_clock.py +90 -0
- wisp_ai-0.1.0/src/wisp/tui/process_lifecycle.py +382 -0
- wisp_ai-0.1.0/src/wisp/tui/prompt_highlighting.py +390 -0
- wisp_ai-0.1.0/src/wisp/tui/prompt_history.py +115 -0
- wisp_ai-0.1.0/src/wisp/tui/prompt_history_widget.py +229 -0
- wisp_ai-0.1.0/src/wisp/tui/rendering.py +1775 -0
- wisp_ai-0.1.0/src/wisp/tui/shell.py +3181 -0
- wisp_ai-0.1.0/src/wisp/tui/skills.py +58 -0
- wisp_ai-0.1.0/src/wisp/tui/state.py +324 -0
- wisp_ai-0.1.0/src/wisp/tui/stream_buffer.py +500 -0
- wisp_ai-0.1.0/src/wisp/tui/textual_app.py +4438 -0
- wisp_ai-0.1.0/src/wisp/tui/textual_card_registry.py +178 -0
- wisp_ai-0.1.0/src/wisp/tui/textual_history.py +1471 -0
- wisp_ai-0.1.0/src/wisp/tui/textual_input.py +178 -0
- wisp_ai-0.1.0/src/wisp/tui/textual_renderer.py +925 -0
- wisp_ai-0.1.0/src/wisp/tui/textual_transcript.py +581 -0
- wisp_ai-0.1.0/src/wisp/tui/theme.py +287 -0
- wisp_ai-0.1.0/src/wisp/tui/theme_picker.py +162 -0
- wisp_ai-0.1.0/src/wisp/tui/theme_preference.py +219 -0
- wisp_ai-0.1.0/src/wisp/tui/tool_call.py +452 -0
- wisp_ai-0.1.0/src/wisp/tui/tool_output.py +1539 -0
- wisp_ai-0.1.0/src/wisp/tui/transcript_window.py +197 -0
- wisp_ai-0.1.0/src/wisp/tui/update_commands.py +106 -0
- wisp_ai-0.1.0/src/wisp/tui/update_prompt.py +168 -0
- wisp_ai-0.1.0/src/wisp/tui/update_types.py +16 -0
- wisp_ai-0.1.0/src/wisp/tui/widgets.py +4606 -0
- wisp_ai-0.1.0/src/wisp/update_check.py +516 -0
- wisp_ai-0.1.0/src/wisp/validation.py +26 -0
wisp_ai-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Hanyu
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
wisp_ai-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: wisp-ai
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Terminal-first coding agent with typed CLI, TUI, RPC, and SDK interfaces
|
|
5
|
+
Keywords: agent,ai,cli,coding-agent,llm,tui
|
|
6
|
+
Author: whanyu1212
|
|
7
|
+
Author-email: whanyu1212 <whanyu1212@hotmail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
18
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
19
|
+
Classifier: Typing :: Typed
|
|
20
|
+
Requires-Dist: anthropic>=0.116.0
|
|
21
|
+
Requires-Dist: anyio>=4.14.1
|
|
22
|
+
Requires-Dist: cryptography>=50.0.0
|
|
23
|
+
Requires-Dist: google-genai>=2.12.0
|
|
24
|
+
Requires-Dist: httpx>=0.28.1
|
|
25
|
+
Requires-Dist: jsonschema>=4.26
|
|
26
|
+
Requires-Dist: mcp>=2,<3
|
|
27
|
+
Requires-Dist: openai>=2.44.0
|
|
28
|
+
Requires-Dist: packaging>=26.0
|
|
29
|
+
Requires-Dist: pathspec>=1.1.1
|
|
30
|
+
Requires-Dist: prompt-toolkit>=3.0.52
|
|
31
|
+
Requires-Dist: pygments>=2.20.0
|
|
32
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
33
|
+
Requires-Dist: pydantic>=2.13.4
|
|
34
|
+
Requires-Dist: regex>=2026.7.19
|
|
35
|
+
Requires-Dist: rich>=15.0.0
|
|
36
|
+
Requires-Dist: textual>=8.2.8
|
|
37
|
+
Requires-Dist: typer>=0.26.8
|
|
38
|
+
Requires-Python: >=3.12
|
|
39
|
+
Project-URL: Homepage, https://github.com/whanyu1212/Wisp
|
|
40
|
+
Project-URL: Repository, https://github.com/whanyu1212/Wisp
|
|
41
|
+
Project-URL: Changelog, https://github.com/whanyu1212/Wisp/blob/main/CHANGELOG.md
|
|
42
|
+
Project-URL: Issues, https://github.com/whanyu1212/Wisp/issues
|
|
43
|
+
Description-Content-Type: text/markdown
|
|
44
|
+
|
|
45
|
+
<p align="center">
|
|
46
|
+
<img src="https://raw.githubusercontent.com/whanyu1212/Wisp/main/assets/wisp-banner-v2.png" alt="Wisp — A coding agent that stays in sync, illustrated by a glowing spectral companion linked to a terminal." width="100%">
|
|
47
|
+
</p>
|
|
48
|
+
|
|
49
|
+
# Wisp
|
|
50
|
+
|
|
51
|
+
<p align="center">
|
|
52
|
+
<strong>A coding agent that stays in sync with you.</strong><br>
|
|
53
|
+
Redirect it while it works. Approve what it changes. Inspect everything it did.
|
|
54
|
+
</p>
|
|
55
|
+
|
|
56
|
+
<p align="center">
|
|
57
|
+
<a href="#install">Install</a>
|
|
58
|
+
·
|
|
59
|
+
<a href="#quickstart">Quickstart</a>
|
|
60
|
+
·
|
|
61
|
+
<a href="#staying-in-sync">Staying in sync</a>
|
|
62
|
+
·
|
|
63
|
+
<a href="#documentation">Docs</a>
|
|
64
|
+
·
|
|
65
|
+
<a href="https://pypi.org/project/wisp-ai/">PyPI</a>
|
|
66
|
+
·
|
|
67
|
+
<a href="https://github.com/whanyu1212/Wisp/blob/main/CHANGELOG.md">Changelog</a>
|
|
68
|
+
</p>
|
|
69
|
+
|
|
70
|
+
<p align="center">
|
|
71
|
+
<a href="https://pypi.org/project/wisp-ai/"><img src="https://img.shields.io/pypi/v/wisp-ai?label=PyPI" alt="PyPI version" /></a>
|
|
72
|
+
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/Python-3.12%2B-blue" alt="Python 3.12+" /></a>
|
|
73
|
+
<a href="https://github.com/whanyu1212/Wisp/actions/workflows/ci.yml"><img src="https://github.com/whanyu1212/Wisp/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
74
|
+
<a href="https://github.com/whanyu1212/Wisp/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-green" alt="MIT License" /></a>
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
## What is Wisp?
|
|
78
|
+
|
|
79
|
+
Most coding agents ask you to choose between watching and working: you either sit and wait, or you
|
|
80
|
+
walk away and audit a diff afterwards. Wisp is built for the middle — you can redirect it mid-run,
|
|
81
|
+
you approve anything that touches your machine, and every action it takes is a typed event on an
|
|
82
|
+
inspectable transcript.
|
|
83
|
+
|
|
84
|
+
Underneath is a single event-driven runtime. The CLI, the fullscreen TUI, the JSONL RPC process, and
|
|
85
|
+
the in-process SDK all drive the same command host and agent loop rather than reimplementing it.
|
|
86
|
+
They share session, tool, approval, and cancellation semantics, while each frontend exposes the
|
|
87
|
+
controls its input model supports: RPC and SDK clients have live steering and queue APIs, the TUI
|
|
88
|
+
accepts interactive follow-ups, and print/JSON modes run one prompt without a mid-run input channel.
|
|
89
|
+
|
|
90
|
+
## Install
|
|
91
|
+
|
|
92
|
+
Wisp is published on PyPI as `wisp-ai`, installs a `wisp` command, and requires Python 3.12+. Linux
|
|
93
|
+
and macOS are supported; Windows is best-effort until it has dedicated CI coverage.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
uv tool install "wisp-ai==0.1.0"
|
|
97
|
+
wisp --version
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
To run it without installing: `uvx --from "wisp-ai==0.1.0" wisp`. If `wisp` is not on your
|
|
101
|
+
`PATH`, run `uv tool update-shell` once and restart your shell.
|
|
102
|
+
|
|
103
|
+
See [Installation](https://whanyu1212.github.io/Wisp/guide/installation) for the update policy and
|
|
104
|
+
troubleshooting.
|
|
105
|
+
|
|
106
|
+
## Quickstart
|
|
107
|
+
|
|
108
|
+
Run Wisp from the project you want it to work on:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
cd path/to/project
|
|
112
|
+
wisp
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Wisp defaults to OpenAI Codex subscription access. Type `/connect` to open the provider panel, pick
|
|
116
|
+
**OpenAI → ChatGPT Plus/Pro**, and complete the device-code flow. The same panel accepts masked API
|
|
117
|
+
keys for OpenAI, xAI, DeepSeek, Anthropic, and Google. Then ask for something:
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
explain the architecture of this repository
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
For one-shot prompts and scripts, use print mode — or run entirely offline to try it without
|
|
124
|
+
credentials:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
wisp -p "summarize the current changes"
|
|
128
|
+
wisp -p "hello" --provider fake
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Staying in sync
|
|
132
|
+
|
|
133
|
+
This is the part worth knowing before anything else.
|
|
134
|
+
|
|
135
|
+
**Steer without starting over.** RPC and SDK clients can queue a course correction for the active
|
|
136
|
+
run. Wisp injects it at the next safe request boundary without discarding completed tool work or
|
|
137
|
+
rewriting the transcript. A follow-up waits until the run would otherwise finish. The TUI queues
|
|
138
|
+
text entered during a run as follow-up work; print and JSON invocations are intentionally one-shot.
|
|
139
|
+
|
|
140
|
+
**Cancel cleanly.** Cancellation is cooperative and leaves the session resumable rather than
|
|
141
|
+
half-written. In-flight tool work is unwound, the JSONL record stays valid, and `--continue` picks
|
|
142
|
+
up from the last committed state.
|
|
143
|
+
|
|
144
|
+
**Approve what matters.** Tools are classified `read`, `mutating`, or `command`. Reads run
|
|
145
|
+
directly; writes, edits, and shell commands stop and ask. The decision lives outside the model's
|
|
146
|
+
reach — no prompt can talk Wisp into skipping it — and print mode blocks unsafe execution entirely
|
|
147
|
+
unless you pass `--yes`.
|
|
148
|
+
|
|
149
|
+
**Nothing happens off-screen.** Every action is a typed `WispEvent` in an enforced order, persisted
|
|
150
|
+
to an append-only JSONL session you can read, resume, branch, or audit long after the run.
|
|
151
|
+
|
|
152
|
+
→ [How it stays in sync](https://whanyu1212.github.io/Wisp/guide/staying-in-sync)
|
|
153
|
+
|
|
154
|
+
## Interfaces
|
|
155
|
+
|
|
156
|
+
| Mode | Command | Output | Best for |
|
|
157
|
+
|------|---------|--------|----------|
|
|
158
|
+
| **TUI** | `wisp` (or `wisp tui`) | Fullscreen Textual UI | Interactive development |
|
|
159
|
+
| **Print** | `wisp -p "…"` | Assistant text on stdout, events on stderr | One-shot prompts and scripts |
|
|
160
|
+
| **JSON** | `wisp -p "…" --mode json` | One `WispEvent` JSON object per line | Machine-readable automation |
|
|
161
|
+
| **RPC** | `wisp --mode rpc` | Typed JSONL commands and events | Long-lived integrations |
|
|
162
|
+
|
|
163
|
+
RPC mode and the in-process SDK expose the same command, event, session, trust, and approval
|
|
164
|
+
contracts the built-in interfaces use. See
|
|
165
|
+
[Interfaces](https://whanyu1212.github.io/Wisp/guide/interfaces) and the
|
|
166
|
+
[Python SDK guide](https://whanyu1212.github.io/Wisp/guide/sdk).
|
|
167
|
+
|
|
168
|
+
## Architecture
|
|
169
|
+
|
|
170
|
+
One event-driven runtime, shared by every interface:
|
|
171
|
+
|
|
172
|
+
```text
|
|
173
|
+
CLI / JSONL-RPC / SDK adapters → RPC command host → CodingSession → AgentHarness → run_agent_loop
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Each layer adds exactly one concern. The provider/tool cycle knows nothing about sessions or
|
|
177
|
+
frontends; the harness owns in-memory conversation state; the coding session adds persistence and
|
|
178
|
+
safety policy; interfaces consume typed events. The TUI is an RPC client, not a second agent loop —
|
|
179
|
+
which is why it cannot drift from the guarantees above.
|
|
180
|
+
|
|
181
|
+
→ [Architecture](https://whanyu1212.github.io/Wisp/architecture/)
|
|
182
|
+
|
|
183
|
+
## Documentation
|
|
184
|
+
|
|
185
|
+
| | |
|
|
186
|
+
|---|---|
|
|
187
|
+
| [Guide](https://whanyu1212.github.io/Wisp/guide/) | Installation, quickstart, providers, tools, sessions, skills, TUI |
|
|
188
|
+
| [Staying in sync](https://whanyu1212.github.io/Wisp/guide/staying-in-sync) | Steering, cancellation, approvals, transcripts |
|
|
189
|
+
| [Python SDK](https://whanyu1212.github.io/Wisp/guide/sdk) | In-process embedding, typed events, safety, sessions, and cleanup |
|
|
190
|
+
| [Reference](https://whanyu1212.github.io/Wisp/reference/) | CLI, SDK, configuration, and environment variables |
|
|
191
|
+
| [Architecture](https://whanyu1212.github.io/Wisp/architecture/) | Runtime layers and ownership boundaries |
|
|
192
|
+
| [Contributing](https://whanyu1212.github.io/Wisp/contributing/) | Development setup and testing |
|
|
193
|
+
|
|
194
|
+
## Contributing
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
uv sync # install
|
|
198
|
+
uv run ruff format --check . && uv run ruff check . && uv run mypy # quality gates
|
|
199
|
+
uv run pytest tests # complete suite
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The suite runs entirely against deterministic fake and scripted providers, so the agent core, CLI,
|
|
203
|
+
and JSONL sessions are exercised without API keys or network calls. Run the complete command before
|
|
204
|
+
considering a change verified, and preserve the layer boundaries described above.
|
|
205
|
+
|
|
206
|
+
See [Contributing](https://whanyu1212.github.io/Wisp/contributing/) for development setup and CI
|
|
207
|
+
policy. Issues and pull requests are welcome at
|
|
208
|
+
[github.com/whanyu1212/Wisp/issues](https://github.com/whanyu1212/Wisp/issues).
|
|
209
|
+
|
|
210
|
+
## License
|
|
211
|
+
|
|
212
|
+
MIT — see [LICENSE](https://github.com/whanyu1212/Wisp/blob/main/LICENSE).
|
wisp_ai-0.1.0/README.md
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/whanyu1212/Wisp/main/assets/wisp-banner-v2.png" alt="Wisp — A coding agent that stays in sync, illustrated by a glowing spectral companion linked to a terminal." width="100%">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# Wisp
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>A coding agent that stays in sync with you.</strong><br>
|
|
9
|
+
Redirect it while it works. Approve what it changes. Inspect everything it did.
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="#install">Install</a>
|
|
14
|
+
·
|
|
15
|
+
<a href="#quickstart">Quickstart</a>
|
|
16
|
+
·
|
|
17
|
+
<a href="#staying-in-sync">Staying in sync</a>
|
|
18
|
+
·
|
|
19
|
+
<a href="#documentation">Docs</a>
|
|
20
|
+
·
|
|
21
|
+
<a href="https://pypi.org/project/wisp-ai/">PyPI</a>
|
|
22
|
+
·
|
|
23
|
+
<a href="https://github.com/whanyu1212/Wisp/blob/main/CHANGELOG.md">Changelog</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
<p align="center">
|
|
27
|
+
<a href="https://pypi.org/project/wisp-ai/"><img src="https://img.shields.io/pypi/v/wisp-ai?label=PyPI" alt="PyPI version" /></a>
|
|
28
|
+
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/Python-3.12%2B-blue" alt="Python 3.12+" /></a>
|
|
29
|
+
<a href="https://github.com/whanyu1212/Wisp/actions/workflows/ci.yml"><img src="https://github.com/whanyu1212/Wisp/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
|
|
30
|
+
<a href="https://github.com/whanyu1212/Wisp/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-MIT-green" alt="MIT License" /></a>
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
## What is Wisp?
|
|
34
|
+
|
|
35
|
+
Most coding agents ask you to choose between watching and working: you either sit and wait, or you
|
|
36
|
+
walk away and audit a diff afterwards. Wisp is built for the middle — you can redirect it mid-run,
|
|
37
|
+
you approve anything that touches your machine, and every action it takes is a typed event on an
|
|
38
|
+
inspectable transcript.
|
|
39
|
+
|
|
40
|
+
Underneath is a single event-driven runtime. The CLI, the fullscreen TUI, the JSONL RPC process, and
|
|
41
|
+
the in-process SDK all drive the same command host and agent loop rather than reimplementing it.
|
|
42
|
+
They share session, tool, approval, and cancellation semantics, while each frontend exposes the
|
|
43
|
+
controls its input model supports: RPC and SDK clients have live steering and queue APIs, the TUI
|
|
44
|
+
accepts interactive follow-ups, and print/JSON modes run one prompt without a mid-run input channel.
|
|
45
|
+
|
|
46
|
+
## Install
|
|
47
|
+
|
|
48
|
+
Wisp is published on PyPI as `wisp-ai`, installs a `wisp` command, and requires Python 3.12+. Linux
|
|
49
|
+
and macOS are supported; Windows is best-effort until it has dedicated CI coverage.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
uv tool install "wisp-ai==0.1.0"
|
|
53
|
+
wisp --version
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
To run it without installing: `uvx --from "wisp-ai==0.1.0" wisp`. If `wisp` is not on your
|
|
57
|
+
`PATH`, run `uv tool update-shell` once and restart your shell.
|
|
58
|
+
|
|
59
|
+
See [Installation](https://whanyu1212.github.io/Wisp/guide/installation) for the update policy and
|
|
60
|
+
troubleshooting.
|
|
61
|
+
|
|
62
|
+
## Quickstart
|
|
63
|
+
|
|
64
|
+
Run Wisp from the project you want it to work on:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
cd path/to/project
|
|
68
|
+
wisp
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Wisp defaults to OpenAI Codex subscription access. Type `/connect` to open the provider panel, pick
|
|
72
|
+
**OpenAI → ChatGPT Plus/Pro**, and complete the device-code flow. The same panel accepts masked API
|
|
73
|
+
keys for OpenAI, xAI, DeepSeek, Anthropic, and Google. Then ask for something:
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
explain the architecture of this repository
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
For one-shot prompts and scripts, use print mode — or run entirely offline to try it without
|
|
80
|
+
credentials:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
wisp -p "summarize the current changes"
|
|
84
|
+
wisp -p "hello" --provider fake
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Staying in sync
|
|
88
|
+
|
|
89
|
+
This is the part worth knowing before anything else.
|
|
90
|
+
|
|
91
|
+
**Steer without starting over.** RPC and SDK clients can queue a course correction for the active
|
|
92
|
+
run. Wisp injects it at the next safe request boundary without discarding completed tool work or
|
|
93
|
+
rewriting the transcript. A follow-up waits until the run would otherwise finish. The TUI queues
|
|
94
|
+
text entered during a run as follow-up work; print and JSON invocations are intentionally one-shot.
|
|
95
|
+
|
|
96
|
+
**Cancel cleanly.** Cancellation is cooperative and leaves the session resumable rather than
|
|
97
|
+
half-written. In-flight tool work is unwound, the JSONL record stays valid, and `--continue` picks
|
|
98
|
+
up from the last committed state.
|
|
99
|
+
|
|
100
|
+
**Approve what matters.** Tools are classified `read`, `mutating`, or `command`. Reads run
|
|
101
|
+
directly; writes, edits, and shell commands stop and ask. The decision lives outside the model's
|
|
102
|
+
reach — no prompt can talk Wisp into skipping it — and print mode blocks unsafe execution entirely
|
|
103
|
+
unless you pass `--yes`.
|
|
104
|
+
|
|
105
|
+
**Nothing happens off-screen.** Every action is a typed `WispEvent` in an enforced order, persisted
|
|
106
|
+
to an append-only JSONL session you can read, resume, branch, or audit long after the run.
|
|
107
|
+
|
|
108
|
+
→ [How it stays in sync](https://whanyu1212.github.io/Wisp/guide/staying-in-sync)
|
|
109
|
+
|
|
110
|
+
## Interfaces
|
|
111
|
+
|
|
112
|
+
| Mode | Command | Output | Best for |
|
|
113
|
+
|------|---------|--------|----------|
|
|
114
|
+
| **TUI** | `wisp` (or `wisp tui`) | Fullscreen Textual UI | Interactive development |
|
|
115
|
+
| **Print** | `wisp -p "…"` | Assistant text on stdout, events on stderr | One-shot prompts and scripts |
|
|
116
|
+
| **JSON** | `wisp -p "…" --mode json` | One `WispEvent` JSON object per line | Machine-readable automation |
|
|
117
|
+
| **RPC** | `wisp --mode rpc` | Typed JSONL commands and events | Long-lived integrations |
|
|
118
|
+
|
|
119
|
+
RPC mode and the in-process SDK expose the same command, event, session, trust, and approval
|
|
120
|
+
contracts the built-in interfaces use. See
|
|
121
|
+
[Interfaces](https://whanyu1212.github.io/Wisp/guide/interfaces) and the
|
|
122
|
+
[Python SDK guide](https://whanyu1212.github.io/Wisp/guide/sdk).
|
|
123
|
+
|
|
124
|
+
## Architecture
|
|
125
|
+
|
|
126
|
+
One event-driven runtime, shared by every interface:
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
CLI / JSONL-RPC / SDK adapters → RPC command host → CodingSession → AgentHarness → run_agent_loop
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Each layer adds exactly one concern. The provider/tool cycle knows nothing about sessions or
|
|
133
|
+
frontends; the harness owns in-memory conversation state; the coding session adds persistence and
|
|
134
|
+
safety policy; interfaces consume typed events. The TUI is an RPC client, not a second agent loop —
|
|
135
|
+
which is why it cannot drift from the guarantees above.
|
|
136
|
+
|
|
137
|
+
→ [Architecture](https://whanyu1212.github.io/Wisp/architecture/)
|
|
138
|
+
|
|
139
|
+
## Documentation
|
|
140
|
+
|
|
141
|
+
| | |
|
|
142
|
+
|---|---|
|
|
143
|
+
| [Guide](https://whanyu1212.github.io/Wisp/guide/) | Installation, quickstart, providers, tools, sessions, skills, TUI |
|
|
144
|
+
| [Staying in sync](https://whanyu1212.github.io/Wisp/guide/staying-in-sync) | Steering, cancellation, approvals, transcripts |
|
|
145
|
+
| [Python SDK](https://whanyu1212.github.io/Wisp/guide/sdk) | In-process embedding, typed events, safety, sessions, and cleanup |
|
|
146
|
+
| [Reference](https://whanyu1212.github.io/Wisp/reference/) | CLI, SDK, configuration, and environment variables |
|
|
147
|
+
| [Architecture](https://whanyu1212.github.io/Wisp/architecture/) | Runtime layers and ownership boundaries |
|
|
148
|
+
| [Contributing](https://whanyu1212.github.io/Wisp/contributing/) | Development setup and testing |
|
|
149
|
+
|
|
150
|
+
## Contributing
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
uv sync # install
|
|
154
|
+
uv run ruff format --check . && uv run ruff check . && uv run mypy # quality gates
|
|
155
|
+
uv run pytest tests # complete suite
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The suite runs entirely against deterministic fake and scripted providers, so the agent core, CLI,
|
|
159
|
+
and JSONL sessions are exercised without API keys or network calls. Run the complete command before
|
|
160
|
+
considering a change verified, and preserve the layer boundaries described above.
|
|
161
|
+
|
|
162
|
+
See [Contributing](https://whanyu1212.github.io/Wisp/contributing/) for development setup and CI
|
|
163
|
+
policy. Issues and pull requests are welcome at
|
|
164
|
+
[github.com/whanyu1212/Wisp/issues](https://github.com/whanyu1212/Wisp/issues).
|
|
165
|
+
|
|
166
|
+
## License
|
|
167
|
+
|
|
168
|
+
MIT — see [LICENSE](https://github.com/whanyu1212/Wisp/blob/main/LICENSE).
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "wisp-ai"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Terminal-first coding agent with typed CLI, TUI, RPC, and SDK interfaces"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
requires-python = ">=3.12"
|
|
9
|
+
keywords = [
|
|
10
|
+
"agent",
|
|
11
|
+
"ai",
|
|
12
|
+
"cli",
|
|
13
|
+
"coding-agent",
|
|
14
|
+
"llm",
|
|
15
|
+
"tui",
|
|
16
|
+
]
|
|
17
|
+
classifiers = [
|
|
18
|
+
"Development Status :: 4 - Beta",
|
|
19
|
+
"Environment :: Console",
|
|
20
|
+
"Intended Audience :: Developers",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
"Programming Language :: Python :: 3",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Topic :: Software Development :: Code Generators",
|
|
26
|
+
"Topic :: Software Development :: Libraries :: Application Frameworks",
|
|
27
|
+
"Typing :: Typed",
|
|
28
|
+
]
|
|
29
|
+
dependencies = [
|
|
30
|
+
"anthropic>=0.116.0",
|
|
31
|
+
"anyio>=4.14.1",
|
|
32
|
+
"cryptography>=50.0.0",
|
|
33
|
+
"google-genai>=2.12.0",
|
|
34
|
+
"httpx>=0.28.1",
|
|
35
|
+
"jsonschema>=4.26",
|
|
36
|
+
"mcp>=2,<3",
|
|
37
|
+
"openai>=2.44.0",
|
|
38
|
+
"packaging>=26.0",
|
|
39
|
+
"pathspec>=1.1.1",
|
|
40
|
+
"prompt-toolkit>=3.0.52",
|
|
41
|
+
"pygments>=2.20.0",
|
|
42
|
+
"pyyaml>=6.0.2",
|
|
43
|
+
"pydantic>=2.13.4",
|
|
44
|
+
"regex>=2026.7.19",
|
|
45
|
+
"rich>=15.0.0",
|
|
46
|
+
"textual>=8.2.8",
|
|
47
|
+
"typer>=0.26.8",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
[[project.authors]]
|
|
51
|
+
name = "whanyu1212"
|
|
52
|
+
email = "whanyu1212@hotmail.com"
|
|
53
|
+
|
|
54
|
+
[project.urls]
|
|
55
|
+
Homepage = "https://github.com/whanyu1212/Wisp"
|
|
56
|
+
Repository = "https://github.com/whanyu1212/Wisp"
|
|
57
|
+
Changelog = "https://github.com/whanyu1212/Wisp/blob/main/CHANGELOG.md"
|
|
58
|
+
Issues = "https://github.com/whanyu1212/Wisp/issues"
|
|
59
|
+
|
|
60
|
+
[project.scripts]
|
|
61
|
+
wisp = "wisp.cli:main"
|
|
62
|
+
|
|
63
|
+
[build-system]
|
|
64
|
+
requires = ["uv_build>=0.9.8,<0.10.0"]
|
|
65
|
+
build-backend = "uv_build"
|
|
66
|
+
|
|
67
|
+
[tool.uv.build-backend]
|
|
68
|
+
module-name = "wisp"
|
|
69
|
+
|
|
70
|
+
[tool.pytest.ini_options]
|
|
71
|
+
testpaths = ["tests"]
|
|
72
|
+
markers = [
|
|
73
|
+
"tui: headless Textual integration tests",
|
|
74
|
+
"process: tests covering process-backed tools or process trees",
|
|
75
|
+
"benchmark: deterministic performance and resource-bound scenarios",
|
|
76
|
+
"slow: intentionally long-running tests outside the other categories",
|
|
77
|
+
"production_fault: required deterministic production fault-injection regressions",
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
[tool.ruff]
|
|
81
|
+
line-length = 100
|
|
82
|
+
|
|
83
|
+
[tool.ruff.lint]
|
|
84
|
+
select = [
|
|
85
|
+
"E",
|
|
86
|
+
"F",
|
|
87
|
+
"I",
|
|
88
|
+
"UP",
|
|
89
|
+
"B",
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
[tool.mypy]
|
|
93
|
+
python_version = "3.12"
|
|
94
|
+
strict = true
|
|
95
|
+
files = [
|
|
96
|
+
"src/wisp",
|
|
97
|
+
"examples/sdk/common.py",
|
|
98
|
+
"examples/sdk/control_requests.py",
|
|
99
|
+
"examples/sdk/minimal.py",
|
|
100
|
+
"examples/sdk/persisted_sessions.py",
|
|
101
|
+
"examples/sdk/safety_requests.py",
|
|
102
|
+
"examples/sdk/subprocess_rpc.py",
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
[dependency-groups]
|
|
106
|
+
dev = [
|
|
107
|
+
"mypy>=2.1.0",
|
|
108
|
+
"pytest>=9.1.1",
|
|
109
|
+
"pytest-asyncio>=1.4.0",
|
|
110
|
+
"ruff>=0.15.20",
|
|
111
|
+
"types-jsonschema>=4.26",
|
|
112
|
+
"types-pygments>=2.19",
|
|
113
|
+
"types-regex>=2026.7.19.20260720",
|
|
114
|
+
"types-pyyaml>=6.0.12",
|
|
115
|
+
]
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "wisp-ai"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Terminal-first coding agent with typed CLI, TUI, RPC, and SDK interfaces"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "whanyu1212", email = "whanyu1212@hotmail.com" }
|
|
10
|
+
]
|
|
11
|
+
requires-python = ">=3.12"
|
|
12
|
+
keywords = [
|
|
13
|
+
"agent",
|
|
14
|
+
"ai",
|
|
15
|
+
"cli",
|
|
16
|
+
"coding-agent",
|
|
17
|
+
"llm",
|
|
18
|
+
"tui",
|
|
19
|
+
]
|
|
20
|
+
classifiers = [
|
|
21
|
+
"Development Status :: 4 - Beta",
|
|
22
|
+
"Environment :: Console",
|
|
23
|
+
"Intended Audience :: Developers",
|
|
24
|
+
"Operating System :: OS Independent",
|
|
25
|
+
"Programming Language :: Python :: 3",
|
|
26
|
+
"Programming Language :: Python :: 3.12",
|
|
27
|
+
"Programming Language :: Python :: 3.13",
|
|
28
|
+
"Topic :: Software Development :: Code Generators",
|
|
29
|
+
"Topic :: Software Development :: Libraries :: Application Frameworks",
|
|
30
|
+
"Typing :: Typed",
|
|
31
|
+
]
|
|
32
|
+
dependencies = [
|
|
33
|
+
"anthropic>=0.116.0",
|
|
34
|
+
"anyio>=4.14.1",
|
|
35
|
+
"cryptography>=50.0.0",
|
|
36
|
+
"google-genai>=2.12.0",
|
|
37
|
+
"httpx>=0.28.1",
|
|
38
|
+
"jsonschema>=4.26",
|
|
39
|
+
"mcp>=2,<3",
|
|
40
|
+
"openai>=2.44.0",
|
|
41
|
+
"packaging>=26.0",
|
|
42
|
+
"pathspec>=1.1.1",
|
|
43
|
+
"prompt-toolkit>=3.0.52",
|
|
44
|
+
"pygments>=2.20.0",
|
|
45
|
+
"pyyaml>=6.0.2",
|
|
46
|
+
"pydantic>=2.13.4",
|
|
47
|
+
"regex>=2026.7.19",
|
|
48
|
+
"rich>=15.0.0",
|
|
49
|
+
"textual>=8.2.8",
|
|
50
|
+
"typer>=0.26.8",
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
[project.urls]
|
|
54
|
+
Homepage = "https://github.com/whanyu1212/Wisp"
|
|
55
|
+
Repository = "https://github.com/whanyu1212/Wisp"
|
|
56
|
+
Changelog = "https://github.com/whanyu1212/Wisp/blob/main/CHANGELOG.md"
|
|
57
|
+
Issues = "https://github.com/whanyu1212/Wisp/issues"
|
|
58
|
+
|
|
59
|
+
[project.scripts]
|
|
60
|
+
wisp = "wisp.cli:main"
|
|
61
|
+
|
|
62
|
+
[build-system]
|
|
63
|
+
requires = ["uv_build>=0.9.8,<0.10.0"]
|
|
64
|
+
build-backend = "uv_build"
|
|
65
|
+
|
|
66
|
+
[tool.uv.build-backend]
|
|
67
|
+
module-name = "wisp"
|
|
68
|
+
|
|
69
|
+
[dependency-groups]
|
|
70
|
+
dev = [
|
|
71
|
+
"mypy>=2.1.0",
|
|
72
|
+
"pytest>=9.1.1",
|
|
73
|
+
"pytest-asyncio>=1.4.0",
|
|
74
|
+
"ruff>=0.15.20",
|
|
75
|
+
"types-jsonschema>=4.26",
|
|
76
|
+
"types-pygments>=2.19",
|
|
77
|
+
"types-regex>=2026.7.19.20260720",
|
|
78
|
+
"types-pyyaml>=6.0.12",
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
[tool.pytest.ini_options]
|
|
82
|
+
testpaths = ["tests"]
|
|
83
|
+
markers = [
|
|
84
|
+
"tui: headless Textual integration tests",
|
|
85
|
+
"process: tests covering process-backed tools or process trees",
|
|
86
|
+
"benchmark: deterministic performance and resource-bound scenarios",
|
|
87
|
+
"slow: intentionally long-running tests outside the other categories",
|
|
88
|
+
"production_fault: required deterministic production fault-injection regressions",
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
[tool.ruff]
|
|
92
|
+
line-length = 100
|
|
93
|
+
|
|
94
|
+
[tool.ruff.lint]
|
|
95
|
+
select = ["E", "F", "I", "UP", "B"]
|
|
96
|
+
|
|
97
|
+
[tool.mypy]
|
|
98
|
+
python_version = "3.12"
|
|
99
|
+
strict = true
|
|
100
|
+
files = [
|
|
101
|
+
"src/wisp",
|
|
102
|
+
"examples/sdk/common.py",
|
|
103
|
+
"examples/sdk/control_requests.py",
|
|
104
|
+
"examples/sdk/minimal.py",
|
|
105
|
+
"examples/sdk/persisted_sessions.py",
|
|
106
|
+
"examples/sdk/safety_requests.py",
|
|
107
|
+
"examples/sdk/subprocess_rpc.py",
|
|
108
|
+
]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Agent runtime package; import concrete contracts from their defining modules."""
|