fleet-python 0.2.66b2__py3-none-any.whl → 0.2.105__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 (70) hide show
  1. examples/export_tasks.py +16 -5
  2. examples/export_tasks_filtered.py +245 -0
  3. examples/fetch_tasks.py +230 -0
  4. examples/import_tasks.py +140 -8
  5. examples/iterate_verifiers.py +725 -0
  6. fleet/__init__.py +128 -5
  7. fleet/_async/__init__.py +27 -3
  8. fleet/_async/base.py +24 -9
  9. fleet/_async/client.py +938 -41
  10. fleet/_async/env/client.py +60 -3
  11. fleet/_async/instance/client.py +52 -7
  12. fleet/_async/models.py +15 -0
  13. fleet/_async/resources/api.py +200 -0
  14. fleet/_async/resources/sqlite.py +1801 -46
  15. fleet/_async/tasks.py +122 -25
  16. fleet/_async/verifiers/bundler.py +22 -21
  17. fleet/_async/verifiers/verifier.py +25 -19
  18. fleet/agent/__init__.py +32 -0
  19. fleet/agent/gemini_cua/Dockerfile +45 -0
  20. fleet/agent/gemini_cua/__init__.py +10 -0
  21. fleet/agent/gemini_cua/agent.py +759 -0
  22. fleet/agent/gemini_cua/mcp/main.py +108 -0
  23. fleet/agent/gemini_cua/mcp_server/__init__.py +5 -0
  24. fleet/agent/gemini_cua/mcp_server/main.py +105 -0
  25. fleet/agent/gemini_cua/mcp_server/tools.py +178 -0
  26. fleet/agent/gemini_cua/requirements.txt +5 -0
  27. fleet/agent/gemini_cua/start.sh +30 -0
  28. fleet/agent/orchestrator.py +854 -0
  29. fleet/agent/types.py +49 -0
  30. fleet/agent/utils.py +34 -0
  31. fleet/base.py +34 -9
  32. fleet/cli.py +1061 -0
  33. fleet/client.py +1060 -48
  34. fleet/config.py +1 -1
  35. fleet/env/__init__.py +16 -0
  36. fleet/env/client.py +60 -3
  37. fleet/eval/__init__.py +15 -0
  38. fleet/eval/uploader.py +231 -0
  39. fleet/exceptions.py +8 -0
  40. fleet/instance/client.py +53 -8
  41. fleet/instance/models.py +1 -0
  42. fleet/models.py +303 -0
  43. fleet/proxy/__init__.py +25 -0
  44. fleet/proxy/proxy.py +453 -0
  45. fleet/proxy/whitelist.py +244 -0
  46. fleet/resources/api.py +200 -0
  47. fleet/resources/sqlite.py +1845 -46
  48. fleet/tasks.py +113 -20
  49. fleet/utils/__init__.py +7 -0
  50. fleet/utils/http_logging.py +178 -0
  51. fleet/utils/logging.py +13 -0
  52. fleet/utils/playwright.py +440 -0
  53. fleet/verifiers/bundler.py +22 -21
  54. fleet/verifiers/db.py +985 -1
  55. fleet/verifiers/decorator.py +1 -1
  56. fleet/verifiers/verifier.py +25 -19
  57. {fleet_python-0.2.66b2.dist-info → fleet_python-0.2.105.dist-info}/METADATA +28 -1
  58. fleet_python-0.2.105.dist-info/RECORD +115 -0
  59. {fleet_python-0.2.66b2.dist-info → fleet_python-0.2.105.dist-info}/WHEEL +1 -1
  60. fleet_python-0.2.105.dist-info/entry_points.txt +2 -0
  61. tests/test_app_method.py +85 -0
  62. tests/test_expect_exactly.py +4148 -0
  63. tests/test_expect_only.py +2593 -0
  64. tests/test_instance_dispatch.py +607 -0
  65. tests/test_sqlite_resource_dual_mode.py +263 -0
  66. tests/test_sqlite_shared_memory_behavior.py +117 -0
  67. fleet_python-0.2.66b2.dist-info/RECORD +0 -81
  68. tests/test_verifier_security.py +0 -427
  69. {fleet_python-0.2.66b2.dist-info → fleet_python-0.2.105.dist-info}/licenses/LICENSE +0 -0
  70. {fleet_python-0.2.66b2.dist-info → fleet_python-0.2.105.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,263 @@
1
+ """Unit tests for SQLiteResource dual-mode functionality."""
2
+
3
+ import pytest
4
+ import tempfile
5
+ import sqlite3
6
+ import os
7
+ from fleet.resources.sqlite import SQLiteResource
8
+ from fleet.instance.models import (
9
+ Resource as ResourceModel,
10
+ ResourceType,
11
+ ResourceMode,
12
+ QueryResponse,
13
+ DescribeResponse,
14
+ )
15
+
16
+
17
+ class TestSQLiteResourceDirectMode:
18
+ """Test SQLiteResource in direct (local file) mode."""
19
+
20
+ @pytest.fixture
21
+ def temp_db(self):
22
+ """Create a temporary SQLite database for testing."""
23
+ fd, path = tempfile.mkstemp(suffix=".db")
24
+ os.close(fd)
25
+
26
+ # Initialize with test data
27
+ conn = sqlite3.connect(path)
28
+ cursor = conn.cursor()
29
+ cursor.execute("""
30
+ CREATE TABLE users (
31
+ id INTEGER PRIMARY KEY,
32
+ name TEXT NOT NULL,
33
+ email TEXT,
34
+ age INTEGER
35
+ )
36
+ """)
37
+ cursor.execute(
38
+ "INSERT INTO users (id, name, email, age) VALUES (?, ?, ?, ?)",
39
+ (1, "Alice", "alice@example.com", 30),
40
+ )
41
+ cursor.execute(
42
+ "INSERT INTO users (id, name, email, age) VALUES (?, ?, ?, ?)",
43
+ (2, "Bob", "bob@example.com", 25),
44
+ )
45
+ conn.commit()
46
+ conn.close()
47
+
48
+ yield path
49
+
50
+ # Cleanup
51
+ if os.path.exists(path):
52
+ os.remove(path)
53
+
54
+ @pytest.fixture
55
+ def resource(self, temp_db):
56
+ """Create a SQLiteResource in direct mode."""
57
+ resource_model = ResourceModel(
58
+ name="test_db",
59
+ type=ResourceType.db,
60
+ mode=ResourceMode.rw,
61
+ )
62
+ return SQLiteResource(resource_model, client=None, db_path=temp_db)
63
+
64
+ def test_mode_property(self, resource):
65
+ """Test that mode property returns 'direct'."""
66
+ assert resource.mode == "direct"
67
+
68
+ def test_query_select(self, resource):
69
+ """Test SELECT query in direct mode."""
70
+ response = resource.query("SELECT * FROM users ORDER BY id")
71
+
72
+ assert response.success is True
73
+ assert response.columns == ["id", "name", "email", "age"]
74
+ assert len(response.rows) == 2
75
+ # Rows can be either tuples or lists depending on the implementation
76
+ assert list(response.rows[0]) == [1, "Alice", "alice@example.com", 30]
77
+ assert list(response.rows[1]) == [2, "Bob", "bob@example.com", 25]
78
+
79
+ def test_query_with_params(self, resource):
80
+ """Test query with parameters."""
81
+ response = resource.query("SELECT * FROM users WHERE id = ?", [1])
82
+
83
+ assert response.success is True
84
+ assert len(response.rows) == 1
85
+ assert response.rows[0][1] == "Alice"
86
+
87
+ def test_exec_insert(self, resource):
88
+ """Test INSERT operation in direct mode."""
89
+ response = resource.exec(
90
+ "INSERT INTO users (id, name, email, age) VALUES (?, ?, ?, ?)",
91
+ [3, "Charlie", "charlie@example.com", 35],
92
+ )
93
+
94
+ assert response.success is True
95
+ assert response.rows_affected == 1
96
+ assert response.last_insert_id == 3
97
+
98
+ # Verify the insert
99
+ check = resource.query("SELECT * FROM users WHERE id = 3")
100
+ assert len(check.rows) == 1
101
+ assert check.rows[0][1] == "Charlie"
102
+
103
+ def test_exec_update(self, resource):
104
+ """Test UPDATE operation in direct mode."""
105
+ response = resource.exec("UPDATE users SET age = ? WHERE id = ?", [31, 1])
106
+
107
+ assert response.success is True
108
+ assert response.rows_affected == 1
109
+
110
+ # Verify the update
111
+ check = resource.query("SELECT age FROM users WHERE id = 1")
112
+ assert check.rows[0][0] == 31
113
+
114
+ def test_exec_delete(self, resource):
115
+ """Test DELETE operation in direct mode."""
116
+ response = resource.exec("DELETE FROM users WHERE id = ?", [2])
117
+
118
+ assert response.success is True
119
+ assert response.rows_affected == 1
120
+
121
+ # Verify the delete
122
+ check = resource.query("SELECT * FROM users")
123
+ assert len(check.rows) == 1
124
+
125
+ def test_describe(self, resource):
126
+ """Test describe() in direct mode."""
127
+ response = resource.describe()
128
+
129
+ assert response.success is True
130
+ assert response.resource_name == "test_db"
131
+ assert len(response.tables) == 1
132
+
133
+ table = response.tables[0]
134
+ assert table.name == "users"
135
+ assert table.sql is not None
136
+ assert len(table.columns) == 4
137
+
138
+ # Check column details
139
+ columns = {col["name"]: col for col in table.columns}
140
+ assert "id" in columns
141
+ assert columns["id"]["primary_key"] is True
142
+ assert "name" in columns
143
+ assert columns["name"]["notnull"] is True
144
+
145
+ def test_table_query_builder(self, resource):
146
+ """Test table() query builder in direct mode."""
147
+ users = resource.table("users").all()
148
+
149
+ assert len(users) == 2
150
+ assert users[0]["name"] == "Alice"
151
+ assert users[1]["name"] == "Bob"
152
+
153
+ def test_query_builder_eq(self, resource):
154
+ """Test query builder eq() filter."""
155
+ user = resource.table("users").eq("name", "Alice").first()
156
+
157
+ assert user is not None
158
+ assert user["name"] == "Alice"
159
+ assert user["email"] == "alice@example.com"
160
+
161
+ def test_query_builder_count(self, resource):
162
+ """Test query builder count()."""
163
+ count = resource.table("users").count()
164
+ assert count == 2
165
+
166
+ count_filtered = resource.table("users").eq("age", 30).count()
167
+ assert count_filtered == 1
168
+
169
+ def test_query_builder_where(self, resource):
170
+ """Test query builder where() with multiple conditions."""
171
+ users = resource.table("users").where(age=25).all()
172
+
173
+ assert len(users) == 1
174
+ assert users[0]["name"] == "Bob"
175
+
176
+ def test_query_builder_limit(self, resource):
177
+ """Test query builder limit()."""
178
+ users = resource.table("users").limit(1).all()
179
+
180
+ assert len(users) == 1
181
+
182
+ def test_query_error_handling(self, resource):
183
+ """Test error handling for invalid queries."""
184
+ response = resource.query("SELECT * FROM nonexistent_table")
185
+
186
+ assert response.success is False
187
+ assert response.error is not None
188
+ assert "nonexistent_table" in response.error.lower() or "no such table" in response.error.lower()
189
+
190
+
191
+ class TestSQLiteResourceHTTPMode:
192
+ """Test SQLiteResource in HTTP (remote) mode."""
193
+
194
+ @pytest.fixture
195
+ def mock_client(self, mocker):
196
+ """Create a mock HTTP client."""
197
+ return mocker.Mock()
198
+
199
+ @pytest.fixture
200
+ def resource(self, mock_client):
201
+ """Create a SQLiteResource in HTTP mode."""
202
+ resource_model = ResourceModel(
203
+ name="remote_db",
204
+ type=ResourceType.db,
205
+ mode=ResourceMode.rw,
206
+ )
207
+ return SQLiteResource(resource_model, client=mock_client, db_path=None)
208
+
209
+ def test_mode_property(self, resource):
210
+ """Test that mode property returns 'http'."""
211
+ assert resource.mode == "http"
212
+
213
+ def test_query_http(self, resource, mock_client, mocker):
214
+ """Test that query() calls HTTP client."""
215
+ # Mock the HTTP response
216
+ mock_response = mocker.Mock()
217
+ mock_response.json.return_value = {
218
+ "success": True,
219
+ "columns": ["id", "name"],
220
+ "rows": [[1, "Alice"]],
221
+ "message": "Query successful",
222
+ }
223
+ mock_client.request.return_value = mock_response
224
+
225
+ response = resource.query("SELECT * FROM users")
226
+
227
+ # Verify HTTP client was called
228
+ mock_client.request.assert_called_once()
229
+ call_args = mock_client.request.call_args
230
+ assert call_args[0][0] == "POST"
231
+ assert "/query" in call_args[0][1]
232
+
233
+ # Verify response
234
+ assert response.success is True
235
+ assert response.columns == ["id", "name"]
236
+
237
+ def test_describe_http(self, resource, mock_client, mocker):
238
+ """Test that describe() calls HTTP client."""
239
+ # Mock the HTTP response
240
+ mock_response = mocker.Mock()
241
+ mock_response.json.return_value = {
242
+ "success": True,
243
+ "resource_name": "remote_db",
244
+ "tables": [],
245
+ "message": "Schema retrieved",
246
+ }
247
+ mock_client.request.return_value = mock_response
248
+
249
+ response = resource.describe()
250
+
251
+ # Verify HTTP client was called
252
+ mock_client.request.assert_called_once()
253
+ call_args = mock_client.request.call_args
254
+ assert call_args[0][0] == "GET"
255
+ assert "/describe" in call_args[0][1]
256
+
257
+ # Verify response
258
+ assert response.success is True
259
+ assert response.resource_name == "remote_db"
260
+
261
+
262
+ if __name__ == "__main__":
263
+ pytest.main([__file__, "-v"])
@@ -0,0 +1,117 @@
1
+ """Verification tests for SQLite shared memory behavior.
2
+
3
+ These tests verify how SQLite's shared memory databases work to ensure
4
+ our implementation assumptions are correct.
5
+ """
6
+
7
+ import sqlite3
8
+ import pytest
9
+
10
+
11
+ def test_plain_memory_no_sharing():
12
+ """Verify that plain :memory: databases don't share data."""
13
+ conn1 = sqlite3.connect(':memory:')
14
+ conn1.execute("CREATE TABLE test (id INT)")
15
+ conn1.execute("INSERT INTO test VALUES (1)")
16
+
17
+ # Second connection to :memory: creates a SEPARATE database
18
+ conn2 = sqlite3.connect(':memory:')
19
+
20
+ with pytest.raises(sqlite3.OperationalError, match="no such table"):
21
+ conn2.execute("SELECT * FROM test")
22
+
23
+ conn1.close()
24
+ conn2.close()
25
+
26
+
27
+ def test_shared_memory_uri_sharing():
28
+ """Verify that shared memory URIs DO share data."""
29
+ conn1 = sqlite3.connect('file:testdb?mode=memory&cache=shared', uri=True)
30
+ conn1.execute("CREATE TABLE test (id INT)")
31
+ conn1.execute("INSERT INTO test VALUES (1)")
32
+ conn1.commit() # Commit so other connections can see changes
33
+
34
+ # Second connection to same URI shares the database
35
+ conn2 = sqlite3.connect('file:testdb?mode=memory&cache=shared', uri=True)
36
+ result = conn2.execute("SELECT * FROM test").fetchall()
37
+
38
+ assert result == [(1,)]
39
+
40
+ conn1.close()
41
+ conn2.close()
42
+
43
+
44
+ def test_different_namespaces_isolated():
45
+ """Verify that different shared memory namespaces are isolated."""
46
+ conn1 = sqlite3.connect('file:db1?mode=memory&cache=shared', uri=True)
47
+ conn1.execute("CREATE TABLE test (id INT)")
48
+ conn1.execute("INSERT INTO test VALUES (1)")
49
+
50
+ conn2 = sqlite3.connect('file:db2?mode=memory&cache=shared', uri=True)
51
+
52
+ # db2 should not have the test table from db1
53
+ with pytest.raises(sqlite3.OperationalError, match="no such table"):
54
+ conn2.execute("SELECT * FROM test")
55
+
56
+ conn1.close()
57
+ conn2.close()
58
+
59
+
60
+ def test_data_lost_when_all_connections_close():
61
+ """Verify that shared memory data is lost when all connections close."""
62
+ conn1 = sqlite3.connect('file:tempdb?mode=memory&cache=shared', uri=True)
63
+ conn1.execute("CREATE TABLE test (id INT)")
64
+ conn1.execute("INSERT INTO test VALUES (1)")
65
+ conn1.commit() # Commit so other connections can see changes
66
+
67
+ conn2 = sqlite3.connect('file:tempdb?mode=memory&cache=shared', uri=True)
68
+ result = conn2.execute("SELECT * FROM test").fetchall()
69
+ assert result == [(1,)]
70
+
71
+ # Close all connections
72
+ conn1.close()
73
+ conn2.close()
74
+
75
+ # Open new connection - database is recreated empty
76
+ conn3 = sqlite3.connect('file:tempdb?mode=memory&cache=shared', uri=True)
77
+
78
+ with pytest.raises(sqlite3.OperationalError, match="no such table"):
79
+ conn3.execute("SELECT * FROM test")
80
+
81
+ conn3.close()
82
+
83
+
84
+ def test_anchor_connection_keeps_data_alive():
85
+ """Verify that keeping one connection open preserves the data."""
86
+ # Create anchor connection
87
+ anchor = sqlite3.connect('file:persistent?mode=memory&cache=shared', uri=True)
88
+ # Drop table if it exists from a previous test run
89
+ anchor.execute("DROP TABLE IF EXISTS test")
90
+ anchor.execute("CREATE TABLE test (id INT)")
91
+ anchor.execute("INSERT INTO test VALUES (1)")
92
+ anchor.commit() # Commit so other connections can see changes
93
+
94
+ # Open and close other connections
95
+ conn1 = sqlite3.connect('file:persistent?mode=memory&cache=shared', uri=True)
96
+ result = conn1.execute("SELECT * FROM test").fetchall()
97
+ assert result == [(1,)]
98
+ conn1.close()
99
+
100
+ # Even after conn1 closes, data is still there because anchor is open
101
+ conn2 = sqlite3.connect('file:persistent?mode=memory&cache=shared', uri=True)
102
+ result = conn2.execute("SELECT * FROM test").fetchall()
103
+ assert result == [(1,)]
104
+ conn2.close()
105
+
106
+ # Close anchor
107
+ anchor.close()
108
+
109
+ # Now data is gone
110
+ conn3 = sqlite3.connect('file:persistent?mode=memory&cache=shared', uri=True)
111
+ with pytest.raises(sqlite3.OperationalError, match="no such table"):
112
+ conn3.execute("SELECT * FROM test")
113
+ conn3.close()
114
+
115
+
116
+ if __name__ == "__main__":
117
+ pytest.main([__file__, "-v"])
@@ -1,81 +0,0 @@
1
- examples/diff_example.py,sha256=iLlpBW_NBjzXBqlvYwjx74uxYZkMGJfea6s3tJhvuNY,5684
2
- examples/dsl_example.py,sha256=yFLgM-Was4-w575xJgPk9DIBmXa34hLJsIB4XwTADOE,7252
3
- examples/example.py,sha256=yn9mqS2yJ6896s25btnJx9-_SLLbyS-Fu-SIcas6jok,1081
4
- examples/exampleResume.py,sha256=hzdL9QfYtwlje5geWS2cgWgjcnLX4UtXSAd-92F66Lw,7044
5
- examples/example_account.py,sha256=t5_Tnr7DcLYfNpEAbuBySQIqsqiQQGySuiItIghCjAM,225
6
- examples/example_action_log.py,sha256=pwvLro_Fkrw4DII002bHGuWfoZ6QRvUMDD9BnMqJgLQ,622
7
- examples/example_client.py,sha256=M9Mfi1FcD2LtSDVk89R_-tgG98swvDYy4qx2zVayJ-0,1025
8
- examples/example_mcp_anthropic.py,sha256=WzQipN6ryPYuiGcvYmaTget4Hn421ijMS6xDYWwrVyE,2619
9
- examples/example_mcp_openai.py,sha256=xhqJd2-mnQs4-ZmydGrX7pPs7_X5i-YFqkO1cr3L-5g,480
10
- examples/example_sync.py,sha256=EkuWmUzB1ZsBJQk6ZRflB793rKsuRHeSg5HJZHVhBB0,975
11
- examples/example_task.py,sha256=dhG6STAkNsTdHs9cO1RFH9WfuvRmq5bRC211hTeFrk8,7088
12
- examples/example_tasks.py,sha256=xTL8UWVAuolSX6swskfrAcmDrLIzn45dJ7YPWCwoEBU,514
13
- examples/example_verifier.py,sha256=0vwNITIG3m4CkSPwIxNXcGx9TqrxEsCGqK2A8keKZMM,2392
14
- examples/export_tasks.py,sha256=cJ_8xND7Q3IOM1JfJPR-DH3aLfHo_KmKJeO-1IVUFrQ,3237
15
- examples/gemini_example.py,sha256=qj9WDazQTYNiRHNeUg9Tjkp33lJMwbx8gDfpFe1sDQo,16180
16
- examples/import_tasks.py,sha256=Duh7T0HUuqsYUZ6LK2AXF3eP0zfSj1izkI5-1p09d9w,11041
17
- examples/json_tasks_example.py,sha256=CYPESGGtOo0fmsDdLidujTfsE4QlJHw7rOhyVqPJ_Ls,5329
18
- examples/nova_act_example.py,sha256=rH23Lp74Okf0rn8ynMdWjK2aviEf5NLPH4k_53Pyxho,831
19
- examples/openai_example.py,sha256=dEWERrTEP5xBiGkLkQjBQGd2NqoxX6gcW6XteBPsWFQ,8231
20
- examples/openai_simple_example.py,sha256=HmiufucrAZne7tHq9uoEsDWlEhjNC265bQAyIGBRU2o,1745
21
- examples/query_builder_example.py,sha256=-cOMfWGNifYfYEt_Ds73XpwATZvFDL6F4KTkVxdMjzg,3951
22
- examples/quickstart.py,sha256=1VT39IRRhemsJgxi0O0gprdpcw7HB4pYO97GAYagIcg,3788
23
- examples/test_cdp_logging.py,sha256=AkCwQCgOTQEI8w3v0knWK_4eXMph7L9x07wj9yIYM10,2836
24
- fleet/__init__.py,sha256=yC4HIcbtPAPOgI0lLri3l8nbXkNee9JOihKAc7SXYkY,4201
25
- fleet/base.py,sha256=bc-340sTpq_DJs7yQ9d2pDWnmJFmA1SwDB9Lagvqtb4,9182
26
- fleet/client.py,sha256=3fcUTBOB8z6nwL07HMXSjajSH_pb2_3gvo2KdGxzxdo,32579
27
- fleet/config.py,sha256=uY02ZKxVoXqVDta-0IMWaYJeE1CTXF_fA9NI6QUutmU,319
28
- fleet/exceptions.py,sha256=fUmPwWhnT8SR97lYsRq0kLHQHKtSh2eJS0VQ2caSzEI,5055
29
- fleet/global_client.py,sha256=frrDAFNM2ywN0JHLtlm9qbE1dQpnQJsavJpb7xSR_bU,1072
30
- fleet/models.py,sha256=AuSApLRN6aIDTOuJ4mGUyS1K1oLG9Q2AzjIE0Zj61MY,13586
31
- fleet/tasks.py,sha256=j14T6aoKDu3NghtQEr0vP-YDW_r8FxdDAazWe-6PQj0,17423
32
- fleet/types.py,sha256=L4Y82xICf1tzyCLqhLYUgEoaIIS5h9T05TyFNHSWs3s,652
33
- fleet/_async/__init__.py,sha256=5oOTmh16UsPWL2gDKKWkj2j5WGNeUhMzbQFWjX21jsc,8310
34
- fleet/_async/base.py,sha256=oisVTQsx0M_yTmyQJc3oij63uKZ97MHz-xYFsWXxQE8,9202
35
- fleet/_async/client.py,sha256=w_g0aOLfyyK_OojjGVe3TgyQQsWxnybJRFMLOtsb0p8,33027
36
- fleet/_async/exceptions.py,sha256=fUmPwWhnT8SR97lYsRq0kLHQHKtSh2eJS0VQ2caSzEI,5055
37
- fleet/_async/global_client.py,sha256=4WskpLHbsDEgWW7hXMD09W-brkp4euy8w2ZJ88594rQ,1103
38
- fleet/_async/models.py,sha256=6WMN--LJFV-A5L2jW8Y6q7HQfub7qGxGoVkPQhvS_jw,13358
39
- fleet/_async/tasks.py,sha256=653T8m41i6ea-YCfr5EOsAD7CIi9ystcExMepxhSiA0,17442
40
- fleet/_async/env/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- fleet/_async/env/client.py,sha256=hUwrKTAkTAbO94_pDaAH8LyvlS9q-7oT7ZRrNo03LNs,1309
42
- fleet/_async/instance/__init__.py,sha256=PtmJq8J8bh0SOQ2V55QURz5GJfobozwtQoqhaOk3_tI,515
43
- fleet/_async/instance/base.py,sha256=3qUBuUR8OVS36LzdP6KyZzngtwPKYO09HoY6Ekxp-KA,1625
44
- fleet/_async/instance/client.py,sha256=kcrmLZciQxvPSfTtbEq5LIbhscwDHg6WIiNcPyM4L9w,6085
45
- fleet/_async/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- fleet/_async/resources/base.py,sha256=UfrenxUqcpL8SgYGOo8o8HgRvv2-ZO5G2Cdo91ofEdg,664
47
- fleet/_async/resources/browser.py,sha256=oldoSiymJ1lJkADhpUG81ViOBDNyppX1jSoEwe9-W94,1369
48
- fleet/_async/resources/mcp.py,sha256=TLEsLiFhfVfZFs0Fu_uDPm-h4FPdvqgQblYqs-PTHhc,1720
49
- fleet/_async/resources/sqlite.py,sha256=up_umepfyX9PDFsnmEMJLjsj7bLa6a3wizZOgMGkK1Q,27409
50
- fleet/_async/verifiers/__init__.py,sha256=1WTlCNq4tIFbbXaQu5Bf2WppZq0A8suhtZbxMTSOwxI,465
51
- fleet/_async/verifiers/bundler.py,sha256=Sq0KkqEhM5Ng2x8R6Z4puXvQ8FMlEO7D3-ldBLktPi4,26205
52
- fleet/_async/verifiers/verifier.py,sha256=IiHX028s6ux0kb2FR0Z5zJangl_IDh6cemXsUN2ktUU,14152
53
- fleet/env/__init__.py,sha256=cS9zCYobM5jypppDMZIQMYd6hOg5f4sgqRXEQ67pckk,676
54
- fleet/env/client.py,sha256=Lu0pGia3Rcull83BFhB1nccAHXbUEGFKl3BUSkoKbr4,1143
55
- fleet/instance/__init__.py,sha256=CyWUkbGAK-DBPw4DC4AnCW-MqqheGhZMA5QSRVu-ws4,479
56
- fleet/instance/base.py,sha256=OYqzBwZFfTX9wlBGSG5gljqj98NbiJeKIfFJ3uj5I4s,1587
57
- fleet/instance/client.py,sha256=XM_Qmd7pUzC3-dCMTh6orTEsGeWJXbKueBlvcWcSUuI,5897
58
- fleet/instance/models.py,sha256=ZTiue0YOuhuwX8jYfJAoCzGfqjLqqXRLqK1LVFhq6rQ,4183
59
- fleet/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- fleet/resources/base.py,sha256=AXZzT0_yWHkT497q3yekfr0xsD4cPGMCC6y7C43TIkk,663
61
- fleet/resources/browser.py,sha256=hRNM0YMsVQUAraZGNi_B-KXxLpuddy4ntoEDFSw7czU,1295
62
- fleet/resources/mcp.py,sha256=c6O4vVJnXANuHMGMe4IPxgp4zBEbFaGm6_d9e6j8Myc,1695
63
- fleet/resources/sqlite.py,sha256=bR6d1zYQ4cMAlmZIJ7jqmY9-N-GokXaDhUyGKTWHsfY,26811
64
- fleet/verifiers/__init__.py,sha256=GntS8qc3xv8mm-cku1t3xjvOll5jcc5FuiVqQgR4Y6Q,458
65
- fleet/verifiers/bundler.py,sha256=Sq0KkqEhM5Ng2x8R6Z4puXvQ8FMlEO7D3-ldBLktPi4,26205
66
- fleet/verifiers/code.py,sha256=A1i_UabZspbyj1awzKVQ_HRxgMO3fU7NbkxYyTrp7So,48
67
- fleet/verifiers/db.py,sha256=LAh1HambBInH_D9q9E2Z41YNkCOI9JJfpWPFqztjpfQ,27922
68
- fleet/verifiers/decorator.py,sha256=nAP3O8szXu7md_kpwpz91hGSUNEVLYjwZQZTkQlV1DM,3260
69
- fleet/verifiers/parse.py,sha256=qz9AfJrTbjlg-LU-lE8Ciqi7Yt2a8-cs17FdpjTLhMk,8550
70
- fleet/verifiers/sql_differ.py,sha256=TqTLWyK3uOyLbitT6HYzYEzuSFC39wcyhgk3rcm__k8,6525
71
- fleet/verifiers/verifier.py,sha256=_lcxXVm8e0xRrK2gNJy9up7pW1zOkPRY5n5lQ85S8jg,14197
72
- fleet_python-0.2.66b2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
73
- scripts/fix_sync_imports.py,sha256=X9fWLTpiPGkSHsjyQUDepOJkxOqw1DPj7nd8wFlFqLQ,8368
74
- scripts/unasync.py,sha256=vWVQxRWX8SRZO5cmzEhpvnG_REhCWXpidIGIpWmEcvI,696
75
- tests/__init__.py,sha256=Re1SdyxH8NfyL1kjhi7SQkGP1mYeWB-D6UALqdIMd8I,35
76
- tests/test_verifier_from_string.py,sha256=Lxi3TpFHFb-hG4-UhLKZJkqo84ax9YJY8G6beO-1erM,13581
77
- tests/test_verifier_security.py,sha256=AvjWTVV-VlWaysNkHcRz1_UZxjYZYlr4ynM6uy2o9eM,12821
78
- fleet_python-0.2.66b2.dist-info/METADATA,sha256=9mVNEaeW1-l9zc2kbm49kU9vzkzFqnEc_IEyyXml6hc,3306
79
- fleet_python-0.2.66b2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
80
- fleet_python-0.2.66b2.dist-info/top_level.txt,sha256=qb1zIbtEktyhRFZdqVytwg54l64qtoZL0wjHB4bUg3c,29
81
- fleet_python-0.2.66b2.dist-info/RECORD,,