phronomy 0.8.0 → 0.9.1

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 (88) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -4
  3. data/README.md +32 -41
  4. data/benchmark/baseline.json +1 -1
  5. data/benchmark/bench_agent_invoke.rb +1 -1
  6. data/benchmark/bench_context_assembler.rb +9 -1
  7. data/benchmark/bench_regression.rb +8 -8
  8. data/benchmark/bench_tool_schema.rb +2 -2
  9. data/benchmark/bench_vector_store.rb +1 -1
  10. data/docs/decisions/011-build-context-as-single-llm-input-authority.md +224 -0
  11. data/lib/phronomy/agent/base.rb +328 -366
  12. data/lib/phronomy/agent/checkpoint.rb +30 -1
  13. data/lib/phronomy/agent/checkpoint_store.rb +97 -0
  14. data/lib/phronomy/agent/concerns/retryable.rb +1 -1
  15. data/lib/phronomy/agent/concerns/suspendable.rb +63 -8
  16. data/lib/phronomy/agent/context/capability/base.rb +689 -0
  17. data/lib/phronomy/agent/context/capability/scope_policy.rb +54 -0
  18. data/lib/phronomy/agent/context/knowledge/base.rb +58 -0
  19. data/lib/phronomy/agent/context/knowledge/entity_knowledge.rb +102 -0
  20. data/lib/phronomy/agent/context/knowledge/static_knowledge.rb +58 -0
  21. data/lib/phronomy/agent/shared_state.rb +2 -2
  22. data/lib/phronomy/agent/tool_executor.rb +1 -1
  23. data/lib/phronomy/concurrency/gate_registry.rb +0 -1
  24. data/lib/phronomy/configuration.rb +13 -6
  25. data/lib/phronomy/event_loop.rb +1 -18
  26. data/lib/phronomy/llm_context_window/assembler.rb +77 -44
  27. data/lib/phronomy/multi_agent/handoff.rb +4 -4
  28. data/lib/phronomy/multi_agent/orchestrator.rb +1 -1
  29. data/lib/phronomy/multi_agent/team_coordinator.rb +2 -2
  30. data/lib/phronomy/runtime/runtime_metrics.rb +0 -1
  31. data/lib/phronomy/runtime.rb +1 -2
  32. data/lib/phronomy/tool.rb +3 -4
  33. data/lib/phronomy/{tool/agent_tool.rb → tools/agent.rb} +8 -9
  34. data/lib/phronomy/{tool/mcp_tool.rb → tools/mcp.rb} +9 -9
  35. data/lib/phronomy/tools/vector_search.rb +70 -0
  36. data/lib/phronomy/vector_store/async_backend.rb +110 -0
  37. data/lib/phronomy/vector_store/base.rb +89 -0
  38. data/lib/phronomy/vector_store/embeddings/base.rb +41 -0
  39. data/lib/phronomy/vector_store/embeddings/ruby_llm_embeddings.rb +47 -0
  40. data/lib/phronomy/vector_store/in_memory.rb +103 -0
  41. data/lib/phronomy/vector_store/loader/base.rb +27 -0
  42. data/lib/phronomy/vector_store/loader/csv_loader.rb +58 -0
  43. data/lib/phronomy/vector_store/loader/markdown_loader.rb +78 -0
  44. data/lib/phronomy/vector_store/loader/plain_text_loader.rb +24 -0
  45. data/lib/phronomy/vector_store/pgvector.rb +127 -0
  46. data/lib/phronomy/vector_store/redis_search.rb +192 -0
  47. data/lib/phronomy/vector_store/splitter/base.rb +49 -0
  48. data/lib/phronomy/vector_store/splitter/fixed_size_splitter.rb +53 -0
  49. data/lib/phronomy/vector_store/splitter/recursive_splitter.rb +107 -0
  50. data/lib/phronomy/vector_store.rb +16 -4
  51. data/lib/phronomy/version.rb +1 -1
  52. data/lib/phronomy/workflow/fsm_session.rb +249 -0
  53. data/lib/phronomy/workflow/phase_machine_builder.rb +247 -0
  54. data/lib/phronomy/workflow_runner.rb +2 -2
  55. data/lib/phronomy.rb +10 -3
  56. data/scripts/api_snapshot.rb +11 -10
  57. metadata +31 -37
  58. data/lib/phronomy/agent/context/conversation/compaction_context.rb +0 -117
  59. data/lib/phronomy/agent/context/conversation/trigger_context.rb +0 -43
  60. data/lib/phronomy/agent/context/conversation/trim_context.rb +0 -82
  61. data/lib/phronomy/agent/context/knowledge/embeddings/base.rb +0 -45
  62. data/lib/phronomy/agent/context/knowledge/embeddings/ruby_llm_embeddings.rb +0 -51
  63. data/lib/phronomy/agent/context/knowledge/loader/base.rb +0 -31
  64. data/lib/phronomy/agent/context/knowledge/loader/csv_loader.rb +0 -62
  65. data/lib/phronomy/agent/context/knowledge/loader/markdown_loader.rb +0 -82
  66. data/lib/phronomy/agent/context/knowledge/loader/plain_text_loader.rb +0 -28
  67. data/lib/phronomy/agent/context/knowledge/source/base.rb +0 -60
  68. data/lib/phronomy/agent/context/knowledge/source/entity_knowledge.rb +0 -102
  69. data/lib/phronomy/agent/context/knowledge/source/rag_knowledge.rb +0 -63
  70. data/lib/phronomy/agent/context/knowledge/source/static_knowledge.rb +0 -58
  71. data/lib/phronomy/agent/context/knowledge/splitter/base.rb +0 -53
  72. data/lib/phronomy/agent/context/knowledge/splitter/fixed_size_splitter.rb +0 -57
  73. data/lib/phronomy/agent/context/knowledge/splitter/recursive_splitter.rb +0 -111
  74. data/lib/phronomy/agent/context/knowledge/vector_store/async_backend.rb +0 -116
  75. data/lib/phronomy/agent/context/knowledge/vector_store/base.rb +0 -95
  76. data/lib/phronomy/agent/context/knowledge/vector_store/in_memory.rb +0 -109
  77. data/lib/phronomy/agent/context/knowledge/vector_store/pgvector.rb +0 -133
  78. data/lib/phronomy/agent/context/knowledge/vector_store/redis_search.rb +0 -198
  79. data/lib/phronomy/agent/fsm.rb +0 -157
  80. data/lib/phronomy/agent/invocation_pipeline.rb +0 -99
  81. data/lib/phronomy/agent/lifecycle/fsm_session.rb +0 -251
  82. data/lib/phronomy/agent/lifecycle/phase_machine_builder.rb +0 -249
  83. data/lib/phronomy/agent/react_agent.rb +0 -204
  84. data/lib/phronomy/embeddings.rb +0 -11
  85. data/lib/phronomy/loader.rb +0 -13
  86. data/lib/phronomy/splitter.rb +0 -12
  87. data/lib/phronomy/tool/base.rb +0 -685
  88. data/lib/phronomy/tool/scope_policy.rb +0 -50
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Phronomy
4
- module Tool
5
- # Evaluates whether a tool with a given scope may execute.
6
- #
7
- # A ScopePolicy is a callable that receives +(tool_class, scope, agent)+ and
8
- # returns one of:
9
- # +:allow+ — proceed immediately without an approval gate.
10
- # +:reject+ — block execution; the tool returns a denial message.
11
- # +:approve+ — delegate to the agent's approval handler (if registered);
12
- # when no handler is registered the call is rejected.
13
- #
14
- # The {Default} instance is used automatically when no custom policy is
15
- # configured on an agent.
16
- #
17
- # @example Custom policy that allows everything
18
- # agent.scope_policy = ->(_tool_class, _scope, _agent) { :allow }
19
- #
20
- # @example Strict policy that rejects all write scopes
21
- # agent.scope_policy = ->(_tc, scope, _agent) {
22
- # scope == :write ? :reject : :allow
23
- # }
24
- class ScopePolicy
25
- # Scopes that must go through an approval gate before execution.
26
- APPROVAL_REQUIRED_SCOPES = %i[write admin external_network filesystem process external_process].freeze
27
-
28
- # Scopes that are always permitted without approval.
29
- ALWAYS_ALLOWED_SCOPES = %i[read_only].freeze
30
-
31
- # Returns +:allow+ for always-allowed scopes, +:approve+ for high-risk
32
- # scopes, and +:allow+ for anything else (including +nil+).
33
- #
34
- # @param _tool_class [Class]
35
- # @param scope [Symbol, nil]
36
- # @param _agent [Object]
37
- # @return [:allow, :approve, :reject]
38
- # @api private
39
- def call(_tool_class, scope, _agent)
40
- return :allow if scope.nil? || ALWAYS_ALLOWED_SCOPES.include?(scope)
41
- return :approve if APPROVAL_REQUIRED_SCOPES.include?(scope)
42
-
43
- :allow
44
- end
45
-
46
- # Shared singleton used when no custom policy is configured.
47
- DEFAULT = new.freeze
48
- end
49
- end
50
- end