decision_agent 1.1.0 → 1.2.0
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/LICENSE.txt +0 -0
- data/README.md +3 -2
- data/lib/decision_agent/ab_testing/ab_test.rb +0 -0
- data/lib/decision_agent/ab_testing/ab_test_assignment.rb +0 -0
- data/lib/decision_agent/ab_testing/ab_test_manager.rb +0 -0
- data/lib/decision_agent/ab_testing/ab_testing_agent.rb +0 -0
- data/lib/decision_agent/ab_testing/storage/activerecord_adapter.rb +0 -3
- data/lib/decision_agent/ab_testing/storage/adapter.rb +0 -0
- data/lib/decision_agent/ab_testing/storage/memory_adapter.rb +0 -0
- data/lib/decision_agent/agent.rb +0 -0
- data/lib/decision_agent/audit/adapter.rb +0 -0
- data/lib/decision_agent/audit/logger_adapter.rb +0 -0
- data/lib/decision_agent/audit/null_adapter.rb +0 -0
- data/lib/decision_agent/auth/access_audit_logger.rb +0 -0
- data/lib/decision_agent/auth/authenticator.rb +0 -0
- data/lib/decision_agent/auth/password_reset_manager.rb +0 -0
- data/lib/decision_agent/auth/password_reset_token.rb +0 -0
- data/lib/decision_agent/auth/permission.rb +0 -0
- data/lib/decision_agent/auth/permission_checker.rb +0 -0
- data/lib/decision_agent/auth/rbac_adapter.rb +0 -0
- data/lib/decision_agent/auth/rbac_config.rb +0 -0
- data/lib/decision_agent/auth/role.rb +0 -0
- data/lib/decision_agent/auth/session.rb +0 -0
- data/lib/decision_agent/auth/session_manager.rb +0 -0
- data/lib/decision_agent/auth/user.rb +0 -0
- data/lib/decision_agent/context.rb +0 -0
- data/lib/decision_agent/decision.rb +0 -0
- data/lib/decision_agent/dmn/adapter.rb +0 -0
- data/lib/decision_agent/dmn/cache.rb +0 -0
- data/lib/decision_agent/dmn/decision_graph.rb +0 -0
- data/lib/decision_agent/dmn/decision_tree.rb +0 -0
- data/lib/decision_agent/dmn/errors.rb +0 -0
- data/lib/decision_agent/dmn/exporter.rb +41 -2
- data/lib/decision_agent/dmn/feel/evaluator.rb +0 -4
- data/lib/decision_agent/dmn/feel/functions.rb +0 -0
- data/lib/decision_agent/dmn/feel/parser.rb +0 -0
- data/lib/decision_agent/dmn/feel/simple_parser.rb +0 -0
- data/lib/decision_agent/dmn/feel/transformer.rb +0 -0
- data/lib/decision_agent/dmn/feel/types.rb +0 -0
- data/lib/decision_agent/dmn/importer.rb +0 -0
- data/lib/decision_agent/dmn/model.rb +0 -0
- data/lib/decision_agent/dmn/parser.rb +0 -0
- data/lib/decision_agent/dmn/testing.rb +0 -4
- data/lib/decision_agent/dmn/validator.rb +3 -7
- data/lib/decision_agent/dmn/versioning.rb +41 -15
- data/lib/decision_agent/dmn/visualizer.rb +0 -0
- data/lib/decision_agent/dsl/condition_evaluator.rb +0 -0
- data/lib/decision_agent/dsl/helpers/cache_helpers.rb +0 -0
- data/lib/decision_agent/dsl/helpers/comparison_helpers.rb +0 -0
- data/lib/decision_agent/dsl/helpers/date_helpers.rb +0 -0
- data/lib/decision_agent/dsl/helpers/geospatial_helpers.rb +0 -0
- data/lib/decision_agent/dsl/helpers/operator_evaluation_helpers.rb +0 -0
- data/lib/decision_agent/dsl/helpers/parameter_parsing_helpers.rb +0 -0
- data/lib/decision_agent/dsl/helpers/template_helpers.rb +0 -0
- data/lib/decision_agent/dsl/helpers/utility_helpers.rb +0 -0
- data/lib/decision_agent/dsl/operators/base.rb +2 -2
- data/lib/decision_agent/dsl/operators/basic_comparison_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/collection_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/date_arithmetic_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/date_time_operators.rb +1 -1
- data/lib/decision_agent/dsl/operators/duration_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/financial_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/geospatial_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/mathematical_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/moving_window_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/numeric_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/rate_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/statistical_aggregations.rb +0 -0
- data/lib/decision_agent/dsl/operators/string_aggregations.rb +0 -0
- data/lib/decision_agent/dsl/operators/string_operators.rb +0 -0
- data/lib/decision_agent/dsl/operators/time_component_operators.rb +0 -0
- data/lib/decision_agent/dsl/rule_parser.rb +0 -0
- data/lib/decision_agent/dsl/schema_validator.rb +0 -0
- data/lib/decision_agent/errors.rb +0 -0
- data/lib/decision_agent/evaluation.rb +0 -0
- data/lib/decision_agent/evaluation_validator.rb +0 -0
- data/lib/decision_agent/evaluators/base.rb +0 -0
- data/lib/decision_agent/evaluators/dmn_evaluator.rb +0 -0
- data/lib/decision_agent/evaluators/json_rule_evaluator.rb +26 -24
- data/lib/decision_agent/evaluators/static_evaluator.rb +0 -0
- data/lib/decision_agent/explainability/condition_trace.rb +0 -0
- data/lib/decision_agent/explainability/explainability_result.rb +0 -0
- data/lib/decision_agent/explainability/rule_trace.rb +0 -0
- data/lib/decision_agent/explainability/trace_collector.rb +0 -0
- data/lib/decision_agent/monitoring/alert_manager.rb +0 -0
- data/lib/decision_agent/monitoring/dashboard/public/dashboard.css +0 -0
- data/lib/decision_agent/monitoring/dashboard/public/dashboard.js +0 -0
- data/lib/decision_agent/monitoring/dashboard/public/index.html +0 -0
- data/lib/decision_agent/monitoring/dashboard_server.rb +0 -0
- data/lib/decision_agent/monitoring/metrics_collector.rb +0 -0
- data/lib/decision_agent/monitoring/monitored_agent.rb +0 -0
- data/lib/decision_agent/monitoring/prometheus_exporter.rb +0 -0
- data/lib/decision_agent/monitoring/storage/activerecord_adapter.rb +0 -0
- data/lib/decision_agent/monitoring/storage/base_adapter.rb +0 -0
- data/lib/decision_agent/monitoring/storage/memory_adapter.rb +1 -1
- data/lib/decision_agent/replay/replay.rb +0 -0
- data/lib/decision_agent/scoring/base.rb +0 -0
- data/lib/decision_agent/scoring/consensus.rb +0 -0
- data/lib/decision_agent/scoring/max_weight.rb +0 -0
- data/lib/decision_agent/scoring/threshold.rb +0 -0
- data/lib/decision_agent/scoring/weighted_average.rb +0 -0
- data/lib/decision_agent/simulation/errors.rb +0 -0
- data/lib/decision_agent/simulation/impact_analyzer.rb +0 -2
- data/lib/decision_agent/simulation/monte_carlo_simulator.rb +0 -2
- data/lib/decision_agent/simulation/replay_engine.rb +0 -2
- data/lib/decision_agent/simulation/scenario_engine.rb +0 -0
- data/lib/decision_agent/simulation/scenario_library.rb +0 -0
- data/lib/decision_agent/simulation/shadow_test_engine.rb +0 -0
- data/lib/decision_agent/simulation/what_if_analyzer.rb +0 -2
- data/lib/decision_agent/simulation.rb +0 -0
- data/lib/decision_agent/testing/batch_test_importer.rb +0 -4
- data/lib/decision_agent/testing/batch_test_runner.rb +0 -2
- data/lib/decision_agent/testing/test_coverage_analyzer.rb +0 -0
- data/lib/decision_agent/testing/test_result_comparator.rb +54 -63
- data/lib/decision_agent/testing/test_scenario.rb +0 -0
- data/lib/decision_agent/version.rb +1 -1
- data/lib/decision_agent/versioning/activerecord_adapter.rb +64 -2
- data/lib/decision_agent/versioning/adapter.rb +33 -0
- data/lib/decision_agent/versioning/file_storage_adapter.rb +77 -7
- data/lib/decision_agent/versioning/version_manager.rb +40 -2
- data/lib/decision_agent/web/dmn_editor/serialization.rb +0 -0
- data/lib/decision_agent/web/dmn_editor/xml_builder.rb +0 -0
- data/lib/decision_agent/web/dmn_editor.rb +0 -6
- data/lib/decision_agent/web/middleware/auth_middleware.rb +0 -0
- data/lib/decision_agent/web/middleware/permission_middleware.rb +0 -0
- data/lib/decision_agent/web/public/app.js +0 -0
- data/lib/decision_agent/web/public/batch_testing.html +0 -0
- data/lib/decision_agent/web/public/dmn-editor.css +0 -0
- data/lib/decision_agent/web/public/dmn-editor.html +0 -0
- data/lib/decision_agent/web/public/dmn-editor.js +5 -0
- data/lib/decision_agent/web/public/index.html +0 -0
- data/lib/decision_agent/web/public/login.html +0 -0
- data/lib/decision_agent/web/public/sample_batch.csv +0 -0
- data/lib/decision_agent/web/public/sample_impact.csv +0 -0
- data/lib/decision_agent/web/public/sample_replay.csv +0 -0
- data/lib/decision_agent/web/public/sample_rules.json +0 -0
- data/lib/decision_agent/web/public/sample_shadow.csv +0 -0
- data/lib/decision_agent/web/public/sample_whatif.csv +0 -0
- data/lib/decision_agent/web/public/simulation.html +0 -0
- data/lib/decision_agent/web/public/simulation_impact.html +0 -0
- data/lib/decision_agent/web/public/simulation_replay.html +0 -0
- data/lib/decision_agent/web/public/simulation_shadow.html +0 -0
- data/lib/decision_agent/web/public/simulation_whatif.html +0 -0
- data/lib/decision_agent/web/public/styles.css +0 -0
- data/lib/decision_agent/web/public/users.html +0 -0
- data/lib/decision_agent/web/rack_helpers.rb +0 -0
- data/lib/decision_agent/web/rack_request_helpers.rb +0 -0
- data/lib/decision_agent/web/server.rb +8 -2
- data/lib/decision_agent.rb +0 -0
- data/lib/generators/decision_agent/install/install_generator.rb +0 -0
- data/lib/generators/decision_agent/install/templates/README +0 -0
- data/lib/generators/decision_agent/install/templates/ab_test_assignment_model.rb +0 -0
- data/lib/generators/decision_agent/install/templates/ab_test_model.rb +0 -0
- data/lib/generators/decision_agent/install/templates/ab_testing_migration.rb +0 -0
- data/lib/generators/decision_agent/install/templates/ab_testing_tasks.rake +0 -0
- data/lib/generators/decision_agent/install/templates/decision_agent_tasks.rake +0 -0
- data/lib/generators/decision_agent/install/templates/decision_log.rb +0 -0
- data/lib/generators/decision_agent/install/templates/error_metric.rb +0 -0
- data/lib/generators/decision_agent/install/templates/evaluation_metric.rb +0 -0
- data/lib/generators/decision_agent/install/templates/migration.rb +14 -0
- data/lib/generators/decision_agent/install/templates/monitoring_migration.rb +0 -2
- data/lib/generators/decision_agent/install/templates/performance_metric.rb +0 -0
- data/lib/generators/decision_agent/install/templates/rule.rb +0 -0
- data/lib/generators/decision_agent/install/templates/rule_version.rb +0 -0
- data/lib/generators/decision_agent/install/templates/rule_version_tag.rb +23 -0
- data/lib/generators/decision_agent/install/templates/versioning_migration.rb +44 -0
- data/lib/generators/decision_agent/monitoring_migration/monitoring_migration_generator.rb +67 -0
- data/lib/generators/decision_agent/versioning_migration/versioning_migration_generator.rb +57 -0
- metadata +10 -3
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -216,6 +216,11 @@ function renderModelEditor() {
|
|
|
216
216
|
async function addDecision(e) {
|
|
217
217
|
e.preventDefault();
|
|
218
218
|
|
|
219
|
+
if (!state.currentModel) {
|
|
220
|
+
showNotification('Please select or create a model first', 'error');
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
219
224
|
const decisionId = document.getElementById('decision-id-input').value;
|
|
220
225
|
const name = document.getElementById('decision-name-input').value;
|
|
221
226
|
const type = document.getElementById('decision-type-select').value;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -46,7 +46,6 @@ require_relative "../versioning/version_manager"
|
|
|
46
46
|
|
|
47
47
|
module DecisionAgent
|
|
48
48
|
module Web
|
|
49
|
-
# rubocop:disable Metrics/ClassLength
|
|
50
49
|
# Framework-agnostic Rack application - works with any Rack-compatible server
|
|
51
50
|
class Server
|
|
52
51
|
include RackHelpers
|
|
@@ -1210,6 +1209,14 @@ module DecisionAgent
|
|
|
1210
1209
|
filename = file_param[:filename] || file_param["filename"] || "uploaded_file"
|
|
1211
1210
|
file_extension = File.extname(filename).downcase
|
|
1212
1211
|
|
|
1212
|
+
# Validate file type before processing
|
|
1213
|
+
allowed_extensions = %w[.csv .xlsx .xls]
|
|
1214
|
+
unless allowed_extensions.include?(file_extension)
|
|
1215
|
+
ctx.status(422)
|
|
1216
|
+
ctx.json({ error: "Unsupported file type '#{file_extension}'. Allowed types: .csv, .xlsx, .xls" })
|
|
1217
|
+
next
|
|
1218
|
+
end
|
|
1219
|
+
|
|
1213
1220
|
# Create temporary file
|
|
1214
1221
|
temp_file = Tempfile.new(["batch_test", file_extension])
|
|
1215
1222
|
temp_file.binmode
|
|
@@ -2493,6 +2500,5 @@ module DecisionAgent
|
|
|
2493
2500
|
)
|
|
2494
2501
|
end
|
|
2495
2502
|
end
|
|
2496
|
-
# rubocop:enable Metrics/ClassLength
|
|
2497
2503
|
end
|
|
2498
2504
|
end
|
data/lib/decision_agent.rb
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -35,5 +35,19 @@ class CreateDecisionAgentTables < ActiveRecord::Migration[7.0]
|
|
|
35
35
|
# unique: true,
|
|
36
36
|
# where: "status = 'active'",
|
|
37
37
|
# name: 'index_rule_versions_one_active_per_rule'
|
|
38
|
+
|
|
39
|
+
# Version tags table — named pointers to specific versions (unique per model + name)
|
|
40
|
+
# NOTE: version_id is intentionally NOT a foreign key so tags survive version deletion
|
|
41
|
+
create_table :rule_version_tags do |t|
|
|
42
|
+
t.string :model_id, null: false
|
|
43
|
+
t.string :name, null: false
|
|
44
|
+
t.bigint :version_id, null: false
|
|
45
|
+
t.timestamps
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# ✅ CRITICAL: Unique constraint — one tag name per model
|
|
49
|
+
add_index :rule_version_tags, %i[model_id name], unique: true
|
|
50
|
+
# Index for efficient tag listing per model
|
|
51
|
+
add_index :rule_version_tags, :model_id
|
|
38
52
|
end
|
|
39
53
|
end
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class CreateDecisionAgentMonitoringTables < ActiveRecord::Migration[7.0]
|
|
4
|
-
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
5
4
|
def change
|
|
6
5
|
# Decision logs table
|
|
7
6
|
create_table :decision_logs do |t|
|
|
@@ -105,5 +104,4 @@ class CreateDecisionAgentMonitoringTables < ActiveRecord::Migration[7.0]
|
|
|
105
104
|
# PARTITION BY RANGE (created_at);
|
|
106
105
|
# SQL
|
|
107
106
|
end
|
|
108
|
-
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
109
107
|
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Stores named tags that point to a specific RuleVersion.
|
|
4
|
+
# A tag is a mutable pointer (re-pointing updates the existing row) but
|
|
5
|
+
# the content of the target version is immutable.
|
|
6
|
+
#
|
|
7
|
+
# version_id is stored as a plain integer without a foreign-key constraint
|
|
8
|
+
# so that tags survive the deletion of the version they originally pointed to.
|
|
9
|
+
class RuleVersionTag < ApplicationRecord
|
|
10
|
+
validates :model_id, presence: true
|
|
11
|
+
validates :name, presence: true
|
|
12
|
+
validates :version_id, presence: true
|
|
13
|
+
validates :name, uniqueness: { scope: :model_id, message: "already exists for this model" }
|
|
14
|
+
|
|
15
|
+
scope :for_model, ->(model_id) { where(model_id: model_id) }
|
|
16
|
+
scope :sorted_by_name, -> { order(name: :asc) }
|
|
17
|
+
|
|
18
|
+
# Resolve the version this tag currently points to.
|
|
19
|
+
# Returns nil if the version has been deleted.
|
|
20
|
+
def version
|
|
21
|
+
RuleVersion.find_by(id: version_id)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class CreateDecisionAgentVersioningTables < ActiveRecord::Migration[7.0]
|
|
4
|
+
def change
|
|
5
|
+
# Rule versions table — stores the full content of each version as JSON
|
|
6
|
+
create_table :rule_versions do |t|
|
|
7
|
+
t.string :rule_id, null: false, index: true
|
|
8
|
+
t.integer :version_number, null: false
|
|
9
|
+
t.text :content, null: false # JSON rule definition
|
|
10
|
+
t.string :created_by, null: false, default: "system"
|
|
11
|
+
t.text :changelog
|
|
12
|
+
t.string :status, null: false, default: "draft" # draft, active, archived
|
|
13
|
+
t.timestamps
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# ✅ CRITICAL: Unique constraint prevents duplicate version numbers per rule.
|
|
17
|
+
# This protects against race conditions in concurrent version creation.
|
|
18
|
+
add_index :rule_versions, %i[rule_id version_number], unique: true
|
|
19
|
+
|
|
20
|
+
# Index for efficient queries by rule_id and status
|
|
21
|
+
add_index :rule_versions, %i[rule_id status]
|
|
22
|
+
|
|
23
|
+
# Optional: Partial unique index for PostgreSQL to enforce one active version per rule
|
|
24
|
+
# Uncomment if using PostgreSQL:
|
|
25
|
+
# add_index :rule_versions, [:rule_id, :status],
|
|
26
|
+
# unique: true,
|
|
27
|
+
# where: "status = 'active'",
|
|
28
|
+
# name: 'index_rule_versions_one_active_per_rule'
|
|
29
|
+
|
|
30
|
+
# Version tags table — named pointers to specific versions (unique per model + name).
|
|
31
|
+
# version_id is intentionally NOT a foreign key so tags survive version deletion.
|
|
32
|
+
create_table :rule_version_tags do |t|
|
|
33
|
+
t.string :model_id, null: false
|
|
34
|
+
t.string :name, null: false
|
|
35
|
+
t.bigint :version_id, null: false
|
|
36
|
+
t.timestamps
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# ✅ CRITICAL: Unique constraint — one tag name per model
|
|
40
|
+
add_index :rule_version_tags, %i[model_id name], unique: true
|
|
41
|
+
# Index for efficient tag listing per model
|
|
42
|
+
add_index :rule_version_tags, :model_id
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/migration"
|
|
5
|
+
|
|
6
|
+
module DecisionAgent
|
|
7
|
+
module Generators
|
|
8
|
+
# Standalone generator that installs only the monitoring tables and models.
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
# rails generate decision_agent:monitoring_migration
|
|
12
|
+
#
|
|
13
|
+
# This is a focused alternative to the full install generator's --monitoring
|
|
14
|
+
# flag. It generates:
|
|
15
|
+
# - db/migrate/create_decision_agent_monitoring_tables.rb
|
|
16
|
+
# - app/models/decision_log.rb
|
|
17
|
+
# - app/models/evaluation_metric.rb
|
|
18
|
+
# - app/models/performance_metric.rb
|
|
19
|
+
# - app/models/error_metric.rb
|
|
20
|
+
# - lib/tasks/decision_agent.rake
|
|
21
|
+
class MonitoringMigrationGenerator < Rails::Generators::Base
|
|
22
|
+
include Rails::Generators::Migration
|
|
23
|
+
|
|
24
|
+
source_root File.expand_path("../../install/templates", __dir__)
|
|
25
|
+
|
|
26
|
+
desc "Generates the DecisionAgent monitoring migration and ActiveRecord models"
|
|
27
|
+
|
|
28
|
+
def self.next_migration_number(dirname)
|
|
29
|
+
next_migration_number = current_migration_number(dirname) + 1
|
|
30
|
+
ActiveRecord::Migration.next_migration_number(next_migration_number)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def copy_migration
|
|
34
|
+
migration_template "monitoring_migration.rb",
|
|
35
|
+
"db/migrate/create_decision_agent_monitoring_tables.rb",
|
|
36
|
+
migration_version: migration_version
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def copy_models
|
|
40
|
+
copy_file "decision_log.rb", "app/models/decision_log.rb"
|
|
41
|
+
copy_file "evaluation_metric.rb", "app/models/evaluation_metric.rb"
|
|
42
|
+
copy_file "performance_metric.rb", "app/models/performance_metric.rb"
|
|
43
|
+
copy_file "error_metric.rb", "app/models/error_metric.rb"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def copy_rake_tasks
|
|
47
|
+
copy_file "decision_agent_tasks.rake", "lib/tasks/decision_agent.rake"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def show_readme
|
|
51
|
+
say "\n"
|
|
52
|
+
say "DecisionAgent monitoring tables generated successfully!", :green
|
|
53
|
+
say "\nNext steps:"
|
|
54
|
+
say " 1. Run migrations: rails db:migrate"
|
|
55
|
+
say " 2. Verify models: DecisionLog, EvaluationMetric, PerformanceMetric, ErrorMetric"
|
|
56
|
+
say " 3. Use the adapter: DecisionAgent::Monitoring::Storage::ActiveRecordAdapter.new"
|
|
57
|
+
say "\nSee docs/PERSISTENT_MONITORING.md for configuration and query examples."
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def migration_version
|
|
63
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "rails/generators/migration"
|
|
5
|
+
|
|
6
|
+
module DecisionAgent
|
|
7
|
+
module Generators
|
|
8
|
+
# Standalone generator that installs only the versioning tables and models.
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
# rails generate decision_agent:versioning_migration
|
|
12
|
+
#
|
|
13
|
+
# This is a focused alternative to the full install generator. It generates:
|
|
14
|
+
# - db/migrate/create_decision_agent_versioning_tables.rb
|
|
15
|
+
# - app/models/rule_version.rb
|
|
16
|
+
# - app/models/rule_version_tag.rb
|
|
17
|
+
class VersioningMigrationGenerator < Rails::Generators::Base
|
|
18
|
+
include Rails::Generators::Migration
|
|
19
|
+
|
|
20
|
+
source_root File.expand_path("../../install/templates", __dir__)
|
|
21
|
+
|
|
22
|
+
desc "Generates the DecisionAgent versioning migration and ActiveRecord models"
|
|
23
|
+
|
|
24
|
+
def self.next_migration_number(dirname)
|
|
25
|
+
next_migration_number = current_migration_number(dirname) + 1
|
|
26
|
+
ActiveRecord::Migration.next_migration_number(next_migration_number)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def copy_migration
|
|
30
|
+
migration_template "versioning_migration.rb",
|
|
31
|
+
"db/migrate/create_decision_agent_versioning_tables.rb",
|
|
32
|
+
migration_version: migration_version
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def copy_models
|
|
36
|
+
copy_file "rule_version.rb", "app/models/rule_version.rb"
|
|
37
|
+
copy_file "rule_version_tag.rb", "app/models/rule_version_tag.rb"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def show_readme
|
|
41
|
+
say "\n"
|
|
42
|
+
say "DecisionAgent versioning tables generated successfully!", :green
|
|
43
|
+
say "\nNext steps:"
|
|
44
|
+
say " 1. Run migrations: rails db:migrate"
|
|
45
|
+
say " 2. Verify models: RuleVersion, RuleVersionTag"
|
|
46
|
+
say " 3. Use the adapter: DecisionAgent::Versioning::ActiveRecordAdapter.new"
|
|
47
|
+
say "\nSee docs/VERSIONING.md for configuration and usage examples."
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def migration_version
|
|
53
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
metadata
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: decision_agent
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sam Aswin
|
|
8
|
+
autorequire:
|
|
8
9
|
bindir: bin
|
|
9
10
|
cert_chain: []
|
|
10
|
-
date:
|
|
11
|
+
date: 2026-04-10 00:00:00.000000000 Z
|
|
11
12
|
dependencies:
|
|
12
13
|
- !ruby/object:Gem::Dependency
|
|
13
14
|
name: bcrypt
|
|
@@ -372,6 +373,10 @@ files:
|
|
|
372
373
|
- lib/generators/decision_agent/install/templates/performance_metric.rb
|
|
373
374
|
- lib/generators/decision_agent/install/templates/rule.rb
|
|
374
375
|
- lib/generators/decision_agent/install/templates/rule_version.rb
|
|
376
|
+
- lib/generators/decision_agent/install/templates/rule_version_tag.rb
|
|
377
|
+
- lib/generators/decision_agent/install/templates/versioning_migration.rb
|
|
378
|
+
- lib/generators/decision_agent/monitoring_migration/monitoring_migration_generator.rb
|
|
379
|
+
- lib/generators/decision_agent/versioning_migration/versioning_migration_generator.rb
|
|
375
380
|
homepage: https://github.com/samaswin/decision_agent
|
|
376
381
|
licenses:
|
|
377
382
|
- MIT
|
|
@@ -381,6 +386,7 @@ metadata:
|
|
|
381
386
|
changelog_uri: https://github.com/samaswin/decision_agent/blob/main/docs/CHANGELOG.md
|
|
382
387
|
github_repo: https://github.com/samaswin/decision_agent
|
|
383
388
|
rubygems_mfa_required: 'true'
|
|
389
|
+
post_install_message:
|
|
384
390
|
rdoc_options: []
|
|
385
391
|
require_paths:
|
|
386
392
|
- lib
|
|
@@ -395,7 +401,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
395
401
|
- !ruby/object:Gem::Version
|
|
396
402
|
version: '0'
|
|
397
403
|
requirements: []
|
|
398
|
-
rubygems_version:
|
|
404
|
+
rubygems_version: 3.5.16
|
|
405
|
+
signing_key:
|
|
399
406
|
specification_version: 4
|
|
400
407
|
summary: Deterministic, explainable, auditable decision engine for Ruby
|
|
401
408
|
test_files: []
|