@meridiona/meridian-darwin-arm64 1.49.2 → 1.51.0

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.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 1.49.2
1
+ 1.51.0
package/bin/meridian CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridiona/meridian-darwin-arm64",
3
- "version": "1.49.2",
3
+ "version": "1.51.0",
4
4
  "description": "Prebuilt Meridian app for macOS arm64 (daemon binary + dashboard + Python services). Installed via @meridiona/meridian.",
5
5
  "homepage": "https://github.com/Meridiona/meridian",
6
6
  "repository": {
@@ -816,7 +816,7 @@ case "$CMD" in
816
816
  uninstall) cmd_uninstall ;;
817
817
  permissions) cmd_permissions ;;
818
818
  version|--version|-v) cat "${REPO_ROOT}/VERSION" 2>/dev/null || echo "unknown" ;;
819
- worklog-status|pm-worklog|coding-agent-hook|coding-agent-summarise|coding-agent-classify|coding-agent-install-skill|oauth-login|tasks-sync) cmd_daemon_passthrough "$CMD" "$@" ;;
819
+ worklog-status|pm-worklog|coding-agent-hook|coding-agent-summarise|coding-agent-classify|coding-agent-install-skill|oauth-login|tasks-sync|ticket-update|ticket-parents) cmd_daemon_passthrough "$CMD" "$@" ;;
820
820
  --help|-h|help|"") cmd_help ;;
821
821
  *) err "unknown command: ${CMD}"; echo; cmd_help; exit 1 ;;
822
822
  esac
@@ -94,11 +94,11 @@ def build_synth_agent(
94
94
  # tools.get_earlier_today_summaries,
95
95
  # ],
96
96
  pre_hooks=[
97
- PIIDetectionGuardrail(),
98
97
  ProjectSecretGuard(),
99
98
  SessionBundleSizeGuard(max_tokens=80_000),
100
99
  ],
101
100
  post_hooks=[
101
+ PIIDetectionGuardrail(),
102
102
  time_spent_sanity_check,
103
103
  ],
104
104
  output_schema=JiraUpdate,
@@ -484,18 +484,34 @@ def _fetch_recent_sessions(
484
484
 
485
485
 
486
486
  def _fetch_pm_tasks(con: _sqlite3.Connection) -> list[dict[str, Any]]:
487
- rows = con.execute(
488
- "SELECT task_key, title,"
489
- " COALESCE(description_text,'') AS description_text,"
490
- " COALESCE(status_raw,'') AS status_raw,"
491
- " COALESCE(is_terminal,0) AS is_terminal,"
492
- " COALESCE(issue_type,'') AS issue_type,"
493
- " COALESCE(parent_key,'') AS parent_key,"
494
- " COALESCE(epic_title,'') AS epic_title,"
495
- " COALESCE(sprint_name,'') AS sprint_name,"
496
- " COALESCE(tags,'') AS tags"
497
- " FROM pm_tasks",
498
- ).fetchall()
487
+ # Candidate set for classification. Tickets the user explicitly EXCLUDED during
488
+ # onboarding board-cleanup (pm_task_curation.decision = 'excluded') are dropped
489
+ # so a cleaned-up dead ticket can never be a classification target. Everything
490
+ # else flows through, including not-yet-decided `looks_stale` rows — the triage
491
+ # only *proposes*; nothing is removed without the human's confirmed decision.
492
+ # LEFT JOIN keeps this safe if curation has no row for a ticket yet.
493
+ base_cols = (
494
+ "SELECT t.task_key, t.title,"
495
+ " COALESCE(t.description_text,'') AS description_text,"
496
+ " COALESCE(t.status_raw,'') AS status_raw,"
497
+ " COALESCE(t.is_terminal,0) AS is_terminal,"
498
+ " COALESCE(t.issue_type,'') AS issue_type,"
499
+ " COALESCE(t.parent_key,'') AS parent_key,"
500
+ " COALESCE(t.epic_title,'') AS epic_title,"
501
+ " COALESCE(t.sprint_name,'') AS sprint_name,"
502
+ " COALESCE(t.tags,'') AS tags"
503
+ " FROM pm_tasks t"
504
+ )
505
+ try:
506
+ rows = con.execute(
507
+ base_cols
508
+ + " LEFT JOIN pm_task_curation c ON c.task_key = t.task_key"
509
+ " WHERE c.decision IS NULL OR c.decision != 'excluded'",
510
+ ).fetchall()
511
+ except _sqlite3.OperationalError:
512
+ # Pre-migration-038 DB (no pm_task_curation): degrade to the unfiltered
513
+ # candidate set rather than crashing the whole /classify_sessions call.
514
+ rows = con.execute(base_cols).fetchall()
499
515
  return [dict(r) for r in rows]
500
516
 
501
517
 
@@ -603,15 +603,19 @@ async def synthesise_worklog(req: _SynthWorklogRequest) -> dict:
603
603
  try:
604
604
  response = await run_in_threadpool(_run)
605
605
  except Exception as exc: # noqa: BLE001 — never crash the shared server
606
- last_detail = f"agent run failed: {exc}"
606
+ last_detail = f"agent run raised {type(exc).__name__}: {exc}"
607
607
  log.warning("synthesise_worklog: attempt %d %s", attempt, last_detail)
608
608
  continue
609
609
  raw = getattr(response, "content", response)
610
+ if raw is None:
611
+ last_detail = "agent returned no content (guardrail likely blocked the run)"
612
+ log.warning("synthesise_worklog: attempt %d %s", attempt, last_detail)
613
+ continue
610
614
  update = pm_workflow._coerce_jira(raw)
611
615
  if update is not None:
612
616
  break
613
- last_detail = "agent output did not parse into a JiraUpdate"
614
- log.warning("synthesise_worklog: attempt %d %s", attempt, last_detail)
617
+ last_detail = f"agent output did not parse into a JiraUpdate (raw type={type(raw).__name__})"
618
+ log.warning("synthesise_worklog: attempt %d %s | raw=%.200s", attempt, last_detail, str(raw))
615
619
 
616
620
  if update is None:
617
621
  raise HTTPException(
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meridian-agents"
7
- version = "1.49.2"
7
+ version = "1.51.0"
8
8
  description = "Meridian agents — MLX classifier server and Jira worklog synthesis for meridian.db"
9
9
  requires-python = ">=3.11"
10
10
  authors = [{ name = "Meridiona" }]
package/ui.tar.gz CHANGED
Binary file