decision_agent 0.2.0 → 0.3.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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -1
  3. data/bin/decision_agent +104 -0
  4. data/lib/decision_agent/dmn/adapter.rb +135 -0
  5. data/lib/decision_agent/dmn/cache.rb +306 -0
  6. data/lib/decision_agent/dmn/decision_graph.rb +327 -0
  7. data/lib/decision_agent/dmn/decision_tree.rb +192 -0
  8. data/lib/decision_agent/dmn/errors.rb +30 -0
  9. data/lib/decision_agent/dmn/exporter.rb +217 -0
  10. data/lib/decision_agent/dmn/feel/evaluator.rb +797 -0
  11. data/lib/decision_agent/dmn/feel/functions.rb +420 -0
  12. data/lib/decision_agent/dmn/feel/parser.rb +349 -0
  13. data/lib/decision_agent/dmn/feel/simple_parser.rb +276 -0
  14. data/lib/decision_agent/dmn/feel/transformer.rb +372 -0
  15. data/lib/decision_agent/dmn/feel/types.rb +276 -0
  16. data/lib/decision_agent/dmn/importer.rb +77 -0
  17. data/lib/decision_agent/dmn/model.rb +197 -0
  18. data/lib/decision_agent/dmn/parser.rb +191 -0
  19. data/lib/decision_agent/dmn/testing.rb +333 -0
  20. data/lib/decision_agent/dmn/validator.rb +315 -0
  21. data/lib/decision_agent/dmn/versioning.rb +229 -0
  22. data/lib/decision_agent/dmn/visualizer.rb +513 -0
  23. data/lib/decision_agent/dsl/condition_evaluator.rb +3 -0
  24. data/lib/decision_agent/dsl/schema_validator.rb +2 -1
  25. data/lib/decision_agent/evaluators/dmn_evaluator.rb +221 -0
  26. data/lib/decision_agent/version.rb +1 -1
  27. data/lib/decision_agent/web/dmn_editor.rb +426 -0
  28. data/lib/decision_agent/web/public/dmn-editor.css +596 -0
  29. data/lib/decision_agent/web/public/dmn-editor.html +250 -0
  30. data/lib/decision_agent/web/public/dmn-editor.js +553 -0
  31. data/lib/decision_agent/web/public/index.html +3 -0
  32. data/lib/decision_agent/web/public/styles.css +21 -0
  33. data/lib/decision_agent/web/server.rb +465 -0
  34. data/spec/ab_testing/ab_testing_agent_spec.rb +174 -0
  35. data/spec/auth/rbac_adapter_spec.rb +228 -0
  36. data/spec/dmn/decision_graph_spec.rb +282 -0
  37. data/spec/dmn/decision_tree_spec.rb +203 -0
  38. data/spec/dmn/feel/errors_spec.rb +18 -0
  39. data/spec/dmn/feel/functions_spec.rb +400 -0
  40. data/spec/dmn/feel/simple_parser_spec.rb +274 -0
  41. data/spec/dmn/feel/types_spec.rb +176 -0
  42. data/spec/dmn/feel_parser_spec.rb +489 -0
  43. data/spec/dmn/hit_policy_spec.rb +202 -0
  44. data/spec/dmn/integration_spec.rb +226 -0
  45. data/spec/examples.txt +1846 -1570
  46. data/spec/fixtures/dmn/complex_decision.dmn +81 -0
  47. data/spec/fixtures/dmn/invalid_structure.dmn +31 -0
  48. data/spec/fixtures/dmn/simple_decision.dmn +40 -0
  49. data/spec/monitoring/metrics_collector_spec.rb +37 -35
  50. data/spec/monitoring/monitored_agent_spec.rb +14 -11
  51. data/spec/performance_optimizations_spec.rb +10 -3
  52. data/spec/thread_safety_spec.rb +10 -2
  53. data/spec/web_ui_rack_spec.rb +294 -0
  54. metadata +65 -1
@@ -0,0 +1,250 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>DMN Editor - DecisionAgent</title>
7
+ <link rel="stylesheet" href="dmn-editor.css">
8
+ </head>
9
+ <body>
10
+ <div class="container">
11
+ <header>
12
+ <h1>DMN Editor</h1>
13
+ <div class="header-actions">
14
+ <button id="new-model-btn" class="btn btn-primary">New Model</button>
15
+ <button id="import-btn" class="btn btn-secondary">Import DMN</button>
16
+ <button id="export-btn" class="btn btn-secondary">Export DMN</button>
17
+ <button id="validate-btn" class="btn btn-secondary">Validate</button>
18
+ <a href="/" class="btn btn-link">Back to Main</a>
19
+ </div>
20
+ </header>
21
+
22
+ <div class="main-content">
23
+ <!-- Sidebar -->
24
+ <aside class="sidebar">
25
+ <h3>Models</h3>
26
+ <div id="model-list" class="model-list">
27
+ <p class="empty-state">No models yet. Create one to get started.</p>
28
+ </div>
29
+ </aside>
30
+
31
+ <!-- Editor Area -->
32
+ <main class="editor-area">
33
+ <div id="welcome-screen" class="welcome-screen">
34
+ <h2>Welcome to DMN Editor</h2>
35
+ <p>Create a new model or import an existing DMN file to get started.</p>
36
+ <button class="btn btn-primary btn-large" onclick="document.getElementById('new-model-btn').click()">
37
+ Create New Model
38
+ </button>
39
+ </div>
40
+
41
+ <div id="editor-container" class="editor-container" style="display: none;">
42
+ <!-- Model Info -->
43
+ <div class="model-info">
44
+ <h2 id="model-name">Model Name</h2>
45
+ <span id="model-id" class="model-id"></span>
46
+ <button id="add-decision-btn" class="btn btn-sm btn-primary">Add Decision</button>
47
+ </div>
48
+
49
+ <!-- Tabs -->
50
+ <div class="tabs">
51
+ <button class="tab-btn active" data-tab="table">Decision Table</button>
52
+ <button class="tab-btn" data-tab="tree">Decision Tree</button>
53
+ <button class="tab-btn" data-tab="graph">Decision Graph</button>
54
+ <button class="tab-btn" data-tab="xml">DMN XML</button>
55
+ </div>
56
+
57
+ <!-- Tab Content -->
58
+ <div class="tab-content">
59
+ <!-- Decision Table Tab -->
60
+ <div id="table-tab" class="tab-pane active">
61
+ <div class="decision-selector">
62
+ <label>Select Decision:</label>
63
+ <select id="decision-select" class="form-control">
64
+ <option value="">No decisions yet</option>
65
+ </select>
66
+ </div>
67
+
68
+ <div id="decision-table-editor" class="decision-table-editor">
69
+ <div class="table-controls">
70
+ <label>Hit Policy:</label>
71
+ <select id="hit-policy-select" class="form-control">
72
+ <option value="UNIQUE">UNIQUE</option>
73
+ <option value="FIRST" selected>FIRST</option>
74
+ <option value="PRIORITY">PRIORITY</option>
75
+ <option value="ANY">ANY</option>
76
+ <option value="COLLECT">COLLECT</option>
77
+ </select>
78
+ <button id="add-input-btn" class="btn btn-sm">Add Input</button>
79
+ <button id="add-output-btn" class="btn btn-sm">Add Output</button>
80
+ <button id="add-rule-btn" class="btn btn-sm btn-primary">Add Rule</button>
81
+ </div>
82
+
83
+ <div class="table-wrapper">
84
+ <table id="decision-table" class="decision-table">
85
+ <thead>
86
+ <tr id="table-headers">
87
+ <th class="rule-number">#</th>
88
+ <!-- Input/output headers will be added dynamically -->
89
+ <th class="actions-col">Actions</th>
90
+ </tr>
91
+ <tr id="table-types">
92
+ <th></th>
93
+ <!-- Type annotations will be added dynamically -->
94
+ <th></th>
95
+ </tr>
96
+ </thead>
97
+ <tbody id="table-body">
98
+ <tr class="empty-row">
99
+ <td colspan="2">No rules defined. Click "Add Rule" to create one.</td>
100
+ </tr>
101
+ </tbody>
102
+ </table>
103
+ </div>
104
+ </div>
105
+ </div>
106
+
107
+ <!-- Decision Tree Tab -->
108
+ <div id="tree-tab" class="tab-pane">
109
+ <div class="tree-controls">
110
+ <button id="add-tree-node-btn" class="btn btn-sm btn-primary">Add Node</button>
111
+ <button id="visualize-tree-btn" class="btn btn-sm">Visualize</button>
112
+ </div>
113
+ <div id="tree-editor" class="tree-editor">
114
+ <p class="empty-state">Decision tree builder coming soon...</p>
115
+ </div>
116
+ <div id="tree-visualization" class="visualization-area"></div>
117
+ </div>
118
+
119
+ <!-- Decision Graph Tab -->
120
+ <div id="graph-tab" class="tab-pane">
121
+ <div class="graph-controls">
122
+ <button id="visualize-graph-btn" class="btn btn-sm btn-primary">Generate Graph</button>
123
+ <select id="graph-format-select" class="form-control">
124
+ <option value="svg">SVG</option>
125
+ <option value="mermaid">Mermaid</option>
126
+ <option value="dot">DOT</option>
127
+ </select>
128
+ </div>
129
+ <div id="graph-visualization" class="visualization-area"></div>
130
+ </div>
131
+
132
+ <!-- XML Tab -->
133
+ <div id="xml-tab" class="tab-pane">
134
+ <div class="xml-controls">
135
+ <button id="copy-xml-btn" class="btn btn-sm">Copy XML</button>
136
+ <button id="download-xml-btn" class="btn btn-sm btn-primary">Download</button>
137
+ </div>
138
+ <pre id="xml-content" class="xml-content"><code></code></pre>
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </main>
143
+ </div>
144
+ </div>
145
+
146
+ <!-- Modals -->
147
+ <div id="new-model-modal" class="modal">
148
+ <div class="modal-content">
149
+ <h3>Create New DMN Model</h3>
150
+ <form id="new-model-form">
151
+ <div class="form-group">
152
+ <label for="model-name-input">Model Name:</label>
153
+ <input type="text" id="model-name-input" class="form-control" required>
154
+ </div>
155
+ <div class="form-group">
156
+ <label for="model-namespace-input">Namespace (optional):</label>
157
+ <input type="text" id="model-namespace-input" class="form-control"
158
+ placeholder="http://example.com/dmn/model">
159
+ </div>
160
+ <div class="modal-actions">
161
+ <button type="submit" class="btn btn-primary">Create</button>
162
+ <button type="button" class="btn btn-secondary" onclick="closeModal('new-model-modal')">Cancel</button>
163
+ </div>
164
+ </form>
165
+ </div>
166
+ </div>
167
+
168
+ <div id="add-decision-modal" class="modal">
169
+ <div class="modal-content">
170
+ <h3>Add Decision</h3>
171
+ <form id="add-decision-form">
172
+ <div class="form-group">
173
+ <label for="decision-id-input">Decision ID:</label>
174
+ <input type="text" id="decision-id-input" class="form-control" required>
175
+ </div>
176
+ <div class="form-group">
177
+ <label for="decision-name-input">Decision Name:</label>
178
+ <input type="text" id="decision-name-input" class="form-control" required>
179
+ </div>
180
+ <div class="form-group">
181
+ <label for="decision-type-select">Type:</label>
182
+ <select id="decision-type-select" class="form-control">
183
+ <option value="decision_table">Decision Table</option>
184
+ <option value="decision_tree">Decision Tree</option>
185
+ <option value="literal">Literal Expression</option>
186
+ </select>
187
+ </div>
188
+ <div class="modal-actions">
189
+ <button type="submit" class="btn btn-primary">Add</button>
190
+ <button type="button" class="btn btn-secondary" onclick="closeModal('add-decision-modal')">Cancel</button>
191
+ </div>
192
+ </form>
193
+ </div>
194
+ </div>
195
+
196
+ <div id="add-column-modal" class="modal">
197
+ <div class="modal-content">
198
+ <h3 id="column-modal-title">Add Column</h3>
199
+ <form id="add-column-form">
200
+ <input type="hidden" id="column-type" value="">
201
+ <div class="form-group">
202
+ <label for="column-id-input">ID:</label>
203
+ <input type="text" id="column-id-input" class="form-control" required>
204
+ </div>
205
+ <div class="form-group">
206
+ <label for="column-label-input">Label:</label>
207
+ <input type="text" id="column-label-input" class="form-control" required>
208
+ </div>
209
+ <div class="form-group">
210
+ <label for="column-type-input">Data Type:</label>
211
+ <select id="column-type-input" class="form-control">
212
+ <option value="string">String</option>
213
+ <option value="number">Number</option>
214
+ <option value="boolean">Boolean</option>
215
+ <option value="date">Date</option>
216
+ </select>
217
+ </div>
218
+ <div class="form-group" id="expression-group">
219
+ <label for="column-expression-input">Expression:</label>
220
+ <input type="text" id="column-expression-input" class="form-control">
221
+ </div>
222
+ <div class="modal-actions">
223
+ <button type="submit" class="btn btn-primary">Add</button>
224
+ <button type="button" class="btn btn-secondary" onclick="closeModal('add-column-modal')">Cancel</button>
225
+ </div>
226
+ </form>
227
+ </div>
228
+ </div>
229
+
230
+ <div id="import-modal" class="modal">
231
+ <div class="modal-content">
232
+ <h3>Import DMN File</h3>
233
+ <form id="import-form">
234
+ <div class="form-group">
235
+ <label for="import-file-input">Select DMN XML File:</label>
236
+ <input type="file" id="import-file-input" class="form-control" accept=".dmn,.xml" required>
237
+ </div>
238
+ <div class="modal-actions">
239
+ <button type="submit" class="btn btn-primary">Import</button>
240
+ <button type="button" class="btn btn-secondary" onclick="closeModal('import-modal')">Cancel</button>
241
+ </div>
242
+ </form>
243
+ </div>
244
+ </div>
245
+
246
+ <div id="notification" class="notification"></div>
247
+
248
+ <script src="dmn-editor.js"></script>
249
+ </body>
250
+ </html>