pulse-coding-agent 0.1.0__py3-none-any.whl

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.
Files changed (104) hide show
  1. pulse/__init__.py +5 -0
  2. pulse/__main__.py +4 -0
  3. pulse/agent.py +270 -0
  4. pulse/agent_manager.py +335 -0
  5. pulse/audit.py +70 -0
  6. pulse/auth.py +670 -0
  7. pulse/ci/github_client.py +66 -0
  8. pulse/ci/runner.py +28 -0
  9. pulse/cli.py +1075 -0
  10. pulse/cli_ui.py +977 -0
  11. pulse/config.py +167 -0
  12. pulse/context.py +960 -0
  13. pulse/conversations/__init__.py +8 -0
  14. pulse/conversations/manager.py +312 -0
  15. pulse/core/agent.py +188 -0
  16. pulse/core/planner.py +105 -0
  17. pulse/core/protocols.py +37 -0
  18. pulse/edits.py +65 -0
  19. pulse/episodic.py +93 -0
  20. pulse/eval/__init__.py +8 -0
  21. pulse/eval/trajectory_logger.py +91 -0
  22. pulse/eval/verifier.py +133 -0
  23. pulse/execution/__init__.py +5 -0
  24. pulse/execution/remote_task.py +76 -0
  25. pulse/git.py +162 -0
  26. pulse/interactive.py +234 -0
  27. pulse/mcp/__init__.py +4 -0
  28. pulse/mcp/client.py +215 -0
  29. pulse/mcp/local_tools.py +105 -0
  30. pulse/memory.py +212 -0
  31. pulse/mutations.py +283 -0
  32. pulse/orchestration/__init__.py +3 -0
  33. pulse/orchestration/orchestrator.py +162 -0
  34. pulse/patch.py +129 -0
  35. pulse/planner/__init__.py +3 -0
  36. pulse/planner/dag_planner.py +85 -0
  37. pulse/planner/execution_loop.py +159 -0
  38. pulse/production.py +235 -0
  39. pulse/provider.py +59 -0
  40. pulse/provider_keys.py +278 -0
  41. pulse/providers/__init__.py +26 -0
  42. pulse/providers/anthropic.py +65 -0
  43. pulse/providers/base.py +251 -0
  44. pulse/providers/deepseek.py +10 -0
  45. pulse/providers/failover.py +32 -0
  46. pulse/providers/gemini.py +66 -0
  47. pulse/providers/groq.py +10 -0
  48. pulse/providers/manager.py +262 -0
  49. pulse/providers/openai.py +40 -0
  50. pulse/providers/openrouter.py +20 -0
  51. pulse/py.typed +1 -0
  52. pulse/reasoning.py +570 -0
  53. pulse/refactor/__init__.py +3 -0
  54. pulse/refactor/impact_analyzer.py +44 -0
  55. pulse/repository.py +209 -0
  56. pulse/rpc.py +249 -0
  57. pulse/rule_synthesizer.py +54 -0
  58. pulse/runtime.py +217 -0
  59. pulse/safety/__init__.py +3 -0
  60. pulse/safety/safety_manager.py +97 -0
  61. pulse/sandbox/SECURITY.md +57 -0
  62. pulse/sandbox/__init__.py +57 -0
  63. pulse/sandbox/api.py +594 -0
  64. pulse/sandbox/audit.py +153 -0
  65. pulse/sandbox/backend/__init__.py +7 -0
  66. pulse/sandbox/backend/base.py +72 -0
  67. pulse/sandbox/backend/docker.py +498 -0
  68. pulse/sandbox/backend/host.py +140 -0
  69. pulse/sandbox/backend/remote.py +224 -0
  70. pulse/sandbox/errors.py +106 -0
  71. pulse/sandbox/filesystem.py +476 -0
  72. pulse/sandbox/git_safe.py +50 -0
  73. pulse/sandbox/lifecycle.py +88 -0
  74. pulse/sandbox/network.py +205 -0
  75. pulse/sandbox/path_validator.py +280 -0
  76. pulse/sandbox/policy.py +209 -0
  77. pulse/sandbox/process.py +331 -0
  78. pulse/sandbox/project.py +158 -0
  79. pulse/sandbox/python_safe.py +62 -0
  80. pulse/sandbox/remote/__init__.py +1 -0
  81. pulse/sandbox/remote/client.py +389 -0
  82. pulse/sandbox/remote/models.py +167 -0
  83. pulse/sandbox/remote/protocol.py +65 -0
  84. pulse/sandbox/remote/server.py +984 -0
  85. pulse/sandbox/remote/worker.py +175 -0
  86. pulse/sandbox/resources.py +236 -0
  87. pulse/sandbox/secrets.py +241 -0
  88. pulse/session_manager.py +365 -0
  89. pulse/software_engineer.py +189 -0
  90. pulse/storage.py +140 -0
  91. pulse/streaming.py +385 -0
  92. pulse/subprocesses.py +79 -0
  93. pulse/task_manager.py +2005 -0
  94. pulse/telemetry/__init__.py +25 -0
  95. pulse/telemetry/cost_tracker.py +95 -0
  96. pulse/telemetry/logger.py +110 -0
  97. pulse/tool_policy.py +197 -0
  98. pulse/tool_registry.py +163 -0
  99. pulse/tools.py +372 -0
  100. pulse/verification.py +118 -0
  101. pulse_coding_agent-0.1.0.dist-info/METADATA +211 -0
  102. pulse_coding_agent-0.1.0.dist-info/RECORD +104 -0
  103. pulse_coding_agent-0.1.0.dist-info/WHEEL +4 -0
  104. pulse_coding_agent-0.1.0.dist-info/entry_points.txt +4 -0
@@ -0,0 +1,211 @@
1
+ Metadata-Version: 2.5
2
+ Name: pulse-coding-agent
3
+ Version: 0.1.0
4
+ Summary: Permissioned coding-agent CLI with durable planning and isolated execution.
5
+ Project-URL: Homepage, https://github.com/Roastedpotato21/pulse
6
+ Project-URL: Repository, https://github.com/Roastedpotato21/pulse
7
+ Project-URL: Issues, https://github.com/Roastedpotato21/pulse/issues
8
+ Project-URL: Changelog, https://github.com/Roastedpotato21/pulse/blob/master/CHANGELOG.md
9
+ Project-URL: Security, https://github.com/Roastedpotato21/pulse/security/policy
10
+ Keywords: ai,coding-agent,developer-tools,sandbox
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Software Development
21
+ Requires-Python: <3.14,>=3.11
22
+ Requires-Dist: httpx==0.28.1
23
+ Requires-Dist: keyring==25.7.0
24
+ Requires-Dist: openai==2.44.0
25
+ Requires-Dist: prompt-toolkit==3.0.52
26
+ Requires-Dist: python-dotenv==1.2.2
27
+ Requires-Dist: rich==15.0.0
28
+ Requires-Dist: typer==0.26.8
29
+ Requires-Dist: websockets==16.1
30
+ Description-Content-Type: text/markdown
31
+
32
+ # Pulse
33
+
34
+ Pulse is a permissioned coding-agent CLI for working on software repositories.
35
+ It combines repository-aware planning, durable task state, explicit mutation
36
+ controls, sandboxed command execution, provider routing, audit trails, and cost
37
+ tracking in one Python package.
38
+
39
+ > **Public beta — 0.1.0:** Pulse is supported for controlled, local,
40
+ > single-user use. The remote worker and VS Code extension are included for
41
+ > evaluation and development, but they are not supported as multi-tenant or
42
+ > unattended production services.
43
+
44
+ ## Requirements
45
+
46
+ - Python 3.11, 3.12, or 3.13
47
+ - An API key for the model provider you choose
48
+ - Docker or Podman for local isolated execution, or access to a configured
49
+ Pulse remote worker
50
+
51
+ ## Install
52
+
53
+ Install the first beta from PyPI:
54
+
55
+ ```bash
56
+ uv tool install pulse-coding-agent==0.1.0
57
+ ```
58
+
59
+ Alternatively, use `pipx install pulse-coding-agent==0.1.0` or install it in a
60
+ dedicated virtual environment with `pip`.
61
+
62
+ ## Quick start
63
+
64
+ Run these commands from the repository you want Pulse to work on:
65
+
66
+ ```bash
67
+ pulse login
68
+ pulse doctor --production --target local
69
+ pulse ask "Explain this repository and identify the highest-risk missing test"
70
+ ```
71
+
72
+ After Google login, Pulse guides provider selection, model selection, and hidden
73
+ BYOK entry. New provider keys are stored in the native OS credential vault.
74
+ Credentials can also be supplied through environment variables such as `OPENAI_API_KEY`,
75
+ `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, or `OPENROUTER_API_KEY`. Do not commit a
76
+ populated `.env` file.
77
+
78
+ To run commands without installing Docker on the client workstation, configure
79
+ a remote worker:
80
+
81
+ ```text
82
+ PULSE_REMOTE_URL=wss://sandbox.example.com
83
+ PULSE_REMOTE_TOKEN=<random token of at least 32 characters>
84
+ PULSE_TLS_CERT=/absolute/path/to/client.crt
85
+ PULSE_TLS_KEY=/absolute/path/to/client.key
86
+ PULSE_TLS_CA=/absolute/path/to/ca.crt
87
+ ```
88
+
89
+ When those variables are set, Pulse tries the remote sandbox first and uses a
90
+ local Docker/Podman engine only as a secure fallback. The remote worker host
91
+ still requires Docker or Podman; execution never silently falls back to the
92
+ client host.
93
+
94
+ Before allowing mutations or shell execution, review the proposed operation and
95
+ its permission prompt. Treat model output, tool arguments, and repository
96
+ content as untrusted input.
97
+
98
+ ## What the beta includes
99
+
100
+ - Repository indexing and context-aware conversations
101
+ - Durable plans, tasks, sessions, episodic memory, and recovery state
102
+ - Permission-gated file mutations with transactional rollback
103
+ - Host, Docker, Podman, and authenticated remote sandbox backends
104
+ - Filesystem, network, resource, timeout, and secret-redaction policies
105
+ - Multi-provider model routing and usage/cost accounting
106
+ - Loopback JSON-RPC integration through `pulse-rpc` or `pulse serve`
107
+ - Production preflight checks, structured audit events, and correlation IDs
108
+
109
+ The package installs three entry points:
110
+
111
+ ```text
112
+ pulse Interactive CLI
113
+ pulse-rpc Loopback JSON-RPC server
114
+ pulse-remote Evaluation-only remote sandbox worker
115
+ ```
116
+
117
+ Use `pulse --help` for the current command surface and command-specific help.
118
+ `pulse-rpc` and `pulse serve` require a strong `PULSE_RPC_TOKEN` bearer secret
119
+ and must stay bound to loopback.
120
+
121
+ ### Interactive shell
122
+
123
+ Run `pulse` without arguments for the responsive project shell. Natural-language
124
+ input goes to the agent; prefix any regular CLI command with `/` to run it in the
125
+ same session, such as `/status`, `/keys list`, or `/chat switch ID`. Completions
126
+ appear as you type and are always generated from the public CLI parser.
127
+
128
+ - `Tab` or `Ctrl-Space`: open/accept command completion
129
+ - `Up`/`Down`: navigate history; `Ctrl-R`: search history
130
+ - `Alt-Enter`: insert a newline; `Enter`: submit
131
+ - `Ctrl-C`: clear the current input; on an empty prompt, exit
132
+ - `/help`, `/clear`, and `/exit`: shell controls
133
+
134
+ History is stored locally in the Git-ignored `.pulse/history` file.
135
+
136
+ ### Account and provider keys
137
+
138
+ ```bash
139
+ pulse version
140
+ pulse login
141
+ pulse auth-status
142
+ pulse whoami
143
+ pulse logout
144
+ pulse keys
145
+ pulse keys list
146
+ pulse keys set openai
147
+ pulse keys rotate openai
148
+ pulse keys remove openai
149
+ ```
150
+
151
+ `pulse keys` opens the status and rotation manager. Set and rotate operations
152
+ prompt with hidden input; provider keys are never accepted as command-line
153
+ arguments or printed back to the terminal. New keys are stored in a
154
+ workspace-scoped entry in the native OS credential vault. Existing `.env` keys
155
+ remain readable for compatibility and are removed for that provider after a
156
+ successful vault-backed set or rotation. Environment variables and external
157
+ secret managers remain supported as fallback sources.
158
+
159
+ ## Supported boundary
160
+
161
+ The 0.1.0 beta supports the local CLI and loopback RPC server for one trusted
162
+ user on one workstation. Pulse does not claim a security boundary between
163
+ mutually untrusted tenants. Do not expose `pulse-rpc` or `pulse-remote` directly
164
+ to the public internet.
165
+
166
+ The remote worker requires authenticated transport, durable configuration, and
167
+ container isolation. It remains evaluation-only until tenant isolation,
168
+ centralized observability, load testing, disaster-recovery exercises, and an
169
+ independent security review are complete. The VS Code extension is source-only
170
+ and is not part of the Python distribution.
171
+
172
+ Pulse sends prompts and selected repository context to the configured model
173
+ provider. Data handling therefore also depends on that provider's terms and
174
+ settings. Pulse itself does not include product analytics or telemetry export
175
+ in this beta.
176
+
177
+ ## Development
178
+
179
+ Clone the repository and create the locked development environment:
180
+
181
+ ```bash
182
+ uv sync --locked
183
+ uv run pulse --help
184
+ ```
185
+
186
+ Run the local quality gates:
187
+
188
+ ```bash
189
+ uv run ruff check src tests scripts
190
+ uv run mypy
191
+ uv run pytest tests/ -k "not sandbox" --cov=pulse --cov-report=term-missing --cov-fail-under=54
192
+ uv build
193
+ uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.0
194
+ ```
195
+
196
+ Docker security tests require a working Docker daemon and are enforced by the
197
+ hosted release workflow. See [OPERATIONS.md](OPERATIONS.md) for release and
198
+ rollback procedures.
199
+
200
+ ## Documentation
201
+
202
+ - [Architecture](ARCHITECTURE.md)
203
+ - [Operations and releases](OPERATIONS.md)
204
+ - [Security policy](SECURITY.md)
205
+ - [Sandbox security boundary](src/pulse/sandbox/SECURITY.md)
206
+ - [Privacy policy](PRIVACY.md)
207
+ - [Changelog](CHANGELOG.md)
208
+
209
+ To report a vulnerability, use GitHub private vulnerability reporting instead
210
+ of a public issue. General defects and beta feedback belong in the
211
+ [issue tracker](https://github.com/Roastedpotato21/pulse/issues).
@@ -0,0 +1,104 @@
1
+ pulse/__init__.py,sha256=QUq3h5ZAnqr2gOSyrD_rLEQTFWyjah9F-1V0NBwFWn8,71
2
+ pulse/__main__.py,sha256=pyMEpUjzVL5u9IiVQ3LnNHh2GrRtNosr-42a6LQx4nM,66
3
+ pulse/agent.py,sha256=ZzrCkoDSTq_LjFdl4eJibyze_I5BmuvKTLBj4yFXVgw,12652
4
+ pulse/agent_manager.py,sha256=DQX2C4iLLaNGvH2sgQq1A1audUXUmBE9KFKtkGebLPU,13899
5
+ pulse/audit.py,sha256=dr6H92YBAaGUjJbwceq3SD7-2fTwNkqUiXjGVg0Cc74,2127
6
+ pulse/auth.py,sha256=wysBCDzJisUow2bERxCzgdlMfPlrZn06HRsXTnpba5g,22109
7
+ pulse/cli.py,sha256=TN6DTfS3aQUsbJPWfcSWVJK6jxAuHY5jESEkzlk9v64,45002
8
+ pulse/cli_ui.py,sha256=pb7vo9xWvngHrXGgqXho4X52Q1XnCYUEcZze6bfN6n8,36157
9
+ pulse/config.py,sha256=LFlgfOQGWl0wr5VCbuRNHkkjiDSQgytfCgQgaCdsmzI,5042
10
+ pulse/context.py,sha256=clckyWCPq823kIrCj3KRGKvY-Np0SHwxzd1gCiaJfIs,37007
11
+ pulse/edits.py,sha256=Pt-hwDliP0kHIk8cWZJvvAO3KUrLrC1UM4XDoybJvvM,2045
12
+ pulse/episodic.py,sha256=Fzqq2VLcsnM7HK0zmxhqFhHvWBZz4sptow3E0zGDbyo,3227
13
+ pulse/git.py,sha256=DdlV2G0a5W1mVqcs6OaNVfD-xOtW9kv5gJ4Mjp61iew,6286
14
+ pulse/interactive.py,sha256=m8cQ2Sc1sgZ_Pv3HZUmKG8rwbMB0_RmrbpGA_Emiho8,8727
15
+ pulse/memory.py,sha256=pyfK9irpV4578HmZEhca4hxxCFkxjZ1f7gtvLM7jMVQ,9157
16
+ pulse/mutations.py,sha256=ImJSNtZ2R_8UY_1HzdwhTAy3cj-Lr5CkrIAPUlz-gco,10954
17
+ pulse/patch.py,sha256=_XSbKCLXitI1WrxXMXQObE-3ElX-CXHcnuRi_zaukf8,4896
18
+ pulse/production.py,sha256=x4mFDxLQ9RNPKbqLjpOF8oEmCLlXIedYwNCr6JXhooU,8235
19
+ pulse/provider.py,sha256=w_oaPRce3U45E1iVjbS0_fM_VCA7ff2fB-m-Bqizb20,1802
20
+ pulse/provider_keys.py,sha256=CrPO4Kqw3D31dh7joHSWDypBU407fYKnIaelmM7h6lY,11077
21
+ pulse/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
22
+ pulse/reasoning.py,sha256=tKzYukaxGNQ65uCu_s8VSRY3JltakGViz16_m1-5dEs,24140
23
+ pulse/repository.py,sha256=lO_0WSFlKGF8K6Ct9m0intC1bSge3Ra8T5k93sLpuLM,8533
24
+ pulse/rpc.py,sha256=8alHF5HIjbPmJVEomaYRNyRYCfGektuhwX3wGL-qIy8,10677
25
+ pulse/rule_synthesizer.py,sha256=m7-61MXragN7uKaEHIGwzPjlAna4EQoli9BISdoU5oo,1961
26
+ pulse/runtime.py,sha256=aKGgSUsm-QvI0zzVgNSg9F_1STzwtr3eXO4O2jF19SI,7180
27
+ pulse/session_manager.py,sha256=sF7Y7v-4USMF5HLnlLs29smriRjoDe3bOSzSuAJlHcI,13964
28
+ pulse/software_engineer.py,sha256=sSbtJc4NU4JoVPPWByw_Qf8h9Ri4NNEn9iRkiYsZuaA,8123
29
+ pulse/storage.py,sha256=LGAaKUhdwlM6S8ONrJXjzkl7hOvyfRoOQhntr5F5zGE,5377
30
+ pulse/streaming.py,sha256=hDJlA1OeKOw1d-Jw-mSeFBh0Z2iBc_i49MwEk2nVPNE,17291
31
+ pulse/subprocesses.py,sha256=YhENUEdmKn7viRCQXmqrhxDRpIfMo50YFS2kb1Doxuw,2029
32
+ pulse/task_manager.py,sha256=VrRLySx5UwARpgGh69Kskp-9ZUb0ob5aul2RqTLAp6I,84017
33
+ pulse/tool_policy.py,sha256=PZ1nIc9OxrmrJDcHn7fmDrrMa-TpCRGnqJnHlC1EO7c,6597
34
+ pulse/tool_registry.py,sha256=qvY7VWza6gJFvZL2zOW5lwGjMAL9PdH18RipLm5mCkg,5966
35
+ pulse/tools.py,sha256=KFHqxAfTU2Q85q70SulyFBFEXQrdivTyPQaWZKWce2o,16404
36
+ pulse/verification.py,sha256=2W8fkjpbwkBWTrNXIlkNTxfHWA5z6eTKwK6F5hp7ZhY,4898
37
+ pulse/ci/github_client.py,sha256=Wcn_FeM5aTA8EwMtsnLX9N6YP03cNaXBYL0wQ7BmvMM,2751
38
+ pulse/ci/runner.py,sha256=aQnJ_M5c1FXnFySHsSSy5ahCZ6CO_zrmgHDTSn2KvW4,944
39
+ pulse/conversations/__init__.py,sha256=cTFnPp87mmTkVhPsnd3PRtOITWGMZU0o6BYbKi2IjG0,257
40
+ pulse/conversations/manager.py,sha256=L3yf6WUn13aMtlSpjOP-jccrVQs20ce2I5kSWrHH66U,12630
41
+ pulse/core/agent.py,sha256=dAOTcYulisNrxR0DtH_B48aPYc6EnbaIUvf8VTAu4PQ,8013
42
+ pulse/core/planner.py,sha256=8qubIZqYGNDhAVyGztNH7WIwB9LGIQVGrre9Sxd-lfw,3716
43
+ pulse/core/protocols.py,sha256=P_N7YTKXx61uyPOYmQr0iqiLLAqA7PWiYQ3H7vVp6n8,1085
44
+ pulse/eval/__init__.py,sha256=0658hX7tfbTCN22gOLa8yRo9kyGuezNCsXO4LDW0Lzo,299
45
+ pulse/eval/trajectory_logger.py,sha256=nBPAM9w7cSur0K61RN8PGLzBKzulvDGnPWmEi3z-ViM,3216
46
+ pulse/eval/verifier.py,sha256=HJSZuti_-JPfyhTRS37iUqiBcUMNjRq-UO4FAvRTntU,5033
47
+ pulse/execution/__init__.py,sha256=wRHZo8UWQqCvGb6rv22jhIf3Q8IZiJgciiGhZzxb6qE,165
48
+ pulse/execution/remote_task.py,sha256=gH5ACHa0ctZjgJRaiD-R145gsoP5N04DxeTQiiuJaks,2610
49
+ pulse/mcp/__init__.py,sha256=wwWWMWewAoBXyNVNBlfUBkEy5k-VcARoRAi2SD6X43k,147
50
+ pulse/mcp/client.py,sha256=35XgRRPYE9_wFElR_nwft0L88AiOBggEkCjJI82cWTk,9095
51
+ pulse/mcp/local_tools.py,sha256=_oMnyjWuZxbgx3ExVsjNlqpXqnaoQ5DolnUkbDrtn8I,3973
52
+ pulse/orchestration/__init__.py,sha256=wYhYpeyRvUtdxskOsxAWnSQpDy5vZMahiogjLzAKu-w,96
53
+ pulse/orchestration/orchestrator.py,sha256=w_LY29xnZlTScnqBP_vfoOgcX4eHaJfMCFwzt85UTLY,6582
54
+ pulse/planner/__init__.py,sha256=M8O7R_AYgUpWUDVFZxZ5tj2LhVSnnTNMaONFsfVFnsQ,144
55
+ pulse/planner/dag_planner.py,sha256=vCDNtOQWZgILMqn7Nram3UwGRnqR6V8FOYsMEmFRbrU,2974
56
+ pulse/planner/execution_loop.py,sha256=a5u23ySHxC4VeulLbinm82uyFuvsKnr6O80qB3mPKys,6241
57
+ pulse/providers/__init__.py,sha256=9Aotqz492qjdB5l5RmxlzC88clU06RDDDkSXFwapzsM,827
58
+ pulse/providers/anthropic.py,sha256=xxEekGZOQnbUTTMdL5EmeO6_qf58_AfvIJSbnZQV7hw,2262
59
+ pulse/providers/base.py,sha256=anbY03KrjtPdoDz05peZ_J3-qCfP5z1bpp0epsgsETc,9201
60
+ pulse/providers/deepseek.py,sha256=vXQ79nxP1GW-0y9tLYt5rfjKGufHPXXM4g0q8DDQQlo,283
61
+ pulse/providers/failover.py,sha256=Zghl8UAS_VfZBSKYLKiPpF6AYv6h44nAR_dESyOQQTQ,1284
62
+ pulse/providers/gemini.py,sha256=y-TmiZ2eTDQ3AKB9oKdqiIrEyK4N79yonTBkWSp5Yjs,2319
63
+ pulse/providers/groq.py,sha256=9dnkg3T47IUATvQmGpaXqcFGCSxcoprKMxFWlTSEsIQ,277
64
+ pulse/providers/manager.py,sha256=pgy3o_Pdh_FwZ7gf85naU7COb3k8EVIMaVzGyJyzpEI,11461
65
+ pulse/providers/openai.py,sha256=sx1wK1tKnnkxdspo_8AqdynREg16ltTsZn2ZVq6f4OE,1271
66
+ pulse/providers/openrouter.py,sha256=nId5Teqx4YvGMG59jTdGAtGdFHPAwK0iXCLByeTUkqY,549
67
+ pulse/refactor/__init__.py,sha256=dH01Vx6V-I0ICGyVaL0iPugq4CwPvd6UswQgh9FC5jc,94
68
+ pulse/refactor/impact_analyzer.py,sha256=h3v9nPOc6cH5FYEE7L5ePhjEKs7JLMw-vmIhZw7QbGU,1828
69
+ pulse/safety/__init__.py,sha256=ylSOpzbjMZYyDjbTdJYTRVQI_ZIJF8L98dpeSTtRvoQ,107
70
+ pulse/safety/safety_manager.py,sha256=qeqvgcu028DSh10gxNw577zjA4kt_qPrmtM41gROwTI,3187
71
+ pulse/sandbox/SECURITY.md,sha256=u2EGwO8LySJdNFJhILj7OR37DICNjWeejY4mcHTv7A8,4616
72
+ pulse/sandbox/__init__.py,sha256=QNH19wr3Es8Vgx9JcwgZP3z8mn4-hcNgCVj4JD3Ausk,2178
73
+ pulse/sandbox/api.py,sha256=XoGkHaA8E6_RqdbBPv8FeEsVscIsX8FUmdV3HXk6jrs,26233
74
+ pulse/sandbox/audit.py,sha256=Z2GOe3btbvQI6D7D6ucpKzONc1FFT6dTzs2PmWrLUrE,5082
75
+ pulse/sandbox/errors.py,sha256=pak0DsBW_amk6NVVn5cXf_77OQQ3X8nwEpSzs4rEOUI,3983
76
+ pulse/sandbox/filesystem.py,sha256=Oqn8IBuc7CHbKqwCM0nBPJU9_yJNhwb6x8Z33TJ6WVw,19990
77
+ pulse/sandbox/git_safe.py,sha256=YqjpAYZhfAdWpsFSSzSiUf7jWEhcecvsP8Nv2f-GPXQ,1645
78
+ pulse/sandbox/lifecycle.py,sha256=EDPZUJWgT0nahYu8ij4Jw3Hn86vCsLKWRrTACMzzgV0,3463
79
+ pulse/sandbox/network.py,sha256=3JPG4sx-iYCii6TNXz0ffq9RiQ-JnJXP1xJLPTIMUDA,7095
80
+ pulse/sandbox/path_validator.py,sha256=_gLZ0D28X1r-tfzTSRxdw-IInrJeSfAXEvRwhLsuR6A,10819
81
+ pulse/sandbox/policy.py,sha256=2SMrIaqvgTEq1AlYhn5czSSN3DRZA6RCrEbcetx4WPQ,7915
82
+ pulse/sandbox/process.py,sha256=uDiW5uxv8WL9AfaI4wB_d5c6MUprFI3_a3I2evrxTcQ,14041
83
+ pulse/sandbox/project.py,sha256=bCZQOTSDVKl8aqAwaR3FXM1hctK4STQmvyxrWXXxYFU,7047
84
+ pulse/sandbox/python_safe.py,sha256=orL_dlIKennNEmGWLL25TKwaazVW-nbnzwHb_rdoi00,2358
85
+ pulse/sandbox/resources.py,sha256=jz7TZTh_S0wT1QGQ2KHUPAsN64dQHy5lIhAqJWOH_Vg,10196
86
+ pulse/sandbox/secrets.py,sha256=LvnkvF8k2UdbLE08iQOhGYmzqq8W4-IHQACIml2C0ps,9427
87
+ pulse/sandbox/backend/__init__.py,sha256=_2g9RDAz0YDRwYGy0kJdnBRG3REQGDq6_sBzXnHtEL0,293
88
+ pulse/sandbox/backend/base.py,sha256=RSuH9lpAT9iFHGee83gSQbxNkxNpfFKOB8hfC-9ZcoQ,2781
89
+ pulse/sandbox/backend/docker.py,sha256=ps8S1asLc9ais39XhJyC6UH1kLOzcb1dwhu8VYIdWHU,20869
90
+ pulse/sandbox/backend/host.py,sha256=dpkYcuzj3367UPzlC3eqvunt2veL2G9SbwhaGesvUnA,5749
91
+ pulse/sandbox/backend/remote.py,sha256=klvTyHQ5wx6Zd02lhZOzU9FsFr8RMpEIX2AiBCzfKcY,9440
92
+ pulse/sandbox/remote/__init__.py,sha256=MPYb7VW5EcoMkpKO8NIgxqeDdZtmpNHgLsTok4OB4iM,53
93
+ pulse/sandbox/remote/client.py,sha256=8q0oGhLHFjIBTaK4XO1wuzWFPRb91v3_vXtQ_-uubs8,15065
94
+ pulse/sandbox/remote/models.py,sha256=ZCy5DZTKJW3lZQTZQaTP93ZNbs-9mWpD_FvYBnec1Po,6199
95
+ pulse/sandbox/remote/protocol.py,sha256=EQyHTMkBvSh2NnyQCaYTwEbgSAHEBtJdova2G4EMB94,2105
96
+ pulse/sandbox/remote/server.py,sha256=qlq5BzlD04kQ7k83fdPyAh1Xv3LkhkazodBKiaTye8k,42742
97
+ pulse/sandbox/remote/worker.py,sha256=74eGPtJdGNREmHRzp9RW4TRMhhNpk4F6Vp0CSYkzRB0,6455
98
+ pulse/telemetry/__init__.py,sha256=Y3p0johD-ZU5OavfwNdQ1LP2JI35cYakEedsz84yDlw,489
99
+ pulse/telemetry/cost_tracker.py,sha256=XHSYdl84lCfT9ZJgJqEsOifJwcXrYmdmpTCpDZ4hytg,3284
100
+ pulse/telemetry/logger.py,sha256=2wtpQGekK0jx_2f-zmWTuDcNuKA6fzB1TSJDos0MSNw,3364
101
+ pulse_coding_agent-0.1.0.dist-info/METADATA,sha256=9w7MDTjLIqd4C0LBUAZ4oOiKAXDOUHeC5Zk-wefp0ko,7906
102
+ pulse_coding_agent-0.1.0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
103
+ pulse_coding_agent-0.1.0.dist-info/entry_points.txt,sha256=FGhyBEduElxG2-52nfw-QQnT7QnHHEdHFXIiHaSCiVs,116
104
+ pulse_coding_agent-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ pulse = pulse.cli:main
3
+ pulse-remote = pulse.sandbox.remote.server:main
4
+ pulse-rpc = pulse.rpc:main