claude-smart 0.2.46 → 0.2.47

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 (85) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.md +19 -11
  3. package/bin/claude-smart.js +290 -68
  4. package/package.json +1 -1
  5. package/plugin/.claude-plugin/plugin.json +1 -1
  6. package/plugin/.codex-plugin/plugin.json +1 -1
  7. package/plugin/README.md +11 -10
  8. package/plugin/dashboard/app/layout.tsx +20 -0
  9. package/plugin/opencode/dist/server.mjs +76 -2
  10. package/plugin/opencode/server.mts +79 -2
  11. package/plugin/pyproject.toml +6 -2
  12. package/plugin/scripts/smart-install.sh +7 -1
  13. package/plugin/src/claude_smart/cli.py +210 -22
  14. package/plugin/src/claude_smart/context_format.py +9 -9
  15. package/plugin/src/claude_smart/cs_cite.py +66 -19
  16. package/plugin/uv.lock +5 -5
  17. package/plugin/vendor/reflexio/README.md +3 -3
  18. package/plugin/vendor/reflexio/pyproject.toml +1 -1
  19. package/plugin/vendor/reflexio/reflexio/README.md +3 -1
  20. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +1 -1
  21. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +2 -2
  22. package/plugin/vendor/reflexio/reflexio/cli/utils.py +44 -1
  23. package/plugin/vendor/reflexio/reflexio/client/client.py +97 -0
  24. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +8 -0
  25. package/plugin/vendor/reflexio/reflexio/lib/_base.py +15 -0
  26. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +9 -8
  27. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +27 -16
  28. package/plugin/vendor/reflexio/reflexio/lib/_search.py +23 -5
  29. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +9 -0
  30. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +1 -0
  31. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/governance.py +117 -0
  32. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +45 -3
  33. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +16 -0
  34. package/plugin/vendor/reflexio/reflexio/server/README.md +14 -2
  35. package/plugin/vendor/reflexio/reflexio/server/api.py +176 -29
  36. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +1 -1
  37. package/plugin/vendor/reflexio/reflexio/server/{_auth.py → auth.py} +2 -0
  38. package/plugin/vendor/reflexio/reflexio/server/extensions.py +213 -0
  39. package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +4 -4
  40. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1 -1
  41. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +12 -1
  42. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.4.0.prompt.md +14 -2
  43. package/plugin/vendor/reflexio/reflexio/server/services/README.md +3 -1
  44. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +8 -0
  45. package/plugin/vendor/reflexio/reflexio/server/services/governance/config.py +52 -0
  46. package/plugin/vendor/reflexio/reflexio/server/services/governance/service.py +378 -0
  47. package/plugin/vendor/reflexio/reflexio/server/services/governance/subject_refs.py +34 -0
  48. package/plugin/vendor/reflexio/reflexio/server/services/lineage/gc_scheduler.py +45 -19
  49. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +9 -1
  50. package/plugin/vendor/reflexio/reflexio/server/services/playbook/aggregation_prompt_processing.py +100 -0
  51. package/plugin/vendor/reflexio/reflexio/server/services/playbook/components/aggregator.py +129 -111
  52. package/plugin/vendor/reflexio/reflexio/server/services/playbook/service.py +9 -9
  53. package/plugin/vendor/reflexio/reflexio/server/services/profile/components/extractor.py +3 -2
  54. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/recency.py +211 -0
  55. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +29 -13
  56. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +4 -0
  57. package/plugin/vendor/reflexio/reflexio/server/services/storage/governance_validation.py +681 -0
  58. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +14 -2
  59. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +2 -0
  60. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +49 -19
  61. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_governance.py +1965 -0
  62. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_lineage.py +5 -3
  63. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1 -2133
  64. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +262 -107
  65. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +73 -33
  66. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/__init__.py +13 -0
  67. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_agent.py +952 -0
  68. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_eval_results.py +189 -0
  69. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_optimization.py +247 -0
  70. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_source_linkage.py +145 -0
  71. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_user.py +838 -0
  72. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +19 -3
  73. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +4 -4
  74. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_governance.py +148 -0
  75. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +0 -909
  76. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +13 -0
  77. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +2 -0
  78. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/__init__.py +13 -0
  79. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_agent.py +365 -0
  80. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_eval_results.py +124 -0
  81. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_optimization.py +85 -0
  82. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_source_linkage.py +47 -0
  83. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_user.py +333 -0
  84. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +153 -12
  85. package/plugin/vendor/reflexio/reflexio/server/services/playbook/user_detail_stripping.py +0 -84
@@ -8,9 +8,9 @@ from ._base import (
8
8
  _vector_rank_rows,
9
9
  )
10
10
  from ._extras import ExtrasMixin
11
+ from ._governance import SQLiteGovernanceMixin
11
12
  from ._lineage import SQLiteLineageMixin
12
13
  from ._operations import OperationMixin
13
- from ._playbook import PlaybookMixin
14
14
  from ._profiles import ProfileMixin
15
15
  from ._requests import RequestMixin
16
16
  from ._shadow_verdicts import ShadowVerdictsMixin as SQLiteShadowVerdictsMixin
@@ -25,13 +25,25 @@ from ._stall_state import (
25
25
  mark_stall_notified,
26
26
  upsert_stall_state,
27
27
  )
28
+ from .playbook import (
29
+ AgentEvaluationResultStoreMixin,
30
+ AgentPlaybookStoreMixin,
31
+ OptimizationJobStoreMixin,
32
+ PlaybookSourceLinkageMixin,
33
+ UserPlaybookStoreMixin,
34
+ )
28
35
 
29
36
 
30
37
  class SQLiteStorage(
31
38
  SQLiteAgentRunMixin,
32
39
  ProfileMixin,
33
40
  RequestMixin,
34
- PlaybookMixin,
41
+ AgentPlaybookStoreMixin,
42
+ UserPlaybookStoreMixin,
43
+ PlaybookSourceLinkageMixin,
44
+ OptimizationJobStoreMixin,
45
+ AgentEvaluationResultStoreMixin,
46
+ SQLiteGovernanceMixin,
35
47
  SQLiteLineageMixin,
36
48
  OperationMixin,
37
49
  ExtrasMixin,
@@ -62,6 +62,7 @@ from reflexio.server.services.storage.retention_mixin import (
62
62
  from reflexio.server.services.storage.storage_base import BaseStorage
63
63
  from reflexio.server.site_var.site_var_manager import SiteVarManager
64
64
 
65
+ from ._governance import init_governance_tables
65
66
  from ._stall_state import init_stall_state_table
66
67
 
67
68
  logger = logging.getLogger(__name__)
@@ -642,6 +643,7 @@ class SQLiteStorageBase(RetentionMixin, BaseStorage):
642
643
  with self._lock:
643
644
  cur = self.conn.cursor()
644
645
  cur.executescript(_DDL)
646
+ init_governance_tables(self.conn)
645
647
  self.conn.commit()
646
648
  if self._has_sqlite_vec:
647
649
  self._create_vec_tables()
@@ -2,6 +2,7 @@
2
2
 
3
3
  import sqlite3
4
4
  from collections import defaultdict
5
+ from datetime import UTC, datetime
5
6
  from typing import Any, Literal, cast
6
7
 
7
8
  from reflexio.models.api_schema.braintrust_schema import (
@@ -179,31 +180,60 @@ class ExtrasMixin:
179
180
  (current_start_iso, current_time_iso),
180
181
  )
181
182
 
183
+ def day_bucket(timestamp: int) -> int:
184
+ return int(
185
+ datetime.fromtimestamp(timestamp, tz=UTC)
186
+ .replace(hour=0, minute=0, second=0, microsecond=0)
187
+ .timestamp()
188
+ )
189
+
190
+ def count_series(timestamps: list[int]) -> list[dict[str, int]]:
191
+ buckets: dict[int, int] = defaultdict(int)
192
+ for timestamp in timestamps:
193
+ buckets[day_bucket(timestamp)] += 1
194
+ return [
195
+ {"timestamp": timestamp, "value": value}
196
+ for timestamp, value in sorted(buckets.items())
197
+ ]
198
+
199
+ def rate_series(rows: list[sqlite3.Row]) -> list[dict[str, int | float]]:
200
+ buckets: dict[int, dict[str, int]] = defaultdict(
201
+ lambda: {"success": 0, "count": 0}
202
+ )
203
+ for row in rows:
204
+ bucket = day_bucket(_iso_to_epoch(row["created_at"]))
205
+ buckets[bucket]["count"] += 1
206
+ if row["is_success"]:
207
+ buckets[bucket]["success"] += 1
208
+ return [
209
+ {
210
+ "timestamp": timestamp,
211
+ "value": (
212
+ 100.0 * aggregate["success"] / aggregate["count"]
213
+ if aggregate["count"]
214
+ else 0.0
215
+ ),
216
+ "count": aggregate["count"],
217
+ }
218
+ for timestamp, aggregate in sorted(buckets.items())
219
+ ]
220
+
182
221
  return {
183
222
  "current_period": current_stats,
184
223
  "previous_period": previous_stats,
185
- "interactions_time_series": [
186
- {"timestamp": _iso_to_epoch(r["created_at"]), "value": 1}
187
- for r in interactions_ts
188
- ],
189
- "profiles_time_series": [
190
- {"timestamp": r["last_modified_timestamp"], "value": 1}
191
- for r in profiles_ts
192
- ],
193
- "playbooks_time_series": sorted(
224
+ "interactions_time_series": count_series(
225
+ [_iso_to_epoch(r["created_at"]) for r in interactions_ts]
226
+ ),
227
+ "profiles_time_series": count_series(
228
+ [r["last_modified_timestamp"] for r in profiles_ts]
229
+ ),
230
+ "playbooks_time_series": count_series(
194
231
  [
195
- {"timestamp": _iso_to_epoch(r["created_at"]), "value": 1}
232
+ _iso_to_epoch(r["created_at"])
196
233
  for r in (*user_playbooks_ts, *agent_playbooks_ts)
197
- ],
198
- key=lambda x: x["timestamp"],
234
+ ]
199
235
  ),
200
- "evaluations_time_series": [
201
- {
202
- "timestamp": _iso_to_epoch(r["created_at"]),
203
- "value": 100 if r["is_success"] else 0,
204
- }
205
- for r in evals_ts
206
- ],
236
+ "evaluations_time_series": rate_series(evals_ts),
207
237
  }
208
238
 
209
239
  @SQLiteStorageBase.handle_exceptions