ApiLogicServer 16.0.3__py3-none-any.whl → 16.0.5__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.
- api_logic_server_cli/api_logic_server.py +3 -1
- api_logic_server_cli/api_logic_server_info.yaml +3 -3
- api_logic_server_cli/prototypes/base/database/system/SAFRSBaseX.py +2 -2
- api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.md +1 -1
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py +2 -2
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/MCP-DB.png +0 -0
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/check_credit.py +5 -21
- api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_ai_mcp.md +446 -0
- api_logic_server_cli/prototypes/manager/samples/readme_samples.md +1 -0
- api_logic_server_cli/prototypes/ont_app/ontimize_seed/package.json +4 -4
- api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py +21 -4
- api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen_wrapper.py +2 -1
- {apilogicserver-16.0.3.dist-info → apilogicserver-16.0.5.dist-info}/METADATA +1 -3
- {apilogicserver-16.0.3.dist-info → apilogicserver-16.0.5.dist-info}/RECORD +18 -16
- {apilogicserver-16.0.3.dist-info → apilogicserver-16.0.5.dist-info}/WHEEL +0 -0
- {apilogicserver-16.0.3.dist-info → apilogicserver-16.0.5.dist-info}/entry_points.txt +0 -0
- {apilogicserver-16.0.3.dist-info → apilogicserver-16.0.5.dist-info}/licenses/LICENSE +0 -0
- {apilogicserver-16.0.3.dist-info → apilogicserver-16.0.5.dist-info}/top_level.txt +0 -0
|
@@ -12,9 +12,11 @@ ApiLogicServer CLI: given a database url, create [and run] customizable ApiLogic
|
|
|
12
12
|
Called from api_logic_server_cli.py, by instantiating the ProjectRun object.
|
|
13
13
|
'''
|
|
14
14
|
|
|
15
|
-
__version__ = "16.00.
|
|
15
|
+
__version__ = "16.00.05" # last public release: 16.00.04
|
|
16
16
|
recent_changes = \
|
|
17
17
|
f'\n\nRecent Changes:\n' +\
|
|
18
|
+
"\t01/05/2026 - 16.00.05: no pandas, for win11 Python 3.13 install \n"\
|
|
19
|
+
"\t12/11/2025 - 16.00.04: bug fix [106] - SqlServer autoinsert \n"\
|
|
18
20
|
"\t11/25/2025 - 16.00.03: Probabalistic logic (w/ fallback, cand*) - see basic_demo/readme_ai_mcp.md \n"\
|
|
19
21
|
"\t11/12/2025 - 15.04.03: Copilot rules on updates, tighter basic_demo startup, allow for demo_ai_mcp/then tutorial \n"\
|
|
20
22
|
"\t11/08/2025 - 15.04.00: Nat lang Copilot data access, fix Manager/Copilot startup, finding venv in project \n"\
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
last_created_date:
|
|
2
|
-
last_created_project_name: ../../../servers/
|
|
3
|
-
last_created_version:
|
|
1
|
+
last_created_date: December 10, 2025 19:14:55
|
|
2
|
+
last_created_project_name: ../../../servers/postgres-nw
|
|
3
|
+
last_created_version: 16.00.04
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from sqlalchemy.ext.declarative import declarative_base
|
|
3
|
-
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String
|
|
3
|
+
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String, and_
|
|
4
4
|
from safrs import SAFRSBase, ValidationError
|
|
5
5
|
from flask_login import UserMixin
|
|
6
6
|
import safrs, flask_sqlalchemy
|
|
@@ -119,7 +119,7 @@ class SAFRSBaseX(SAFRSBase, safrs.DB.Model):
|
|
|
119
119
|
expressions.append(op(attr, attr_val))
|
|
120
120
|
|
|
121
121
|
if len(filters) > 1:
|
|
122
|
-
return query.filter(
|
|
122
|
+
return query.filter(and_(*expressions))
|
|
123
123
|
else:
|
|
124
124
|
return query.filter(*expressions)
|
|
125
125
|
|
api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
We asked **GitHub Copilot** to generate business logic code from natural language requirements.
|
|
11
11
|
|
|
12
|
-
It generated **220 lines of procedural code
|
|
12
|
+
It generated **220 lines of procedural code** (to see it, [click here](https://github.com/ApiLogicServer/ApiLogicServer-src/blob/main/api_logic_server_cli/prototypes/basic_demo/logic/procedural/credit_service.py)).
|
|
13
13
|
|
|
14
14
|
We asked: **"What if the order's customer_id changes?"**
|
|
15
15
|
Copilot found a critical bug and fixed it.
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from sqlalchemy.ext.declarative import declarative_base
|
|
3
|
-
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String
|
|
3
|
+
from sqlalchemy import Column, DECIMAL, Date, ForeignKey, Integer, String, and_
|
|
4
4
|
from safrs import SAFRSBase, ValidationError
|
|
5
5
|
from flask_login import UserMixin
|
|
6
6
|
import safrs, flask_sqlalchemy
|
|
@@ -119,7 +119,7 @@ class SAFRSBaseX(SAFRSBase, safrs.DB.Model):
|
|
|
119
119
|
expressions.append(op(attr, attr_val))
|
|
120
120
|
|
|
121
121
|
if len(filters) > 1:
|
|
122
|
-
return query.filter(
|
|
122
|
+
return query.filter(and_(*expressions))
|
|
123
123
|
else:
|
|
124
124
|
return query.filter(*expressions)
|
|
125
125
|
|
|
@@ -24,24 +24,8 @@ def declare_logic():
|
|
|
24
24
|
5. The Item unit_price is copied from the Product unit_price
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
Rule.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# 2. The Customer's balance is the sum of the Order amount_total where date_shipped is null
|
|
33
|
-
Rule.sum(derive=models.Customer.balance,
|
|
34
|
-
as_sum_of=models.Order.amount_total,
|
|
35
|
-
where=lambda row: row.date_shipped is None)
|
|
36
|
-
|
|
37
|
-
# 3. The Order's amount_total is the sum of the Item amount
|
|
38
|
-
Rule.sum(derive=models.Order.amount_total,
|
|
39
|
-
as_sum_of=models.Item.amount)
|
|
40
|
-
|
|
41
|
-
# 4. The Item amount is the quantity * unit_price
|
|
42
|
-
Rule.formula(derive=models.Item.amount,
|
|
43
|
-
as_expression=lambda row: row.quantity * row.unit_price)
|
|
44
|
-
|
|
45
|
-
# 5. The Item unit_price is copied from the Product unit_price
|
|
46
|
-
Rule.copy(derive=models.Item.unit_price,
|
|
47
|
-
from_parent=models.Product.unit_price)
|
|
27
|
+
Rule.constraint(validate=models.Customer, as_condition=lambda row: row.balance <= row.credit_limit, error_msg="Customer balance exceeds credit limit")
|
|
28
|
+
Rule.sum(derive=models.Customer.balance, as_sum_of=models.Order.amount_total, where=lambda row: row.date_shipped is None)
|
|
29
|
+
Rule.sum(derive=models.Order.amount_total, as_sum_of=models.Item.amount)
|
|
30
|
+
Rule.formula(derive=models.Item.amount, as_expression=lambda row: row.quantity * row.unit_price)
|
|
31
|
+
Rule.copy(derive=models.Item.unit_price, from_parent=models.Product.unit_price)
|
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: MCP AI Example
|
|
3
|
+
notes: gold dource is docs
|
|
4
|
+
source: docs/Integration-MCP-AI-Example
|
|
5
|
+
do_process_code_block_titles: True
|
|
6
|
+
version: 0.1, for readme 11.09/25
|
|
7
|
+
---
|
|
8
|
+
<style>
|
|
9
|
+
-typeset h1,
|
|
10
|
+
-content__button {
|
|
11
|
+
display: none;
|
|
12
|
+
}
|
|
13
|
+
</style>
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
****Copilot** uses **MCP discovery** to create, interact with, and enforce logic in **GenAI-Logic projects****
|
|
18
|
+
|
|
19
|
+
##
|
|
20
|
+
**Prompt 1 (Create System):**
|
|
21
|
+
<img src="docs/MCP-DB.png" alt="MDP-DB" width="400" align="right">
|
|
22
|
+
*Create a system named basic_demo from samples/dbs/basic_demo.sqlite*
|
|
23
|
+
|
|
24
|
+
**Prompt 2 (Add NL Logic):**
|
|
25
|
+
|
|
26
|
+
*Use case: Check Credit:*<br>
|
|
27
|
+
|
|
28
|
+
*1. The Customer's balance is less than the credit limit*<br>
|
|
29
|
+
*2. The Customer's balance is the sum of the Order amount_total where date_shipped is null*<br>
|
|
30
|
+
*3. The Order's amount_total is the sum of the Item amount*<br>
|
|
31
|
+
*4. The Item amount is the quantity * unit_price*<br>
|
|
32
|
+
*5. The Product count suppliers is the sum of the Product Suppliers*<br>
|
|
33
|
+
*6. Item unit_price copied from the Product*<br>
|
|
34
|
+
|
|
35
|
+
*Use case: App Integration*
|
|
36
|
+
|
|
37
|
+
*1. Send the Order to Kafka topic 'order_shipping' if the date_shipped is not None.*
|
|
38
|
+
|
|
39
|
+
(Developers review this DSL before execution, providing a natural human-in-the-loop checkpoint.)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
**Prompt 3 (Test via MCP-discovered API):** *Constraint blocks bad data* -- as shown below: ️
|
|
43
|
+
|
|
44
|
+
*On Alice's first order, update the widget quantity to 100*
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+

|
|
48
|
+
|
|
49
|
+
The diagram above shows the final step of a complete system, built and tested by Copilot with no manual code edits.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## Step 1 – Create System
|
|
54
|
+
In the GenAI-Logic [Manager](https://apilogicserver.github.io/Docs/Manager.md), use Copilot to create an application from an existing database — complete with Admin App, API, and MCP discovery.
|
|
55
|
+
**Step 1: Create Project:**
|
|
56
|
+
```bash title='Step 1: Create Project'
|
|
57
|
+
create a system named basic_demo from samples/dbs/basic_demo.sqlite
|
|
58
|
+
```
|
|
59
|
+
This command:
|
|
60
|
+
|
|
61
|
+
* Creates a new project folder (`basic_demo`)
|
|
62
|
+
* Generates a full **JSON:API** with auto-discovered tables (Customer, Order, Item, Product)
|
|
63
|
+
|
|
64
|
+
* This sqlite sample database (Customers, Orders, Items and Products) is provided when you install GenAI-Logic
|
|
65
|
+
|
|
66
|
+
* Builds a **React Admin App** for instant data access
|
|
67
|
+
* Exposes **MCP metadata** at `/.well-known/mcp.json`, enabling Copilot or ChatGPT to automatically discover the schema and usage patterns
|
|
68
|
+
* Opens a new instance of VSCode on the project
|
|
69
|
+
|
|
70
|
+
The project is ready to run:
|
|
71
|
+
|
|
72
|
+
* In the new project, use Copilot: `start the server` (or click F5)
|
|
73
|
+
* You can explore the admin app and the API, then `stop the server` (or Shift/F5)
|
|
74
|
+
|
|
75
|
+
**Result:** a working three-tier system in under a minute — *database → API → web app → MCP discovery*.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## Step 2 – NL Logic
|
|
80
|
+
Copilot reads the MCP schema and responds to a natural-language instruction such as:
|
|
81
|
+
|
|
82
|
+
**Step 2: Declare Logic:**
|
|
83
|
+
```bash title='Step 2: Declare Logic'
|
|
84
|
+
Use case: Check Credit
|
|
85
|
+
1. The Customer's balance is less than the credit limit
|
|
86
|
+
2. The Customer's balance is the sum of the Order amount_total where date_shipped is null
|
|
87
|
+
3. The Order's amount_total is the sum of the Item amount
|
|
88
|
+
4. The Item amount is the quantity * unit_price
|
|
89
|
+
5. The Item unit_price is copied from the Product unit_price
|
|
90
|
+
|
|
91
|
+
Use case: App Integration
|
|
92
|
+
1. Send the Order to Kafka topic 'order_shipping' if the date_shipped is not None.
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
It then inserts the following rules into `logic/declare_logic.py`:
|
|
96
|
+
```python
|
|
97
|
+
Rule.constraint(validate=Customer, as_condition=lambda row: row.balance <= row.credit_limit)
|
|
98
|
+
Rule.sum(derive=Customer.balance, as_sum_of=Order.amount_total)
|
|
99
|
+
Rule.sum(derive=Order.amount_total, as_sum_of=Item.amount)
|
|
100
|
+
Rule.formula(derive=Item.amount, as_expression=lambda row: row.quantity * row.unit_price)
|
|
101
|
+
Rule.copy(derive=Item.unit_price, from_parent=Product)
|
|
102
|
+
```
|
|
103
|
+
These **five declarative lines** replace hundreds of lines of procedural code, automatically providing:
|
|
104
|
+
|
|
105
|
+
* Credit-limit validation
|
|
106
|
+
* Multi-table derivations
|
|
107
|
+
* Multi-table chaining
|
|
108
|
+
* Unit-price propagation
|
|
109
|
+
|
|
110
|
+
All enforced by the **LogicBank** engine during each API transaction.
|
|
111
|
+
|
|
112
|
+
> AI can get a bit frisky - e.g., it might import objects not used. Don't take any guff - make it fix any errors - it's quite good at that.
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
## Step 3 – Test with MCP
|
|
117
|
+
Copilot can now test the new rule using the MCP-discovered API — no manual coding required.
|
|
118
|
+
**Test with CoPilot and MCP Discovery:**
|
|
119
|
+
```bash title='Test with CoPilot and MCP Discovery'
|
|
120
|
+
Update Alice’s first order so that the quantity for the Widget is 100
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Copilot uses MCP discovery (`.well-known`) to construct and issue this JSON:API request:
|
|
124
|
+
**Copilot issues::**
|
|
125
|
+
```bash title='Copilot issues:'
|
|
126
|
+
curl -X PATCH http://localhost:5656/api/Item/2 -H "Content-Type: application/vnd.api+json" -d '{"data": {"type": "Item", "id": "2", "attributes": {"quantity": 100}}}'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
> Tech Note: this is an *MCP-discovered API* — not yet a registered VS Code MCP tool; discovery alone enables this interaction.
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
### Multi-Table Logic Chaining
|
|
134
|
+
| Trigger | Effect |
|
|
135
|
+
|----------|---------|
|
|
136
|
+
| `Item.quantity` | Recalculates `Item.amount` |
|
|
137
|
+
| `Item.amount` | Updates `Order.amount_total` |
|
|
138
|
+
| `Order.amount_total` | Updates `Customer.balance` |
|
|
139
|
+
| `Customer.balance` | Fires credit-limit constraint |
|
|
140
|
+
|
|
141
|
+
**Outcome:** The logic engine detects that Alice’s balance would exceed her credit limit and **rejects the transaction automatically**.
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
### Runtime Trace
|
|
146
|
+
```
|
|
147
|
+
.Item[2] {update}
|
|
148
|
+
.Order[2] {update – Adjusting order.amount_total}
|
|
149
|
+
.Customer[1] {update – Adjusting customer.balance}
|
|
150
|
+
.Customer[1] {Constraint Failure: Customer balance > credit limit}
|
|
151
|
+
```
|
|
152
|
+
See the screen shot at the top of this page.
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
### Copilot’s Response
|
|
157
|
+
> *Business logic working correctly!*
|
|
158
|
+
> *Update prevented automatically to enforce credit limit.*
|
|
159
|
+
|
|
160
|
+
Copilot used MCP to discover the schema, executed the update, and interpreted the deterministic response — proof that **AI + Logic collaboration** can be both natural and reliable.
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
## Architecture Summary
|
|
165
|
+
| Layer | Role | Description |
|
|
166
|
+
|-------|------|-------------|
|
|
167
|
+
| **Database** | Existing model | e.g. `sample_ai.sqlite` |
|
|
168
|
+
| **GenAI-Logic** | Auto-generated API + Logic runtime | Declarative rules via LogicBank |
|
|
169
|
+
| **MCP** | Discovery protocol | Enables AI to understand and safely invoke APIs |
|
|
170
|
+
| **Copilot** | Natural-language interface | Adds and tests business logic |
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
## Connecting to MCP Integration
|
|
175
|
+
This example continues the flow described in [**MCP Integration**](../Integration-MCP/):
|
|
176
|
+
|
|
177
|
+
* **MCP Server Executors** = your logic-enabled APIs
|
|
178
|
+
* **MCP Client Executors** = AI agents like Copilot that translate NL requests into Tool Context Blocks
|
|
179
|
+
* **Declarative Logic** ensures every AI-driven transaction remains safe and auditable
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
## Related Docs
|
|
184
|
+
|
|
185
|
+
* [Integration: MCP](../Integration-MCP/)
|
|
186
|
+
* [Logic: Rule Types](../Logic/)
|
|
187
|
+
* [Sample: Basic Demo](../Sample-Basic-Demo/)
|
|
188
|
+
* [Study: Declarative vs. Procedural GenAI - A/B Comparison](https://apilogicserver.github.io/Docs/Logic-Why-Declarative-GenAI)
|
|
189
|
+
|
|
190
|
+
_This example illustrates the **Business Logic Agent** pattern — Copilot supplies intent, GenAI-Logic guarantees deterministic execution._
|
|
191
|
+
|
|
192
|
+
<br>
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Study: Why Not Just CodeGen?
|
|
197
|
+
|
|
198
|
+
Some months back, we asked a question you might have wondered about...
|
|
199
|
+
> Instead of **NL → DSL → Engine**, why not just have GenAI code it all?
|
|
200
|
+
|
|
201
|
+
<details markdown>
|
|
202
|
+
|
|
203
|
+
<summary>We ran an A/B Test, Did Some Reseach... Here's What We Found</summary>
|
|
204
|
+
|
|
205
|
+
Our [**complete study is here**](https://apilogicserver.github.io/Docs/Logic-Why-Declarative-GenAI), summarized below.
|
|
206
|
+
|
|
207
|
+
<br>
|
|
208
|
+
|
|
209
|
+
<details markdown>
|
|
210
|
+
|
|
211
|
+
<summary>1. We Tried It: an A/B Test</summary>
|
|
212
|
+
|
|
213
|
+
<br>We tried: we asked Claude Sonnet 4-5 to translate **five rules** into code
|
|
214
|
+
|
|
215
|
+
* ~200 lines → **2 correctness bugs** + performance hit
|
|
216
|
+
|
|
217
|
+
Then something remarkable happened:
|
|
218
|
+
|
|
219
|
+
* After finding the second bug, [**AI itself wrote a review**](https://github.com/ApiLogicServer/ApiLogicServer-src/blob/main/api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison#what-happened-here) explaining why procedural logic *cannot* be correct for dependency graphs.
|
|
220
|
+
**→ Bugs came from transitive dependencies, not weak prompts.**
|
|
221
|
+
It recognized the problem was structural — not model quality.
|
|
222
|
+
|
|
223
|
+
</details>
|
|
224
|
+
|
|
225
|
+
<br>
|
|
226
|
+
|
|
227
|
+
<details markdown>
|
|
228
|
+
|
|
229
|
+
<summary>2. We Researched It: Alice et al</summary>
|
|
230
|
+
|
|
231
|
+
<br>Complex dependencies are a *well-known boundary* for code generation.
|
|
232
|
+
|
|
233
|
+
Paths can be tested, never proven complete.
|
|
234
|
+
|
|
235
|
+
1. LLMs show consistent weaknesses in multi-step reasoning and state tracking—the same failure mode seen in dependency propagation. See: **“Alice in Wonderland: Simple Tasks Showing Complete Reasoning Breakdown in State-Of-the-Art Large Language Models”** ([arXiv:2406.02061](https://arxiv.org/abs/2406.02061)).
|
|
236
|
+
|
|
237
|
+
2. A study titled “LMs: Understanding Code Syntax and Semantics for Code Analysis” found that while large language models (LLMs) excel at syntax, they struggle with semantics — especially dynamic semantics, which includes behavior over time, dependencies and state changes. [Click here](https://arxiv.org/abs/2305.12138?utm_source=chatgpt.com).
|
|
238
|
+
|
|
239
|
+
3. A survey of AI usage in business found that AI still has limits in understanding domain-specific business rules, complex dependencies, verifying all cases, etc. [Click here](https://www.sciencedirect.com/science/article/pii/S219985312400132X?utm_source=chatgpt.com).
|
|
240
|
+
|
|
241
|
+
4. Industry commentary (e.g., from SonarSource) states explicitly: “AI models have limitations in understanding complex business logic or domain-specific requirements.” [Click here](https://www.sonarsource.com/resources/library/ai-code-generation-benefits-risks/?utm_source=chatgpt.com).
|
|
242
|
+
|
|
243
|
+
</details>
|
|
244
|
+
|
|
245
|
+
<br>
|
|
246
|
+
|
|
247
|
+
<details markdown>
|
|
248
|
+
|
|
249
|
+
<summary>3. We Reflected: Evolution Remains a Challenge</summary>
|
|
250
|
+
|
|
251
|
+
<br>Procedural glue is opaque, and every change forces full regeneration for dependency management — risking new bugs each time.
|
|
252
|
+
|
|
253
|
+
Declarative rules avoid this.
|
|
254
|
+
|
|
255
|
+
Rules are **self-organizing**: on startup, the engine discovers dependencies and guarantees ordering, propagation, and constraints. This allows:
|
|
256
|
+
|
|
257
|
+
* Add or change **one rule at a time**
|
|
258
|
+
* Place new rules anywhere that makes sense - the engine recomputes the dependency graph automatically
|
|
259
|
+
* Existing logic remains correct without regeneration
|
|
260
|
+
|
|
261
|
+
This mirrors SQL: you don’t re-emit the entire schema to add one new query.
|
|
262
|
+
|
|
263
|
+
Declarative logic turns iterative change from a **rewrite problem** into an **append problem** — exactly what long-lived systems require for business agility.
|
|
264
|
+
|
|
265
|
+
</details>
|
|
266
|
+
|
|
267
|
+
<br>
|
|
268
|
+
|
|
269
|
+
<details markdown>
|
|
270
|
+
|
|
271
|
+
<summary>4. Intuitively... sql vs dbms</summary>
|
|
272
|
+
|
|
273
|
+
<br>You expect a natural-language **query to call a DBMS**, not **create one.**
|
|
274
|
+
|
|
275
|
+
Likewise, NL business logic should **call a rules engine**, not emit procedural code.
|
|
276
|
+
|
|
277
|
+
You want AI to *help* you with your spreadsheet, not *be excel*.
|
|
278
|
+
|
|
279
|
+
> AI can *help* with most anything, but it doesn't need to *be* everything.
|
|
280
|
+
|
|
281
|
+
</details>
|
|
282
|
+
<br>
|
|
283
|
+
|
|
284
|
+
<details markdown>
|
|
285
|
+
|
|
286
|
+
<summary>5. Finally - Governable Intent</summary>
|
|
287
|
+
|
|
288
|
+
<br> **AI → DSL → Engine**
|
|
289
|
+
|
|
290
|
+
- **AI (probabilistic):** NL intent → rules / DSL
|
|
291
|
+
- **DSL (deterministic):** human in the loop
|
|
292
|
+
- **Engine (runtime execution):** rules → ordering, propagation, constraints, debug, logging
|
|
293
|
+
- **Guardrails:** deterministic rules define *when* AI runs and how outputs are governed
|
|
294
|
+
|
|
295
|
+
> AI expresses intent; the engine enforces correctness.
|
|
296
|
+
|
|
297
|
+
</details>
|
|
298
|
+
|
|
299
|
+
</details>
|
|
300
|
+
|
|
301
|
+
<br>
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## Business Logic Agent: A Unified Model of Governable Creativity
|
|
306
|
+
|
|
307
|
+
But AI provides creativity that businesses want... how do we provide that, *with goverance?*
|
|
308
|
+
|
|
309
|
+
<details markdown>
|
|
310
|
+
|
|
311
|
+
<summary>Unified Deterministic and Probabilistic Logic</summary>
|
|
312
|
+
|
|
313
|
+
<br>Enterprises want the best of both: the creativity of probabalistic logic, *with* the governability of deterministic logic -- all in one unified Business Logic Agent. Here's an example, and we then generalize.
|
|
314
|
+
|
|
315
|
+
<br>
|
|
316
|
+
|
|
317
|
+
<details markdown>
|
|
318
|
+
|
|
319
|
+
<summary>A. Example: Choose Supplier, based on current world conditions</summary>
|
|
320
|
+
|
|
321
|
+
Agentic systems are evolving quickly, and a clearer architectural picture is forming:
|
|
322
|
+
|
|
323
|
+
> Not AI *vs* Rules — **AI and Rules together.**
|
|
324
|
+
|
|
325
|
+
Different kinds of logic naturally call for different tools, as in this unified example:
|
|
326
|
+
|
|
327
|
+
* **Deterministic Logic** — logic that must always be correct, consistent, and governed.
|
|
328
|
+
*Example:* “Customer balance must not exceed credit limit.”
|
|
329
|
+
|
|
330
|
+
* **Creative Logic** — logic that benefits from exploration, adaptation, and probabilistic reasoning.
|
|
331
|
+
*Example:* “Which supplier can still deliver if shipping lanes are disrupted?”
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
* **Creative reasoning needs boundaries.<br>Deterministic rules supply the guardrails that keep outcomes correct, consistent, and governed.**
|
|
335
|
+
|
|
336
|
+
**Declare Logic: Deterministic and Probabilistic:**
|
|
337
|
+
```bash title='Declare Logic: Deterministic and Probabilistic'
|
|
338
|
+
Use case: Check Credit:
|
|
339
|
+
|
|
340
|
+
1. The Customer's balance is less than the credit limit
|
|
341
|
+
2. The Customer's balance is the sum of the Order amount_total where date_shipped is null
|
|
342
|
+
3. The Order's amount_total is the sum of the Item amount
|
|
343
|
+
4. The Item amount is the quantity * unit_price
|
|
344
|
+
5. The Product count suppliers is the sum of the Product Suppliers
|
|
345
|
+
6. Use AI to Set Item field unit_price by finding the optimal Product Supplier
|
|
346
|
+
based on cost, lead time, and world conditions
|
|
347
|
+
|
|
348
|
+
Use case: App Integration
|
|
349
|
+
1. Send the Order to Kafka topic 'order_shipping' if the date_shipped is not None.
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
And then, test via MCP-discovered API:** *Constraint blocks bad data*: ️
|
|
353
|
+
**Test Logic with MCP Discovery:**
|
|
354
|
+
```bash title='Test Logic with MCP Discovery'
|
|
355
|
+
On Alice's first order, include 100 Egyptian Cotton Sheets
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
<details markdown>
|
|
359
|
+
|
|
360
|
+
<summary>Data Model, including AI Audit Trail</summary>
|
|
361
|
+
|
|
362
|
+
<br>
|
|
363
|
+
|
|
364
|
+

|
|
365
|
+
|
|
366
|
+
</details>
|
|
367
|
+
|
|
368
|
+
</details>
|
|
369
|
+
|
|
370
|
+
<br>
|
|
371
|
+
|
|
372
|
+
<details markdown>
|
|
373
|
+
|
|
374
|
+
<summary>B. The Business Logic Agent</summary>
|
|
375
|
+
|
|
376
|
+
<br> **The Business Logic Agent** processes a *declarative NL requests:*
|
|
377
|
+
|
|
378
|
+
- At declaration time (e.g., in Copilot):
|
|
379
|
+
|
|
380
|
+
* **D1:** Accepts a unified declarative NL request
|
|
381
|
+
* **D2.** Uses GenAI to create
|
|
382
|
+
* Rules (in Python DSL: Domain Specific Logic) for deterministic Logic
|
|
383
|
+
* LLM calls for Probablistic
|
|
384
|
+
|
|
385
|
+
- At runtime
|
|
386
|
+
|
|
387
|
+
* **R1:** DSL is executed by the Rules Engine (deterministic - no NL pocessing occurs)
|
|
388
|
+
* **R2:** LLM calls
|
|
389
|
+
|
|
390
|
+

|
|
391
|
+
|
|
392
|
+
**Agentic systems become far more compelling when probabilistic intent is paired with deterministic enforcement.**
|
|
393
|
+
|
|
394
|
+
This "governable intent" model aligns with enterprise expectations —
|
|
395
|
+
adaptive where helpful, reliable where essential.
|
|
396
|
+
|
|
397
|
+
**The Business Logic Agent unifies probabilistic intent with deterministic enforcement in a single model**
|
|
398
|
+
|
|
399
|
+
</details>
|
|
400
|
+
|
|
401
|
+
<br>
|
|
402
|
+
|
|
403
|
+
<details markdown>
|
|
404
|
+
|
|
405
|
+
<summary>C. Echoes Modern Thinking</summary>
|
|
406
|
+
|
|
407
|
+
<br>Lamanna: *"Sometimes customers don't want the model to freestyle…
|
|
408
|
+
They want hard-coded business rules."*
|
|
409
|
+
→ Exactly this hybrid: **probabilistic intent + deterministic enforcement**
|
|
410
|
+
|
|
411
|
+
> Governable AI
|
|
412
|
+
|
|
413
|
+
</details>
|
|
414
|
+
|
|
415
|
+
</details>
|
|
416
|
+
|
|
417
|
+
<br>
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## Heads-Up: AI-Enabled Projects
|
|
422
|
+
|
|
423
|
+
<details markdown>
|
|
424
|
+
|
|
425
|
+
<summary>Copilot can help you understand, learn, and do... here's how</summary>
|
|
426
|
+
|
|
427
|
+
<br>
|
|
428
|
+
|
|
429
|
+
GenAI-Logic projects are already **AI-enabled**, meaning they come with built-in training materials that help assistants like **GitHub Copilot**, **Claude**, or **ChatGPT** understand your project context. For more information, see [AI-Enabled Projects Overview](https://apilogicserver.github.io/Docs/Project-AI-Enabled.md).
|
|
430
|
+
|
|
431
|
+
Once you’ve completed this demo, try engaging your AI assistant directly — it already knows about your project’s structure, rules, and examples.
|
|
432
|
+
|
|
433
|
+
*Understand* GenAI-Logic by **asking Copilot questions** such as:
|
|
434
|
+
|
|
435
|
+
- “Where are the declarative business rules defined?”
|
|
436
|
+
- “Explain how credit-limit validation works in this project.”
|
|
437
|
+
- “Show me how to add a new rule for discount calculation.”
|
|
438
|
+
- “Walk me through the AI Guided Tour.”
|
|
439
|
+
|
|
440
|
+
*Learn* about GenAI-Logic with the *AI-Guided Tour*. **Just ask Copilot: *guide me through***.
|
|
441
|
+
|
|
442
|
+
- note: you should first delete `logic/logic_discovery/check_credit.py`)
|
|
443
|
+
|
|
444
|
+
In addition to all the things CoPilot can do natively, we've taught it about GenAI-Logic. **Just ask Copilot: *what can you help me with?***
|
|
445
|
+
|
|
446
|
+
</details>
|
|
@@ -34,6 +34,7 @@ genai-logic create --db_url=sqlite:///samples/dbs/todos.sqlite --project_name=to
|
|
|
34
34
|
genai-logic create --db_url=sqlite:////Users/val/dev/ApiLogicServer/ApiLogicServer-dev/clean/ApiLogicServer/samples/dbs/todos.sqlite --project_name=todo
|
|
35
35
|
|
|
36
36
|
# from localhost to mysql container
|
|
37
|
+
genai-logic create --db_url=mysql+pymysql://root:p@localhost:3306/Northwind --project_name=mysql-northwind
|
|
37
38
|
genai-logic create --db_url=mysql+pymysql://root:p@localhost:3306/classicmodels --project_name=docker_classicmodels
|
|
38
39
|
genai-logic create --db_url=mysql+pymysql://root:p@localhost:3306/Chinook --project_name=docker_chinook
|
|
39
40
|
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"@angular/router": "^15.2.10",
|
|
31
31
|
"@angular/service-worker": "^15.2.10",
|
|
32
32
|
"@angular/upgrade": "^15.2.10",
|
|
33
|
-
"ontimize-web-ngx": "15.
|
|
34
|
-
"ontimize-web-ngx-charts": "15.2.
|
|
35
|
-
"ontimize-web-ngx-filemanager": "^15.1.
|
|
36
|
-
"ontimize-web-ngx-map": "15.0.
|
|
33
|
+
"ontimize-web-ngx": "15.7.1",
|
|
34
|
+
"ontimize-web-ngx-charts": "15.2.1",
|
|
35
|
+
"ontimize-web-ngx-filemanager": "^15.1.1",
|
|
36
|
+
"ontimize-web-ngx-map": "15.0.1",
|
|
37
37
|
"ontimize-web-ngx-report": "15.1.0-next.3",
|
|
38
38
|
"ontimize-web-ngx-keycloak": "15.0.0",
|
|
39
39
|
"rxjs": "~7.8.0",
|
|
@@ -1204,6 +1204,7 @@ else:
|
|
|
1204
1204
|
column.index = True
|
|
1205
1205
|
kwarg.append('index')
|
|
1206
1206
|
|
|
1207
|
+
autoincrement = False
|
|
1207
1208
|
if Computed and isinstance(column.server_default, Computed):
|
|
1208
1209
|
expression = self._get_compiled_expression(column.server_default.sqltext)
|
|
1209
1210
|
|
|
@@ -1214,17 +1215,24 @@ else:
|
|
|
1214
1215
|
server_default = 'Computed({!r}{})'.format(expression, persist_arg)
|
|
1215
1216
|
|
|
1216
1217
|
elif column.server_default:
|
|
1218
|
+
# tests:
|
|
1219
|
+
# SQL Server Types [TVF]. server_default is Identity(start=1, increment=1) sqlalchemy.sql.schema.Identity
|
|
1220
|
+
# 6 - Create Postgres (servers) server_default is DefaultClause: sqlalchemy.sql.schema.DefaultClause
|
|
1221
|
+
# dev must pip install psycopg==3.2.13, pip install psycopg-binary==3.2.13
|
|
1217
1222
|
# The quote escaping does not cover pathological cases but should mostly work FIXME SqlSvr no .arg
|
|
1218
1223
|
# not used for postgres/mysql; for sqlite, text is '0'
|
|
1219
|
-
if
|
|
1220
|
-
|
|
1221
|
-
else:
|
|
1224
|
+
if hasattr( column.server_default, 'arg' ):
|
|
1225
|
+
pass # employee_id = Column(Integer, server_default=text("nextval('employees_employee_id_seq'::regclass)"), primary_key=True)
|
|
1222
1226
|
default_expr = self._get_compiled_expression(column.server_default.arg)
|
|
1223
1227
|
if '\n' in default_expr:
|
|
1224
1228
|
server_default = 'server_default=text("""\\\n{0}""")'.format(default_expr)
|
|
1225
1229
|
else:
|
|
1226
1230
|
default_expr = default_expr.replace('"', '\\"')
|
|
1227
1231
|
server_default = 'server_default=text("{0}")'.format(default_expr)
|
|
1232
|
+
elif isinstance(column.server_default, sqlalchemy.sql.schema.Identity): # sqlsvr is different
|
|
1233
|
+
autoincrement = True # EmployeeId = Column(Integer, primary_key=True, autoincrement=True)
|
|
1234
|
+
else:
|
|
1235
|
+
server_default = 'server_default=text("{0}")'.format('0')
|
|
1228
1236
|
|
|
1229
1237
|
comment = getattr(column, 'comment', None)
|
|
1230
1238
|
if (column.name + "") == "xx_id":
|
|
@@ -1233,20 +1241,29 @@ else:
|
|
|
1233
1241
|
log.debug(f"render_column show name is true: {column.table.name}.{column.name}") # researching why
|
|
1234
1242
|
if column.name == "credit_limit" and column.table.name == "customers":
|
|
1235
1243
|
debug_stop = "render column breakpoint"
|
|
1244
|
+
if column.name == "photo" and column.table.name == "employees":
|
|
1245
|
+
debug_stop = "render column breakpoint"
|
|
1236
1246
|
rendered_col_type = self.render_column_type(column.type) if render_coltype else ""
|
|
1237
1247
|
rendered_name = repr(column.name) if do_show_name else ""
|
|
1248
|
+
"""
|
|
1249
|
+
The {0} gets replaced by whatever is passed to .format().
|
|
1250
|
+
In this case, it's the result of ', '.join(...)
|
|
1251
|
+
which joins together all the column attributes (name, type, constraints, defaults, etc.) with commas.
|
|
1252
|
+
eg. Column(Integer, primary_key=True), Column(String(8000))
|
|
1253
|
+
"""
|
|
1238
1254
|
render_result = 'Column({0})'.format(', '.join(
|
|
1239
1255
|
([repr(column.name)] if do_show_name else []) +
|
|
1240
1256
|
([self.render_column_type(column.type)] if render_coltype else []) +
|
|
1241
1257
|
[self.render_constraint(x) for x in dedicated_fks] +
|
|
1242
1258
|
[repr(x) for x in column.constraints] +
|
|
1243
1259
|
([server_default] if server_default else []) +
|
|
1260
|
+
(['autoincrement=True'] if autoincrement else []) +
|
|
1244
1261
|
['{0}={1}'.format(k, repr(getattr(column, k))) for k in kwarg] +
|
|
1245
1262
|
(['comment={!r}'.format(comment)] if comment and not self.nocomments else []) +
|
|
1246
1263
|
(['quote = True'] if self.model_creation_services.project.quote else [])
|
|
1247
1264
|
))
|
|
1248
1265
|
|
|
1249
|
-
"""
|
|
1266
|
+
""" old version without quote = True
|
|
1250
1267
|
return 'Column({0})'.format(', '.join(
|
|
1251
1268
|
([repr(column.name)] if show_name else []) +
|
|
1252
1269
|
([self.render_column_type(column.type)] if render_coltype else []) +
|
|
@@ -132,7 +132,7 @@ def fix_generated(code, args):
|
|
|
132
132
|
code = code.replace(bad_import,"# " + bad_import)
|
|
133
133
|
code = code.replace(line1, line1 + bad_import + "\n")
|
|
134
134
|
# code = code.replace("Column(Image)","Column(Text)") FAILS - incompatible type
|
|
135
|
-
if "postgres" in args.url:
|
|
135
|
+
if fix_postgress_largebinary := False and "postgres" in args.url:
|
|
136
136
|
code = code.replace("Column(LargeBinary)","Column(Text)")
|
|
137
137
|
|
|
138
138
|
# Column(IMAGE)
|
|
@@ -217,6 +217,7 @@ def create_models_memstring(args) -> str:
|
|
|
217
217
|
# For Python 3.13+, force PostgreSQL URLs to use psycopg3 dialect
|
|
218
218
|
engine_url = args.url
|
|
219
219
|
if sys.version_info >= (3, 13) and engine_url.startswith('postgresql://'):
|
|
220
|
+
# dev must pip install psycopg==3.2.13, pip install psycopg-binary==3.2.13
|
|
220
221
|
engine_url = engine_url.replace('postgresql://', 'postgresql+psycopg://', 1)
|
|
221
222
|
|
|
222
223
|
engine = create_engine(engine_url) # type _engine.Engine
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ApiLogicServer
|
|
3
|
-
Version: 16.0.
|
|
3
|
+
Version: 16.0.5
|
|
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
|
|
@@ -63,8 +63,6 @@ Requires-Dist: behave==1.2.6
|
|
|
63
63
|
Requires-Dist: alembic==1.7.7
|
|
64
64
|
Requires-Dist: python-ulid==2.7.0
|
|
65
65
|
Requires-Dist: psutil==6.0.0
|
|
66
|
-
Requires-Dist: pandas==2.2.2
|
|
67
|
-
Requires-Dist: openpyxl==3.1.5
|
|
68
66
|
Requires-Dist: GeoAlchemy2==0.12.5
|
|
69
67
|
Requires-Dist: confluent-kafka==2.6.0
|
|
70
68
|
Requires-Dist: translate==3.6.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
api_logic_server_cli/api_logic_server.py,sha256=
|
|
3
|
-
api_logic_server_cli/api_logic_server_info.yaml,sha256=
|
|
2
|
+
api_logic_server_cli/api_logic_server.py,sha256=WAp_gKxezrCLjsnUaQmYMdOgM3-LqxzfVBNXNKIip14,105321
|
|
3
|
+
api_logic_server_cli/api_logic_server_info.yaml,sha256=99QQaYQFR0kerupFvyUdYGahGyE8Q_DffKa6ESNOUF4,133
|
|
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
|
|
6
6
|
api_logic_server_cli/cli_args_project.py,sha256=I5no_fGRV_ZsK3SuttVDAaQYI4Q5zCjx6LojGkM024w,4645
|
|
@@ -472,7 +472,7 @@ api_logic_server_cli/prototypes/base/database/alembic/versions/readme.md,sha256=
|
|
|
472
472
|
api_logic_server_cli/prototypes/base/database/database_discovery/authentication_models.py,sha256=8IGpWyNzr3BavktFP85gtsWcorTznR2DFeQb-9yCLZ4,6772
|
|
473
473
|
api_logic_server_cli/prototypes/base/database/database_discovery/auto_discovery.py,sha256=m-LFznTdM581n7xkisamzHIQZ3fEiY9RPKd4wzB6wYo,978
|
|
474
474
|
api_logic_server_cli/prototypes/base/database/db_debug/db_debug.py,sha256=ctcwksnM89597LUAme5Sn044r-xgRh47wSSe3MioPH4,3259
|
|
475
|
-
api_logic_server_cli/prototypes/base/database/system/SAFRSBaseX.py,sha256=
|
|
475
|
+
api_logic_server_cli/prototypes/base/database/system/SAFRSBaseX.py,sha256=vMrJEaeqCVinJOAY1jhFhB-Ro372S_2lZlIsP9arMN4,5391
|
|
476
476
|
api_logic_server_cli/prototypes/base/database/test_data/alp_init.py,sha256=C7yqHB7KoOgwvzRsI3DVk9O_QHPu4SYioChv0Jz5xXY,1203
|
|
477
477
|
api_logic_server_cli/prototypes/base/database/test_data/readme.md,sha256=IDKVMagnjobf5IigYCkQkUMM_iLvBdhK9grMNImSOKg,694
|
|
478
478
|
api_logic_server_cli/prototypes/base/database/test_data/response2code.py,sha256=PTeAXHU-r6r0EBknSGXnbkdySAAzch_3gOuRlyUyVF8,4414
|
|
@@ -698,7 +698,7 @@ api_logic_server_cli/prototypes/basic_demo/iteration/logic/declare_logic.py,sha2
|
|
|
698
698
|
api_logic_server_cli/prototypes/basic_demo/iteration/ui/admin/admin.yaml,sha256=uqxqYNMbKm4aCaTOy5CnlAtYccYM32-oQLVi5K6tfNI,3554
|
|
699
699
|
api_logic_server_cli/prototypes/basic_demo/logic/declarative-vs-procedural-comparison.html,sha256=GUzgmnWdT709M5mPJGyfF1ARzzz3y5guASDBWeG43PU,3915
|
|
700
700
|
api_logic_server_cli/prototypes/basic_demo/logic/procedural/credit_service.py,sha256=n_7YzxxssaxfuB8-nu_jPrQ-H6leAqKjJQRfOKcQwR4,7525
|
|
701
|
-
api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.md,sha256=
|
|
701
|
+
api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.md,sha256=rCCDEbtbpnsGUfCFarhblNlcVWc8uZQf27nkYmXka88,16012
|
|
702
702
|
api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.png,sha256=JYukeefOas_GGBVvRGdHGAtD124H6EILQsEtjFxPrPE,842498
|
|
703
703
|
api_logic_server_cli/prototypes/basic_demo/ui/my-react-app/README.md,sha256=h7ePuwOqn3jv7YkjM4ruaP5rpYBmr_4Q3NChhb8pVJ4,452
|
|
704
704
|
api_logic_server_cli/prototypes/basic_demo/ui/my-react-app/README_create_react_app.md,sha256=cOr7x6X9RmqjITtafhsqQTg8vl1Ob8X0WC78WL21CdE,3359
|
|
@@ -817,12 +817,13 @@ api_logic_server_cli/prototypes/manager/.github/sync-to-dev-src.sh,sha256=hZbc5f
|
|
|
817
817
|
api_logic_server_cli/prototypes/manager/.github/welcome.md,sha256=9Wtufrx0wRf_5jgne8K9T6Sntm2yhyR3bnFKL_ch_0M,1841
|
|
818
818
|
api_logic_server_cli/prototypes/manager/.vscode/launch.json,sha256=B9NaDoTvJsXg1qeEuhG3RdRk4M2RpnpHBW6b8oXrBn4,33551
|
|
819
819
|
api_logic_server_cli/prototypes/manager/.vscode/settings.json,sha256=Ceq5Z34iC6hXNoPLahFHKAn39wjdh2VZqshkWAOXu9g,660
|
|
820
|
-
api_logic_server_cli/prototypes/manager/samples/readme_samples.md,sha256=
|
|
820
|
+
api_logic_server_cli/prototypes/manager/samples/readme_samples.md,sha256=Y8T9C4uaLOOfrTpJjqm1x9St1hqDTqttchjZbns2BnY,3739
|
|
821
821
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/.env,sha256=VCYAc9rxtOuDpv4Og6QwVV8bhzipEGu4sf--kI4Lq5k,355
|
|
822
822
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/.gitignore,sha256=PAO98cVvjgAL_mvXCMS_Vfk7bT2Vd1-j9a8_nB2qxqs,190
|
|
823
823
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/_config.yml,sha256=KIUQQpjgj7hP_Z2Fksq90E52UnbKnyom-v9L_eIfqZo,170
|
|
824
824
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/api_logic_server_run.py,sha256=Lvr_sihD9tuqGktSK3HhCKjwrcHkwkNaHWW-wSCglrg,6994
|
|
825
825
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme.md,sha256=YjvVHYlMAyD9YTaloIUBrOzHh48mYUwgnSTmLlrFDe4,18602
|
|
826
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_ai_mcp.md,sha256=nXiwHFO7I_N202nEjdbeMXjh2eYd9BkLsWeMDlsBU7M,16748
|
|
826
827
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_project.md,sha256=sGJuNF_Qt5ripZBXfTi0OmoV4fUxe7ySxrqcKs7DwOk,1186
|
|
827
828
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_standard.md,sha256=Vw7oXyJnvLVVfa-wBuzGUBu3czXi9_U7d5IftGF5x5g,18329
|
|
828
829
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/readme_vibe.md,sha256=ovlSTlsZfYjQ5NiHqMbo1oldaXGPKIo7nZyUImEF7fg,13374
|
|
@@ -943,7 +944,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/alemb
|
|
|
943
944
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/database_discovery/authentication_models.py,sha256=8IGpWyNzr3BavktFP85gtsWcorTznR2DFeQb-9yCLZ4,6772
|
|
944
945
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/database_discovery/auto_discovery.py,sha256=m-LFznTdM581n7xkisamzHIQZ3fEiY9RPKd4wzB6wYo,978
|
|
945
946
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/db_debug/db_debug.py,sha256=ctcwksnM89597LUAme5Sn044r-xgRh47wSSe3MioPH4,3259
|
|
946
|
-
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py,sha256=
|
|
947
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/system/SAFRSBaseX.py,sha256=Sx3191vMs8ochEv48AnvB-xsKZU8zSuCfPvbZ4qXEMY,5392
|
|
947
948
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/test_data/alp_init.py,sha256=C7yqHB7KoOgwvzRsI3DVk9O_QHPu4SYioChv0Jz5xXY,1203
|
|
948
949
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/test_data/readme.md,sha256=IDKVMagnjobf5IigYCkQkUMM_iLvBdhK9grMNImSOKg,694
|
|
949
950
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/database/test_data/response2code.py,sha256=PTeAXHU-r6r0EBknSGXnbkdySAAzch_3gOuRlyUyVF8,4414
|
|
@@ -983,6 +984,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/keycloa
|
|
|
983
984
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/keycloak/unused/auth_provider.py,sha256=e8PoH9Ck4nrMe-QY99Lh0G02gzn2ubnMauFVEpNbeQ8,2771
|
|
984
985
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/keycloak/unused/unused-docker-compose-keycloak.sh,sha256=YvYRD4ID8v7znslXKOlzu3hpN17h0O_zwGPkFYy1G20,353
|
|
985
986
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/devops/python-anywhere/python_anywhere_wsgi.py,sha256=CAvz31yoXUwNl6ZKtKA6cflJMPFZcFFvDic3VIOBxyc,3889
|
|
987
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/MCP-DB.png,sha256=FIQ-gjUQYw2NiRM3NzyDGHXAk-Y3rMBo0oduqOZ0OEg,26745
|
|
986
988
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/db.dbml,sha256=ddG3q_CxcbjbQ61CbqK5OT5YEhTRBVf9pyQlRrqi_YQ,875
|
|
987
989
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/models-not-code.png,sha256=XvndgzHphsAbpxfV1D5q8XvJfjK8NVHwDWj59HuQ1Ic,381811
|
|
988
990
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/docs/runtime engines.png,sha256=l9OCqVXZuALVhPQEBERtZDFdqgqojixm66cIKSZyNj0,105414
|
|
@@ -1033,7 +1035,7 @@ api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/load_ver
|
|
|
1033
1035
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/readme_logic.md,sha256=teXyg9-7b-1OAj_kLC7gQ37zNllTRFnovdq2LGsyg6E,10178
|
|
1034
1036
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/app_integration.py,sha256=wy8MXTKbYRhv-N5Jm5Q-mW4UtFrk6Q2y1ZeGbUoUVas,863
|
|
1035
1037
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/auto_discovery.py,sha256=m97W6DYi6ouTDuFCiU1rPq1UqzJuNnVePyOeLU33D1s,2645
|
|
1036
|
-
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/check_credit.py,sha256=
|
|
1038
|
+
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/check_credit.py,sha256=GnWg3OZVZWo09EFRvnzjuLwaQXrHbmjmIeaKu6wAIt8,1687
|
|
1037
1039
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/mcp_client_executor_request.py,sha256=X6jlA_xcR7RpbFgc5uY5yDFTCKp0eGHnVubIT2M0AbU,2184
|
|
1038
1040
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/readme_logic_discovery.md,sha256=SRg3Hrq3vCjqtAL1XijcbPGvfLLgkqsODLtIKfZUEaI,396
|
|
1039
1041
|
api_logic_server_cli/prototypes/manager/samples/basic_demo_sample/logic/logic_discovery/use_case.py,sha256=M3TQZwBaAtgEyNjP_Hl8s35x_zEpzpnIrtxmD7sL1NY,916
|
|
@@ -2615,7 +2617,7 @@ api_logic_server_cli/prototypes/ont_app/ontimize_seed/docker-compose-ontimize.ym
|
|
|
2615
2617
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/karma.conf.js,sha256=Q7cZOkcrjCTxX69D5MqQ3PI8eTP0nxV36fIDu_xGylM,1037
|
|
2616
2618
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/ngsw-config.json,sha256=glcgrz-2KB2haUlGFyjmobH1kKAq5ZWf1xoAOyOWJ9w,620
|
|
2617
2619
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/package-lock.json,sha256=G7q3FYtAH9VX1p8fMIJvC9Ot7hnOur980ersbTXnEss,577163
|
|
2618
|
-
api_logic_server_cli/prototypes/ont_app/ontimize_seed/package.json,sha256=
|
|
2620
|
+
api_logic_server_cli/prototypes/ont_app/ontimize_seed/package.json,sha256=NP8Y2PpT5Owaq-ciYOXPh7f6BssZQHaBzwUekQz33e8,2262
|
|
2619
2621
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/tsconfig.app.json,sha256=hyYKRbyu1xs_xaJGVOPu5jcEek2oP8DMIeKN5X6Yla0,272
|
|
2620
2622
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/tsconfig.json,sha256=gx_giKrzvilZmNVRkJ0LYQPBQCIgYbSIfQwQx5yXQbk,568
|
|
2621
2623
|
api_logic_server_cli/prototypes/ont_app/ontimize_seed/tsconfig.spec.json,sha256=vV38h43m3prBlu4Wm_e2ZSYh6eV1vZayMH6zeU8PTcM,270
|
|
@@ -2827,7 +2829,7 @@ api_logic_server_cli/sqlacodegen_wrapper/Readme.md,sha256=pcBng3xB7DHqcLSY9NgVlt
|
|
|
2827
2829
|
api_logic_server_cli/sqlacodegen_wrapper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2828
2830
|
api_logic_server_cli/sqlacodegen_wrapper/console_log.txt,sha256=RvaA45ZgMc5won9JzwK9BMK0LKfkiARNS0EW31vjTeM,53944
|
|
2829
2831
|
api_logic_server_cli/sqlacodegen_wrapper/requirements.txt,sha256=13u62njPM4Emzdxow4V8xxYVjBQoO3aSAtNt0Z_V3aE,54
|
|
2830
|
-
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen_wrapper.py,sha256=
|
|
2832
|
+
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen_wrapper.py,sha256=hScDU6cKyp2SLDaH_Ag3KMvJ5hL1kcYkzKZ8bzlNSiM,22582
|
|
2831
2833
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/.travis.yml,sha256=mz8WDjTN-Rj9quyH-OZfTRcrACRZ98Dk0V_Z1v8udGY,1850
|
|
2832
2834
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/CHANGES.rst,sha256=lpwnI9rMfFx-TbbTa83B0qmracfKFSKnJMDVBR150fk,2593
|
|
2833
2835
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/README.rst,sha256=i5RCj2RqmvoDWv4tczRiJ3a5ONugmW69-kjbTzGc7JA,3865
|
|
@@ -2837,7 +2839,7 @@ api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/setup.cfg,sha256=BmOXcaPR0F
|
|
|
2837
2839
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/setup.py,sha256=ekn0wq_leWEKgpvijFLI881EVokkaZZhfmZYSQIZquo,196
|
|
2838
2840
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/tox.ini,sha256=mVlmM_uI-7K4pLs-jBfu8ZOQpHwQj8fh7LogvwjXJyE,440
|
|
2839
2841
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2840
|
-
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py,sha256=
|
|
2842
|
+
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/codegen.py,sha256=gwfwhLfWuZqaWf81ALVnTtDPyzWlbyZuzktXnXeoZs8,79110
|
|
2841
2843
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/main.py,sha256=BX0gX5e9n5MSzE2tr3O3yRmWuv55mjDI3Z2JSACrUd4,3840
|
|
2842
2844
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/als_safrs_310/delete_log.txt,sha256=gMkXWPBkd-jEb-P7UA8WkCnV8tAccBL-IhT41Jz5TRw,16390
|
|
2843
2845
|
api_logic_server_cli/sqlacodegen_wrapper/sqlacodegen/sqlacodegen/als_safrs_310/notes.txt,sha256=6KP8dOvdWsIGrpRmaueXbo_ZpD-6Edz-pOfTE80cScA,3991
|
|
@@ -2872,9 +2874,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
|
|
|
2872
2874
|
api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
|
|
2873
2875
|
api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
|
|
2874
2876
|
api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
|
|
2875
|
-
apilogicserver-16.0.
|
|
2876
|
-
apilogicserver-16.0.
|
|
2877
|
-
apilogicserver-16.0.
|
|
2878
|
-
apilogicserver-16.0.
|
|
2879
|
-
apilogicserver-16.0.
|
|
2880
|
-
apilogicserver-16.0.
|
|
2877
|
+
apilogicserver-16.0.5.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
|
|
2878
|
+
apilogicserver-16.0.5.dist-info/METADATA,sha256=_ChrME40ux4Z4SGn5gXiiRXOYp-yYRnQqvnkiuwquoY,26401
|
|
2879
|
+
apilogicserver-16.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
2880
|
+
apilogicserver-16.0.5.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
|
|
2881
|
+
apilogicserver-16.0.5.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
|
|
2882
|
+
apilogicserver-16.0.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|