ApiLogicServer 15.2.0__py3-none-any.whl → 15.2.3__py3-none-any.whl

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 (24) hide show
  1. api_logic_server_cli/api_logic_server.py +2 -2
  2. api_logic_server_cli/prototypes/base/.github/.copilot-instructions.md +22 -0
  3. api_logic_server_cli/prototypes/base/docs/training/testing.md +21 -9
  4. api_logic_server_cli/prototypes/base/test/api_logic_server_behave/behave_logic_report.py +55 -29
  5. api_logic_server_cli/prototypes/base/test/api_logic_server_behave/behave_logic_report.py.bak +285 -0
  6. api_logic_server_cli/prototypes/basic_demo/customizations/test/api_logic_server_behave/reports/Behave Logic Report Intro micro.md +35 -0
  7. api_logic_server_cli/prototypes/basic_demo/customizations/test/api_logic_server_behave/reports/Behave Logic Report Intro.md +35 -0
  8. api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/training/testing.md +210 -12
  9. api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/behave_logic_report.py +13 -84
  10. api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/behave_logic_report.py.bak +282 -0
  11. api_logic_server_cli/prototypes/manager/system/ApiLogicServer-Internal-Dev/copilot-dev-context.md +39 -4
  12. api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/behave_logic_report.py +13 -75
  13. api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/behave_logic_report.py.bak +256 -0
  14. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/behave_logic_report.py +13 -75
  15. api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/behave_logic_report.py.bak +256 -0
  16. api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/reports/Behave Logic Report Intro micro.md +17 -0
  17. api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/reports/Behave Logic Report Intro.md +17 -0
  18. {apilogicserver-15.2.0.dist-info → apilogicserver-15.2.3.dist-info}/METADATA +79 -8
  19. {apilogicserver-15.2.0.dist-info → apilogicserver-15.2.3.dist-info}/RECORD +23 -16
  20. api_logic_server_cli/prototypes/base/.github/.copilot-instructionsZ.mdx +0 -661
  21. {apilogicserver-15.2.0.dist-info → apilogicserver-15.2.3.dist-info}/WHEEL +0 -0
  22. {apilogicserver-15.2.0.dist-info → apilogicserver-15.2.3.dist-info}/entry_points.txt +0 -0
  23. {apilogicserver-15.2.0.dist-info → apilogicserver-15.2.3.dist-info}/licenses/LICENSE +0 -0
  24. {apilogicserver-15.2.0.dist-info → apilogicserver-15.2.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,256 @@
1
+ import requests
2
+ from pathlib import Path
3
+ import os
4
+ import ast
5
+ import sys
6
+ import click
7
+
8
+ """
9
+ Creates wiki file from test/behave/behave.log, with rule use.
10
+
11
+ Tips
12
+ * use 2 spaces (at end) for newline
13
+ * for tab: & emsp;
14
+
15
+ """
16
+
17
+ tab = " "
18
+ behave_debug_info = " # "
19
+ wiki_data = []
20
+ debug_scenario = "XXGood Order Custom Service"
21
+
22
+ scenario_doc_strings = {}
23
+ """ dict of scenario_name, array of strings """
24
+
25
+
26
+ def remove_trailer(line: str) -> str:
27
+ """ remove everything after the ## """
28
+ end_here = line.find("\t\t##")
29
+ result = line[0:end_here]
30
+ return result
31
+
32
+ def line_spacer():
33
+ wiki_data.append("\n")
34
+ wiki_data.append(" ")
35
+ wiki_data.append(" ")
36
+ wiki_data.append("\n")
37
+
38
+
39
+ def get_current_readme(prepend_wiki: str):
40
+ """ initialize wiki_data with readme up to {report_name} """
41
+ report_name = "Behave Logic Report"
42
+ with open(prepend_wiki) as readme:
43
+ readme_lines = readme.readlines()
44
+ need_spacer = True
45
+ for each_readme_line in readme_lines:
46
+ if '# ' + report_name in each_readme_line:
47
+ need_spacer = False
48
+ break
49
+ wiki_data.append(each_readme_line[0:-1])
50
+ if need_spacer:
51
+ line_spacer()
52
+ wiki_data.append(f'# {report_name}')
53
+
54
+ def get_truncated_scenario_name(scenario_name: str) -> str:
55
+ """ address max file length (chop at 26), illegal characters """
56
+ scenario_trunc = scenario_name
57
+ if scenario_trunc is not None and len(scenario_trunc) >= 26:
58
+ scenario_trunc = scenario_name[0:25]
59
+ scenario_trunc = f'{str(scenario_trunc).replace(" ", "_")}'
60
+ return scenario_trunc
61
+
62
+
63
+ def show_logic(scenario: str, logic_logs_dir: str):
64
+ """ insert s{logic_logs_dir}/scenario.log into wiki_data as disclosure area """
65
+ scenario_trunc = get_truncated_scenario_name(scenario)
66
+ logic_file_name = f'{logic_logs_dir}/{scenario_trunc}.log'
67
+ logic_file_name_path = Path(logic_file_name)
68
+ if not logic_file_name_path.is_file(): # debug code
69
+ # wiki_data.append(f'unable to find Logic Log file: {logic_file_name}')
70
+ if scenario == debug_scenario:
71
+ print(f'RELATIVE: {logic_file_name} in {os.getcwd()}')
72
+ full_name = f'{os.getcwd()}/{logic_file_name}'
73
+ print(f'..FULL: {os.getcwd()}/{logic_file_name}')
74
+ logic_file_name = '{logic_logs_dir}/test.log'
75
+ with open(logic_file_name) as logic:
76
+ logic_lines = logic.readlines()
77
+ else:
78
+ logic_log = []
79
+ rules_used = []
80
+ wiki_data.append("<details markdown>")
81
+ wiki_data.append("<summary>Tests - and their logic - are transparent.. click to see Logic</summary>")
82
+ line_spacer()
83
+ scenario_trunc = get_truncated_scenario_name(scenario)
84
+ if scenario_trunc in scenario_doc_strings:
85
+ wiki_data.append(f'**Logic Doc** for scenario: {scenario}')
86
+ wiki_data.append(" ")
87
+ for each_doc_string_line in scenario_doc_strings[scenario_trunc]:
88
+ wiki_data.append(each_doc_string_line[0: -1])
89
+ line_spacer()
90
+ wiki_data.append(f'**Rules Used** in Scenario: {scenario}')
91
+ wiki_data.append("```")
92
+ with open(logic_file_name) as logic:
93
+ logic_lines = logic.readlines()
94
+ is_logic_log = True
95
+ for each_logic_line in logic_lines:
96
+ each_logic_line = remove_trailer(each_logic_line)
97
+ if is_logic_log:
98
+ if "Rules Fired" in each_logic_line:
99
+ is_logic_log = False
100
+ continue
101
+ else:
102
+ logic_log.append(each_logic_line)
103
+ else:
104
+ if 'logic_logger - INFO' in each_logic_line:
105
+ pass
106
+ break
107
+ wiki_data.append(each_logic_line + " ")
108
+ wiki_data.append("```")
109
+ wiki_data.append(f'**Logic Log** in Scenario: {scenario}')
110
+ wiki_data.append("```")
111
+ for each_logic_log in logic_log:
112
+ each_line = remove_trailer(each_logic_log)
113
+ wiki_data.append(each_line)
114
+ wiki_data.append("```")
115
+ wiki_data.append("</details>")
116
+
117
+
118
+ def get_docStrings(steps_dir: str):
119
+ steps_dir_files = os.listdir(steps_dir)
120
+ indent = 4 # skip leading blanks
121
+ for each_steps_dir_file in steps_dir_files:
122
+ each_steps_dir_file_path = Path(steps_dir).joinpath(each_steps_dir_file)
123
+ if each_steps_dir_file_path.is_file():
124
+ with open(each_steps_dir_file_path) as f:
125
+ step_code = f.readlines()
126
+ # print(f'Found File: {str(each_steps_dir_file_path)}')
127
+ for index, each_step_code_line in enumerate(step_code):
128
+ if each_step_code_line.startswith('@when'):
129
+ comment_start = index + 2
130
+ if '"""' in step_code[comment_start]:
131
+ # print(".. found doc string")
132
+ doc_string_line = comment_start+1
133
+ doc_string = []
134
+ while (True):
135
+ if '"""' in step_code[doc_string_line]:
136
+ break
137
+ doc_string.append(step_code[doc_string_line][indent:])
138
+ doc_string_line += 1
139
+ scenario_line = doc_string_line+1
140
+ if 'scenario_name' not in step_code[scenario_line]:
141
+ print(f'\n** Warning - scenario_name not found '\
142
+ f'in file {str(each_steps_dir_file_path)}, '\
143
+ f'after line {scenario_line} -- skipped')
144
+ else:
145
+ scenario_code_line = step_code[scenario_line]
146
+ scenario_name_start = scenario_code_line.find("'") + 1
147
+ scenario_name_end = scenario_code_line[scenario_name_start+1:].find("'")
148
+ scenario_name = scenario_code_line[scenario_name_start:
149
+ scenario_name_end + scenario_name_start+1]
150
+ if scenario_name == debug_scenario:
151
+ print(f'got {debug_scenario}')
152
+ scenario_trunc = get_truncated_scenario_name(scenario_name)
153
+ # print(f'.... truncated scenario_name: {scenario_trunc} in {scenario_code_line}')
154
+ scenario_doc_strings[scenario_trunc] = doc_string
155
+ # print("that's all, folks")
156
+
157
+
158
+ def main(behave_log: str, scenario_logs: str, wiki: str, prepend_wiki: str):
159
+ """ main driver """
160
+ get_docStrings(steps_dir="features/steps")
161
+
162
+ get_current_readme(prepend_wiki=prepend_wiki)
163
+
164
+ contents = None
165
+ with open(behave_log) as f:
166
+ contents = f.readlines()
167
+
168
+ just_saw_then = False
169
+ current_scenario = ""
170
+ for each_line in contents:
171
+ if just_saw_then and each_line == "\n":
172
+ show_logic(scenario=current_scenario, logic_logs_dir=scenario_logs)
173
+ just_saw_then = False
174
+ if each_line.startswith("Feature"):
175
+ wiki_data.append("&nbsp;")
176
+ wiki_data.append("&nbsp;")
177
+ each_line = "## " + each_line
178
+ if each_line.startswith(" Scenario"):
179
+ each_line = tab + each_line
180
+ if each_line.startswith(" Given") or \
181
+ each_line.startswith(" When") or \
182
+ each_line.startswith(" Then"):
183
+ if each_line.startswith(" Then"):
184
+ just_saw_then = True
185
+ each_line = tab + tab + each_line
186
+
187
+ each_line = each_line[:-1]
188
+ debug_loc = each_line.find(behave_debug_info)
189
+ if debug_loc > 0:
190
+ each_line = each_line[0 : debug_loc]
191
+ each_line = each_line.rstrip()
192
+ if "Scenario" in each_line:
193
+ current_scenario = each_line[18:]
194
+ wiki_data.append("&nbsp;")
195
+ wiki_data.append("&nbsp;")
196
+ wiki_data.append("### " + each_line[8:])
197
+
198
+ each_line = each_line + " " # wiki for "new line"
199
+
200
+ wiki_data.append(each_line)
201
+
202
+ with open(wiki, 'w') as rpt:
203
+ rpt.write('\n'.join(wiki_data))
204
+ wiki_full_path = Path(wiki).absolute()
205
+ print(f'Wiki Output: {wiki_full_path}\n\n')
206
+
207
+
208
+
209
+ def print_args(args, msg):
210
+ print(msg)
211
+ for each_arg in args:
212
+ print(f' {each_arg}')
213
+ print(" ")
214
+
215
+
216
+ @click.group()
217
+ @click.pass_context
218
+ def cli(ctx):
219
+ """
220
+ Combine behave.log and scenario_logic_logs to create Behave Logic Report
221
+
222
+ """
223
+ pass
224
+
225
+
226
+ @cli.command("run")
227
+ @click.pass_context
228
+ @click.option('--behave_log',
229
+ default=f'logs/behave.log', # cwd set to test/api_logic_server_behave
230
+ # prompt="Log from behave test suite run [behave.log]",
231
+ help="Help")
232
+ @click.option('--scenario_logs',
233
+ default=f'logs/scenario_logic_logs',
234
+ # prompt="Logic Log directory from ",
235
+ help="Help")
236
+ @click.option('--wiki',
237
+ default=f'reports/Behave Logic Report.md',
238
+ # prompt="Log from behave test suite run [api_logic_server_behave]",
239
+ help="Help")
240
+ @click.option('--prepend_wiki',
241
+ default=f'reports/Behave Logic Report Intro micro.md',
242
+ # prompt="Log from behave test suite run [Behave Logic Report Intro]",
243
+ help="Help")
244
+ def run(ctx, behave_log: str, scenario_logs: str, wiki: str, prepend_wiki: str):
245
+ main(behave_log = behave_log, scenario_logs = scenario_logs, wiki = wiki, prepend_wiki = prepend_wiki)
246
+
247
+
248
+ if __name__ == '__main__': # debugger & python command line start here
249
+ # eg: python api_logic_server_cli/cli.py create --project_name=~/Desktop/test_project
250
+ # unix: python api_logic_server_cli/cli.py create --project_name=/home/ApiLogicProject
251
+
252
+ print(f'\nBehave Logic Report 1.1, started at {os.getcwd()}')
253
+ commands = sys.argv
254
+ if len(sys.argv) > 1:
255
+ print_args(commands, f'\n\nCommand Line Arguments:')
256
+ cli()
@@ -0,0 +1,17 @@
1
+ ## Northwind Sample
2
+
3
+ This is the sample project from API Logic Server, based on the [Northwind database](https://apilogicserver.github.io/Docs/Sample-Database/) (sqlite database located in the `database` folder - no installation required):
4
+
5
+ ![Sample Database](https://apilogicserver.github.io/Docs/images/model/sample-database.png)
6
+
7
+ >
8
+
9
+ The sample Scenarios below were chosen to illustrate the basic patterns of using
10
+ rules. Open the disclosure box ("Tests - and their logic...") to see the implementation and notes.
11
+
12
+ The following report was created during test suite execution.
13
+
14
+ &nbsp;
15
+
16
+ # Behave Logic Report
17
+
@@ -0,0 +1,17 @@
1
+ ## Northwind Sample
2
+
3
+ This is the sample project from API Logic Server, based on the [Northwind database](https://apilogicserver.github.io/Docs/Sample-Database/) (sqlite database located in the `database` folder - no installation required):
4
+
5
+ ![Sample Database](https://apilogicserver.github.io/Docs/images/model/sample-database.png)
6
+
7
+ >
8
+
9
+ The sample Scenarios below were chosen to illustrate the basic patterns of using
10
+ rules. Open the disclosure box ("Tests - and their logic...") to see the implementation and notes.
11
+
12
+ The following report was created during test suite execution.
13
+
14
+ &nbsp;
15
+
16
+ # Behave Logic Report
17
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ApiLogicServer
3
- Version: 15.2.0
3
+ Version: 15.2.3
4
4
  Author-email: Val Huber <apilogicserver@gmail.com>
5
5
  License-Expression: BSD-3-Clause
6
6
  Project-URL: Homepage, https://www.genai-logic.com
@@ -83,7 +83,7 @@ Dynamic: license-file
83
83
  [![Latest Version](https://img.shields.io/pypi/v/apilogicserver.svg)](https://pypi.python.org/pypi/apilogicserver/)
84
84
  [![Supported Python versions](https://img.shields.io/pypi/pyversions/apilogicserver.svg)](https://pypi.python.org/pypi/apilogicserver/)
85
85
 
86
- **Transform 30-40 years of backend development requests into 3-4 days** with GenAI-powered microservice automation.
86
+ **Create instant microservices from your database or natural language prompt** - working API + Admin App + Logic in 5 seconds, with 40X code reduction through declarative rules.
87
87
 
88
88
  Create **instant microservices** (MCP-enabled API + Admin App + Business Logic) from your database or a natural language prompt:
89
89
 
@@ -121,7 +121,7 @@ python api_logic_server_run.py
121
121
  - 🔐 **Security** - Row-level authorization, JWT authentication
122
122
  - 🐳 **Docker-ready** - Pre-configured containers for deployment
123
123
 
124
- **[📖 4-minute video demo](https://www.youtube.com/watch?v=7I33Fa9Ulos)** | **[📚 Full Documentation](https://apilogicserver.github.io/Docs/)** | **[🏠 Home](https://www.genai-logic.com)**
124
+ **[📖 8-minute video demo](https://www.youtube.com/watch?v=Z4_NJIm5rFs&t=323s)** | **[📚 Full Documentation](https://apilogicserver.github.io/Docs/)** | **[🏠 Home](https://www.genai-logic.com)**
125
125
 
126
126
  ---
127
127
 
@@ -144,16 +144,68 @@ python api_logic_server_run.py
144
144
 
145
145
  ---
146
146
 
147
- ## 💡 Use Cases
147
+ ## 💡 When to Use API Logic Server
148
148
 
149
- - **🔌 Application Integration** - Instant APIs for legacy databases
150
- - **⚡ Rapid Prototyping** - Working backend in minutes, not weeks
149
+ ### Ideal Use Cases
150
+
151
+ API Logic Server excels at **data-centric business applications** where the complexity is in multi-table calculations, constraints, and derivations:
152
+
153
+ - **🔌 Application Integration** - Instant APIs for legacy databases (modernization without rewrite)
154
+ - **⚡ Rapid Prototyping** - Working backend in minutes for validation
151
155
  - **🤖 GenAI Backends** - Natural language → working microservice
152
156
  - **🏢 Backoffice Apps** - Admin dashboards for data maintenance
153
157
  - **🔗 Microservices** - Decompose monoliths with instant services
158
+ - **📊 Business Rule Automation** - Complex calculations, cascading updates, constraint checking
159
+ - **🔄 CRUD-Heavy Applications** - Order management, inventory, customer systems
160
+ - **🏛️ Legacy Modernization** - MCP-enable existing databases, create modern API layer while legacy apps continue running
161
+
162
+ **Sweet Spot:** Applications where business logic complexity >> UI complexity
163
+
164
+ ### ⚠️ Not Recommended For
165
+
166
+ API Logic Server is optimized for data-centric business logic, but **less suited** for:
167
+
168
+ - **Real-time streaming systems** - Use Kafka/Flink for high-throughput event processing
169
+ - **Complex UI/UX interactions** - Works great as the backend, but not a UI framework
170
+ - **Machine learning pipelines** - Use TensorFlow/PyTorch for ML workflows
171
+ - **Low-level system programming** - Traditional languages better suited
172
+ - **Document/content management** - Use specialized CMS platforms
173
+ - **Simple static websites** - Overkill for basic content delivery
174
+
175
+ **For these scenarios, traditional approaches are more appropriate.** API Logic Server can still serve as the backend for hybrid architectures.
154
176
 
155
177
  ---
156
178
 
179
+
180
+ ## ❓ Frequently Asked Questions
181
+
182
+ **Q: How is this different from low-code platforms (Retool, OutSystems, Hasura)?**
183
+
184
+ A: Unlike pure low-code platforms, API Logic Server generates **standard Python projects you own, extend and deploy**. Screen creation is by vibe tools rather than screen painting. Unlike API generators, it includes sophisticated multi-table logic automation (40X code reduction). **[Read detailed comparison →](https://medium.com/@valjhuber/declarative-genai-the-architecture-behind-enterprise-vibe-automation-1b8a4fe4fbd7)**
185
+
186
+ **Q: Isn't this just vendor lock-in?**
187
+
188
+ A: It's **free and open source**. The declarative rules sit on top of standard (readable, version-controlled) Python — you can always drop down to procedural code. If you ever need to migrate away, you can either keep using the rules engine (it's just a library) or replace declarative rules with equivalent procedural code using standard SQLAlchemy events.
189
+
190
+ **Q: Can I customize the generated app?**
191
+
192
+ A: **Absolutely.** You can override the UI, extend APIs, and plug in your own logic — using standard Python, SQLAlchemy, and any Vibe tool. The generated project is a starting point, not a black box. **[See customization patterns →](https://apilogicserver.github.io/Docs/Logic/)**
193
+
194
+ **Q: What happens when logic doesn't fit the declarative model?**
195
+
196
+ A: The declarative engine handles **over 95%** of typical business logic (calculations, validations, cascading updates). For complex workflows, state machines, or external integrations, you write standard Python event handlers that coexist with declarative rules. The engine calls your code at the right time — no conflict, full extensibility.
197
+
198
+ **Q: How long does it take developers to become productive?**
199
+
200
+ A: Developers can start writing rules immediately using natural language, and the DSL syntax is intuitive. Understanding the engine's optimization strategies (pruning, chaining) takes a few days of practice. **Most teams are fully productive within a week.**
201
+
202
+ **Q: What if I have questions or need help?**
203
+
204
+ A: Join our **[Discord community](https://discord.gg/fNRTTVFT)** for real-time help, check **[GitHub Discussions](https://github.com/ApiLogicServer/ApiLogicServer-src/discussions)**, or browse the **[comprehensive documentation](https://apilogicserver.github.io/Docs/)**.
205
+
206
+ **[→ More FAQs in detailed article](https://medium.com/@valjhuber/declarative-genai-the-architecture-behind-enterprise-vibe-automation-1b8a4fe4fbd7#faqs)**
207
+
208
+ ---
157
209
  ## 🏗️ Architecture
158
210
 
159
211
  ```
@@ -302,11 +354,11 @@ python behave_logic_report.py
302
354
 
303
355
  ---
304
356
 
305
- ## 🎬 Video Overview (4 min)
357
+ ## 🎬 Video Overview (8 min)
306
358
 
307
359
  See how **Microservice Automation** creates and runs a microservice - a multi-page app and an API:
308
360
 
309
- [![GenAI Automation](https://raw.githubusercontent.com/ApiLogicServer/Docs/main/docs/images/sample-ai/copilot/genai-automation-video.png)](https://www.youtube.com/watch?v=7I33Fa9Ulos "Microservice Automation")
361
+ [![GenAI Automation](https://raw.githubusercontent.com/ApiLogicServer/Docs/main/docs/images/sample-ai/copilot/genai-automation-video.png)](https://www.youtube.com/watch?v=Z4_NJIm5rFs&t=323s "Microservice Automation")
310
362
 
311
363
  ---
312
364
 
@@ -485,6 +537,25 @@ Built on the shoulders of giants:
485
537
 
486
538
  ---
487
539
 
540
+
541
+ ## 📝 In-Depth Articles
542
+
543
+ These Medium articles provide comprehensive context on architecture, use cases, and the reasoning behind API Logic Server:
544
+
545
+ | Article | Topic | Key Insights |
546
+ |---------|-------|--------------|
547
+ | **[Welcome to GenAI-Logic](https://medium.com/@valjhuber/welcome-to-genai-logic-a610ba14bd72)** | Vision & Overview | Big picture: Does GenAI deliver business agility? Start here for context. |
548
+ | **[Declarative GenAI Architecture](https://medium.com/@valjhuber/declarative-genai-the-architecture-behind-enterprise-vibe-automation-1b8a4fe4fbd7)** | Technical Deep Dive | NL → DSL → Engines pattern, FrankenCode problem, **includes FAQ section** |
549
+ | **[Declarative Logic: Living in a Procedural World](https://medium.com/@valjhuber/declarative-logic-living-in-a-procedural-world-6c5b20552c6b)** | Architecture Philosophy | How declarative rules work in Python, the paradox resolved |
550
+ | **[Living With Logic in the Enterprise](https://medium.com/@valjhuber/living-with-logic-7e202782d0c5)** | Production Patterns | Debugging, testing, performance, customization in real deployments |
551
+ | **[Business User / IT Collaboration](https://medium.com/@valjhuber/declarative-genai-business-user-it-collaboration-c5547776ff7d)** | Team Dynamics | How logic acts as a contract between business and IT |
552
+ | **[Vibe an MCP Server](https://medium.com/@valjhuber/vibe-an-mcp-server-declarative-genai-logic-dec16719c004)** | MCP Integration | Creating MCP-enabled services with natural language |
553
+ | **[Probabilistic and Deterministic Logic](https://medium.com/@valjhuber/probabilistic-and-deterministic-logic-9a38f98d24a8)** | AI + Rules | Engineering reliability into agentic systems (AI at runtime + rules) |
554
+ | **[Enterprise Vibe Automation](https://medium.com/@valjhuber/enterprise-vibe-automation-b40c8f750a1d)** | GenAI Workflows | Full-stack automation from prompts |
555
+
556
+ **These articles represent significant research and real-world experience** - they address common questions, architectural decisions, and lessons learned from 40+ years of declarative technology evolution.
557
+
558
+ ---
488
559
  ## 📞 Connect
489
560
 
490
561
  - **🏠 Home:** [genai-logic.com](https://www.genai-logic.com)
@@ -1,5 +1,5 @@
1
1
  api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- api_logic_server_cli/api_logic_server.py,sha256=-hfuPmWGlH-IBu3BPO-qA9u5fgS6OmGd6j5_JT42jII,104478
2
+ api_logic_server_cli/api_logic_server.py,sha256=ebZHYYBPIJWMjw5kyuVeIRPXyc4US-I3y8U_SU1Hb_0,104501
3
3
  api_logic_server_cli/api_logic_server_info.yaml,sha256=xwH5ENyjrlv3XbKx7IaY2iaF0Cc4zHi3x7qtpEWTzBI,139
4
4
  api_logic_server_cli/cli.py,sha256=xAqTOhq-OnXU2HEQgzsGC9yKrGcAgKUt_8b9U2bV5No,87831
5
5
  api_logic_server_cli/cli_args_base.py,sha256=7cVM6BeizwttYAwUu1FUyuLuvWufvgt0TFeA8FI6tu0,3304
@@ -423,8 +423,7 @@ api_logic_server_cli/prototypes/base/.devcontainer-option/For_VSCode.dockerfile,
423
423
  api_logic_server_cli/prototypes/base/.devcontainer-option/devcontainer.json,sha256=tk-mGd4XdmbpKUqUeGmcPMzX3RDc6am9-de8c-rFmSo,2361
424
424
  api_logic_server_cli/prototypes/base/.devcontainer-option/readme.md,sha256=-sSneMDne1fqEoox2hXUGmoO8ewgi34y7lJwGTidSpY,104
425
425
  api_logic_server_cli/prototypes/base/.devcontainer-option/setup.sh,sha256=pOvGjZ7jgRQzFkD93mNICmcC2y66Dexrq4bCnSSVwtU,310
426
- api_logic_server_cli/prototypes/base/.github/.copilot-instructions.md,sha256=ceN5_oghMh0dQ4ltVK-92IVahyFUAT-isGETdKvrDFg,32886
427
- api_logic_server_cli/prototypes/base/.github/.copilot-instructionsZ.mdx,sha256=KSwjZ6Mh3lmbh0-OfFDmdTKw_C8O7OFskrcbRBCUB98,29874
426
+ api_logic_server_cli/prototypes/base/.github/.copilot-instructions.md,sha256=rUxVk-srt1BXmzIkF10tlrrMvL7by5sDrpJKj84vym4,34002
428
427
  api_logic_server_cli/prototypes/base/.idea/runConfigurations/ApiLogicServer.xml,sha256=eFzhe9NH-VNjcPWbPsRQy5o-MugJR9IWklA1Fo8wtYg,1127
429
428
  api_logic_server_cli/prototypes/base/.idea/runConfigurations/Report_Behave_Logic.xml,sha256=I3jlEf-TPzc-1NY843v6AcQIQ8QJD3z9KvxTYSZWMtY,1306
430
429
  api_logic_server_cli/prototypes/base/.idea/runConfigurations/Run_Behave.xml,sha256=CTzF0P4w7o4FzOi-eSpru0HczSEGtJsKqkQ7VWRyxPc,1196
@@ -535,7 +534,7 @@ api_logic_server_cli/prototypes/base/docs/training/logic_example.py,sha256=yAot6
535
534
  api_logic_server_cli/prototypes/base/docs/training/react_map.prompt.md,sha256=8B9bDjk4sL1t5LzYLKjuf78UPDmhj9assRZTIOvlwN4,891
536
535
  api_logic_server_cli/prototypes/base/docs/training/react_tree.prompt.md,sha256=Eoi4Q3H4x-PQOjonUjQ1o6xkiFtcEA_hg8tuFP-qk80,652
537
536
  api_logic_server_cli/prototypes/base/docs/training/readme_training.md,sha256=EilDTYaDPoGCD9ef5Efs8eDn8ZNQTgGN7_QnJ4LrO2s,120
538
- api_logic_server_cli/prototypes/base/docs/training/testing.md,sha256=XUb6brf3YV2ilbekoqtVSuiBu32Obl8x4khXOer1VVc,27757
537
+ api_logic_server_cli/prototypes/base/docs/training/testing.md,sha256=embArgUMijhQbVSmBpEW9TCEXBpE9evAt7qJSOP7qmA,28556
539
538
  api_logic_server_cli/prototypes/base/integration/kafka/kafka_consumer.py,sha256=2DOsFpYnsJ71gZzzfJweEmL-i99uCtEFU0hVwIKFGMw,1516
540
539
  api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py,sha256=g0nMAVfz1Y0iKJbbXfvRpdf-QUmyB4uUGZ6lyaVoXag,4470
541
540
  api_logic_server_cli/prototypes/base/integration/kafka/kafka_readme.md,sha256=MlwykHWM2w41KzWh4vPuTnIodR8f-BQzrWpV4P1hrsI,161
@@ -576,7 +575,8 @@ api_logic_server_cli/prototypes/base/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-
576
575
  api_logic_server_cli/prototypes/base/test/readme_test.md,sha256=9uvv3lR0UDNvtv-KrH82z_DWXYLElmUj0tl56MWJ2m8,17128
577
576
  api_logic_server_cli/prototypes/base/test/api_logic_server_behave/AI-Generated-Tests-from-Rules.md,sha256=fwRmJ4VS8kZqBdpTUf_7acbXAx0ErRqZhtMpK6Rioqw,22131
578
577
  api_logic_server_cli/prototypes/base/test/api_logic_server_behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
579
- api_logic_server_cli/prototypes/base/test/api_logic_server_behave/behave_logic_report.py,sha256=2rd4m5lmgMCRwEw5_ZSblyTySlMbnNPpR3Km6gsy0xY,11572
578
+ api_logic_server_cli/prototypes/base/test/api_logic_server_behave/behave_logic_report.py,sha256=H0F4xQR6wb2c-jTkSs91ruIEsXxlVFEZhItYA7wdFbY,12333
579
+ api_logic_server_cli/prototypes/base/test/api_logic_server_behave/behave_logic_report.py.bak,sha256=2rd4m5lmgMCRwEw5_ZSblyTySlMbnNPpR3Km6gsy0xY,11572
580
580
  api_logic_server_cli/prototypes/base/test/api_logic_server_behave/behave_run.py,sha256=KvHQAlsyF2heBvoD6voAkhIVJXS1AAKaHEcw77AsD3Q,2429
581
581
  api_logic_server_cli/prototypes/base/test/api_logic_server_behave/check_step_order.py,sha256=E0-hDVRlkC2Rgi-HiE9Sd2PCwlVwX3f13atMZX72fYg,4824
582
582
  api_logic_server_cli/prototypes/base/test/api_logic_server_behave/features/about.feature,sha256=c7KDFyXpX_84n6JhUtGzruX-bwb1fxNyYD57ttyWpwA,414
@@ -630,6 +630,8 @@ api_logic_server_cli/prototypes/basic_demo/customizations/logic/declare_logic.py
630
630
  api_logic_server_cli/prototypes/basic_demo/customizations/logic/logic_discovery/email_request.py,sha256=3UnBUBpHSThHHRLLJuV-sgRAs6sS-UCzsTjBzf0onns,1851
631
631
  api_logic_server_cli/prototypes/basic_demo/customizations/logic/logic_discovery/simple_constraints.py,sha256=4HRLOXuLJP1eOosONeEtpA9DehxiZME0-FBKuG1RaI0,760
632
632
  api_logic_server_cli/prototypes/basic_demo/customizations/security/declare_security.py,sha256=gbdH29cPY656lgROPm_w20Q-g6AhlIMES3wiIrqBTdk,2439
633
+ api_logic_server_cli/prototypes/basic_demo/customizations/test/api_logic_server_behave/reports/Behave Logic Report Intro micro.md,sha256=zy5rlGweEfq5X2n6vh6ohBkPR6MX_eyJ15j0IcMzcZc,1222
634
+ api_logic_server_cli/prototypes/basic_demo/customizations/test/api_logic_server_behave/reports/Behave Logic Report Intro.md,sha256=UNf2_6RjMS6sFMrSa-GDydoTz5MoWN20rX6Z9_a5MB8,1258
633
635
  api_logic_server_cli/prototypes/basic_demo/customizations/ui/admin/admin.yaml,sha256=t7NhcorYcJbox2Kk7Hb3RBWwVEyCcCzZfYx8rntE-yA,3293
634
636
  api_logic_server_cli/prototypes/basic_demo/customizations/ui/admin/home.js,sha256=0YSOlZAyhYOm7eKSVRMspzEc_P7PO-lRaUurYGCqQ10,3371
635
637
  api_logic_server_cli/prototypes/basic_demo/customizations/ui/reference_react_app/README.md,sha256=XZWAqxnRWxZ1yVS65g3j6etrcdxX1QDf2TZSms67Yd0,489
@@ -986,7 +988,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/training/
986
988
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/training/react_map.prompt.md,sha256=8B9bDjk4sL1t5LzYLKjuf78UPDmhj9assRZTIOvlwN4,891
987
989
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/training/react_tree.prompt.md,sha256=Eoi4Q3H4x-PQOjonUjQ1o6xkiFtcEA_hg8tuFP-qk80,652
988
990
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/training/readme_training.md,sha256=EilDTYaDPoGCD9ef5Efs8eDn8ZNQTgGN7_QnJ4LrO2s,120
989
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/training/testing.md,sha256=bYAy0AiSWeel6Ezi0BO0_bg-D6j_Jnmou_xL7WB-rD0,20399
991
+ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/training/testing.md,sha256=embArgUMijhQbVSmBpEW9TCEXBpE9evAt7qJSOP7qmA,28556
990
992
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/integration/kafka/kafka_consumer.py,sha256=2DOsFpYnsJ71gZzzfJweEmL-i99uCtEFU0hVwIKFGMw,1516
991
993
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/integration/kafka/kafka_producer.py,sha256=g0nMAVfz1Y0iKJbbXfvRpdf-QUmyB4uUGZ6lyaVoXag,4470
992
994
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/integration/kafka/kafka_readme.md,sha256=MlwykHWM2w41KzWh4vPuTnIodR8f-BQzrWpV4P1hrsI,161
@@ -1042,7 +1044,8 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/__init__.
1042
1044
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/readme_test.md,sha256=9uvv3lR0UDNvtv-KrH82z_DWXYLElmUj0tl56MWJ2m8,17128
1043
1045
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/AI-Generated-Tests-from-Rules.md,sha256=G09jLAapospjju7HohX_RgpKTHlit9kovgFM76XbMgo,22627
1044
1046
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1045
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/behave_logic_report.py,sha256=dK0QZMi6ux3KVlwDQIht2_ww7YJHnocd4M2jtf9dvSU,11324
1047
+ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/behave_logic_report.py,sha256=4pjKlLBsdzuFF-yh5VPmuoXfQHUsIuutY1_TogRRH9c,8922
1048
+ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/behave_logic_report.py.bak,sha256=dK0QZMi6ux3KVlwDQIht2_ww7YJHnocd4M2jtf9dvSU,11324
1046
1049
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/behave_run.py,sha256=KvHQAlsyF2heBvoD6voAkhIVJXS1AAKaHEcw77AsD3Q,2429
1047
1050
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/features/about.feature,sha256=c7KDFyXpX_84n6JhUtGzruX-bwb1fxNyYD57ttyWpwA,414
1048
1051
  api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/test/api_logic_server_behave/features/order_processing.feature,sha256=KscQw3dUUFvXaGeZL2xs6CLtplf2-nwLH7_oDcDjumA,3077
@@ -1387,7 +1390,7 @@ api_logic_server_cli/prototypes/manager/samples/prompts/genai_demo.prompt,sha256
1387
1390
  api_logic_server_cli/prototypes/manager/system/Manager_workspace.code-workspace,sha256=sfzw6ZW2eZHOJCKmTM3r-Kt_fE1KKArD9fk4TLI5xUY,329
1388
1391
  api_logic_server_cli/prototypes/manager/system/readme_ssystem.md,sha256=52zXRh5KJ4GSRWyNLwzbXqKMDJmR7M6PhS71-DIUoBI,106
1389
1392
  api_logic_server_cli/prototypes/manager/system/style-guide.yaml,sha256=JaP3NDE29k4_e9ELeLTZfnWf2L8VgS1X7hO8J_BNqJU,673
1390
- api_logic_server_cli/prototypes/manager/system/ApiLogicServer-Internal-Dev/copilot-dev-context.md,sha256=LFZIIa80VSMNiCZNIG_Y9ZanhyJvxXUZ0cYGMUYuUhg,6833
1393
+ api_logic_server_cli/prototypes/manager/system/ApiLogicServer-Internal-Dev/copilot-dev-context.md,sha256=bOLcRyfb5D8ta2NOfNZT22h25-gzNFlCY92o2rmfNSk,9816
1391
1394
  api_logic_server_cli/prototypes/manager/system/ApiLogicServer-Internal-Dev/install-ApiLogicServer-dev.ps1,sha256=RBV9nGJZBkvCoH06UJ5o15Kmt5nIeLXeIvTCmpHLWXE,3433
1392
1395
  api_logic_server_cli/prototypes/manager/system/ApiLogicServer-Internal-Dev/install-ApiLogicServer-dev.sh,sha256=zutEcQNZ1DX9gaUSRbsAcIClsy_a7inHWcb2dpcYgWY,3677
1393
1396
  api_logic_server_cli/prototypes/manager/system/ApiLogicServer-Internal-Dev/readme.md,sha256=NSr2hEKT1XeFMzJ_x5vcbdEFZ4PJz_GobdjRg-TyLHU,206
@@ -1527,7 +1530,8 @@ api_logic_server_cli/prototypes/manager/system/app_model_editor/security/system/
1527
1530
  api_logic_server_cli/prototypes/manager/system/app_model_editor/security/system/custom_swagger.json,sha256=rq-W5pnAWKSms20TPqUw2rsXq8OJgoX7Cs1eV8xnbcU,1705
1528
1531
  api_logic_server_cli/prototypes/manager/system/app_model_editor/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1529
1532
  api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1530
- api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/behave_logic_report.py,sha256=tXH_AmStMMgObNpxtJkcZ3vPcGldTTV3iUeukdqP3DE,9969
1533
+ api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/behave_logic_report.py,sha256=T9wRh5eqGhsTIQDSawXbwg81PP9FilEDRkAd4B6nltk,8052
1534
+ api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/behave_logic_report.py.bak,sha256=tXH_AmStMMgObNpxtJkcZ3vPcGldTTV3iUeukdqP3DE,9969
1531
1535
  api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/behave_run.py,sha256=NaTK_X-9BljLQVqgIw2hB7jn-VilRB9DFRAh06TxVrE,1281
1532
1536
  api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/features/about.feature,sha256=c7KDFyXpX_84n6JhUtGzruX-bwb1fxNyYD57ttyWpwA,414
1533
1537
  api_logic_server_cli/prototypes/manager/system/app_model_editor/test/api_logic_server_behave/features/steps/about.py,sha256=Z6-JUv2-ANp04ctvEdylOXBW7PE1t9Ofhxb8UJRkJ_Y,465
@@ -2030,7 +2034,8 @@ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_d
2030
2034
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/security/system/custom_swagger.json,sha256=rq-W5pnAWKSms20TPqUw2rsXq8OJgoX7Cs1eV8xnbcU,1705
2031
2035
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2032
2036
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2033
- api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/behave_logic_report.py,sha256=tXH_AmStMMgObNpxtJkcZ3vPcGldTTV3iUeukdqP3DE,9969
2037
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/behave_logic_report.py,sha256=T9wRh5eqGhsTIQDSawXbwg81PP9FilEDRkAd4B6nltk,8052
2038
+ api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/behave_logic_report.py.bak,sha256=tXH_AmStMMgObNpxtJkcZ3vPcGldTTV3iUeukdqP3DE,9969
2034
2039
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/behave_run.py,sha256=KvHQAlsyF2heBvoD6voAkhIVJXS1AAKaHEcw77AsD3Q,2429
2035
2040
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/features/about.feature,sha256=c7KDFyXpX_84n6JhUtGzruX-bwb1fxNyYD57ttyWpwA,414
2036
2041
  api_logic_server_cli/prototypes/manager/system/genai/examples/genai_demo/genai_demo_docs_logic/test/api_logic_server_behave/features/steps/about.py,sha256=Z6-JUv2-ANp04ctvEdylOXBW7PE1t9Ofhxb8UJRkJ_Y,465
@@ -2465,6 +2470,8 @@ api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/features/steps/p
2465
2470
  api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/features/steps/salary_change.py,sha256=ge6XE5iR33PkpX9HyTeN63ztObl3WLFuEQze94WH9I8,5031
2466
2471
  api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/features/steps/test_utils.py,sha256=5NTKwf0ZFXE10Q3FVIWL6VKQd8ISG_6FwSWXRBONQ70,4779
2467
2472
  api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/features/steps/tests_successful.py,sha256=A0KRSy6JUENefYzMOgeiSYbd7NzSkPObtZ3ppxcP9js,1513
2473
+ api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/reports/Behave Logic Report Intro micro.md,sha256=vHXrAJUASJX5kv-DpxYg6nPqIWLYxdmeD4LIdMwPhyc,612
2474
+ api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/reports/Behave Logic Report Intro.md,sha256=vHXrAJUASJX5kv-DpxYg6nPqIWLYxdmeD4LIdMwPhyc,612
2468
2475
  api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/wip/espression_parser.py,sha256=2W9DFZ_EtTiEms-exBdLAqiosRbWb6dn5xYGqIb4BiE,5785
2469
2476
  api_logic_server_cli/prototypes/nw/test/api_logic_server_behave/wip/expression_parser.feature,sha256=cQmyCXCjSs_8wcvSxyf0czDOtzLPwG_zfx-M_DurGMY,1022
2470
2477
  api_logic_server_cli/prototypes/nw/test/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -2849,9 +2856,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
2849
2856
  api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
2850
2857
  api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
2851
2858
  api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
2852
- apilogicserver-15.2.0.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
2853
- apilogicserver-15.2.0.dist-info/METADATA,sha256=kg0INb9_F_CJb19aZheiaWp5LXs9gC2uDpSR85YFnN4,19075
2854
- apilogicserver-15.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
2855
- apilogicserver-15.2.0.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
2856
- apilogicserver-15.2.0.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
2857
- apilogicserver-15.2.0.dist-info/RECORD,,
2859
+ apilogicserver-15.2.3.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
2860
+ apilogicserver-15.2.3.dist-info/METADATA,sha256=Z-Y8Zyr4rStFTN6ivyP4FoYZiRyapwqRvt4bMuvgYUs,25085
2861
+ apilogicserver-15.2.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
2862
+ apilogicserver-15.2.3.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
2863
+ apilogicserver-15.2.3.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
2864
+ apilogicserver-15.2.3.dist-info/RECORD,,