verbiflow 0.1.1__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.
Files changed (158) hide show
  1. verbiflow-0.1.1/PKG-INFO +43 -0
  2. verbiflow-0.1.1/README.md +24 -0
  3. verbiflow-0.1.1/pyproject.toml +74 -0
  4. verbiflow-0.1.1/setup.cfg +4 -0
  5. verbiflow-0.1.1/src/verbiflow/__init__.py +299 -0
  6. verbiflow-0.1.1/src/verbiflow/_types.py +34 -0
  7. verbiflow-0.1.1/src/verbiflow/artifacts.py +599 -0
  8. verbiflow-0.1.1/src/verbiflow/assets/contract_matrix.json +26293 -0
  9. verbiflow-0.1.1/src/verbiflow/assets/function_index.json +25982 -0
  10. verbiflow-0.1.1/src/verbiflow/auth.py +1093 -0
  11. verbiflow-0.1.1/src/verbiflow/auth_store.py +65 -0
  12. verbiflow-0.1.1/src/verbiflow/billing.py +388 -0
  13. verbiflow-0.1.1/src/verbiflow/capabilities.py +252 -0
  14. verbiflow-0.1.1/src/verbiflow/clay.py +294 -0
  15. verbiflow-0.1.1/src/verbiflow/cli.py +2102 -0
  16. verbiflow-0.1.1/src/verbiflow/client.py +1465 -0
  17. verbiflow-0.1.1/src/verbiflow/copy.py +374 -0
  18. verbiflow-0.1.1/src/verbiflow/crm.py +561 -0
  19. verbiflow-0.1.1/src/verbiflow/crunchbase.py +127 -0
  20. verbiflow-0.1.1/src/verbiflow/daemon.py +735 -0
  21. verbiflow-0.1.1/src/verbiflow/domains.py +94 -0
  22. verbiflow-0.1.1/src/verbiflow/email.py +150 -0
  23. verbiflow-0.1.1/src/verbiflow/enrichment.py +1326 -0
  24. verbiflow-0.1.1/src/verbiflow/errors.py +41 -0
  25. verbiflow-0.1.1/src/verbiflow/files.py +59 -0
  26. verbiflow-0.1.1/src/verbiflow/host.py +6835 -0
  27. verbiflow-0.1.1/src/verbiflow/host_secrets.py +427 -0
  28. verbiflow-0.1.1/src/verbiflow/hosted_host.py +810 -0
  29. verbiflow-0.1.1/src/verbiflow/hosted_runtime.py +82 -0
  30. verbiflow-0.1.1/src/verbiflow/inbox.py +620 -0
  31. verbiflow-0.1.1/src/verbiflow/install_state.py +366 -0
  32. verbiflow-0.1.1/src/verbiflow/integrations.py +109 -0
  33. verbiflow-0.1.1/src/verbiflow/jobs.py +1331 -0
  34. verbiflow-0.1.1/src/verbiflow/linkedin.py +928 -0
  35. verbiflow-0.1.1/src/verbiflow/local_store.py +2653 -0
  36. verbiflow-0.1.1/src/verbiflow/log.py +484 -0
  37. verbiflow-0.1.1/src/verbiflow/metadata.py +447 -0
  38. verbiflow-0.1.1/src/verbiflow/models.py +246 -0
  39. verbiflow-0.1.1/src/verbiflow/personalization.py +87 -0
  40. verbiflow-0.1.1/src/verbiflow/play_app/README.md +49 -0
  41. verbiflow-0.1.1/src/verbiflow/play_app/copy-sidecars.mjs +29 -0
  42. verbiflow-0.1.1/src/verbiflow/play_app/index.html +12 -0
  43. verbiflow-0.1.1/src/verbiflow/play_app/package.json +20 -0
  44. verbiflow-0.1.1/src/verbiflow/play_app/src/App.svelte +200 -0
  45. verbiflow-0.1.1/src/verbiflow/play_app/src/CardsView.svelte +57 -0
  46. verbiflow-0.1.1/src/verbiflow/play_app/src/ChartView.svelte +45 -0
  47. verbiflow-0.1.1/src/verbiflow/play_app/src/CustomView.svelte +19 -0
  48. verbiflow-0.1.1/src/verbiflow/play_app/src/DetailDrawer.svelte +26 -0
  49. verbiflow-0.1.1/src/verbiflow/play_app/src/EvidenceView.svelte +40 -0
  50. verbiflow-0.1.1/src/verbiflow/play_app/src/GraphView.svelte +129 -0
  51. verbiflow-0.1.1/src/verbiflow/play_app/src/MapView.svelte +91 -0
  52. verbiflow-0.1.1/src/verbiflow/play_app/src/MetricsView.svelte +34 -0
  53. verbiflow-0.1.1/src/verbiflow/play_app/src/TableView.svelte +76 -0
  54. verbiflow-0.1.1/src/verbiflow/play_app/src/TimelineView.svelte +46 -0
  55. verbiflow-0.1.1/src/verbiflow/play_app/src/main.js +9 -0
  56. verbiflow-0.1.1/src/verbiflow/play_app/src/play-data.js +70 -0
  57. verbiflow-0.1.1/src/verbiflow/play_app/src/styles.css +903 -0
  58. verbiflow-0.1.1/src/verbiflow/play_app/vite.config.js +11 -0
  59. verbiflow-0.1.1/src/verbiflow/play_context.py +199 -0
  60. verbiflow-0.1.1/src/verbiflow/play_scaffold.py +365 -0
  61. verbiflow-0.1.1/src/verbiflow/plays.py +809 -0
  62. verbiflow-0.1.1/src/verbiflow/py.typed +1 -0
  63. verbiflow-0.1.1/src/verbiflow/registry.py +286 -0
  64. verbiflow-0.1.1/src/verbiflow/reports.py +1528 -0
  65. verbiflow-0.1.1/src/verbiflow/rows.py +1833 -0
  66. verbiflow-0.1.1/src/verbiflow/rowset.py +395 -0
  67. verbiflow-0.1.1/src/verbiflow/scaffold.py +2972 -0
  68. verbiflow-0.1.1/src/verbiflow/sdk_context.py +181 -0
  69. verbiflow-0.1.1/src/verbiflow/senders.py +334 -0
  70. verbiflow-0.1.1/src/verbiflow/sequences.py +6047 -0
  71. verbiflow-0.1.1/src/verbiflow/sequences_common.py +18 -0
  72. verbiflow-0.1.1/src/verbiflow/sequences_destination_sync.py +419 -0
  73. verbiflow-0.1.1/src/verbiflow/session.py +206 -0
  74. verbiflow-0.1.1/src/verbiflow/skill/SKILL.md +898 -0
  75. verbiflow-0.1.1/src/verbiflow/skill/agents/openai.yaml +7 -0
  76. verbiflow-0.1.1/src/verbiflow/skill/assets/function_index.json +25982 -0
  77. verbiflow-0.1.1/src/verbiflow/skill/references/agent_harnesses.md +14 -0
  78. verbiflow-0.1.1/src/verbiflow/skill/references/artifacts_jobs.md +248 -0
  79. verbiflow-0.1.1/src/verbiflow/skill/references/audience_discovery.md +488 -0
  80. verbiflow-0.1.1/src/verbiflow/skill/references/auth.md +325 -0
  81. verbiflow-0.1.1/src/verbiflow/skill/references/billing_domains.md +329 -0
  82. verbiflow-0.1.1/src/verbiflow/skill/references/clay.md +208 -0
  83. verbiflow-0.1.1/src/verbiflow/skill/references/copy.md +893 -0
  84. verbiflow-0.1.1/src/verbiflow/skill/references/crm.md +226 -0
  85. verbiflow-0.1.1/src/verbiflow/skill/references/crunchbase.md +369 -0
  86. verbiflow-0.1.1/src/verbiflow/skill/references/csv_output.md +193 -0
  87. verbiflow-0.1.1/src/verbiflow/skill/references/dashboard.md +202 -0
  88. verbiflow-0.1.1/src/verbiflow/skill/references/discovery.md +221 -0
  89. verbiflow-0.1.1/src/verbiflow/skill/references/enrichment.md +303 -0
  90. verbiflow-0.1.1/src/verbiflow/skill/references/geo.md +276 -0
  91. verbiflow-0.1.1/src/verbiflow/skill/references/host_browser.md +291 -0
  92. verbiflow-0.1.1/src/verbiflow/skill/references/hosts_claude_code.md +14 -0
  93. verbiflow-0.1.1/src/verbiflow/skill/references/hosts_codex.md +17 -0
  94. verbiflow-0.1.1/src/verbiflow/skill/references/hosts_cursor.md +12 -0
  95. verbiflow-0.1.1/src/verbiflow/skill/references/hosts_mochi.md +24 -0
  96. verbiflow-0.1.1/src/verbiflow/skill/references/inbox.md +118 -0
  97. verbiflow-0.1.1/src/verbiflow/skill/references/linkedin.md +381 -0
  98. verbiflow-0.1.1/src/verbiflow/skill/references/logging.md +328 -0
  99. verbiflow-0.1.1/src/verbiflow/skill/references/parallelism.md +324 -0
  100. verbiflow-0.1.1/src/verbiflow/skill/references/places.md +219 -0
  101. verbiflow-0.1.1/src/verbiflow/skill/references/row_operations.md +311 -0
  102. verbiflow-0.1.1/src/verbiflow/skill/references/safety.md +295 -0
  103. verbiflow-0.1.1/src/verbiflow/skill/references/senders.md +234 -0
  104. verbiflow-0.1.1/src/verbiflow/skill/references/sequence_authoring.md +688 -0
  105. verbiflow-0.1.1/src/verbiflow/skill/references/sequences.md +376 -0
  106. verbiflow-0.1.1/src/verbiflow/skill/references/sources.md +104 -0
  107. verbiflow-0.1.1/src/verbiflow/skill/references/testing.md +354 -0
  108. verbiflow-0.1.1/src/verbiflow/skill/references/web.md +228 -0
  109. verbiflow-0.1.1/src/verbiflow/skill/references/workflow_composition.md +341 -0
  110. verbiflow-0.1.1/src/verbiflow/skill/references/workflow_operations.md +340 -0
  111. verbiflow-0.1.1/src/verbiflow/skill/references/workflow_queues.md +234 -0
  112. verbiflow-0.1.1/src/verbiflow/skill/references/workflow_reports.md +139 -0
  113. verbiflow-0.1.1/src/verbiflow/skill/references/workflow_scaffold.md +250 -0
  114. verbiflow-0.1.1/src/verbiflow/skill/references/workflow_schedules.md +410 -0
  115. verbiflow-0.1.1/src/verbiflow/skill/references/workflow_sources.md +266 -0
  116. verbiflow-0.1.1/src/verbiflow/skill/references/workflows.md +155 -0
  117. verbiflow-0.1.1/src/verbiflow/skill/scripts/resolve_sdk_source.py +24 -0
  118. verbiflow-0.1.1/src/verbiflow/skill/scripts/search_functions.py +32 -0
  119. verbiflow-0.1.1/src/verbiflow/skill/scripts/validate_environment.py +32 -0
  120. verbiflow-0.1.1/src/verbiflow/skill/tests/test_skill_scripts.py +39 -0
  121. verbiflow-0.1.1/src/verbiflow/skill_runtime.py +169 -0
  122. verbiflow-0.1.1/src/verbiflow/source_adapters.py +135 -0
  123. verbiflow-0.1.1/src/verbiflow/sources.py +1490 -0
  124. verbiflow-0.1.1/src/verbiflow/state.py +820 -0
  125. verbiflow-0.1.1/src/verbiflow/viz.py +1248 -0
  126. verbiflow-0.1.1/src/verbiflow/web.py +346 -0
  127. verbiflow-0.1.1/src/verbiflow/workflows.py +10291 -0
  128. verbiflow-0.1.1/src/verbiflow/workspaces.py +274 -0
  129. verbiflow-0.1.1/src/verbiflow.egg-info/PKG-INFO +43 -0
  130. verbiflow-0.1.1/src/verbiflow.egg-info/SOURCES.txt +156 -0
  131. verbiflow-0.1.1/src/verbiflow.egg-info/dependency_links.txt +1 -0
  132. verbiflow-0.1.1/src/verbiflow.egg-info/entry_points.txt +2 -0
  133. verbiflow-0.1.1/src/verbiflow.egg-info/requires.txt +12 -0
  134. verbiflow-0.1.1/src/verbiflow.egg-info/top_level.txt +1 -0
  135. verbiflow-0.1.1/tests/test_agent_harnesses.py +214 -0
  136. verbiflow-0.1.1/tests/test_auth_and_host_sessions.py +775 -0
  137. verbiflow-0.1.1/tests/test_capture_cascade.py +221 -0
  138. verbiflow-0.1.1/tests/test_clay_filters_and_jobs.py +182 -0
  139. verbiflow-0.1.1/tests/test_cli.py +714 -0
  140. verbiflow-0.1.1/tests/test_client.py +843 -0
  141. verbiflow-0.1.1/tests/test_copy_regex_parity.py +133 -0
  142. verbiflow-0.1.1/tests/test_functional_coverage.py +103 -0
  143. verbiflow-0.1.1/tests/test_host_parity.py +330 -0
  144. verbiflow-0.1.1/tests/test_hosted_browser_profiles.py +81 -0
  145. verbiflow-0.1.1/tests/test_hosted_mochi_runtime.py +898 -0
  146. verbiflow-0.1.1/tests/test_job_artifact_handles.py +1143 -0
  147. verbiflow-0.1.1/tests/test_linkedin_url_standardize.py +324 -0
  148. verbiflow-0.1.1/tests/test_log.py +426 -0
  149. verbiflow-0.1.1/tests/test_metadata.py +3673 -0
  150. verbiflow-0.1.1/tests/test_models.py +32 -0
  151. verbiflow-0.1.1/tests/test_play_context.py +59 -0
  152. verbiflow-0.1.1/tests/test_rows.py +648 -0
  153. verbiflow-0.1.1/tests/test_sequences_audience_paging.py +122 -0
  154. verbiflow-0.1.1/tests/test_sources_batch.py +172 -0
  155. verbiflow-0.1.1/tests/test_strip_unverified_founders.py +94 -0
  156. verbiflow-0.1.1/tests/test_typed_api.py +4905 -0
  157. verbiflow-0.1.1/tests/test_workflow_schedules.py +250 -0
  158. verbiflow-0.1.1/tests/test_workflows.py +8221 -0
@@ -0,0 +1,43 @@
1
+ Metadata-Version: 2.4
2
+ Name: verbiflow
3
+ Version: 0.1.1
4
+ Summary: Python SDK for Verbiflow Growth workflows
5
+ Author: Verbiflow
6
+ License: MIT
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: httpx<1,>=0.27
10
+ Requires-Dist: playwright<2,>=1.48
11
+ Provides-Extra: agents
12
+ Requires-Dist: claude-agent-sdk<0.3,>=0.2.87; extra == "agents"
13
+ Requires-Dist: openai-agents<1,>=0.17; extra == "agents"
14
+ Provides-Extra: dev
15
+ Requires-Dist: pytest<10,>=8; extra == "dev"
16
+ Requires-Dist: pytest-asyncio<2,>=0.24; extra == "dev"
17
+ Requires-Dist: ruff<1,>=0.8; extra == "dev"
18
+ Requires-Dist: basedpyright<2,>=1.24; extra == "dev"
19
+
20
+ # Verbiflow Python SDK
21
+
22
+ Agent-native Python client for Verbiflow Growth workflows.
23
+
24
+ ```python
25
+ import verbiflow as vf
26
+
27
+ job = vf.rows.qualify(
28
+ [{"email": "a@example.com", "title": "VP Engineering"}],
29
+ rubric="Pass senior engineering and product leaders.",
30
+ )
31
+ print(job.job_id, job.artifact_id)
32
+ ```
33
+
34
+ The SDK runs local row transforms in Python and sends provider/platform side
35
+ effects through the Verbiflow Bridge API.
36
+
37
+ First-class direct Bridge namespaces include `vf.session`, `vf.billing`,
38
+ `vf.senders`, `vf.sequences`, and `vf.linkedin` for the server-backed operator
39
+ paths.
40
+
41
+ The public SDK is typed-only. Use namespaces such as `vf.sources.people`,
42
+ `vf.enrichment`, `vf.sequences`, `vf.linkedin`, `vf.files`, and `vf.host`;
43
+ there is no public `vf.tools` or MCP-shaped `growth_*` alias layer.
@@ -0,0 +1,24 @@
1
+ # Verbiflow Python SDK
2
+
3
+ Agent-native Python client for Verbiflow Growth workflows.
4
+
5
+ ```python
6
+ import verbiflow as vf
7
+
8
+ job = vf.rows.qualify(
9
+ [{"email": "a@example.com", "title": "VP Engineering"}],
10
+ rubric="Pass senior engineering and product leaders.",
11
+ )
12
+ print(job.job_id, job.artifact_id)
13
+ ```
14
+
15
+ The SDK runs local row transforms in Python and sends provider/platform side
16
+ effects through the Verbiflow Bridge API.
17
+
18
+ First-class direct Bridge namespaces include `vf.session`, `vf.billing`,
19
+ `vf.senders`, `vf.sequences`, and `vf.linkedin` for the server-backed operator
20
+ paths.
21
+
22
+ The public SDK is typed-only. Use namespaces such as `vf.sources.people`,
23
+ `vf.enrichment`, `vf.sequences`, `vf.linkedin`, `vf.files`, and `vf.host`;
24
+ there is no public `vf.tools` or MCP-shaped `growth_*` alias layer.
@@ -0,0 +1,74 @@
1
+ [build-system]
2
+ requires = ["setuptools>=69.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "verbiflow"
7
+ version = "0.1.1"
8
+ description = "Python SDK for Verbiflow Growth workflows"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ authors = [{ name = "Verbiflow" }]
12
+ license = { text = "MIT" }
13
+ dependencies = [
14
+ "httpx>=0.27,<1",
15
+ "playwright>=1.48,<2",
16
+ ]
17
+
18
+ [project.scripts]
19
+ verbiflow = "verbiflow.cli:main"
20
+
21
+ [project.optional-dependencies]
22
+ agents = [
23
+ "claude-agent-sdk>=0.2.87,<0.3",
24
+ "openai-agents>=0.17,<1",
25
+ ]
26
+ dev = [
27
+ "pytest>=8,<10",
28
+ "pytest-asyncio>=0.24,<2",
29
+ "ruff>=0.8,<1",
30
+ "basedpyright>=1.24,<2",
31
+ ]
32
+
33
+ [tool.setuptools.packages.find]
34
+ where = ["src"]
35
+
36
+ [tool.setuptools.package-data]
37
+ verbiflow = [
38
+ "py.typed",
39
+ "assets/function_index.json",
40
+ "assets/contract_matrix.json",
41
+ "skill/SKILL.md",
42
+ "skill/agents/*.yaml",
43
+ "skill/assets/*.json",
44
+ "skill/references/*.md",
45
+ "skill/scripts/*.py",
46
+ "skill/tests/*.py",
47
+ "play_app/*.html",
48
+ "play_app/*.json",
49
+ "play_app/*.js",
50
+ "play_app/*.mjs",
51
+ "play_app/*.md",
52
+ "play_app/src/*.js",
53
+ "play_app/src/*.svelte",
54
+ "play_app/src/*.css",
55
+ ]
56
+
57
+ [tool.pytest.ini_options]
58
+ testpaths = ["tests"]
59
+ asyncio_mode = "auto"
60
+
61
+ [tool.ruff]
62
+ line-length = 100
63
+ target-version = "py311"
64
+
65
+ [tool.ruff.lint]
66
+ select = ["E", "F", "I", "UP", "B"]
67
+
68
+ [tool.basedpyright]
69
+ typeCheckingMode = "strict"
70
+ pythonVersion = "3.11"
71
+ reportMissingTypeStubs = false
72
+ reportAny = false
73
+ include = ["src/verbiflow"]
74
+ exclude = ["src/verbiflow/skill"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,299 @@
1
+ from __future__ import annotations
2
+
3
+ from importlib import metadata as importlib_metadata
4
+ from typing import TYPE_CHECKING
5
+
6
+ from . import copy as copy # preload before namespace proxies install
7
+ from . import local_store, log, play_scaffold, reports, scaffold, source_adapters, viz, workflows
8
+ from .client import AsyncClient, Client
9
+ from .errors import (
10
+ ApiError,
11
+ MissingConfigurationError,
12
+ PartialCreateError,
13
+ ValidationError,
14
+ VerbiflowError,
15
+ )
16
+ from .jobs import AsyncJobResult, JobResult
17
+ from .metadata import function_index, help
18
+ from .models import Artifact, ArtifactPage, ArtifactRow, FunctionMetadata, PendingJob
19
+ from .rowset import (
20
+ PERSONAL_DOMAINS,
21
+ RowSet,
22
+ artifact_id,
23
+ col,
24
+ count,
25
+ email_domain,
26
+ from_records,
27
+ is_personal_domain,
28
+ is_personal_domain_value,
29
+ rows_to_csv,
30
+ )
31
+
32
+ if TYPE_CHECKING:
33
+ import httpx
34
+
35
+ try:
36
+ __version__ = importlib_metadata.version("verbiflow")
37
+ except importlib_metadata.PackageNotFoundError:
38
+ __version__ = "0.0.0+unknown"
39
+
40
+ _default_client: Client | None = None
41
+
42
+
43
+ class _DefaultNamespaceProxy:
44
+ def __init__(self, namespace: str) -> None:
45
+ self._namespace = namespace
46
+
47
+ def __getattr__(self, name: str) -> object:
48
+ return getattr(getattr(_get_default_client(), self._namespace), name)
49
+
50
+ def __repr__(self) -> str:
51
+ return f"<verbiflow.{self._namespace} lazy namespace>"
52
+
53
+
54
+ def _get_default_client() -> Client:
55
+ global _default_client
56
+ if _default_client is None:
57
+ _default_client = Client()
58
+ return _default_client
59
+
60
+
61
+ def _install_default_namespace_proxies() -> None:
62
+ global rows, artifacts, auth, capabilities, clay, copy, crunchbase, crm, domains, email
63
+ global files, host, inbox, integrations, jobs, sources, enrichment, sequences, senders, linkedin
64
+ global personalization, plays, session, billing, workspaces, web
65
+ rows = _DefaultNamespaceProxy("rows")
66
+ artifacts = _DefaultNamespaceProxy("artifacts")
67
+ auth = _DefaultNamespaceProxy("auth")
68
+ capabilities = _DefaultNamespaceProxy("capabilities")
69
+ clay = _DefaultNamespaceProxy("clay")
70
+ copy = _DefaultNamespaceProxy("copy")
71
+ crunchbase = _DefaultNamespaceProxy("crunchbase")
72
+ crm = _DefaultNamespaceProxy("crm")
73
+ domains = _DefaultNamespaceProxy("domains")
74
+ email = _DefaultNamespaceProxy("email")
75
+ files = _DefaultNamespaceProxy("files")
76
+ host = _DefaultNamespaceProxy("host")
77
+ inbox = _DefaultNamespaceProxy("inbox")
78
+ integrations = _DefaultNamespaceProxy("integrations")
79
+ jobs = _DefaultNamespaceProxy("jobs")
80
+ sources = _DefaultNamespaceProxy("sources")
81
+ enrichment = _DefaultNamespaceProxy("enrichment")
82
+ sequences = _DefaultNamespaceProxy("sequences")
83
+ senders = _DefaultNamespaceProxy("senders")
84
+ linkedin = _DefaultNamespaceProxy("linkedin")
85
+ personalization = _DefaultNamespaceProxy("personalization")
86
+ plays = _DefaultNamespaceProxy("plays")
87
+ session = _DefaultNamespaceProxy("session")
88
+ billing = _DefaultNamespaceProxy("billing")
89
+ workspaces = _DefaultNamespaceProxy("workspaces")
90
+ web = _DefaultNamespaceProxy("web")
91
+
92
+
93
+ _install_default_namespace_proxies()
94
+
95
+
96
+ def configure(
97
+ *,
98
+ base_url: str | None = None,
99
+ api_key: str | None = None,
100
+ org_id: str | None = None,
101
+ org_slug: str | None = None,
102
+ profile: str | None = None,
103
+ timeout: float = 60.0,
104
+ max_retries: int = 2,
105
+ transport: httpx.AsyncBaseTransport | None = None,
106
+ ) -> Client:
107
+ global \
108
+ _default_client, \
109
+ rows, \
110
+ artifacts, \
111
+ auth, \
112
+ capabilities, \
113
+ clay, \
114
+ copy, \
115
+ crunchbase, \
116
+ crm, \
117
+ domains, \
118
+ email
119
+ global files, host, inbox, integrations, jobs, sources, enrichment, sequences, senders, linkedin
120
+ global personalization, plays, session, billing, workspaces, web
121
+ _default_client = Client(
122
+ base_url=base_url,
123
+ api_key=api_key,
124
+ org_id=org_id,
125
+ org_slug=org_slug,
126
+ profile=profile,
127
+ timeout=timeout,
128
+ max_retries=max_retries,
129
+ transport=transport,
130
+ )
131
+ rows = _default_client.rows
132
+ artifacts = _default_client.artifacts
133
+ auth = _default_client.auth
134
+ capabilities = _default_client.capabilities
135
+ clay = _default_client.clay
136
+ copy = _default_client.copy
137
+ crunchbase = _default_client.crunchbase
138
+ crm = _default_client.crm
139
+ domains = _default_client.domains
140
+ email = _default_client.email
141
+ files = _default_client.files
142
+ host = _default_client.host
143
+ inbox = _default_client.inbox
144
+ integrations = _default_client.integrations
145
+ jobs = _default_client.jobs
146
+ sources = _default_client.sources
147
+ enrichment = _default_client.enrichment
148
+ sequences = _default_client.sequences
149
+ senders = _default_client.senders
150
+ linkedin = _default_client.linkedin
151
+ personalization = _default_client.personalization
152
+ plays = _default_client.plays
153
+ session = _default_client.session
154
+ billing = _default_client.billing
155
+ workspaces = _default_client.workspaces
156
+ web = _default_client.web
157
+ return _default_client
158
+
159
+
160
+ __all__ = [
161
+ "ApiError",
162
+ "Artifact",
163
+ "ArtifactPage",
164
+ "ArtifactRow",
165
+ "AsyncClient",
166
+ "Client",
167
+ "FunctionMetadata",
168
+ "AsyncJobResult",
169
+ "JobResult",
170
+ "MissingConfigurationError",
171
+ "PartialCreateError",
172
+ "PendingJob",
173
+ "PERSONAL_DOMAINS",
174
+ "RowSet",
175
+ "ValidationError",
176
+ "VerbiflowError",
177
+ "artifacts",
178
+ "artifact_id",
179
+ "auth",
180
+ "billing",
181
+ "capabilities",
182
+ "clay",
183
+ "col",
184
+ "configure",
185
+ "copy",
186
+ "count",
187
+ "crunchbase",
188
+ "crm",
189
+ "domains",
190
+ "email",
191
+ "email_domain",
192
+ "enrichment",
193
+ "files",
194
+ "from_records",
195
+ "function_index",
196
+ "help",
197
+ "host",
198
+ "inbox",
199
+ "integrations",
200
+ "is_personal_domain",
201
+ "is_personal_domain_value",
202
+ "jobs",
203
+ "linkedin",
204
+ "log",
205
+ "local_store",
206
+ "personalization",
207
+ "play_scaffold",
208
+ "plays",
209
+ "rows",
210
+ "rows_to_csv",
211
+ "reports",
212
+ "scaffold",
213
+ "senders",
214
+ "sequences",
215
+ "session",
216
+ "sources",
217
+ "source_adapters",
218
+ "viz",
219
+ "workspaces",
220
+ "web",
221
+ "workflows",
222
+ "__version__",
223
+ ]
224
+
225
+
226
+ # Mirror @sdk_function-synthesized docstrings from each AsyncXNamespace to its
227
+ # matching sync wrapper so vf.<namespace>.<fn>.__doc__ surfaces the arguments,
228
+ # intent, and category metadata that `verbiflow functions describe` returns.
229
+ # Done here (instead of inside each namespace file) to avoid re-entrant imports
230
+ # that crash when verbiflow.email is re-evaluated alongside Python's stdlib
231
+ # email module.
232
+ def _mirror_namespace_docstrings() -> None:
233
+ from .artifacts import ArtifactsNamespace, AsyncArtifactsNamespace
234
+ from .auth import AsyncAuthNamespace, AuthNamespace
235
+ from .billing import AsyncBillingNamespace, BillingNamespace
236
+ from .capabilities import AsyncCapabilitiesNamespace, CapabilitiesNamespace
237
+ from .clay import AsyncClayNamespace, ClayNamespace
238
+ from .crm import AsyncCrmNamespace, CrmNamespace
239
+ from .crunchbase import AsyncCrunchbaseNamespace, CrunchbaseNamespace
240
+ from .domains import AsyncDomainsNamespace, DomainsNamespace
241
+ from .email import AsyncEmailNamespace, EmailNamespace
242
+ from .enrichment import AsyncEnrichmentNamespace, EnrichmentNamespace
243
+ from .files import AsyncFilesNamespace, FilesNamespace
244
+ from .host import AsyncChromeHostNamespace, ChromeHostNamespace
245
+ from .inbox import AsyncInboxNamespace, InboxNamespace
246
+ from .integrations import AsyncIntegrationsNamespace, IntegrationsNamespace
247
+ from .jobs import AsyncJobsNamespace, JobsNamespace
248
+ from .linkedin import AsyncLinkedInNamespace, LinkedInNamespace
249
+ from .personalization import AsyncPersonalizationNamespace, PersonalizationNamespace
250
+ from .plays import (
251
+ AsyncPlaySchedulesNamespace,
252
+ AsyncPlaysNamespace,
253
+ PlaySchedulesNamespace,
254
+ PlaysNamespace,
255
+ )
256
+ from .registry import mirror_async_docstrings as _mirror
257
+ from .rows import AsyncRowsNamespace, RowsNamespace
258
+ from .senders import AsyncSendersNamespace, SendersNamespace
259
+ from .sequences import AsyncSequencesNamespace, SequencesNamespace
260
+ from .session import AsyncSessionNamespace, SessionNamespace
261
+ from .sources import AsyncPeopleSourcesNamespace, PeopleSourcesNamespace
262
+ from .web import AsyncWebNamespace, WebNamespace
263
+ from .workspaces import AsyncWorkspacesNamespace, WorkspacesNamespace
264
+
265
+ for sync_cls, async_cls in (
266
+ (ArtifactsNamespace, AsyncArtifactsNamespace),
267
+ (AuthNamespace, AsyncAuthNamespace),
268
+ (BillingNamespace, AsyncBillingNamespace),
269
+ (CapabilitiesNamespace, AsyncCapabilitiesNamespace),
270
+ (ClayNamespace, AsyncClayNamespace),
271
+ (CrunchbaseNamespace, AsyncCrunchbaseNamespace),
272
+ (CrmNamespace, AsyncCrmNamespace),
273
+ (DomainsNamespace, AsyncDomainsNamespace),
274
+ (EmailNamespace, AsyncEmailNamespace),
275
+ (EnrichmentNamespace, AsyncEnrichmentNamespace),
276
+ (FilesNamespace, AsyncFilesNamespace),
277
+ (ChromeHostNamespace, AsyncChromeHostNamespace),
278
+ (InboxNamespace, AsyncInboxNamespace),
279
+ (IntegrationsNamespace, AsyncIntegrationsNamespace),
280
+ (JobsNamespace, AsyncJobsNamespace),
281
+ (LinkedInNamespace, AsyncLinkedInNamespace),
282
+ (PersonalizationNamespace, AsyncPersonalizationNamespace),
283
+ (PlaysNamespace, AsyncPlaysNamespace),
284
+ (PlaySchedulesNamespace, AsyncPlaySchedulesNamespace),
285
+ (RowsNamespace, AsyncRowsNamespace),
286
+ (SendersNamespace, AsyncSendersNamespace),
287
+ (SequencesNamespace, AsyncSequencesNamespace),
288
+ (SessionNamespace, AsyncSessionNamespace),
289
+ (PeopleSourcesNamespace, AsyncPeopleSourcesNamespace),
290
+ (WebNamespace, AsyncWebNamespace),
291
+ (WorkspacesNamespace, AsyncWorkspacesNamespace),
292
+ ):
293
+ _mirror(sync_cls, async_cls)
294
+
295
+
296
+ _mirror_namespace_docstrings()
297
+ del _mirror_namespace_docstrings
298
+ _install_default_namespace_proxies()
299
+ del _install_default_namespace_proxies
@@ -0,0 +1,34 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping, Sequence
4
+ from typing import Any, TypeAlias, cast
5
+
6
+ JsonScalar: TypeAlias = None | bool | int | float | str
7
+ JsonValue: TypeAlias = JsonScalar | list["JsonValue"] | dict[str, "JsonValue"]
8
+ JsonObject: TypeAlias = dict[str, JsonValue]
9
+ JsonMapping: TypeAlias = Mapping[str, JsonValue]
10
+ JsonSequence: TypeAlias = Sequence[JsonValue]
11
+
12
+
13
+ def as_json_object(value: object, *, context: str) -> JsonObject:
14
+ if isinstance(value, dict):
15
+ mapping = cast(Mapping[Any, Any], value)
16
+ result: JsonObject = {}
17
+ for key, item in mapping.items():
18
+ if not isinstance(key, str):
19
+ raise TypeError(f"{context} contains a non-string key: {key!r}")
20
+ result[key] = as_json_value(item, context=context)
21
+ return result
22
+ raise TypeError(f"{context} must be a JSON object.")
23
+
24
+
25
+ def as_json_value(value: object, *, context: str) -> JsonValue:
26
+ if value is None or isinstance(value, bool | int | float | str):
27
+ return value
28
+ if isinstance(value, list):
29
+ return [as_json_value(item, context=context) for item in cast(list[Any], value)]
30
+ if isinstance(value, tuple):
31
+ return [as_json_value(item, context=context) for item in cast(tuple[Any, ...], value)]
32
+ if isinstance(value, dict):
33
+ return as_json_object(cast(object, value), context=context)
34
+ raise TypeError(f"{context} contains non-JSON value {value!r}.")