codespy-ai 2.1.0__tar.gz → 2.1.1__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 (124) hide show
  1. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/PKG-INFO +1 -1
  2. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/pyproject.toml +1 -1
  3. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/__init__.py +1 -1
  4. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/postgres.py +15 -7
  5. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/config_memory.py +8 -2
  6. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/pipeline.py +2 -2
  7. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/LICENSE +0 -0
  8. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/README.md +0 -0
  9. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/__init__.py +0 -0
  10. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/context_safe.py +0 -0
  11. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/cost_tracker.py +0 -0
  12. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/diagnostic_adapter.py +0 -0
  13. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/dspy_config.py +0 -0
  14. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/__init__.py +0 -0
  15. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/cerebral/__init__.py +0 -0
  16. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/cerebral/cerebral.py +0 -0
  17. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/cerebral/cost.py +0 -0
  18. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/cerebral/orphans.py +0 -0
  19. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/cerebral/structured_output.py +0 -0
  20. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/hippocampus/__init__.py +0 -0
  21. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/hippocampus/budget.py +0 -0
  22. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/hippocampus/cartographer.py +0 -0
  23. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/hippocampus/context_memory.py +0 -0
  24. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/hippocampus/distiller.py +0 -0
  25. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/hippocampus/episode.py +0 -0
  26. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/hippocampus/hippocampus.py +0 -0
  27. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/pg0_manager.py +0 -0
  28. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/prefrontal/__init__.py +0 -0
  29. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/prefrontal/facets.py +0 -0
  30. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/prefrontal/format.py +0 -0
  31. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/prefrontal/prefrontal.py +0 -0
  32. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/prefrontal/query.py +0 -0
  33. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/prefrontal/reach.py +0 -0
  34. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/memory/recall.py +0 -0
  35. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/__init__.py +0 -0
  36. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/audit/__init__.py +0 -0
  37. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/audit/agent.py +0 -0
  38. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/code_review/__init__.py +0 -0
  39. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/code_review/agent.py +0 -0
  40. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/doc/__init__.py +0 -0
  41. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/doc/agent.py +0 -0
  42. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/doc/doc_extractor.py +0 -0
  43. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/helpers.py +0 -0
  44. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/models.py +0 -0
  45. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/scope/__init__.py +0 -0
  46. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/scope/agent.py +0 -0
  47. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/scope/manifest_parser.py +0 -0
  48. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/scope/models.py +0 -0
  49. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/summary/__init__.py +0 -0
  50. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/summary/agent.py +0 -0
  51. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/supply_chain/__init__.py +0 -0
  52. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/review/supply_chain/agent.py +0 -0
  53. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/agents/rlm_tools.py +0 -0
  54. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/cli.py +0 -0
  55. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/cli_local.py +0 -0
  56. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/cli_mcp_server.py +0 -0
  57. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/cli_remote.py +0 -0
  58. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/config.py +0 -0
  59. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/config_dspy.py +0 -0
  60. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/config_git.py +0 -0
  61. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/config_io.py +0 -0
  62. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/config_llm.py +0 -0
  63. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/config_utils.py +0 -0
  64. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/__init__.py +0 -0
  65. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/cyber/__init__.py +0 -0
  66. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/cyber/osv/__init__.py +0 -0
  67. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/cyber/osv/client.py +0 -0
  68. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/cyber/osv/models.py +0 -0
  69. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/cyber/osv/server.py +0 -0
  70. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/__init__.py +0 -0
  71. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/base.py +0 -0
  72. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/client.py +0 -0
  73. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/github_client.py +0 -0
  74. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/gitlab_client.py +0 -0
  75. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/local_diff.py +0 -0
  76. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/models.py +0 -0
  77. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/git/server.py +0 -0
  78. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/mcp_utils.py +0 -0
  79. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/__init__.py +0 -0
  80. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/ripgrep/__init__.py +0 -0
  81. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/ripgrep/client.py +0 -0
  82. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/ripgrep/server.py +0 -0
  83. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/__init__.py +0 -0
  84. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/base_extractor.py +0 -0
  85. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/__init__.py +0 -0
  86. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/bash.py +0 -0
  87. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/cpp.py +0 -0
  88. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/csharp.py +0 -0
  89. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/go.py +0 -0
  90. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/java.py +0 -0
  91. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/javascript.py +0 -0
  92. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/kotlin.py +0 -0
  93. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/objc.py +0 -0
  94. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/php.py +0 -0
  95. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/python.py +0 -0
  96. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/ripgrep_fallback.py +0 -0
  97. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/ruby.py +0 -0
  98. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/rust.py +0 -0
  99. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/swift.py +0 -0
  100. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/extractors/terraform.py +0 -0
  101. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/models.py +0 -0
  102. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/parser.py +0 -0
  103. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/parsers/treesitter/server.py +0 -0
  104. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/__init__.py +0 -0
  105. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/base.py +0 -0
  106. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/filesystem/__init__.py +0 -0
  107. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/filesystem/client.py +0 -0
  108. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/filesystem/server.py +0 -0
  109. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/models.py +0 -0
  110. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/s3/__init__.py +0 -0
  111. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/s3/client.py +0 -0
  112. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/storage/s3/server.py +0 -0
  113. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/web/__init__.py +0 -0
  114. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/web/client.py +0 -0
  115. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/web/models.py +0 -0
  116. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/tools/web/server.py +0 -0
  117. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/__init__.py +0 -0
  118. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/__init__.py +0 -0
  119. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/models.py +0 -0
  120. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/reporters/__init__.py +0 -0
  121. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/reporters/base.py +0 -0
  122. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/reporters/git.py +0 -0
  123. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/reporters/stdout.py +0 -0
  124. {codespy_ai-2.1.0 → codespy_ai-2.1.1}/src/codespy/workflows/review/server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codespy-ai
3
- Version: 2.1.0
3
+ Version: 2.1.1
4
4
  Summary: Code review agent powered by DSPy
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codespy-ai"
3
- version = "2.1.0"
3
+ version = "2.1.1"
4
4
  description = "Code review agent powered by DSPy"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """codespy - Code review agent powered by DSPy."""
2
2
 
3
- __version__ = "2.1.0"
3
+ __version__ = "2.1.1"
@@ -33,6 +33,7 @@ class EpisodeStore:
33
33
  schema: str | None = None,
34
34
  min_size: int = 1,
35
35
  max_size: int = 4,
36
+ persist_recalls: bool = False,
36
37
  ):
37
38
  """Create store with a psycopg ConnectionPool, scoped to a bank.
38
39
 
@@ -45,8 +46,12 @@ class EpisodeStore:
45
46
  (e.g. "episodic", "semantic"). None = server default (public).
46
47
  min_size: Minimum connections in pool
47
48
  max_size: Maximum connections in pool
49
+ persist_recalls: Write Prefrontal recall records to the ``recalls``
50
+ table. When False (default), ``save_episode`` skips them
51
+ and ``save_recalls`` is a no-op. The table is still created.
48
52
  """
49
53
  self.bank_id = bank_id
54
+ self.persist_recalls = persist_recalls
50
55
  self._schema = schema
51
56
  # Inject search_path into the connection string so every pooled
52
57
  # connection targets the right schema automatically.
@@ -567,19 +572,20 @@ class EpisodeStore:
567
572
  (self.bank_id, str(episode.id), name, content),
568
573
  )
569
574
 
570
- # 8. Insert recalls (Prefrontal monitoring) - now with episode_id set
571
- self._insert_recalls(
572
- cur, episode.recalls or [], run_id=episode.run_id, episode_id=episode.id, task=episode.task
573
- )
575
+ # 8. Insert recalls (Prefrontal monitoring, opt-in)
576
+ if self.persist_recalls:
577
+ self._insert_recalls(
578
+ cur, episode.recalls or [], run_id=episode.run_id, episode_id=episode.id, task=episode.task
579
+ )
574
580
 
575
581
  conn.commit()
576
582
 
577
583
  logger.info(
578
- "save_episode: persisted episode %s (bank=%s, task=%s, topics=%d, observations=%d, recalls=%d)",
584
+ "save_episode: persisted episode %s (bank=%s, task=%s, topics=%d, observations=%d, recalls=%s)",
579
585
  episode.id, self.bank_id, episode.task,
580
586
  len(episode.context_memory.topics),
581
587
  len(episode.context_memory.all_observations()),
582
- len(episode.recalls or []),
588
+ len(episode.recalls or []) if self.persist_recalls else "off",
583
589
  )
584
590
 
585
591
  def load_context(
@@ -836,8 +842,10 @@ class EpisodeStore:
836
842
  run_id: Run identifier
837
843
  episode_id: Optional episode UUID (None for run-level recalls)
838
844
  task: Task name (consumer task or "review" for run-level load)
845
+
846
+ No-op unless the store was built with ``persist_recalls=True``.
839
847
  """
840
- if not records:
848
+ if not self.persist_recalls or not records:
841
849
  return
842
850
 
843
851
  with self._pool.connection() as conn:
@@ -81,6 +81,11 @@ class HippocampusConfig(BaseModel):
81
81
  # Whether to apply head+tail trajectory bounding before distillation.
82
82
  compact_trajectory: bool = True
83
83
 
84
+ # Store Prefrontal recalls in the episodic ``recalls`` table (monitoring
85
+ # only). Off by default: every row holds the full recalled text, so the
86
+ # table grows fast.
87
+ persist_recalls: bool = False
88
+
84
89
  # Token budgets
85
90
  max_hippocampus_tokens: int = Field(default=16384)
86
91
  max_hippocampus_item_tokens: int = Field(default=512)
@@ -343,13 +348,14 @@ def get_episode_store(settings: Settings) -> EpisodeStore | None:
343
348
  mem = settings.memory
344
349
  bank_id = mem.bank_id or DEFAULT_BANK_ID
345
350
  schema = EPISODIC_SCHEMA
351
+ persist_recalls = mem.hippocampus.persist_recalls
346
352
 
347
353
  # Try external PostgreSQL first
348
354
  uri = mem.postgres.build_uri()
349
355
  if uri:
350
356
  from codespy.agents.memory.postgres import EpisodeStore
351
357
 
352
- _store = EpisodeStore(uri, bank_id, schema=schema)
358
+ _store = EpisodeStore(uri, bank_id, schema=schema, persist_recalls=persist_recalls)
353
359
  logger.info(f"EpisodeStore connected to external PostgreSQL (bank={bank_id}, schema={schema})")
354
360
  else:
355
361
  # Try pg0-embedded for local dev
@@ -359,7 +365,7 @@ def get_episode_store(settings: Settings) -> EpisodeStore | None:
359
365
  uri = get_pg0_uri(name=mem.pg0.name, port=mem.pg0.port, data_dir=mem.pg0.data_dir)
360
366
  from codespy.agents.memory.postgres import EpisodeStore
361
367
 
362
- _store = EpisodeStore(uri, bank_id, schema=schema)
368
+ _store = EpisodeStore(uri, bank_id, schema=schema, persist_recalls=persist_recalls)
363
369
  logger.info(f"EpisodeStore connected to pg0-embedded PostgreSQL (bank={bank_id}, schema={schema})")
364
370
  except ImportError:
365
371
  logger.warning(
@@ -299,10 +299,10 @@ class ReviewPipeline(dspy.Module):
299
299
  packages=all_packages[:MAX_ENTITY_TERMS],
300
300
  )
301
301
  pf_text = run_pf.load(facets)
302
- # Persist run-level recalls
302
+ # Persist run-level recalls (opt-in: memory.hippocampus.persist_recalls)
303
303
  try:
304
304
  store = get_episode_store(self.settings)
305
- if store and run_pf.recalls:
305
+ if store and store.persist_recalls and run_pf.recalls:
306
306
  store.save_recalls(
307
307
  run_pf.recalls,
308
308
  run_id=run_id,
File without changes
File without changes