codee-agent 0.6.1__tar.gz → 0.6.2__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.
- {codee_agent-0.6.1 → codee_agent-0.6.2}/PKG-INFO +1 -1
- {codee_agent-0.6.1 → codee_agent-0.6.2}/pyproject.toml +1 -1
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/admin.py +17 -2
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/executor.py +3 -1
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/runs_db.py +14 -6
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/test_runs_db.py +21 -5
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/trigger_aws_sqs_skills.py +2 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/trigger_cron_skills.py +2 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/trigger_email_skills.py +2 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_executor.py +3 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/LICENSE +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/README.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/.gitignore +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/admin_api.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/admin_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/admin_service.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/agent_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/coding_agents.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/init_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/claude_key_rotation.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/cron_describe.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/mcp_config.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/test_claude_key_rotation.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/test_mcp_config.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/test_trigger_cron_skills.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/test_trigger_issue_skills.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/lib/trigger_issue_skills.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/mail_server.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/setup_wizard.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/start_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/tasks_providers.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/AGENTS.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/CLAUDE.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/aws-sqs-alarm-response/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/cron-research-5xx-errors/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-code-reviewer/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-developer/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-planner/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-planner/assets/readme-template.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-qa/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-security-reviewer/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/task-code-reviewer/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/task-developer/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/task-qa/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/task-security-reviewer/SKILL.md +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_admin_api.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_admin_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_admin_service.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_agent_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_coding_agents.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_init_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_memory_index.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_setup_wizard.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/test_start_cli.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/workflow_graph.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_admin/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_admin/codee_admin.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_abstract/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_abstract/provider.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_claude_code/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_claude_code/account.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_claude_code/credentials.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_claude_code/oauth.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_claude_code/provider.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_claude_code/test.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_claude_code/usage.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_codex/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_codex/provider.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_codex/test.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_github_copilot/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_github_copilot/provider.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_agent_github_copilot/test.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_database/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_database/claude_code_accounts.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_database/database.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_database/oauth_tokens.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_main_context/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_main_context/context.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_main_context/logging.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_main_context/test_context.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_main_context/test_logging.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_abstract/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_abstract/provider.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_azure_devops/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_azure_devops/oauth.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_azure_devops/provider.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_azure_devops/test.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_jira/__init__.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee_tasks_jira/provider.py +0 -0
- {codee_agent-0.6.1 → codee_agent-0.6.2}/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.
|
|
3
|
+
Version: 0.6.2
|
|
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
|
|
@@ -254,7 +254,10 @@ class RunRecord(BaseModel):
|
|
|
254
254
|
status: str
|
|
255
255
|
error: str
|
|
256
256
|
started_at: str
|
|
257
|
+
session_id: str
|
|
257
258
|
message: str
|
|
259
|
+
user_message: str
|
|
260
|
+
response: str
|
|
258
261
|
preview: str
|
|
259
262
|
viewer_url: str
|
|
260
263
|
|
|
@@ -798,7 +801,10 @@ class AdminState(rx.State):
|
|
|
798
801
|
status=run["status"],
|
|
799
802
|
error=run.get("error") or "",
|
|
800
803
|
started_at=run["started_at"],
|
|
804
|
+
session_id=run.get("session_id") or "",
|
|
801
805
|
message=message,
|
|
806
|
+
user_message=(run.get("user_message") or message).strip(),
|
|
807
|
+
response=(run.get("response") or "").strip(),
|
|
802
808
|
preview=preview[:120] + ("..." if len(preview) > 120 else ""),
|
|
803
809
|
viewer_url=(SERVICE.session_viewer.format(session_id=run["session_id"])
|
|
804
810
|
if SERVICE.session_viewer and run.get("session_id") else ""),
|
|
@@ -2386,6 +2392,9 @@ def run_row(run: RunRecord) -> rx.Component:
|
|
|
2386
2392
|
rx.badge(run.status, color_scheme=rx.cond(run.status == "succeeded", "green", "red"))),
|
|
2387
2393
|
rx.text(run.started_at, color=MUTED, font_size="0.8rem",
|
|
2388
2394
|
font_family="IBM Plex Mono, monospace"),
|
|
2395
|
+
rx.text("Thread ID: ", run.session_id, color=MUTED,
|
|
2396
|
+
font_size="0.8rem",
|
|
2397
|
+
font_family="IBM Plex Mono, monospace"),
|
|
2389
2398
|
rx.text(run.preview, color=MUTED),
|
|
2390
2399
|
rx.cond(run.error != "", rx.text(
|
|
2391
2400
|
run.error, color="#b42318", font_size="0.85rem")),
|
|
@@ -2394,8 +2403,14 @@ def run_row(run: RunRecord) -> rx.Component:
|
|
|
2394
2403
|
rx.cond(run.viewer_url != "", rx.link(rx.icon("external-link", size=16), href=run.viewer_url,
|
|
2395
2404
|
is_external=True, aria_label="View session", color=ACCENT)),
|
|
2396
2405
|
gap="1rem", align="start", width="100%"),
|
|
2397
|
-
rx.cond(run.
|
|
2398
|
-
header="
|
|
2406
|
+
rx.cond((run.user_message != "") | (run.response != ""), rx.accordion.root(rx.accordion.item(
|
|
2407
|
+
header="Run info", content=rx.vstack(
|
|
2408
|
+
rx.text("User message", font_weight="600"),
|
|
2409
|
+
rx.text(run.user_message, white_space="pre-wrap"),
|
|
2410
|
+
rx.cond(run.response != "", rx.fragment(
|
|
2411
|
+
rx.text("LLM response", font_weight="600", margin_top="0.75rem"),
|
|
2412
|
+
rx.text(run.response, white_space="pre-wrap"))),
|
|
2413
|
+
spacing="2", align="start", width="100%"), value=run.started_at),
|
|
2399
2414
|
collapsible=True, width="100%")),
|
|
2400
2415
|
padding="1rem", background=SURFACE, border=BORDER, width="100%")
|
|
2401
2416
|
|
|
@@ -314,6 +314,7 @@ def _run_task(task_id: str, message: str, session_id: str, skill_name: str,
|
|
|
314
314
|
task_id, len(response), response)
|
|
315
315
|
runs_db.record_run(skill_name, "issue", session_id, "succeeded",
|
|
316
316
|
started_at=started_at, message=shown,
|
|
317
|
+
user_message=message, response=response,
|
|
317
318
|
main_context=context)
|
|
318
319
|
except Exception as exc:
|
|
319
320
|
# Over-limit / transient failure: leave the task in its current
|
|
@@ -322,7 +323,8 @@ def _run_task(task_id: str, message: str, session_id: str, skill_name: str,
|
|
|
322
323
|
log.debug("%s failed with:\n%s", task_id, traceback.format_exc())
|
|
323
324
|
runs_db.record_run(skill_name, "issue", session_id, "failed",
|
|
324
325
|
error=str(exc)[:500], started_at=started_at,
|
|
325
|
-
message=shown,
|
|
326
|
+
message=shown, user_message=message,
|
|
327
|
+
main_context=context)
|
|
326
328
|
finally:
|
|
327
329
|
with _inflight_lock:
|
|
328
330
|
_inflight.discard(task_id)
|
|
@@ -11,7 +11,7 @@ from codee_main_context.context import CodeeMainContext
|
|
|
11
11
|
from codee_database.database import get_db_connection
|
|
12
12
|
|
|
13
13
|
_COLUMNS = ("id", "skill_name", "trigger_type", "session_id", "status", "error",
|
|
14
|
-
"started_at", "message")
|
|
14
|
+
"started_at", "message", "user_message", "response")
|
|
15
15
|
|
|
16
16
|
# Codee names a session before the agent runs, but not every agent runs under
|
|
17
17
|
# the name it was given: Codex mints its own thread id and reports it back mid
|
|
@@ -50,7 +50,9 @@ def init(main_context: CodeeMainContext) -> None:
|
|
|
50
50
|
status TEXT NOT NULL,
|
|
51
51
|
error TEXT,
|
|
52
52
|
started_at TEXT NOT NULL,
|
|
53
|
-
message TEXT
|
|
53
|
+
message TEXT,
|
|
54
|
+
user_message TEXT,
|
|
55
|
+
response TEXT
|
|
54
56
|
)"""
|
|
55
57
|
)
|
|
56
58
|
conn.execute(
|
|
@@ -59,6 +61,10 @@ def init(main_context: CodeeMainContext) -> None:
|
|
|
59
61
|
cols = {row[1] for row in conn.execute("PRAGMA table_info(runs)")}
|
|
60
62
|
if "message" not in cols:
|
|
61
63
|
conn.execute("ALTER TABLE runs ADD COLUMN message TEXT")
|
|
64
|
+
if "response" not in cols:
|
|
65
|
+
conn.execute("ALTER TABLE runs ADD COLUMN response TEXT")
|
|
66
|
+
if "user_message" not in cols:
|
|
67
|
+
conn.execute("ALTER TABLE runs ADD COLUMN user_message TEXT")
|
|
62
68
|
# In-flight claude runs; a row lives only while its subprocess is running.
|
|
63
69
|
conn.execute(
|
|
64
70
|
"""CREATE TABLE IF NOT EXISTS active_jobs (
|
|
@@ -78,7 +84,8 @@ def init(main_context: CodeeMainContext) -> None:
|
|
|
78
84
|
|
|
79
85
|
|
|
80
86
|
def record_run(skill_name, trigger_type, session_id, status, error=None, started_at=None,
|
|
81
|
-
message=None,
|
|
87
|
+
message=None, user_message=None, response=None,
|
|
88
|
+
*, main_context: CodeeMainContext) -> None:
|
|
82
89
|
"""Insert one run row. Never raises to the caller (FR-009)."""
|
|
83
90
|
try:
|
|
84
91
|
init(main_context)
|
|
@@ -88,9 +95,10 @@ def record_run(skill_name, trigger_type, session_id, status, error=None, started
|
|
|
88
95
|
with get_db_connection(main_context) as conn:
|
|
89
96
|
conn.execute(
|
|
90
97
|
"INSERT INTO runs (skill_name, trigger_type, session_id, status, error,"
|
|
91
|
-
" started_at, message
|
|
98
|
+
" started_at, message, user_message, response)"
|
|
99
|
+
" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
92
100
|
(skill_name, trigger_type, session_id,
|
|
93
|
-
status, error, started_at, message),
|
|
101
|
+
status, error, started_at, message, user_message, response),
|
|
94
102
|
)
|
|
95
103
|
except Exception as exc: # ponytail: a logging miss must never abort the skill run
|
|
96
104
|
print(f"[runs_db] Failed to record run for {skill_name}: {exc}")
|
|
@@ -104,7 +112,7 @@ def recent_runs(limit: int = 100, offset: int = 0, *,
|
|
|
104
112
|
with get_db_connection(main_context) as conn:
|
|
105
113
|
rows = conn.execute(
|
|
106
114
|
"SELECT id, skill_name, trigger_type, session_id, status, error,"
|
|
107
|
-
" started_at, message"
|
|
115
|
+
" started_at, message, user_message, response"
|
|
108
116
|
" FROM runs ORDER BY started_at DESC, id DESC LIMIT ? OFFSET ?",
|
|
109
117
|
(limit, max(offset, 0)),
|
|
110
118
|
).fetchall()
|
|
@@ -130,6 +130,17 @@ def test_message_round_trip(tmp_path):
|
|
|
130
130
|
assert by_skill == {"a": "hello", "b": "", "c": None}
|
|
131
131
|
|
|
132
132
|
|
|
133
|
+
def test_response_round_trip(tmp_path):
|
|
134
|
+
ctx = _ctx(tmp_path)
|
|
135
|
+
runs_db.record_run("a", "cron", "s1", "succeeded", message="question",
|
|
136
|
+
user_message="full question", response="final answer",
|
|
137
|
+
main_context=ctx)
|
|
138
|
+
|
|
139
|
+
run, = runs_db.recent_runs(main_context=ctx)
|
|
140
|
+
assert run["user_message"] == "full question"
|
|
141
|
+
assert run["response"] == "final answer"
|
|
142
|
+
|
|
143
|
+
|
|
133
144
|
# ---------------------------------------------------------------- active_jobs
|
|
134
145
|
def test_active_job_lifecycle(tmp_path):
|
|
135
146
|
ctx = _ctx(tmp_path)
|
|
@@ -210,7 +221,7 @@ def test_fmt_elapsed():
|
|
|
210
221
|
assert runs_db.fmt_elapsed(3700) == "1h 1m"
|
|
211
222
|
|
|
212
223
|
|
|
213
|
-
def
|
|
224
|
+
def test_migration_adds_run_detail_columns_without_data_loss(tmp_path):
|
|
214
225
|
ctx = _ctx(tmp_path)
|
|
215
226
|
# Build an old-schema DB (spec 001, no message column) with one row.
|
|
216
227
|
with sqlite3.connect(_db_file(tmp_path)) as conn:
|
|
@@ -231,10 +242,15 @@ def test_migration_adds_message_column_without_data_loss(tmp_path):
|
|
|
231
242
|
assert len(rows) == 1
|
|
232
243
|
assert rows[0]["skill_name"] == "old"
|
|
233
244
|
assert rows[0]["message"] is None # pre-feature row reads as NULL
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
245
|
+
assert rows[0]["user_message"] is None
|
|
246
|
+
assert rows[0]["response"] is None
|
|
247
|
+
|
|
248
|
+
# New writes carry both details; the upgraded DB round-trips them.
|
|
249
|
+
runs_db.record_run("new", "cron", "sid-new", "succeeded", message="m",
|
|
250
|
+
user_message="u", response="r", main_context=ctx)
|
|
251
|
+
newest = runs_db.recent_runs(main_context=ctx)[0]
|
|
252
|
+
assert (newest["message"], newest["user_message"], newest["response"]) == (
|
|
253
|
+
"m", "u", "r")
|
|
238
254
|
|
|
239
255
|
|
|
240
256
|
# The agent Codee names a session for is not always the agent that runs under
|
|
@@ -80,11 +80,13 @@ def trigger_aws_sqs_skills(
|
|
|
80
80
|
sqs_message_source.delete(message)
|
|
81
81
|
runs_db.record_run(skill.name, "aws-sqs",
|
|
82
82
|
session_id, "succeeded", message=prompt,
|
|
83
|
+
user_message=prompt, response=response,
|
|
83
84
|
main_context=main_context)
|
|
84
85
|
except Exception as exc:
|
|
85
86
|
print(f"[aws_sqs_skills] Failed to run {skill.name}: {exc}")
|
|
86
87
|
runs_db.record_run(skill.name, "aws-sqs", session_id, "failed",
|
|
87
88
|
error=str(exc)[:500], message=prompt,
|
|
89
|
+
user_message=prompt,
|
|
88
90
|
main_context=main_context)
|
|
89
91
|
|
|
90
92
|
|
|
@@ -126,6 +126,7 @@ def trigger_cron_skills(
|
|
|
126
126
|
f"[cron_skills] Claude response for {skill.name} ({len(response)} chars)")
|
|
127
127
|
runs_db.record_run(skill.name, "cron", session_id,
|
|
128
128
|
"succeeded", message=skill.body,
|
|
129
|
+
user_message=skill.body, response=response,
|
|
129
130
|
main_context=main_context)
|
|
130
131
|
except Exception as exc:
|
|
131
132
|
# Don't advance the state slot: leave the job "due" so a later tick
|
|
@@ -135,6 +136,7 @@ def trigger_cron_skills(
|
|
|
135
136
|
f"[cron_skills] Failed to run {skill.name}, will retry: {exc}")
|
|
136
137
|
runs_db.record_run(skill.name, "cron", session_id, "failed",
|
|
137
138
|
error=str(exc)[:500], message=skill.body,
|
|
139
|
+
user_message=skill.body,
|
|
138
140
|
main_context=main_context)
|
|
139
141
|
continue
|
|
140
142
|
if is_forced:
|
|
@@ -89,12 +89,14 @@ def trigger_email_skills(
|
|
|
89
89
|
path.unlink(missing_ok=True)
|
|
90
90
|
runs_db.record_run(skill.name, "email", session_id,
|
|
91
91
|
"succeeded", message=prompt,
|
|
92
|
+
user_message=prompt, response=response,
|
|
92
93
|
main_context=main_context)
|
|
93
94
|
except Exception as exc:
|
|
94
95
|
print(
|
|
95
96
|
f"[email_skills] Failed to run {skill.name} for {path.name}: {exc}")
|
|
96
97
|
runs_db.record_run(skill.name, "email", session_id, "failed",
|
|
97
98
|
error=str(exc)[:500], message=prompt,
|
|
99
|
+
user_message=prompt,
|
|
98
100
|
main_context=main_context)
|
|
99
101
|
|
|
100
102
|
|
|
@@ -266,6 +266,8 @@ class RunTaskLoggingTest(unittest.TestCase):
|
|
|
266
266
|
self.assertEqual(run["status"], "succeeded")
|
|
267
267
|
self.assertEqual(run["session_id"], "sid-1")
|
|
268
268
|
self.assertEqual(run["message"], "/story-developer NIM-1")
|
|
269
|
+
self.assertEqual(run["user_message"], "/story-developer NIM-1")
|
|
270
|
+
self.assertEqual(run["response"], "done")
|
|
269
271
|
|
|
270
272
|
def test_failed_run_is_recorded_with_the_error(self) -> None:
|
|
271
273
|
with patch.object(executor, "_run_agent", side_effect=RuntimeError("over limit")):
|
|
@@ -298,6 +300,7 @@ class RunTaskLoggingTest(unittest.TestCase):
|
|
|
298
300
|
|
|
299
301
|
run_record, = self._runs()
|
|
300
302
|
self.assertEqual(run_record["message"], "/story-developer 4124")
|
|
303
|
+
self.assertEqual(run_record["user_message"], prompt)
|
|
301
304
|
# The agent still gets the wording it can act on.
|
|
302
305
|
self.assertEqual(run.call_args.args[0], prompt)
|
|
303
306
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/aws-sqs-alarm-response/SKILL.md
RENAMED
|
File without changes
|
{codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/cron-research-5xx-errors/SKILL.md
RENAMED
|
File without changes
|
{codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-code-reviewer/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/story-security-reviewer/SKILL.md
RENAMED
|
File without changes
|
{codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/task-code-reviewer/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codee_agent-0.6.1 → codee_agent-0.6.2}/src/codee/templates/skills/task-security-reviewer/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|