Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
a3f0923
feat: Add workflow cancellation helpers to WorkflowLifecycle
Jan 27, 2026
901257e
feat: Enhance workflow list search and pagination
Jan 27, 2026
f9e83aa
feat: Add workflow_type classification for filtering
Jan 27, 2026
8b1f743
feat: Enhance log streaming to use step_events table
Jan 27, 2026
84b36e9
feat: Add parent_step_name tracking for child workflows
Jan 27, 2026
86d4090
feat: Add token/cost metadata and queue step type for agent workflows
Jan 27, 2026
ffc0e2a
fix: Disable duplicate Tiptap extensions in StarterKit
Jan 27, 2026
d139866
fix: Status filter case mismatch and remove pytest-postgresql
Jan 27, 2026
52f935c
refactor: Normalize status consistently across all API endpoints
Jan 27, 2026
4214697
feat: Auto-expand error workflows and optimize polling interval
Jan 27, 2026
6079aa4
feat: Add workflow output display, retry, and config sections
Jan 27, 2026
a0c5af3
feat: Complete workflow observability UI with timeline, metrics, and …
Jan 28, 2026
045758f
feat: Add step logs and distinct config/output visual styles
Jan 28, 2026
0bd41e0
feat: Add Apify adapter for social media monitoring
Jan 28, 2026
8b4e0dd
refactor: Unify Steps and Timeline into single progressive disclosure…
Jan 28, 2026
cc9ee0f
feat: Add detailed tool call tracking and step details display
Jan 28, 2026
cfb6459
feat: Real-time tool call tracking via direct Dolt writes
Jan 28, 2026
933216d
test: Update test for revised workflow run help text
Jan 28, 2026
321d02b
fix: Resolve linting errors (unused imports, unsorted imports)
Jan 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
434 changes: 434 additions & 0 deletions CLAUDE.md

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ dev = [
"pytest>=8.0.0",
"pytest-asyncio>=0.24.0",
"pytest-cov>=4.1.0",
"pytest-postgresql>=6.0.0",
"ruff>=0.1.0",
"pre-commit>=3.5.0",
]
Expand Down Expand Up @@ -129,6 +128,5 @@ dev = [
"pytest>=8.4.2",
"pytest-asyncio>=0.24.0",
"pytest-cov>=4.1.0",
"pytest-postgresql>=7.0.2",
"ruff>=0.1.0",
]
2 changes: 1 addition & 1 deletion src/kurt/cli/tests/test_workflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ def test_run_help(self, cli_runner: CliRunner):
"""Test run command shows help."""
result = invoke_cli(cli_runner, run_cmd, ["--help"])
assert_cli_success(result)
assert_output_contains(result, "Run a workflow from a TOML file")
assert_output_contains(result, "Run a workflow from a TOML or Markdown file")

def test_run_shows_options(self, cli_runner: CliRunner):
"""Test run command lists options in help."""
Expand Down
2 changes: 1 addition & 1 deletion src/kurt/db/dolt.py
Original file line number Diff line number Diff line change
Expand Up @@ -728,8 +728,8 @@ def _query_embedded(self, sql: str, params: list[Any] | None = None) -> QueryRes

def _execute_embedded(self, sql: str, params: list[Any] | None = None, max_retries: int = 5) -> QueryResult:
"""Execute statement using dolt CLI with retry for concurrent access."""
import time
import random
import time

interpolated = self._interpolate_params(sql, params)

Expand Down
25 changes: 23 additions & 2 deletions src/kurt/integrations/research/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def research_group():
@click.option(
"--source",
default="perplexity",
type=click.Choice(["perplexity"]),
type=click.Choice(["perplexity", "apify"]),
help="Research source to configure",
)
@track_command
Expand Down Expand Up @@ -75,6 +75,14 @@ def onboard_cmd(source: str):
console.print("\n[bold]Perplexity Setup:[/bold]")
console.print(" API_KEY: Get from https://www.perplexity.ai/settings/api")
console.print(" DEFAULT_MODEL: sonar-reasoning (recommended)")
elif source == "apify":
console.print("\n[bold]Apify Setup:[/bold]")
console.print(" API_TOKEN: Get from https://console.apify.com/account/integrations")
console.print(" DEFAULT_ACTOR: apidojo/tweet-scraper (for Twitter)")
console.print("\n[bold]Available Actors:[/bold]")
console.print(" Twitter: apidojo/tweet-scraper, quacker/twitter-scraper")
console.print(" LinkedIn: curious_coder/linkedin-post-search-scraper")
console.print(" Threads: apidojo/threads-scraper")
return

# Test connection
Expand All @@ -91,6 +99,19 @@ def onboard_cmd(source: str):
else:
console.print("[red]\u2717 Connection failed[/red]")
raise click.Abort()
elif source == "apify":
from .monitoring.apify import ApifyAdapter

adapter = ApifyAdapter(source_config)
if adapter.test_connection():
console.print(f"[green]\u2713 Connected to {source.capitalize()}[/green]")
user_info = adapter.get_user_info()
if user_info:
username = user_info.get("username", "unknown")
console.print(f"[dim] Logged in as: {username}[/dim]")
else:
console.print("[red]\u2717 Connection failed[/red]")
raise click.Abort()
else:
console.print(f"[yellow]No connection test available for {source}[/yellow]")

Expand Down Expand Up @@ -128,7 +149,7 @@ def status_cmd():
return

# Check each known source
known_sources = ["perplexity"]
known_sources = ["perplexity", "apify"]

for source in known_sources:
if source_configured(source):
Expand Down
5 changes: 5 additions & 0 deletions src/kurt/integrations/research/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,11 @@ def create_template_config(source: str) -> dict[str, Any]:
"max_tokens": "4000",
"temperature": "0.2",
}
elif source == "apify":
return {
"api_token": "YOUR_APIFY_API_TOKEN",
"default_actor": "apidojo/tweet-scraper",
}
else:
return {
"api_key": "YOUR_API_KEY",
Expand Down
4 changes: 3 additions & 1 deletion src/kurt/integrations/research/monitoring/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
"""
Monitoring adapters for research signals.

Provides adapters for Reddit, HackerNews, and RSS/Atom feeds.
Provides adapters for Reddit, HackerNews, RSS/Atom feeds, and Apify social media.
"""

from kurt.integrations.research.monitoring.apify import ApifyAdapter
from kurt.integrations.research.monitoring.feeds import FeedAdapter
from kurt.integrations.research.monitoring.hackernews import HackerNewsAdapter
from kurt.integrations.research.monitoring.models import Signal
Expand All @@ -14,4 +15,5 @@
"RedditAdapter",
"HackerNewsAdapter",
"FeedAdapter",
"ApifyAdapter",
]
Loading
Loading