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.
- checksums.yaml +4 -4
- data/.mutant.yml +22 -0
- data/CHANGELOG.md +488 -0
- data/CONTRIBUTING.md +102 -0
- data/README.md +374 -36
- data/RELEASE_CHECKLIST.md +86 -0
- data/Rakefile +33 -0
- data/SECURITY.md +80 -0
- data/benchmark/baseline.json +9 -0
- data/benchmark/bench_agent_invoke.rb +105 -0
- data/benchmark/bench_context_assembler.rb +46 -0
- data/benchmark/bench_regression.rb +172 -0
- data/benchmark/bench_token_estimator.rb +44 -0
- data/benchmark/bench_tool_schema.rb +69 -0
- data/benchmark/bench_vector_store.rb +39 -0
- data/benchmark/bench_workflow.rb +55 -0
- data/benchmark/run_all.rb +118 -0
- data/docs/decisions/001-rubyllm-as-provider-layer.md +42 -0
- data/docs/decisions/002-workflow-context-immutability.md +42 -0
- data/docs/decisions/003-event-loop-singleton.md +48 -0
- data/docs/decisions/004-invoke-timeout-is-not-cancellation.md +75 -0
- data/docs/decisions/005-static-knowledge-class-level-cache.md +45 -0
- data/docs/decisions/006-no-built-in-guardrails.md +66 -0
- data/docs/decisions/007-mcp-is-beta-stability.md +51 -0
- data/docs/decisions/008-orchestrator-uses-os-threads.md +52 -0
- data/docs/decisions/009-state-store-abstraction.md +141 -0
- data/docs/decisions/010-cooperative-first-concurrency.md +248 -0
- data/lib/phronomy/agent/base.rb +416 -49
- data/lib/phronomy/agent/before_completion_context.rb +1 -0
- data/lib/phronomy/agent/checkpoint.rb +1 -0
- data/lib/phronomy/agent/concerns/before_completion.rb +6 -0
- data/lib/phronomy/agent/concerns/error_translation.rb +45 -0
- data/lib/phronomy/agent/concerns/guardrailable.rb +3 -0
- data/lib/phronomy/agent/concerns/retryable.rb +12 -1
- data/lib/phronomy/agent/concerns/suspendable.rb +19 -0
- data/lib/phronomy/agent/fsm.rb +44 -52
- data/lib/phronomy/agent/handoff.rb +3 -0
- data/lib/phronomy/agent/orchestrator.rb +191 -54
- data/lib/phronomy/agent/parallel_tool_chat.rb +87 -13
- data/lib/phronomy/agent/react_agent.rb +16 -6
- data/lib/phronomy/agent/runner.rb +2 -0
- data/lib/phronomy/agent/shared_state.rb +11 -0
- data/lib/phronomy/agent/suspend_signal.rb +2 -0
- data/lib/phronomy/agent/team_coordinator.rb +17 -5
- data/lib/phronomy/async_queue.rb +155 -0
- data/lib/phronomy/blocking_adapter_pool.rb +435 -0
- data/lib/phronomy/cancellation_scope.rb +123 -0
- data/lib/phronomy/cancellation_token.rb +133 -0
- data/lib/phronomy/concurrency_gate.rb +155 -0
- data/lib/phronomy/configuration.rb +168 -2
- data/lib/phronomy/context/assembler.rb +6 -0
- data/lib/phronomy/context/compaction_context.rb +2 -0
- data/lib/phronomy/context/context_version_cache.rb +2 -0
- data/lib/phronomy/context/token_budget.rb +3 -0
- data/lib/phronomy/context/token_estimator.rb +9 -2
- data/lib/phronomy/context/trigger_context.rb +1 -0
- data/lib/phronomy/context/trim_context.rb +4 -0
- data/lib/phronomy/deadline.rb +63 -0
- data/lib/phronomy/diagnostics.rb +62 -0
- data/lib/phronomy/embeddings/base.rb +22 -2
- data/lib/phronomy/embeddings/ruby_llm_embeddings.rb +6 -2
- data/lib/phronomy/eval/comparison.rb +2 -0
- data/lib/phronomy/eval/dataset.rb +4 -0
- data/lib/phronomy/eval/metrics.rb +6 -0
- data/lib/phronomy/eval/runner.rb +11 -9
- data/lib/phronomy/eval/scorer/base.rb +1 -0
- data/lib/phronomy/eval/scorer/exact_match.rb +2 -0
- data/lib/phronomy/eval/scorer/includes_scorer.rb +2 -0
- data/lib/phronomy/eval/scorer/llm_judge.rb +2 -0
- data/lib/phronomy/event_loop.rb +275 -30
- data/lib/phronomy/fsm_session.rb +57 -4
- data/lib/phronomy/generator_verifier.rb +2 -0
- data/lib/phronomy/guardrail/base.rb +3 -0
- data/lib/phronomy/guardrail/prompt_injection_guardrail.rb +58 -0
- data/lib/phronomy/invocation_context.rb +152 -0
- data/lib/phronomy/knowledge_source/base.rb +24 -2
- data/lib/phronomy/knowledge_source/entity_knowledge.rb +7 -2
- data/lib/phronomy/knowledge_source/rag_knowledge.rb +8 -4
- data/lib/phronomy/knowledge_source/static_knowledge.rb +7 -2
- data/lib/phronomy/llm_adapter/base.rb +104 -0
- data/lib/phronomy/llm_adapter/ruby_llm.rb +41 -0
- data/lib/phronomy/llm_adapter.rb +20 -0
- data/lib/phronomy/loader/base.rb +1 -0
- data/lib/phronomy/loader/csv_loader.rb +2 -0
- data/lib/phronomy/loader/markdown_loader.rb +2 -0
- data/lib/phronomy/loader/plain_text_loader.rb +1 -0
- data/lib/phronomy/metrics.rb +38 -0
- data/lib/phronomy/output_parser/base.rb +1 -0
- data/lib/phronomy/output_parser/json_parser.rb +22 -3
- data/lib/phronomy/output_parser/structured_parser.rb +2 -0
- data/lib/phronomy/prompt_template.rb +5 -0
- data/lib/phronomy/runnable.rb +20 -3
- data/lib/phronomy/runtime/deterministic_scheduler.rb +412 -0
- data/lib/phronomy/runtime/fake_scheduler.rb +165 -0
- data/lib/phronomy/runtime/gate_registry.rb +52 -0
- data/lib/phronomy/runtime/pool_registry.rb +57 -0
- data/lib/phronomy/runtime/runtime_metrics.rb +117 -0
- data/lib/phronomy/runtime/scheduler.rb +98 -0
- data/lib/phronomy/runtime/scheduler_timer_adapter.rb +79 -0
- data/lib/phronomy/runtime/task_registry.rb +48 -0
- data/lib/phronomy/runtime/thread_scheduler.rb +30 -0
- data/lib/phronomy/runtime/timer_queue.rb +106 -0
- data/lib/phronomy/runtime/timer_service.rb +42 -0
- data/lib/phronomy/runtime.rb +374 -0
- data/lib/phronomy/splitter/base.rb +2 -0
- data/lib/phronomy/splitter/fixed_size_splitter.rb +2 -0
- data/lib/phronomy/splitter/recursive_splitter.rb +2 -0
- data/lib/phronomy/state_store/base.rb +48 -0
- data/lib/phronomy/state_store/in_memory.rb +62 -0
- data/lib/phronomy/task/backend.rb +80 -0
- data/lib/phronomy/task/fiber_backend.rb +157 -0
- data/lib/phronomy/task/immediate_backend.rb +89 -0
- data/lib/phronomy/task/thread_backend.rb +84 -0
- data/lib/phronomy/task.rb +275 -0
- data/lib/phronomy/task_group.rb +265 -0
- data/lib/phronomy/testing/fake_clock.rb +109 -0
- data/lib/phronomy/testing/fake_scheduler.rb +104 -0
- data/lib/phronomy/testing/scheduler_helpers.rb +59 -0
- data/lib/phronomy/testing.rb +12 -0
- data/lib/phronomy/tool/agent_tool.rb +1 -0
- data/lib/phronomy/tool/base.rb +298 -28
- data/lib/phronomy/tool/mcp_tool.rb +103 -17
- data/lib/phronomy/tool/scope_policy.rb +50 -0
- data/lib/phronomy/tool_executor.rb +106 -0
- data/lib/phronomy/tracing/base.rb +3 -0
- data/lib/phronomy/tracing/langfuse_tracer.rb +2 -0
- data/lib/phronomy/tracing/open_telemetry_tracer.rb +36 -0
- data/lib/phronomy/vector_store/async_backend.rb +110 -0
- data/lib/phronomy/vector_store/base.rb +40 -7
- data/lib/phronomy/vector_store/in_memory.rb +16 -7
- data/lib/phronomy/vector_store/pgvector.rb +40 -9
- data/lib/phronomy/vector_store/redis_search.rb +29 -8
- data/lib/phronomy/version.rb +1 -1
- data/lib/phronomy/workflow.rb +147 -11
- data/lib/phronomy/workflow_context.rb +83 -6
- data/lib/phronomy/workflow_runner.rb +106 -7
- data/lib/phronomy.rb +112 -1
- data/scripts/api_snapshot.rb +91 -0
- data/scripts/check_api_annotations.rb +68 -0
- data/scripts/check_private_enforcement.rb +93 -0
- data/scripts/check_readme_runnable.rb +98 -0
- data/scripts/run_mutation.sh +46 -0
- 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.
|
|
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-
|
|
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:
|