phronomy 0.6.0 → 0.7.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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/.mutant.yml +22 -0
  3. data/CHANGELOG.md +488 -0
  4. data/CONTRIBUTING.md +102 -0
  5. data/README.md +374 -36
  6. data/RELEASE_CHECKLIST.md +86 -0
  7. data/Rakefile +33 -0
  8. data/SECURITY.md +80 -0
  9. data/benchmark/baseline.json +9 -0
  10. data/benchmark/bench_agent_invoke.rb +105 -0
  11. data/benchmark/bench_context_assembler.rb +46 -0
  12. data/benchmark/bench_regression.rb +172 -0
  13. data/benchmark/bench_token_estimator.rb +44 -0
  14. data/benchmark/bench_tool_schema.rb +69 -0
  15. data/benchmark/bench_vector_store.rb +39 -0
  16. data/benchmark/bench_workflow.rb +55 -0
  17. data/benchmark/run_all.rb +118 -0
  18. data/docs/decisions/001-rubyllm-as-provider-layer.md +42 -0
  19. data/docs/decisions/002-workflow-context-immutability.md +42 -0
  20. data/docs/decisions/003-event-loop-singleton.md +48 -0
  21. data/docs/decisions/004-invoke-timeout-is-not-cancellation.md +75 -0
  22. data/docs/decisions/005-static-knowledge-class-level-cache.md +45 -0
  23. data/docs/decisions/006-no-built-in-guardrails.md +66 -0
  24. data/docs/decisions/007-mcp-is-beta-stability.md +51 -0
  25. data/docs/decisions/008-orchestrator-uses-os-threads.md +52 -0
  26. data/docs/decisions/009-state-store-abstraction.md +141 -0
  27. data/docs/decisions/010-cooperative-first-concurrency.md +248 -0
  28. data/lib/phronomy/agent/base.rb +416 -49
  29. data/lib/phronomy/agent/before_completion_context.rb +1 -0
  30. data/lib/phronomy/agent/checkpoint.rb +1 -0
  31. data/lib/phronomy/agent/concerns/before_completion.rb +6 -0
  32. data/lib/phronomy/agent/concerns/error_translation.rb +45 -0
  33. data/lib/phronomy/agent/concerns/guardrailable.rb +3 -0
  34. data/lib/phronomy/agent/concerns/retryable.rb +12 -1
  35. data/lib/phronomy/agent/concerns/suspendable.rb +19 -0
  36. data/lib/phronomy/agent/fsm.rb +44 -52
  37. data/lib/phronomy/agent/handoff.rb +3 -0
  38. data/lib/phronomy/agent/orchestrator.rb +191 -54
  39. data/lib/phronomy/agent/parallel_tool_chat.rb +87 -13
  40. data/lib/phronomy/agent/react_agent.rb +16 -6
  41. data/lib/phronomy/agent/runner.rb +2 -0
  42. data/lib/phronomy/agent/shared_state.rb +11 -0
  43. data/lib/phronomy/agent/suspend_signal.rb +2 -0
  44. data/lib/phronomy/agent/team_coordinator.rb +17 -5
  45. data/lib/phronomy/async_queue.rb +155 -0
  46. data/lib/phronomy/blocking_adapter_pool.rb +435 -0
  47. data/lib/phronomy/cancellation_scope.rb +123 -0
  48. data/lib/phronomy/cancellation_token.rb +133 -0
  49. data/lib/phronomy/concurrency_gate.rb +155 -0
  50. data/lib/phronomy/configuration.rb +168 -2
  51. data/lib/phronomy/context/assembler.rb +6 -0
  52. data/lib/phronomy/context/compaction_context.rb +2 -0
  53. data/lib/phronomy/context/context_version_cache.rb +2 -0
  54. data/lib/phronomy/context/token_budget.rb +3 -0
  55. data/lib/phronomy/context/token_estimator.rb +9 -2
  56. data/lib/phronomy/context/trigger_context.rb +1 -0
  57. data/lib/phronomy/context/trim_context.rb +4 -0
  58. data/lib/phronomy/deadline.rb +63 -0
  59. data/lib/phronomy/diagnostics.rb +62 -0
  60. data/lib/phronomy/embeddings/base.rb +22 -2
  61. data/lib/phronomy/embeddings/ruby_llm_embeddings.rb +6 -2
  62. data/lib/phronomy/eval/comparison.rb +2 -0
  63. data/lib/phronomy/eval/dataset.rb +4 -0
  64. data/lib/phronomy/eval/metrics.rb +6 -0
  65. data/lib/phronomy/eval/runner.rb +11 -9
  66. data/lib/phronomy/eval/scorer/base.rb +1 -0
  67. data/lib/phronomy/eval/scorer/exact_match.rb +2 -0
  68. data/lib/phronomy/eval/scorer/includes_scorer.rb +2 -0
  69. data/lib/phronomy/eval/scorer/llm_judge.rb +2 -0
  70. data/lib/phronomy/event_loop.rb +275 -30
  71. data/lib/phronomy/fsm_session.rb +57 -4
  72. data/lib/phronomy/generator_verifier.rb +2 -0
  73. data/lib/phronomy/guardrail/base.rb +3 -0
  74. data/lib/phronomy/guardrail/prompt_injection_guardrail.rb +58 -0
  75. data/lib/phronomy/invocation_context.rb +152 -0
  76. data/lib/phronomy/knowledge_source/base.rb +24 -2
  77. data/lib/phronomy/knowledge_source/entity_knowledge.rb +7 -2
  78. data/lib/phronomy/knowledge_source/rag_knowledge.rb +8 -4
  79. data/lib/phronomy/knowledge_source/static_knowledge.rb +7 -2
  80. data/lib/phronomy/llm_adapter/base.rb +104 -0
  81. data/lib/phronomy/llm_adapter/ruby_llm.rb +41 -0
  82. data/lib/phronomy/llm_adapter.rb +20 -0
  83. data/lib/phronomy/loader/base.rb +1 -0
  84. data/lib/phronomy/loader/csv_loader.rb +2 -0
  85. data/lib/phronomy/loader/markdown_loader.rb +2 -0
  86. data/lib/phronomy/loader/plain_text_loader.rb +1 -0
  87. data/lib/phronomy/metrics.rb +38 -0
  88. data/lib/phronomy/output_parser/base.rb +1 -0
  89. data/lib/phronomy/output_parser/json_parser.rb +22 -3
  90. data/lib/phronomy/output_parser/structured_parser.rb +2 -0
  91. data/lib/phronomy/prompt_template.rb +5 -0
  92. data/lib/phronomy/runnable.rb +20 -3
  93. data/lib/phronomy/runtime/deterministic_scheduler.rb +412 -0
  94. data/lib/phronomy/runtime/fake_scheduler.rb +165 -0
  95. data/lib/phronomy/runtime/gate_registry.rb +52 -0
  96. data/lib/phronomy/runtime/pool_registry.rb +57 -0
  97. data/lib/phronomy/runtime/runtime_metrics.rb +117 -0
  98. data/lib/phronomy/runtime/scheduler.rb +98 -0
  99. data/lib/phronomy/runtime/scheduler_timer_adapter.rb +79 -0
  100. data/lib/phronomy/runtime/task_registry.rb +48 -0
  101. data/lib/phronomy/runtime/thread_scheduler.rb +30 -0
  102. data/lib/phronomy/runtime/timer_queue.rb +106 -0
  103. data/lib/phronomy/runtime/timer_service.rb +42 -0
  104. data/lib/phronomy/runtime.rb +374 -0
  105. data/lib/phronomy/splitter/base.rb +2 -0
  106. data/lib/phronomy/splitter/fixed_size_splitter.rb +2 -0
  107. data/lib/phronomy/splitter/recursive_splitter.rb +2 -0
  108. data/lib/phronomy/state_store/base.rb +48 -0
  109. data/lib/phronomy/state_store/in_memory.rb +62 -0
  110. data/lib/phronomy/task/backend.rb +80 -0
  111. data/lib/phronomy/task/fiber_backend.rb +157 -0
  112. data/lib/phronomy/task/immediate_backend.rb +89 -0
  113. data/lib/phronomy/task/thread_backend.rb +84 -0
  114. data/lib/phronomy/task.rb +275 -0
  115. data/lib/phronomy/task_group.rb +265 -0
  116. data/lib/phronomy/testing/fake_clock.rb +109 -0
  117. data/lib/phronomy/testing/fake_scheduler.rb +104 -0
  118. data/lib/phronomy/testing/scheduler_helpers.rb +59 -0
  119. data/lib/phronomy/testing.rb +12 -0
  120. data/lib/phronomy/tool/agent_tool.rb +1 -0
  121. data/lib/phronomy/tool/base.rb +298 -28
  122. data/lib/phronomy/tool/mcp_tool.rb +103 -17
  123. data/lib/phronomy/tool/scope_policy.rb +50 -0
  124. data/lib/phronomy/tool_executor.rb +106 -0
  125. data/lib/phronomy/tracing/base.rb +3 -0
  126. data/lib/phronomy/tracing/langfuse_tracer.rb +2 -0
  127. data/lib/phronomy/tracing/open_telemetry_tracer.rb +36 -0
  128. data/lib/phronomy/vector_store/async_backend.rb +110 -0
  129. data/lib/phronomy/vector_store/base.rb +40 -7
  130. data/lib/phronomy/vector_store/in_memory.rb +16 -7
  131. data/lib/phronomy/vector_store/pgvector.rb +40 -9
  132. data/lib/phronomy/vector_store/redis_search.rb +29 -8
  133. data/lib/phronomy/version.rb +1 -1
  134. data/lib/phronomy/workflow.rb +147 -11
  135. data/lib/phronomy/workflow_context.rb +83 -6
  136. data/lib/phronomy/workflow_runner.rb +106 -7
  137. data/lib/phronomy.rb +112 -1
  138. data/scripts/api_snapshot.rb +91 -0
  139. data/scripts/check_api_annotations.rb +68 -0
  140. data/scripts/check_private_enforcement.rb +93 -0
  141. data/scripts/check_readme_runnable.rb +98 -0
  142. data/scripts/run_mutation.sh +46 -0
  143. metadata +83 -2
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # check_private_enforcement.rb
5
+ #
6
+ # Verifies that every instance method annotated @api private in lib/ is
7
+ # actually non-public at the Ruby level (i.e., NOT in Module#public_instance_methods).
8
+ #
9
+ # Class methods (def self.xxx) are excluded from this check because their
10
+ # visibility is managed separately on the singleton class and rarely causes
11
+ # accidental public exposure to consumers.
12
+ #
13
+ # Usage (run from the phronomy/ repository root):
14
+ # bundle exec ruby scripts/check_private_enforcement.rb
15
+ #
16
+ # Exit codes:
17
+ # 0 — all @api private instance methods are non-public (or have no Ruby def)
18
+ # 1 — one or more @api private instance methods are exposed as public
19
+
20
+ require "bundler/setup"
21
+ require_relative "../lib/phronomy"
22
+
23
+ lib_dir = File.expand_path("../lib", __dir__)
24
+
25
+ unless File.directory?(lib_dir)
26
+ warn "ERROR: lib directory not found at #{lib_dir}"
27
+ exit 1
28
+ end
29
+
30
+ # Step 1: Collect instance methods annotated @api private via static analysis.
31
+ api_private_entries = []
32
+
33
+ Dir.glob(File.join(lib_dir, "**", "*.rb")).sort.each do |file|
34
+ lines = File.readlines(file)
35
+
36
+ lines.each_with_index do |line, i|
37
+ next unless line.match?(/^\s*#\s*@api\s+private\s*$/)
38
+
39
+ # Advance past any further comment or blank lines to reach the def.
40
+ j = i + 1
41
+ j += 1 while j < lines.size && lines[j].match?(/^\s*(#|$)/)
42
+ next unless j < lines.size
43
+
44
+ # Skip class-level methods — they live on the singleton class, not as
45
+ # public instance methods accessible to consumers.
46
+ next if lines[j].match?(/def\s+self\./)
47
+
48
+ # Match both plain def and "private def".
49
+ m = lines[j].match(/^\s*(?:private\s+)?def\s+(\w+[!?=]?)/)
50
+ next unless m
51
+
52
+ rel_path = file.sub("#{lib_dir}/../", "")
53
+ api_private_entries << {name: m[1].to_sym, file: rel_path, line: j + 1}
54
+ end
55
+ end
56
+
57
+ if api_private_entries.empty?
58
+ puts "No @api private instance methods found."
59
+ exit 0
60
+ end
61
+
62
+ # Step 2: Build a map of publicly exposed instance methods across all
63
+ # Phronomy-namespaced modules/classes (own methods only, no inheritance).
64
+ all_phronomy_modules = ObjectSpace.each_object(Module).select do |mod|
65
+ mod.name&.start_with?("Phronomy")
66
+ end
67
+
68
+ public_exposure_map = {}
69
+ all_phronomy_modules.each do |mod|
70
+ mod.public_instance_methods(false).each do |meth|
71
+ (public_exposure_map[meth] ||= []) << mod.name
72
+ end
73
+ end
74
+
75
+ # Step 3: Report violations — @api private methods that are still public.
76
+ errors = []
77
+
78
+ api_private_entries.each do |entry|
79
+ exposing_modules = public_exposure_map[entry[:name]]
80
+ next unless exposing_modules
81
+
82
+ errors << "#{entry[:file]}:#{entry[:line]} def #{entry[:name]}" \
83
+ " (annotated @api private but public in: #{exposing_modules.join(", ")})"
84
+ end
85
+
86
+ if errors.empty?
87
+ puts "OK: all #{api_private_entries.size} @api private instance methods are non-public."
88
+ exit 0
89
+ else
90
+ warn "ERROR: #{errors.size} @api private instance method(s) are exposed as public:"
91
+ errors.each { |e| warn " #{e}" }
92
+ exit 1
93
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ # scripts/check_readme_runnable.rb
4
+ #
5
+ # Extracts ```ruby runnable blocks from README.md and executes each in an
6
+ # isolated subprocess with a fake LLM stub to catch API drift.
7
+ #
8
+ # Any block that raises NoMethodError / ArgumentError / NameError causes a
9
+ # non-zero exit, failing the CI step.
10
+ #
11
+ # Usage (from the phronomy/ root):
12
+ # bundle exec ruby scripts/check_readme_runnable.rb
13
+
14
+ require "tempfile"
15
+ require "open3"
16
+
17
+ REPO_ROOT = File.expand_path("..", __dir__)
18
+ README_PATH = File.join(REPO_ROOT, "README.md")
19
+
20
+ # Injected before every runnable block.
21
+ # Uses the Gemfile of this project so subprocesses can load phronomy.
22
+ PREAMBLE = <<~RUBY
23
+ # frozen_string_literal: true
24
+ # --- CI preamble: stub LLM calls so no real network requests are made ---
25
+ ENV["BUNDLE_GEMFILE"] ||= "#{File.join(REPO_ROOT, "Gemfile")}"
26
+ require "bundler/setup"
27
+ require "phronomy"
28
+
29
+ # Patch invoke methods to return canned responses instead of calling the LLM.
30
+ module Phronomy
31
+ module Agent
32
+ class Base
33
+ def invoke(input = nil, **)
34
+ {output: "ci-stub-output", messages: []}
35
+ end
36
+ end
37
+
38
+ class Runner
39
+ def invoke(input = nil, **)
40
+ {output: "ci-stub-output", agent: nil, messages: []}
41
+ end
42
+ end
43
+ end
44
+
45
+ module Chain
46
+ class LLMChain
47
+ def invoke(vars = {})
48
+ "ci-stub-chain"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ # --- end CI preamble ---
54
+
55
+ RUBY
56
+
57
+ readme = File.read(README_PATH)
58
+
59
+ # Match opening fence with 'runnable' annotation: ```ruby runnable
60
+ blocks = readme.scan(/^```ruby runnable\n(.*?)^```/m).map.with_index(1) { |(code), i| [i, code] }
61
+
62
+ if blocks.empty?
63
+ puts "No 'ruby runnable' blocks found in README.md."
64
+ exit 0
65
+ end
66
+
67
+ puts "Checking #{blocks.size} runnable Ruby block(s) in README.md..."
68
+
69
+ failures = []
70
+
71
+ blocks.each do |index, code|
72
+ Tempfile.create(["readme_runnable_#{index}", ".rb"]) do |f|
73
+ f.write(PREAMBLE)
74
+ f.write(code)
75
+ f.flush
76
+
77
+ out, err, status = Open3.capture3(RbConfig.ruby, f.path)
78
+ combined = (out + err).gsub(f.path, "block ##{index}")
79
+
80
+ if status.success?
81
+ puts " OK block ##{index}"
82
+ else
83
+ failures << index
84
+ puts " FAIL block ##{index}"
85
+ # Print at most 15 lines of output to keep CI logs readable.
86
+ puts combined.lines.first(15).join
87
+ end
88
+ end
89
+ end
90
+
91
+ puts
92
+ if failures.empty?
93
+ puts "All #{blocks.size} runnable block(s) passed."
94
+ exit 0
95
+ else
96
+ puts "#{failures.size} block(s) failed: #{failures.join(", ")}"
97
+ exit 1
98
+ end
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env bash
2
+ # scripts/run_mutation.sh — Run mutation tests on core Phronomy domain classes.
3
+ #
4
+ # Usage:
5
+ # bash scripts/run_mutation.sh [SUBJECT_PATTERN]
6
+ #
7
+ # SUBJECT_PATTERN (optional): restrict to a specific subject, e.g. "Phronomy::WorkflowContext"
8
+ # When omitted, all subjects listed in .mutant.yml are tested.
9
+ #
10
+ # Requires mutant-rspec (in Gemfile development group):
11
+ # gem "mutant-rspec", "~> 0.15.1"
12
+ #
13
+ # Target: mutation score >= 80% for each listed subject.
14
+ # Baseline scores (as of initial run):
15
+ # Phronomy::WorkflowContext 84.85%
16
+ # Phronomy::Tool::Base 55.74%
17
+ #
18
+ # Note: mutation testing is slow (~1-5 min per subject). Run locally or via
19
+ # the nightly-mutation GitHub Actions workflow.
20
+
21
+ set -euo pipefail
22
+
23
+ cd "$(dirname "$0")/.."
24
+
25
+ if ! bundle exec mutant --version &>/dev/null; then
26
+ echo "ERROR: mutant is not available. Run: bundle install"
27
+ exit 1
28
+ fi
29
+
30
+ SUBJECT="${1:-}"
31
+
32
+ echo "=== Phronomy Mutation Test ==="
33
+ echo "Date: $(date -u +"%Y-%m-%dT%H:%M:%SZ")"
34
+ echo "Ruby: $(ruby --version)"
35
+ echo "Mutant: $(bundle exec mutant --version 2>&1 | grep -v warning | head -1)"
36
+ echo ""
37
+
38
+ if [[ -n "$SUBJECT" ]]; then
39
+ echo "Subject: $SUBJECT"
40
+ echo ""
41
+ bundle exec mutant run -- "$SUBJECT"
42
+ else
43
+ echo "Subjects: all (see .mutant.yml)"
44
+ echo ""
45
+ bundle exec mutant run
46
+ fi
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phronomy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Raizo T.C.S
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-05-21 00:00:00.000000000 Z
11
+ date: 2026-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby_llm
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '1.3'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: zeitwerk
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -31,6 +37,9 @@ dependencies:
31
37
  - - ">="
32
38
  - !ruby/object:Gem::Version
33
39
  version: '2.6'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '3'
34
43
  type: :runtime
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,6 +47,9 @@ dependencies:
38
47
  - - ">="
39
48
  - !ruby/object:Gem::Version
40
49
  version: '2.6'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3'
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: state_machines
43
55
  requirement: !ruby/object:Gem::Requirement
@@ -60,16 +72,40 @@ executables: []
60
72
  extensions: []
61
73
  extra_rdoc_files: []
62
74
  files:
75
+ - ".mutant.yml"
63
76
  - ".yardopts"
64
77
  - CHANGELOG.md
78
+ - CONTRIBUTING.md
65
79
  - README.md
80
+ - RELEASE_CHECKLIST.md
66
81
  - Rakefile
82
+ - SECURITY.md
83
+ - benchmark/baseline.json
84
+ - benchmark/bench_agent_invoke.rb
85
+ - benchmark/bench_context_assembler.rb
86
+ - benchmark/bench_regression.rb
87
+ - benchmark/bench_token_estimator.rb
88
+ - benchmark/bench_tool_schema.rb
89
+ - benchmark/bench_vector_store.rb
90
+ - benchmark/bench_workflow.rb
91
+ - benchmark/run_all.rb
92
+ - docs/decisions/001-rubyllm-as-provider-layer.md
93
+ - docs/decisions/002-workflow-context-immutability.md
94
+ - docs/decisions/003-event-loop-singleton.md
95
+ - docs/decisions/004-invoke-timeout-is-not-cancellation.md
96
+ - docs/decisions/005-static-knowledge-class-level-cache.md
97
+ - docs/decisions/006-no-built-in-guardrails.md
98
+ - docs/decisions/007-mcp-is-beta-stability.md
99
+ - docs/decisions/008-orchestrator-uses-os-threads.md
100
+ - docs/decisions/009-state-store-abstraction.md
101
+ - docs/decisions/010-cooperative-first-concurrency.md
67
102
  - lib/phronomy.rb
68
103
  - lib/phronomy/agent.rb
69
104
  - lib/phronomy/agent/base.rb
70
105
  - lib/phronomy/agent/before_completion_context.rb
71
106
  - lib/phronomy/agent/checkpoint.rb
72
107
  - lib/phronomy/agent/concerns/before_completion.rb
108
+ - lib/phronomy/agent/concerns/error_translation.rb
73
109
  - lib/phronomy/agent/concerns/guardrailable.rb
74
110
  - lib/phronomy/agent/concerns/retryable.rb
75
111
  - lib/phronomy/agent/concerns/suspendable.rb
@@ -82,6 +118,11 @@ files:
82
118
  - lib/phronomy/agent/shared_state.rb
83
119
  - lib/phronomy/agent/suspend_signal.rb
84
120
  - lib/phronomy/agent/team_coordinator.rb
121
+ - lib/phronomy/async_queue.rb
122
+ - lib/phronomy/blocking_adapter_pool.rb
123
+ - lib/phronomy/cancellation_scope.rb
124
+ - lib/phronomy/cancellation_token.rb
125
+ - lib/phronomy/concurrency_gate.rb
85
126
  - lib/phronomy/configuration.rb
86
127
  - lib/phronomy/context.rb
87
128
  - lib/phronomy/context/assembler.rb
@@ -91,6 +132,8 @@ files:
91
132
  - lib/phronomy/context/token_estimator.rb
92
133
  - lib/phronomy/context/trigger_context.rb
93
134
  - lib/phronomy/context/trim_context.rb
135
+ - lib/phronomy/deadline.rb
136
+ - lib/phronomy/diagnostics.rb
94
137
  - lib/phronomy/embeddings.rb
95
138
  - lib/phronomy/embeddings/base.rb
96
139
  - lib/phronomy/embeddings/ruby_llm_embeddings.rb
@@ -114,16 +157,22 @@ files:
114
157
  - lib/phronomy/guardrail/base.rb
115
158
  - lib/phronomy/guardrail/input_guardrail.rb
116
159
  - lib/phronomy/guardrail/output_guardrail.rb
160
+ - lib/phronomy/guardrail/prompt_injection_guardrail.rb
161
+ - lib/phronomy/invocation_context.rb
117
162
  - lib/phronomy/knowledge_source.rb
118
163
  - lib/phronomy/knowledge_source/base.rb
119
164
  - lib/phronomy/knowledge_source/entity_knowledge.rb
120
165
  - lib/phronomy/knowledge_source/rag_knowledge.rb
121
166
  - lib/phronomy/knowledge_source/static_knowledge.rb
167
+ - lib/phronomy/llm_adapter.rb
168
+ - lib/phronomy/llm_adapter/base.rb
169
+ - lib/phronomy/llm_adapter/ruby_llm.rb
122
170
  - lib/phronomy/loader.rb
123
171
  - lib/phronomy/loader/base.rb
124
172
  - lib/phronomy/loader/csv_loader.rb
125
173
  - lib/phronomy/loader/markdown_loader.rb
126
174
  - lib/phronomy/loader/plain_text_loader.rb
175
+ - lib/phronomy/metrics.rb
127
176
  - lib/phronomy/output_parser.rb
128
177
  - lib/phronomy/output_parser/base.rb
129
178
  - lib/phronomy/output_parser/json_parser.rb
@@ -131,21 +180,48 @@ files:
131
180
  - lib/phronomy/prompt_template.rb
132
181
  - lib/phronomy/ruby_llm_patches.rb
133
182
  - lib/phronomy/runnable.rb
183
+ - lib/phronomy/runtime.rb
184
+ - lib/phronomy/runtime/deterministic_scheduler.rb
185
+ - lib/phronomy/runtime/fake_scheduler.rb
186
+ - lib/phronomy/runtime/gate_registry.rb
187
+ - lib/phronomy/runtime/pool_registry.rb
188
+ - lib/phronomy/runtime/runtime_metrics.rb
189
+ - lib/phronomy/runtime/scheduler.rb
190
+ - lib/phronomy/runtime/scheduler_timer_adapter.rb
191
+ - lib/phronomy/runtime/task_registry.rb
192
+ - lib/phronomy/runtime/thread_scheduler.rb
193
+ - lib/phronomy/runtime/timer_queue.rb
194
+ - lib/phronomy/runtime/timer_service.rb
134
195
  - lib/phronomy/splitter.rb
135
196
  - lib/phronomy/splitter/base.rb
136
197
  - lib/phronomy/splitter/fixed_size_splitter.rb
137
198
  - lib/phronomy/splitter/recursive_splitter.rb
199
+ - lib/phronomy/state_store/base.rb
200
+ - lib/phronomy/state_store/in_memory.rb
201
+ - lib/phronomy/task.rb
202
+ - lib/phronomy/task/backend.rb
203
+ - lib/phronomy/task/fiber_backend.rb
204
+ - lib/phronomy/task/immediate_backend.rb
205
+ - lib/phronomy/task/thread_backend.rb
206
+ - lib/phronomy/task_group.rb
207
+ - lib/phronomy/testing.rb
208
+ - lib/phronomy/testing/fake_clock.rb
209
+ - lib/phronomy/testing/fake_scheduler.rb
210
+ - lib/phronomy/testing/scheduler_helpers.rb
138
211
  - lib/phronomy/token_usage.rb
139
212
  - lib/phronomy/tool.rb
140
213
  - lib/phronomy/tool/agent_tool.rb
141
214
  - lib/phronomy/tool/base.rb
142
215
  - lib/phronomy/tool/mcp_tool.rb
216
+ - lib/phronomy/tool/scope_policy.rb
217
+ - lib/phronomy/tool_executor.rb
143
218
  - lib/phronomy/tracing.rb
144
219
  - lib/phronomy/tracing/base.rb
145
220
  - lib/phronomy/tracing/langfuse_tracer.rb
146
221
  - lib/phronomy/tracing/null_tracer.rb
147
222
  - lib/phronomy/tracing/open_telemetry_tracer.rb
148
223
  - lib/phronomy/vector_store.rb
224
+ - lib/phronomy/vector_store/async_backend.rb
149
225
  - lib/phronomy/vector_store/base.rb
150
226
  - lib/phronomy/vector_store/in_memory.rb
151
227
  - lib/phronomy/vector_store/pgvector.rb
@@ -154,7 +230,12 @@ files:
154
230
  - lib/phronomy/workflow.rb
155
231
  - lib/phronomy/workflow_context.rb
156
232
  - lib/phronomy/workflow_runner.rb
233
+ - scripts/api_snapshot.rb
234
+ - scripts/check_api_annotations.rb
235
+ - scripts/check_private_enforcement.rb
157
236
  - scripts/check_readme_ruby.rb
237
+ - scripts/check_readme_runnable.rb
238
+ - scripts/run_mutation.sh
158
239
  - sig/phronomy.rbs
159
240
  homepage: https://github.com/Raizo-TCS/phronomy
160
241
  licenses: