codee-agent 0.6.5__tar.gz → 0.6.6__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 (92) hide show
  1. {codee_agent-0.6.5 → codee_agent-0.6.6}/PKG-INFO +1 -1
  2. {codee_agent-0.6.5 → codee_agent-0.6.6}/pyproject.toml +1 -1
  3. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/admin.py +140 -5
  4. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/admin_service.py +4 -3
  5. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_admin_service.py +7 -3
  6. {codee_agent-0.6.5 → codee_agent-0.6.6}/LICENSE +0 -0
  7. {codee_agent-0.6.5 → codee_agent-0.6.6}/README.md +0 -0
  8. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/.gitignore +0 -0
  9. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/__init__.py +0 -0
  10. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/admin_api.py +0 -0
  11. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/admin_cli.py +0 -0
  12. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/agent_cli.py +0 -0
  13. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/coding_agents.py +0 -0
  14. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/executor.py +0 -0
  15. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/init_cli.py +0 -0
  16. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/__init__.py +0 -0
  17. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/claude_key_rotation.py +0 -0
  18. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/cron_describe.py +0 -0
  19. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/mcp_config.py +0 -0
  20. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/runs_db.py +0 -0
  21. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/test_claude_key_rotation.py +0 -0
  22. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/test_mcp_config.py +0 -0
  23. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/test_runs_db.py +0 -0
  24. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/test_trigger_cron_skills.py +0 -0
  25. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/test_trigger_issue_skills.py +0 -0
  26. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/trigger_aws_sqs_skills.py +0 -0
  27. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/trigger_cron_skills.py +0 -0
  28. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/trigger_email_skills.py +0 -0
  29. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/lib/trigger_issue_skills.py +0 -0
  30. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/mail_server.py +0 -0
  31. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/setup_wizard.py +0 -0
  32. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/start_cli.py +0 -0
  33. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/tasks_providers.py +0 -0
  34. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/AGENTS.md +0 -0
  35. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/CLAUDE.md +0 -0
  36. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/aws-sqs-alarm-response/SKILL.md +0 -0
  37. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/cron-research-5xx-errors/SKILL.md +0 -0
  38. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/story-code-reviewer/SKILL.md +0 -0
  39. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/story-developer/SKILL.md +0 -0
  40. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/story-planner/SKILL.md +0 -0
  41. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/story-planner/assets/readme-template.md +0 -0
  42. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/story-qa/SKILL.md +0 -0
  43. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/story-security-reviewer/SKILL.md +0 -0
  44. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/task-code-reviewer/SKILL.md +0 -0
  45. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/task-developer/SKILL.md +0 -0
  46. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/task-qa/SKILL.md +0 -0
  47. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/templates/skills/task-security-reviewer/SKILL.md +0 -0
  48. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_admin_api.py +0 -0
  49. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_admin_cli.py +0 -0
  50. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_agent_cli.py +0 -0
  51. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_coding_agents.py +0 -0
  52. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_executor.py +0 -0
  53. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_init_cli.py +0 -0
  54. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_memory_index.py +0 -0
  55. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_setup_wizard.py +0 -0
  56. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/test_start_cli.py +0 -0
  57. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee/workflow_graph.py +0 -0
  58. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_admin/__init__.py +0 -0
  59. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_admin/codee_admin.py +0 -0
  60. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_abstract/__init__.py +0 -0
  61. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_abstract/provider.py +0 -0
  62. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_claude_code/__init__.py +0 -0
  63. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_claude_code/account.py +0 -0
  64. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_claude_code/credentials.py +0 -0
  65. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_claude_code/oauth.py +0 -0
  66. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_claude_code/provider.py +0 -0
  67. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_claude_code/test.py +0 -0
  68. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_claude_code/usage.py +0 -0
  69. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_codex/__init__.py +0 -0
  70. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_codex/provider.py +0 -0
  71. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_codex/test.py +0 -0
  72. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_github_copilot/__init__.py +0 -0
  73. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_github_copilot/provider.py +0 -0
  74. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_agent_github_copilot/test.py +0 -0
  75. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_database/__init__.py +0 -0
  76. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_database/claude_code_accounts.py +0 -0
  77. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_database/database.py +0 -0
  78. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_database/oauth_tokens.py +0 -0
  79. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_main_context/__init__.py +0 -0
  80. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_main_context/context.py +0 -0
  81. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_main_context/logging.py +0 -0
  82. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_main_context/test_context.py +0 -0
  83. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_main_context/test_logging.py +0 -0
  84. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_abstract/__init__.py +0 -0
  85. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_abstract/provider.py +0 -0
  86. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_azure_devops/__init__.py +0 -0
  87. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_azure_devops/oauth.py +0 -0
  88. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_azure_devops/provider.py +0 -0
  89. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_azure_devops/test.py +0 -0
  90. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_jira/__init__.py +0 -0
  91. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_jira/provider.py +0 -0
  92. {codee_agent-0.6.5 → codee_agent-0.6.6}/src/codee_tasks_jira/test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codee-agent
3
- Version: 0.6.5
3
+ Version: 0.6.6
4
4
  Summary: A virtual co-worker that picks up Jira and Azure DevOps tasks and solves them with coding agents.
5
5
  Keywords: ai,agent,jira,azure-devops,claude-code,github-copilot,codex,automation
6
6
  Author: Denis Kibalko
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "codee-agent"
3
- version = "0.6.5"
3
+ version = "0.6.6"
4
4
  description = "A virtual co-worker that picks up Jira and Azure DevOps tasks and solves them with coding agents."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -367,6 +367,10 @@ class AdminState(rx.State):
367
367
  agent_test_messages: list[ConversationMessage] = []
368
368
  agent_test_sending: bool = False
369
369
  agent_test_generation: int = 0
370
+ agent_test_model: str = ""
371
+ agent_test_models: list[ModelOption] = []
372
+ agent_test_model_query: str = ""
373
+ agent_test_models_loading: bool = False
370
374
  # Whether the executor runs Claude Code on the connected accounts instead
371
375
  # of leaving ~/.claude/.credentials.json alone.
372
376
  claude_code_rotate_keys: bool = False
@@ -475,6 +479,32 @@ class AdminState(rx.State):
475
479
  return ""
476
480
  return query
477
481
 
482
+ @rx.var
483
+ def filtered_agent_test_models(self) -> list[ModelOption]:
484
+ query = self.agent_test_model_query.strip().lower()
485
+ return [
486
+ model for model in self.agent_test_models
487
+ if not query or query in f"{model.name} {model.id}".lower()
488
+ ]
489
+
490
+ @rx.var
491
+ def agent_test_model_label(self) -> str:
492
+ if not self.agent_test_model:
493
+ return "Agent default"
494
+ for model in self.agent_test_models:
495
+ if model.id == self.agent_test_model:
496
+ return model.name
497
+ return self.agent_test_model
498
+
499
+ @rx.var
500
+ def custom_agent_test_model_query(self) -> str:
501
+ query = self.agent_test_model_query.strip()
502
+ if not query or any(
503
+ model.id == query for model in self.agent_test_models
504
+ ):
505
+ return ""
506
+ return query
507
+
478
508
  @rx.var
479
509
  def active_route(self) -> str:
480
510
  return self.router.url.path.rstrip("/") or "/"
@@ -1527,13 +1557,17 @@ class AdminState(rx.State):
1527
1557
  error = self._persist_settings()
1528
1558
  return rx.toast.error(error) if error else rx.toast.success("Settings saved")
1529
1559
 
1530
- def open_agent_test(self) -> None:
1560
+ def open_agent_test(self) -> Any:
1531
1561
  self.agent_test_input = ""
1532
1562
  self.agent_test_session_id = ""
1533
1563
  self.agent_test_messages = []
1534
1564
  self.agent_test_sending = False
1535
1565
  self.agent_test_generation += 1
1566
+ self.agent_test_model = ""
1567
+ self.agent_test_models = []
1568
+ self.agent_test_model_query = ""
1536
1569
  self.agent_test_open = True
1570
+ return AdminState.load_agent_test_models
1537
1571
 
1538
1572
  def set_agent_test_open(self, open_: bool) -> None:
1539
1573
  self.agent_test_open = open_
@@ -1544,6 +1578,28 @@ class AdminState(rx.State):
1544
1578
  def set_agent_test_input(self, value: str) -> None:
1545
1579
  self.agent_test_input = value
1546
1580
 
1581
+ def set_agent_test_model_query(self, value: str) -> None:
1582
+ self.agent_test_model_query = value
1583
+
1584
+ def choose_agent_test_model(self, model_id: str) -> None:
1585
+ self.agent_test_model = model_id.strip()
1586
+ self.agent_test_model_query = ""
1587
+
1588
+ @rx.event(background=True)
1589
+ async def load_agent_test_models(self) -> None:
1590
+ async with self:
1591
+ agent = self.coding_agent
1592
+ self.agent_test_models_loading = True
1593
+ try:
1594
+ models = await asyncio.to_thread(SERVICE.list_agent_models, agent)
1595
+ except Exception:
1596
+ models = []
1597
+ async with self:
1598
+ if self.coding_agent != agent:
1599
+ return
1600
+ self.agent_test_models = [ModelOption(**model) for model in models]
1601
+ self.agent_test_models_loading = False
1602
+
1547
1603
  @rx.event(background=True)
1548
1604
  async def send_agent_test_message(self) -> Any:
1549
1605
  async with self:
@@ -1552,6 +1608,7 @@ class AdminState(rx.State):
1552
1608
  return
1553
1609
  agent = self.coding_agent
1554
1610
  session_id = self.agent_test_session_id
1611
+ model = self.agent_test_model
1555
1612
  generation = self.agent_test_generation
1556
1613
  self.agent_test_input = ""
1557
1614
  self.agent_test_sending = True
@@ -1565,6 +1622,7 @@ class AdminState(rx.State):
1565
1622
  agent,
1566
1623
  message,
1567
1624
  session_id,
1625
+ model,
1568
1626
  )
1569
1627
  except Exception as error:
1570
1628
  async with self:
@@ -2131,7 +2189,7 @@ def model_menu_item(button: rx.Component) -> rx.Component:
2131
2189
  return rx.popover.close(rx.flex(button, width="100%"), width="100%")
2132
2190
 
2133
2191
 
2134
- def model_option_row(option: ModelOption) -> rx.Component:
2192
+ def _model_option_row(option: ModelOption, choose_model: Any) -> rx.Component:
2135
2193
  """One row of the model picker: friendly name left, model code right."""
2136
2194
  return model_menu_item(
2137
2195
  rx.button(
@@ -2143,7 +2201,15 @@ def model_option_row(option: ModelOption) -> rx.Component:
2143
2201
  align="center", spacing="2", width="100%"),
2144
2202
  variant="ghost", color_scheme="gray", width="100%",
2145
2203
  justify_content="start", padding="0.45rem 0.6rem",
2146
- on_click=AdminState.choose_model(option.id)))
2204
+ on_click=choose_model(option.id)))
2205
+
2206
+
2207
+ def model_option_row(option: ModelOption) -> rx.Component:
2208
+ return _model_option_row(option, AdminState.choose_model)
2209
+
2210
+
2211
+ def agent_test_model_option_row(option: ModelOption) -> rx.Component:
2212
+ return _model_option_row(option, AdminState.choose_agent_test_model)
2147
2213
 
2148
2214
 
2149
2215
  def agent_picker() -> rx.Component:
@@ -3309,6 +3375,72 @@ def agent_test_dialog() -> rx.Component:
3309
3375
  rx.dialog.description(
3310
3376
  "Chat with the selected coding agent in the Codee project.",
3311
3377
  color=MUTED),
3378
+ field(
3379
+ "Model",
3380
+ rx.popover.root(
3381
+ rx.popover.trigger(
3382
+ rx.button(
3383
+ rx.hstack(
3384
+ rx.text(AdminState.agent_test_model_label),
3385
+ rx.spacer(),
3386
+ rx.icon("chevrons-up-down", size=14),
3387
+ align="center", width="100%"),
3388
+ variant="surface", color_scheme="gray",
3389
+ width="100%", type="button")),
3390
+ rx.popover.content(
3391
+ rx.vstack(
3392
+ rx.input(
3393
+ placeholder=(
3394
+ "Search models, or type a model code"),
3395
+ value=AdminState.agent_test_model_query,
3396
+ on_change=AdminState.set_agent_test_model_query,
3397
+ auto_focus=True, width="100%"),
3398
+ rx.cond(
3399
+ AdminState.custom_agent_test_model_query != "",
3400
+ model_menu_item(
3401
+ rx.button(
3402
+ rx.hstack(
3403
+ rx.icon("plus", size=14),
3404
+ rx.text("Use "),
3405
+ rx.code(
3406
+ AdminState.custom_agent_test_model_query),
3407
+ align="center", spacing="2"),
3408
+ variant="soft", width="100%",
3409
+ justify_content="start",
3410
+ padding="0.45rem 0.6rem",
3411
+ on_click=AdminState.choose_agent_test_model(
3412
+ AdminState.custom_agent_test_model_query)))),
3413
+ rx.scroll_area(
3414
+ rx.vstack(
3415
+ model_menu_item(
3416
+ rx.button(
3417
+ "Agent default", variant="ghost",
3418
+ color_scheme="gray", width="100%",
3419
+ justify_content="start",
3420
+ padding="0.45rem 0.6rem",
3421
+ on_click=AdminState.choose_agent_test_model(""))),
3422
+ rx.foreach(
3423
+ AdminState.filtered_agent_test_models,
3424
+ agent_test_model_option_row),
3425
+ rx.cond(
3426
+ AdminState.agent_test_models_loading,
3427
+ rx.text(
3428
+ "Loading models from the coding agent…",
3429
+ color=MUTED, font_size="0.8rem",
3430
+ padding="0.5rem")),
3431
+ spacing="1", width="100%"),
3432
+ type="auto", scrollbars="vertical",
3433
+ max_height="15rem", width="100%"),
3434
+ spacing="2", width="100%"),
3435
+ width="24rem", max_width="calc(100vw - 3rem)")),
3436
+ rx.text(
3437
+ rx.cond(
3438
+ AdminState.agent_test_model == "",
3439
+ "Runs on whatever that agent defaults to.",
3440
+ rx.fragment("Uses ",
3441
+ rx.code(AdminState.agent_test_model),
3442
+ " for this conversation.")),
3443
+ color=MUTED, font_size="0.82rem")),
3312
3444
  rx.scroll_area(
3313
3445
  rx.vstack(
3314
3446
  rx.cond(
@@ -3374,7 +3506,7 @@ def settings_page() -> rx.Component:
3374
3506
  rx.heading("Coding agent", size="4", margin_bottom="1rem"),
3375
3507
  rx.vstack(
3376
3508
  field("Default agent",
3377
- rx.hstack(
3509
+ rx.grid(
3378
3510
  rx.select(
3379
3511
  ["claude_code", "github_copilot", "codex"],
3380
3512
  value=AdminState.coding_agent,
@@ -3384,7 +3516,10 @@ def settings_page() -> rx.Component:
3384
3516
  "Test conversation", variant="outline",
3385
3517
  white_space="nowrap",
3386
3518
  on_click=AdminState.open_agent_test),
3387
- width="100%", spacing="3")),
3519
+ grid_template_columns=rx.breakpoints(
3520
+ initial="minmax(0, 1fr)",
3521
+ md="minmax(0, 1fr) auto"),
3522
+ width="100%", gap="0.75rem")),
3388
3523
  field("Max parallel tasks",
3389
3524
  rx.input(value=AdminState.max_parallel_agents,
3390
3525
  on_change=AdminState.set_max_parallel_agents,
@@ -2444,7 +2444,8 @@ class AdminService:
2444
2444
  raise RuntimeError(str(exc)) from exc
2445
2445
 
2446
2446
  def test_agent_conversation(
2447
- self, agent_code: str, user_message: str, session_id: str = ""
2447
+ self, agent_code: str, user_message: str, session_id: str = "",
2448
+ model: str = "",
2448
2449
  ) -> tuple[str, str]:
2449
2450
  """Run one turn with the selected agent and return reply plus session id."""
2450
2451
  selected = resolve_agent_code(agent_code)
@@ -2459,10 +2460,10 @@ class AdminService:
2459
2460
 
2460
2461
  if session_id:
2461
2462
  response = agent.continue_conversation(
2462
- user_message, session_id, on_session_id=opened)
2463
+ user_message, session_id, model, on_session_id=opened)
2463
2464
  else:
2464
2465
  response = agent.run(
2465
- user_message, actual_session_id, on_session_id=opened)
2466
+ user_message, actual_session_id, model, on_session_id=opened)
2466
2467
  return response, actual_session_id
2467
2468
 
2468
2469
  def setup_tasks_mcp(
@@ -182,23 +182,27 @@ class TestAgentConversationTest(unittest.TestCase):
182
182
  agent.run.side_effect = run
183
183
 
184
184
  response, session_id = self.service.test_agent_conversation(
185
- "codex", "Hello")
185
+ "codex", "Hello", model="gpt-6-astra")
186
186
 
187
187
  self.assertEqual(response, "Final response")
188
188
  self.assertEqual(session_id, "agent-thread")
189
189
  build_agent.assert_called_once_with(
190
190
  self.service.context.settings, Path("/repo"), CodingAgent.CODEX)
191
+ self.assertEqual(agent.run.call_args.args[2], "gpt-6-astra")
191
192
 
192
193
  @patch("codee.admin_service.build_coding_agent")
193
194
  def test_later_turn_resumes_the_same_session(self, build_agent) -> None:
194
195
  build_agent.return_value.continue_conversation.return_value = "Still here"
195
196
 
196
197
  response, session_id = self.service.test_agent_conversation(
197
- "github_copilot", "What did I ask?", "same-thread")
198
+ "github_copilot", "What did I ask?", "same-thread",
199
+ "claude-opus-5")
198
200
 
199
201
  self.assertEqual((response, session_id), ("Still here", "same-thread"))
200
202
  call = build_agent.return_value.continue_conversation.call_args
201
- self.assertEqual(call.args[:2], ("What did I ask?", "same-thread"))
203
+ self.assertEqual(
204
+ call.args[:3],
205
+ ("What did I ask?", "same-thread", "claude-opus-5"))
202
206
 
203
207
 
204
208
  class AdminServiceWorkItemsTest(unittest.TestCase):
File without changes
File without changes