ace-sim 0.13.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.
data/lib/ace/sim.rb ADDED
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "yaml"
4
+ require "date"
5
+ require "ace/support/config"
6
+ require "ace/core"
7
+ require "ace/b36ts"
8
+
9
+ require_relative "sim/version"
10
+ require_relative "sim/models/simulation_session"
11
+ require_relative "sim/molecules/source_bundler"
12
+ require_relative "sim/molecules/stage_executor"
13
+ require_relative "sim/molecules/final_synthesis_executor"
14
+ require_relative "sim/molecules/session_store"
15
+ require_relative "sim/molecules/synthesis_builder"
16
+ require_relative "sim/organisms/simulation_runner"
17
+ require_relative "sim/cli"
18
+
19
+ module Ace
20
+ module Sim
21
+ class Error < StandardError; end
22
+ class ValidationError < Error; end
23
+
24
+ module_function
25
+
26
+ def normalize_list(raw)
27
+ Array(raw).flatten.compact.map(&:to_s).map(&:strip).reject(&:empty?)
28
+ end
29
+
30
+ def config
31
+ @config ||= begin
32
+ defaults = load_defaults
33
+ user_config = config_resolver.resolve_namespace("sim").to_h
34
+ Ace::Support::Config::Models::Config.wrap(defaults, user_config, source: "sim")
35
+ end
36
+ end
37
+
38
+ def get(*keys)
39
+ config.dig(*keys)
40
+ end
41
+
42
+ def reset_config!
43
+ @config = nil
44
+ @config_resolver = nil
45
+ @preset_names = nil
46
+ end
47
+
48
+ def preset_names
49
+ @preset_names ||= begin
50
+ dirs = [
51
+ File.join(gem_root, ".ace-defaults", "sim", "presets"),
52
+ File.join(Dir.home, ".ace", "sim", "presets"),
53
+ File.join(Dir.pwd, ".ace", "sim", "presets")
54
+ ]
55
+
56
+ dirs.filter_map do |dir|
57
+ next unless Dir.exist?(dir)
58
+
59
+ files = Dir.glob(File.join(dir, "*.yml")) + Dir.glob(File.join(dir, "*.yaml"))
60
+ files.map { |path| File.basename(path, ".*") }
61
+ end.flatten.uniq.sort
62
+ end
63
+ end
64
+
65
+ def load_preset(name)
66
+ preset_name = name.to_s.strip
67
+ return nil if preset_name.empty?
68
+
69
+ data = config_resolver.resolve_file([
70
+ "sim/presets/#{preset_name}.yml",
71
+ "sim/presets/#{preset_name}.yaml"
72
+ ]).data
73
+
74
+ preset = if data.nil? || data.empty?
75
+ return nil unless preset_names.include?(preset_name)
76
+
77
+ {"steps" => normalize_list(get("sim", "default_steps"))}
78
+ else
79
+ data["preset"] || data
80
+ end
81
+
82
+ steps = normalize_list(preset["steps"])
83
+ raise ValidationError, "Preset '#{preset_name}' has no steps" if steps.empty?
84
+
85
+ normalized = preset.to_h.each_with_object({}) { |(k, v), acc| acc[k.to_s] = v }
86
+ normalized["name"] = preset_name
87
+ normalized["steps"] = steps
88
+ normalized
89
+ end
90
+
91
+ def step_bundle_path(step)
92
+ step_name = step.to_s.strip
93
+ return nil if step_name.empty?
94
+
95
+ candidates = [
96
+ File.join(Dir.pwd, ".ace", "sim", "steps", "#{step_name}.md"),
97
+ File.join(Dir.home, ".ace", "sim", "steps", "#{step_name}.md"),
98
+ File.join(gem_root, ".ace-defaults", "sim", "steps", "#{step_name}.md")
99
+ ]
100
+
101
+ candidates.find { |path| File.exist?(path) }
102
+ end
103
+
104
+ def default_preset_name
105
+ get("sim", "default_preset") || "validate-idea"
106
+ end
107
+
108
+ def next_run_id
109
+ Ace::B36ts.now
110
+ rescue
111
+ timestamp = Time.now.utc.to_i.to_s(36)
112
+ entropy = rand(36**2).to_s(36).rjust(2, "0")
113
+ "#{timestamp}#{entropy}"
114
+ end
115
+
116
+ def config_resolver
117
+ @config_resolver ||= Ace::Support::Config.create(gem_path: gem_root)
118
+ end
119
+
120
+ def gem_root
121
+ Gem.loaded_specs["ace-sim"]&.gem_dir || File.expand_path("../..", __dir__)
122
+ end
123
+
124
+ def load_defaults
125
+ defaults_path = File.join(gem_root, ".ace-defaults", "sim", "config.yml")
126
+ raise "Default config not found: #{defaults_path}" unless File.exist?(defaults_path)
127
+
128
+ YAML.safe_load_file(defaults_path, permitted_classes: [Date], aliases: true) || {}
129
+ end
130
+ private_class_method :load_defaults
131
+ end
132
+ end
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ace-sim
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.13.0
5
+ platform: ruby
6
+ authors:
7
+ - Michal Czyz
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ace-support-config
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.8'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.8'
26
+ - !ruby/object:Gem::Dependency
27
+ name: ace-support-core
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.25'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.25'
40
+ - !ruby/object:Gem::Dependency
41
+ name: ace-b36ts
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.6'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.6'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ace-support-cli
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.3'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.3'
68
+ - !ruby/object:Gem::Dependency
69
+ name: ace-support-test-helpers
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.12'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.12'
82
+ - !ruby/object:Gem::Dependency
83
+ name: minitest
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '5.19'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '5.19'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rake
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '13.0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '13.0'
110
+ description: ace-sim executes preset-driven simulation chains across multiple providers
111
+ so teams can validate ideas, review tasks, and compare synthesis outcomes before
112
+ taking action.
113
+ email:
114
+ - mc@cs3b.com
115
+ executables:
116
+ - ace-sim
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".ace-defaults/nav/protocols/wfi-sources/ace-sim.yml"
121
+ - ".ace-defaults/sim/config.yml"
122
+ - ".ace-defaults/sim/presets/validate-idea.yml"
123
+ - ".ace-defaults/sim/presets/validate-task.yml"
124
+ - ".ace-defaults/sim/steps/draft.md"
125
+ - ".ace-defaults/sim/steps/plan.md"
126
+ - ".ace-defaults/sim/steps/work.md"
127
+ - CHANGELOG.md
128
+ - LICENSE
129
+ - README.md
130
+ - Rakefile
131
+ - docs/demo/ace-sim-run-4x.gif
132
+ - docs/demo/ace-sim-run.gif
133
+ - docs/demo/ace-sim-run.tape.yml
134
+ - docs/getting-started.md
135
+ - docs/handbook.md
136
+ - docs/usage.md
137
+ - exe/ace-sim
138
+ - handbook/skills/as-sim-run/SKILL.md
139
+ - handbook/workflow-instructions/sim/run.wf.md
140
+ - lib/ace/sim.rb
141
+ - lib/ace/sim/cli.rb
142
+ - lib/ace/sim/cli/commands/run.rb
143
+ - lib/ace/sim/models/simulation_session.rb
144
+ - lib/ace/sim/molecules/final_synthesis_executor.rb
145
+ - lib/ace/sim/molecules/session_store.rb
146
+ - lib/ace/sim/molecules/source_bundler.rb
147
+ - lib/ace/sim/molecules/stage_executor.rb
148
+ - lib/ace/sim/molecules/synthesis_builder.rb
149
+ - lib/ace/sim/organisms/simulation_runner.rb
150
+ - lib/ace/sim/version.rb
151
+ homepage: https://github.com/cs3b/ace
152
+ licenses:
153
+ - MIT
154
+ metadata:
155
+ allowed_push_host: https://rubygems.org
156
+ homepage_uri: https://github.com/cs3b/ace
157
+ source_code_uri: https://github.com/cs3b/ace/tree/main/ace-sim/
158
+ changelog_uri: https://github.com/cs3b/ace/blob/main/ace-sim/CHANGELOG.md
159
+ rdoc_options: []
160
+ require_paths:
161
+ - lib
162
+ required_ruby_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: 3.2.0
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubygems_version: 3.6.9
174
+ specification_version: 4
175
+ summary: Multi-provider LLM simulation chains for validating ideas and reviewing tasks
176
+ before implementation
177
+ test_files: []