ApiLogicServer 15.0.33__py3-none-any.whl → 15.0.37__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 +5 -3
- api_logic_server_cli/api_logic_server_info.yaml +2 -2
- api_logic_server_cli/fragments/docker-compose.yml +1 -0
- api_logic_server_cli/manager.py +13 -11
- api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_context_results.txt +142 -0
- api_logic_server_cli/prototypes/base/integration/mcp/mcp_client_executor.py +65 -29
- api_logic_server_cli/prototypes/manager/README.md +106 -92
- api_logic_server_cli/prototypes/manager/samples/dbs/readme_samples.md +7 -1
- api_logic_server_cli/prototypes/manager/samples/readme_samples.md +1 -1
- api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-Resource-Learning-Prompt.md +3 -2
- api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-js-Learning-Prompt.md +4 -14
- api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/README.md +4 -5
- api_logic_server_cli/prototypes/manager/system/readme_ssystem.md +2 -0
- api_logic_server_cli/prototypes/nw/ui/reference_react_app/README.md +9 -3
- api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Customer.js +145 -24
- {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/METADATA +1 -1
- {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/RECORD +21 -19
- {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/WHEEL +0 -0
- {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/entry_points.txt +0 -0
- {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/licenses/LICENSE +0 -0
- {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/top_level.txt +0 -0
|
@@ -12,9 +12,10 @@ 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__ = "15.00.
|
|
15
|
+
__version__ = "15.00.37" # last public release: 15.00.36 (15.00.12)
|
|
16
16
|
recent_changes = \
|
|
17
17
|
f'\n\nRecent Changes:\n' +\
|
|
18
|
+
"\t07/02/2024 - 15.00.37: minor bug in mgr symlink creation, nw cards, mgr readme diagnostics, mcp printer \n"\
|
|
18
19
|
"\t06/30/2024 - 15.00.33: Tech Preview: genai-logic genai-add-app --vibe, bug [96, 97] \n"\
|
|
19
20
|
"\t06/10/2024 - 15.00.12: MCP Security, win fixes for readme, graphics quotes \n"\
|
|
20
21
|
"\t06/08/2024 - 15.00.10: MCP, optional shortening of stacktrace lines, bugfix[92] \n"\
|
|
@@ -100,6 +101,7 @@ if debug_value is not None:
|
|
|
100
101
|
logging.getLogger('sqlacodegen_wrapper.sqlacodegen.sqlacodegen.codegen').setLevel(logging.DEBUG)
|
|
101
102
|
logging.getLogger('api_logic_server_cli.sqlacodegen_wrapper.sqlacodegen_wrapper').setLevel(logging.DEBUG)
|
|
102
103
|
logging.getLogger('create_from_model.model_creation_services').setLevel(logging.DEBUG)
|
|
104
|
+
logging.getLogger('api_logic_server_cli.manager').setLevel(logging.DEBUG)
|
|
103
105
|
|
|
104
106
|
|
|
105
107
|
# log.debug("Patch to enable import of outer directories")
|
|
@@ -779,7 +781,7 @@ def fix_build_docker_image(msg, project: Project):
|
|
|
779
781
|
|
|
780
782
|
def start_open_with(project: Project):
|
|
781
783
|
""" Creation complete. Opening {open_with} at {project_name} """
|
|
782
|
-
log.info(f'\
|
|
784
|
+
log.info(f'\n✅ Creation complete - Opening {project.open_with} at {project.project_name}')
|
|
783
785
|
log.debug(".. See the readme for install / run instructions")
|
|
784
786
|
if project.is_docker:
|
|
785
787
|
log.info("... docker unable to start IDE - please run manager on local host")
|
|
@@ -1684,7 +1686,7 @@ from database import <project.bind_key>_models
|
|
|
1684
1686
|
log.info(f' exit # exit the Docker container ')
|
|
1685
1687
|
log.info(f' code {docker_project_name} # e.g., open VSCode on created project\n')
|
|
1686
1688
|
else:
|
|
1687
|
-
log.info(f'\
|
|
1689
|
+
log.info(f'\n✅ Project created at: {str(self.project_directory_path)}\n')
|
|
1688
1690
|
|
|
1689
1691
|
# log.info(f' $ ApiLogicServer run # Run created API and Admin App, or\n')
|
|
1690
1692
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
last_created_date:
|
|
1
|
+
last_created_date: July 01, 2025 14:38:20
|
|
2
2
|
last_created_project_name: samples/nw_sample_nocust
|
|
3
|
-
last_created_version: 15.00.
|
|
3
|
+
last_created_version: 15.00.35
|
api_logic_server_cli/manager.py
CHANGED
|
@@ -46,18 +46,18 @@ def create_manager(clean: bool, open_with: str, api_logic_server_path: Path,
|
|
|
46
46
|
|
|
47
47
|
Side Effects:
|
|
48
48
|
Creates a symbolic link from 'cli_path/database/basic_demo.sqlite' to 'mgr_path/samples/dbs/basic_demo'.
|
|
49
|
-
Prints a confirmation message upon successful creation.
|
|
50
49
|
|
|
51
|
-
Raises:
|
|
52
|
-
OSError: If the symbolic link cannot be created (e.g., due to permissions or existing link).
|
|
53
50
|
"""
|
|
54
51
|
|
|
55
52
|
# create symbolic link - thanks https://www.geeksforgeeks.org/python/python-os-symlink-method/
|
|
56
53
|
try:
|
|
57
|
-
os.symlink(cli_path.parent / 'database/basic_demo.sqlite', mgr_path / 'samples/
|
|
58
|
-
|
|
54
|
+
os.symlink(cli_path.parent / 'database/basic_demo.sqlite', mgr_path / 'samples/dbs/basic_demo.sqlite')
|
|
55
|
+
os.symlink(cli_path.parent / 'database/nw-gold.sqlite', mgr_path / 'samples/dbs/nw.sqlite')
|
|
56
|
+
os.symlink(cli_path.parent / 'database/Chinook_Sqlite.sqlite', mgr_path / 'samples/dbs/chinook.sqlite')
|
|
57
|
+
os.symlink(cli_path.parent / 'database/classicmodels.sqlite', mgr_path / 'samples/dbs/classicmodels.sqlite')
|
|
58
|
+
log.debug("✅ Manager Creation - SymLink created: samples/dbs/")
|
|
59
59
|
except Exception as e:
|
|
60
|
-
|
|
60
|
+
log.debug(f"❌ Manager Creation - SymLink creation failed: {str(e)}")
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
log = logging.getLogger(__name__)
|
|
@@ -145,21 +145,23 @@ def create_manager(clean: bool, open_with: str, api_logic_server_path: Path,
|
|
|
145
145
|
copied_path = shutil.copytree(src=from_docker_dir, dst=to_dir, dirs_exist_ok=True)
|
|
146
146
|
|
|
147
147
|
# get latest readme from git (eg, has been updated since pip install)
|
|
148
|
-
|
|
148
|
+
get_readme_url = f"https://raw.githubusercontent.com/ApiLogicServer/ApiLogicServer-src/main/api_logic_server_cli/prototypes/manager/README.md"
|
|
149
|
+
# https://github.com/ApiLogicServer/ApiLogicServer-src/main/api_logic_server_cli/prototypes/manager/README.md
|
|
149
150
|
readme_path = to_dir.joinpath('README.md')
|
|
150
151
|
try:
|
|
151
|
-
r = requests.get(
|
|
152
|
+
r = requests.get(get_readme_url) # , params=params)
|
|
152
153
|
if r.status_code == 200:
|
|
153
154
|
readme_data = r.content.decode('utf-8')
|
|
154
155
|
with open(str(readme_path), "w", encoding="utf-8") as readme_file:
|
|
155
156
|
readme_file.write(readme_data)
|
|
157
|
+
log.debug("✅ Wrote Manager Readme from git")
|
|
156
158
|
except requests.exceptions.ConnectionError as conerr:
|
|
157
159
|
# without this, windows fails if network is down
|
|
158
|
-
|
|
160
|
+
log.debug("❌ Manager Readme from git failed, using pip-installed version")
|
|
159
161
|
except Exception as e: # do NOT fail
|
|
160
|
-
log.error(f'
|
|
162
|
+
log.error(f'❌ Manager Readme from git excp installed: {e}')
|
|
161
163
|
pass # just fall back to using the pip-installed version
|
|
162
|
-
create_utils.copy_md(from_doc_file='Sample-Basic-Tour.md', project = to_dir)
|
|
164
|
+
create_utils.copy_md(from_doc_file='Sample-Basic-Tour.md', project = to_dir) # does this just override whatever?
|
|
163
165
|
|
|
164
166
|
if not samples:
|
|
165
167
|
shutil.rmtree(to_dir.joinpath(f'{docker_volume}system/app_model_editor'))
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
|
|
2
|
+
1. Discovered MCP servers from config file: integration/mcp/../../integration/mcp/mcp_server_discovery.json:{
|
|
3
|
+
"servers": [
|
|
4
|
+
{
|
|
5
|
+
"name": "API Logic Server: basic_demo",
|
|
6
|
+
"base_url": "http://localhost:5656",
|
|
7
|
+
"schema_url": "http://localhost:5656/.well-known/mcp.json"
|
|
8
|
+
}
|
|
9
|
+
]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
Learnings and Schema from discovery schema_url: http://localhost:5656/.well-known/mcp.json:
|
|
14
|
+
{
|
|
15
|
+
"base_url": "http://localhost:5656/api",
|
|
16
|
+
"description": "API Logic Project: basic_demo",
|
|
17
|
+
"learning": "To issue one request per row from a prior step (fan-out), use the syntax:\n\n\"$<stepIndex>[*].<fieldName>\"\n\nFor example, if step 0 returns orders, and you want to send a POST per customer:\n\nBefore (incorrect):\n \"customer_id\": \"{customer_id}\"\n\nAfter (correct):\n \"customer_id\": \"$0[*].customer_id\"\n \nOnly if 'email' is in the Natural language query, send email by issing a POST request to the SysEmail endpoint, setting the subject, message and customer_id in the body. DO NOT include a POST unless the word \u2018email\u2019 appears in the user query.\n\nFormat response as mcp_responseFormat.\n\n<mcp_responseFormat>\nclass QueryParam(BaseModel):\n name: str # attribute name\n op: str # eq, lt, gt\n val: str\n\nclass JsonValues(BaseMopdel):\n name: str # name of attribute\n value: str # value of attribute\n\nclass Resource(BaseModel):\n tool_type: str\n base_url: str\n path: str # specified use case or requirement name (use 'General' if missing)\n method: str # GET, PATCH, POST or DELETE\n body: json # data for P
|
|
18
|
+
"resources":
|
|
19
|
+
[
|
|
20
|
+
{
|
|
21
|
+
"fields": [
|
|
22
|
+
"id",
|
|
23
|
+
"name",
|
|
24
|
+
"balance",
|
|
25
|
+
"credit_limit",
|
|
26
|
+
"email",
|
|
27
|
+
"email_opt_out"
|
|
28
|
+
],
|
|
29
|
+
"filterable": [
|
|
30
|
+
... etc
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
2a. LLM request:
|
|
35
|
+
|
|
36
|
+
Natural language query:
|
|
37
|
+
List the orders date_shipped is null and CreatedOn before 2023-07-14, and send a discount email (subject: 'Discount Offer') to the customer for each one.
|
|
38
|
+
|
|
39
|
+
Learnings_and_Schema:
|
|
40
|
+
{"http://localhost:5656/.well-known/mcp.json": {"base_url": "http://localhost:5656/api", "description": "API Logic Project: basic_demo", "learning": "To issue one request per row from a prior step (fan-out), use the syntax:\n\n\"$<stepIndex>[*].<fieldName>\"\n\nFor example, if step 0 returns orders, and you want to send a POST per customer:\n\nBefore (incorrect):\n \"customer_id\": \"{customer_id}\"\n\nAfter (correct):\n \"customer_id\": \"$0[*].customer_id\"\n \nOnly if 'email' is in the Natural language query, send email by issing a POST request to the SysEmail endpoint, setting the subject, message and customer_id in the body. DO NOT include a POST unless the word \u2018email\u2019 appears in the user query.\n\nFormat response as mcp_responseFormat.\n\n<mcp_responseFormat>\nclass QueryParam(BaseModel):\n name: str # attribute name\n op: str # eq, lt, gt\n val: str\n\nclass JsonValues(BaseMopdel):\n name: str # name of attribute\n value: str # value of attribute\n\nclass Resource(BaseModel):\n tool_type: str\n base_url: str\n path: str # specified use case or requirement name (use 'General' if missing)\n method: str # GET, PATCH, POST or
|
|
41
|
+
... etc from step 1
|
|
42
|
+
|
|
43
|
+
2b. generated tool context from LLM:
|
|
44
|
+
{
|
|
45
|
+
"schema_version": "1.0",
|
|
46
|
+
"resources": [
|
|
47
|
+
{
|
|
48
|
+
"tool_type": "json-api",
|
|
49
|
+
"base_url": "http://localhost:5656/api",
|
|
50
|
+
"path": "/Order",
|
|
51
|
+
"method": "GET",
|
|
52
|
+
"query_params": [
|
|
53
|
+
{
|
|
54
|
+
"name": "date_shipped",
|
|
55
|
+
"op": "eq",
|
|
56
|
+
"val": "null"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "CreatedOn",
|
|
60
|
+
"op": "lt",
|
|
61
|
+
"val": "2023-07-14"
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"tool_type": "json-api",
|
|
67
|
+
"base_url": "http://localhost:5656/api",
|
|
68
|
+
"path": "/SysEmail",
|
|
69
|
+
"method": "POST",
|
|
70
|
+
"body": {
|
|
71
|
+
"subject": "Discount Offer",
|
|
72
|
+
"message": "Dear customer, we are offering a discount on your next purchase. Please check your account for more details.",
|
|
73
|
+
"customer_id": "$0[*].customer_id"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
3. MCP Client Executor – Starting Tool Context Execution
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
➡️ MCP execute_api_step[0]:
|
|
84
|
+
Method: GET http://localhost:5656/api/Order
|
|
85
|
+
Query: filter=[{"name": "date_shipped", "op": "eq", "val": null}, {"name": "CreatedOn", "op": "lt", "val": "2023-07-14"}]
|
|
86
|
+
Body: {}
|
|
87
|
+
|
|
88
|
+
Warning: No Flask request context available. secure API calls may not work as expected.
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
➡️ MCP execute_api_step[1]:
|
|
92
|
+
Method: POST http://localhost:5656/api/SysEmail
|
|
93
|
+
Query: filter=[]
|
|
94
|
+
Body: {'data': {'type': 'SysEmail', 'attributes': {'subject': 'Discount Offer', 'message': 'Dear customer, we are offering a discount on your next purchase. Please check your account for more details.', 'customer_id': 1}}}
|
|
95
|
+
|
|
96
|
+
Warning: No Flask request context available. secure API calls may not work as expected.
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
➡️ MCP execute_api_step[1]:
|
|
100
|
+
Method: POST http://localhost:5656/api/SysEmail
|
|
101
|
+
Query: filter=[]
|
|
102
|
+
Body: {'data': {'type': 'SysEmail', 'attributes': {'subject': 'Discount Offer', 'message': 'Dear customer, we are offering a discount on your next purchase. Please check your account for more details.', 'customer_id': 3}}}
|
|
103
|
+
|
|
104
|
+
Warning: No Flask request context available. secure API calls may not work as expected.
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
➡️ MCP execute_api_step[1]:
|
|
108
|
+
Method: POST http://localhost:5656/api/SysEmail
|
|
109
|
+
Query: filter=[]
|
|
110
|
+
Body: {'data': {'type': 'SysEmail', 'attributes': {'subject': 'Discount Offer', 'message': 'Dear customer, we are offering a discount on your next purchase. Please check your account for more details.', 'customer_id': 5}}}
|
|
111
|
+
|
|
112
|
+
Warning: No Flask request context available. secure API calls may not work as expected.
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
4. MCP Client Executor – Context Results:
|
|
116
|
+
|
|
117
|
+
Step 0 - Results (3 rows):
|
|
118
|
+
| CreatedOn | amount_total | customer_id | date_shipped | notes |
|
|
119
|
+
|------------|--------------|-------------|--------------|------------------|
|
|
120
|
+
| 2023-02-22 | 90.0 | 1 | None | Second Order |
|
|
121
|
+
| 2023-01-22 | 220.0 | 3 | None | Pending Shipment |
|
|
122
|
+
| 2023-01-22 | 220.0 | 5 | None | Silent Shipment |
|
|
123
|
+
|
|
124
|
+
Step 1 - Results (1 rows):
|
|
125
|
+
| CreatedOn | customer_id | message | subject |
|
|
126
|
+
|------------|-------------|--------------------------------------------------------------------------------------------------------------|----------------|
|
|
127
|
+
| 2025-07-02 | 1 | Dear customer, we are offering a discount on your next purchase. Please check your account for more details. | Discount Offer |
|
|
128
|
+
|
|
129
|
+
Step 2 - Results (1 rows):
|
|
130
|
+
| CreatedOn | customer_id | message | subject |
|
|
131
|
+
|------------|-------------|--------------------------------------------------------------------------------------------------------------|----------------|
|
|
132
|
+
| 2025-07-02 | 3 | Dear customer, we are offering a discount on your next purchase. Please check your account for more details. | Discount Offer |
|
|
133
|
+
|
|
134
|
+
Step 3 - Results (1 rows):
|
|
135
|
+
| CreatedOn | customer_id | message | subject |
|
|
136
|
+
|------------|-------------|--------------------------------------------------------------------------------------------------------------|----------------|
|
|
137
|
+
| 2025-07-02 | 5 | Dear customer, we are offering a discount on your next purchase. Please check your account for more details. | Discount Offer |
|
|
138
|
+
|
|
139
|
+
✅ MCP Client Executor – All Steps Executed - Review Results Above
|
|
140
|
+
.. 💡 Suggestion - Copy/Paste Response to a JsonFormatter
|
|
141
|
+
|
|
142
|
+
Test complete.
|
|
@@ -224,28 +224,6 @@ def process_tool_context(tool_context):
|
|
|
224
224
|
# query_param_filter = query_param_filter.replace("date_created", 'CreatedOn') # TODO - why this name?
|
|
225
225
|
return query_param_filter # end get_query_param_filter
|
|
226
226
|
|
|
227
|
-
def print_get_response(query_param_filter, mcp_response):
|
|
228
|
-
""" Print the response from the GET request. """
|
|
229
|
-
log.info("\n3. MCP Server (als) GET filter(query_param_filter):\n" + query_param_filter)
|
|
230
|
-
log.info(" GET Response:\n" + mcp_response.text)
|
|
231
|
-
results : List[Dict] = mcp_response.json()['data']
|
|
232
|
-
# print results in a table format
|
|
233
|
-
if results:
|
|
234
|
-
# Get all unique keys from all result dicts
|
|
235
|
-
keys = set()
|
|
236
|
-
for row in results:
|
|
237
|
-
if isinstance(row, dict):
|
|
238
|
-
keys.update(row.keys())
|
|
239
|
-
keys = list(keys)
|
|
240
|
-
# Print header
|
|
241
|
-
log.info("\n| " + " | ".join(keys) + " |")
|
|
242
|
-
log.info("|" + "|".join(["---"] * len(keys)) + "|")
|
|
243
|
-
# Print rows
|
|
244
|
-
for row in results:
|
|
245
|
-
log.info("| " + " | ".join(str(row.get(k, "")) for k in keys) + " |")
|
|
246
|
-
else:
|
|
247
|
-
log.info("No results found.")
|
|
248
|
-
|
|
249
227
|
def substitute_vars(val, context, row=None, ref_index=None):
|
|
250
228
|
"""
|
|
251
229
|
Substitutes variable references in a value using a provided context.
|
|
@@ -411,7 +389,7 @@ Based on this, generate the next tool_context step(s) as a JSON list.
|
|
|
411
389
|
if has_request_context():
|
|
412
390
|
headers = request.headers # get headers from Flask request context
|
|
413
391
|
else:
|
|
414
|
-
log.info("Warning: No Flask request context available.
|
|
392
|
+
log.info("Warning: No Flask request context available. Some API calls may not work as expected.")
|
|
415
393
|
try:
|
|
416
394
|
resp = requests.request(method, url, headers=headers, json=body if method in ["POST", "PATCH"] else None, params=params)
|
|
417
395
|
resp.raise_for_status()
|
|
@@ -447,17 +425,75 @@ Based on this, generate the next tool_context step(s) as a JSON list.
|
|
|
447
425
|
context_results.append(result)
|
|
448
426
|
step_num += 1
|
|
449
427
|
|
|
428
|
+
def print_json_as_table(json_data, step_index):
|
|
429
|
+
"""Print JSON data in table format showing only data/attributes section with column headers."""
|
|
430
|
+
if not isinstance(json_data, dict):
|
|
431
|
+
log.info(f"\nStep {step_index}: Non-dict result - {json_data}")
|
|
432
|
+
return
|
|
433
|
+
|
|
434
|
+
# Extract data section
|
|
435
|
+
data = json_data.get('data', [])
|
|
436
|
+
if not data:
|
|
437
|
+
log.info(f"\nStep {step_index}: No data found in result")
|
|
438
|
+
return
|
|
439
|
+
|
|
440
|
+
# Handle both single item and list of items
|
|
441
|
+
if isinstance(data, dict):
|
|
442
|
+
data = [data]
|
|
443
|
+
elif not isinstance(data, list):
|
|
444
|
+
log.info(f"\nStep {step_index}: Data is not in expected format")
|
|
445
|
+
return
|
|
446
|
+
|
|
447
|
+
# Extract attributes from all items to get all possible columns
|
|
448
|
+
all_attributes = set()
|
|
449
|
+
attribute_rows = []
|
|
450
|
+
|
|
451
|
+
for item in data:
|
|
452
|
+
if isinstance(item, dict) and 'attributes' in item:
|
|
453
|
+
attributes = item['attributes']
|
|
454
|
+
all_attributes.update(attributes.keys())
|
|
455
|
+
attribute_rows.append(attributes)
|
|
456
|
+
else:
|
|
457
|
+
# If no attributes section, use the item directly
|
|
458
|
+
if isinstance(item, dict):
|
|
459
|
+
all_attributes.update(item.keys())
|
|
460
|
+
attribute_rows.append(item)
|
|
461
|
+
|
|
462
|
+
if not attribute_rows:
|
|
463
|
+
log.info(f"\nStep {step_index}: No attributes found in data")
|
|
464
|
+
return
|
|
465
|
+
|
|
466
|
+
# Sort columns for consistent display
|
|
467
|
+
columns = sorted(list(all_attributes))
|
|
468
|
+
|
|
469
|
+
# Calculate column widths
|
|
470
|
+
col_widths = {}
|
|
471
|
+
for col in columns:
|
|
472
|
+
col_widths[col] = max(len(str(col)),
|
|
473
|
+
max(len(str(row.get(col, ""))) for row in attribute_rows))
|
|
474
|
+
|
|
475
|
+
# Print table header
|
|
476
|
+
log.info(f"\nStep {step_index} - Results ({len(attribute_rows)} rows):")
|
|
477
|
+
header = "| " + " | ".join(col.ljust(col_widths[col]) for col in columns) + " |"
|
|
478
|
+
separator = "|" + "|".join("-" * (col_widths[col] + 2) for col in columns) + "|"
|
|
479
|
+
|
|
480
|
+
log.info(header)
|
|
481
|
+
log.info(separator)
|
|
482
|
+
|
|
483
|
+
# Print table rows
|
|
484
|
+
for row in attribute_rows:
|
|
485
|
+
row_str = "| " + " | ".join(str(row.get(col, "")).ljust(col_widths[col]) for col in columns) + " |"
|
|
486
|
+
log.info(row_str)
|
|
487
|
+
|
|
450
488
|
if print := True: # print context (which is just the GETs)
|
|
451
489
|
log.info("\n\n4. MCP Client Executor – Context Results:")
|
|
452
490
|
for each_context_result in context_results:
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
each_print = json.dumps(each_context_result, indent=4)
|
|
456
|
-
print_line = f"\nStep {context_results.index(each_context_result)}\n{each_print}"
|
|
457
|
-
log.info(print_line)
|
|
491
|
+
step_index = context_results.index(each_context_result)
|
|
492
|
+
print_json_as_table(each_context_result, step_index)
|
|
458
493
|
pass
|
|
459
494
|
|
|
460
|
-
log.info("\n✅ MCP Client Executor – All Steps Executed
|
|
495
|
+
log.info("\n✅ MCP Client Executor – All Steps Executed - Review Results Above")
|
|
496
|
+
log.info(".. 💡 Suggestion - Copy/Paste Response to a JsonFormatter\n")
|
|
461
497
|
|
|
462
498
|
return context_results
|
|
463
499
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Welcome
|
|
3
3
|
Description: Instant mcp-enabled microservices, standard projects, declarative business logic
|
|
4
|
-
Source: docs//Sample-Basic-Tour
|
|
5
|
-
version info: 15.01.
|
|
4
|
+
Source: docs//Sample-Basic-Tour.md
|
|
5
|
+
version info: 15.01.35 (07/01/2025) installed version
|
|
6
6
|
Used: Manager Readme
|
|
7
|
-
Instructions: Copy in Sample-Basic-Demo (Replace "
|
|
7
|
+
Instructions: Copy in Sample-Basic-Demo (Replace "This illustrates" up to "Explore GenAI CLI")
|
|
8
8
|
---
|
|
9
9
|
<style>
|
|
10
|
-
-typeset h1,
|
|
11
|
-
-content__button {
|
|
10
|
+
.md-typeset h1,
|
|
11
|
+
.md-content__button {
|
|
12
12
|
display: none;
|
|
13
13
|
}
|
|
14
14
|
</style>
|
|
@@ -19,7 +19,7 @@ Instructions: Copy in Sample-Basic-Demo (Replace "We'll illustrate" up to "Explo
|
|
|
19
19
|
|
|
20
20
|
2. ***Customize*** with **Declarative Rules** and Python in your IDE, standard container deployment
|
|
21
21
|
|
|
22
|
-
You are in the [API Logic Server Manager](
|
|
22
|
+
You are in the [API Logic Server Manager](Manager.md). This is a good place to manage projects, create notes and resources, etc.
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
|
|
@@ -27,7 +27,7 @@ You are in the [API Logic Server Manager](https://apilogicserver.github.io/Docs/
|
|
|
27
27
|
|
|
28
28
|
**Evaluation Guide:** click on the disclosure buttons, below.
|
|
29
29
|
|
|
30
|
-
This illustrates basic [GenAI-Logic](https://www.genai-logic.com/product/key-features) operation:
|
|
30
|
+
This illustrates basic [GenAI-Logic](https://www.genai-logic.com/product/key-features){:target="_blank" rel="noopener"} operation:
|
|
31
31
|
|
|
32
32
|
1. Creating projects from new or existing databases, providing a MCP-enabled API and an Admin App
|
|
33
33
|
2. Adding declarative logic and security, and
|
|
@@ -36,12 +36,16 @@ This illustrates basic [GenAI-Logic](https://www.genai-logic.com/product/key-fea
|
|
|
36
36
|
|
|
37
37
|
The entire process takes 20 minutes; usage notes:
|
|
38
38
|
|
|
39
|
-
* Important: look for **readme files** in created projects
|
|
40
|
-
* You may find it more convenient to view this [in your Browser](
|
|
39
|
+
* Important: look for **readme files** in created projects
|
|
40
|
+
* You may find it more convenient to view this [in your Browser](Sample-Basic-Tour.md)
|
|
41
|
+
* A slide show summary is available [on our Web Site](https://www.genai-logic.com/product/tour){:target="_blank" rel="noopener"}
|
|
42
|
+
|
|
43
|
+

|
|
44
|
+
|
|
41
45
|
|
|
42
46
|
|
|
43
47
|
|
|
44
|
-
## 1.
|
|
48
|
+
## 1. Create and Run
|
|
45
49
|
|
|
46
50
|
API Logic Server can create projects from existing databases, or use GenAI to create projects with new databases. Let's see how.
|
|
47
51
|
|
|
@@ -51,17 +55,17 @@ API Logic Server can create projects from existing databases, or use GenAI to cr
|
|
|
51
55
|
Create the project - use the CLI (**Terminal > New Terminal**), :
|
|
52
56
|
|
|
53
57
|
```bash
|
|
54
|
-
$
|
|
58
|
+
$ genai-logic create --project_name=basic_demo --db_url=basic_demo
|
|
55
59
|
```
|
|
56
60
|
|
|
57
|
-
> Note: the `db_url` value is [an abbreviation](https://apilogicserver.github.io/Docs/Data-Model-Examples/) for a test database provided as part of the installation. You would normally supply a SQLAlchemy URI to your existing database.
|
|
61
|
+
> Note: the `db_url` value is [an abbreviation](https://apilogicserver.github.io/Docs/Data-Model-Examples/){:target="_blank" rel="noopener"} for a test database provided as part of the installation. You would normally supply a SQLAlchemy URI to your existing database, e.g. <br>`genai-logic create --project_name=basic_demo --db_url=sqlite:///samples/dbs/basic_demo.sqlite`.
|
|
58
62
|
|
|
59
63
|
|
|
60
64
|
<details markdown>
|
|
61
65
|
|
|
62
66
|
<summary> The database is Customer, Orders, Items and Product</summary>
|
|
63
67
|
|
|
64
|
-

|
|
65
69
|
|
|
66
70
|
</details>
|
|
67
71
|
<br>
|
|
@@ -71,41 +75,38 @@ $ ApiLogicServer create --project_name=basic_demo --db_url=basic_demo
|
|
|
71
75
|
|
|
72
76
|
You can create a project *and a new database* from a prompt using GenAI, either by:
|
|
73
77
|
|
|
74
|
-
* [WebGenAI - in the Browser, via pubic website](
|
|
75
|
-
* [GenAI - in the Browser, via docker](
|
|
76
|
-
* [GenAI CLI](
|
|
78
|
+
* [WebGenAI - in the Browser, via pubic website](WebGenAI.md){:target="_blank" rel="noopener"}, or
|
|
79
|
+
* [GenAI - in the Browser, via docker](WebGenAI-install.md){:target="_blank" rel="noopener"}, or
|
|
80
|
+
* [GenAI CLI](WebGenAI-CLI.md){:target="_blank" rel="noopener"}
|
|
77
81
|
|
|
78
82
|
Here we use the GenAI CLI:
|
|
79
83
|
|
|
80
84
|
1. If you have signed up (see *Get an OpenAI Key*, below), this will create and open a project called `genai_demo` from `genai_demo.prompt` (available in left Explorer pane):
|
|
81
85
|
|
|
82
86
|
```bash
|
|
83
|
-
|
|
87
|
+
genai-logic genai --using=system/genai/examples/genai_demo/genai_demo.prompt --project-name=genai_demo
|
|
84
88
|
```
|
|
85
89
|
|
|
86
90
|
2. ***Or,*** you can simulate the process (no signup) using:
|
|
87
91
|
|
|
88
92
|
```bash
|
|
89
|
-
|
|
90
|
-
als genai --repaired-response=system/genai/examples/genai_demo/genai_demo.response_example --project-name=genai_demo
|
|
91
|
-
|
|
93
|
+
genai-logic genai --repaired-response=system/genai/examples/genai_demo/genai_demo.response_example --project-name=genai_demo
|
|
92
94
|
```
|
|
93
95
|
|
|
94
|
-
For background on how it works, [click here](Sample-Genai#how-does-it-work).
|
|
96
|
+
For background on how it works, [click here](Sample-Genai.md#how-does-it-work){:target="_blank" rel="noopener"}.
|
|
95
97
|
|
|
96
98
|
|
|
97
99
|
|
|
98
|
-
## 2. Working Software Now
|
|
99
100
|
|
|
100
101
|
### Open in your IDE and Run
|
|
101
102
|
|
|
102
103
|
You can open with VSCode, and run it as follows:
|
|
103
104
|
|
|
104
|
-
1. **
|
|
105
|
+
1. **Start the Server:** F5 (also described in the Appendix).
|
|
105
106
|
|
|
106
|
-
|
|
107
|
+
* Your virtual environment is automatically configured in most cases; see the Appendix (Procedures / Detail Procedures) if that's not working.
|
|
107
108
|
|
|
108
|
-
|
|
109
|
+
2. **Start the Admin App:** either use the links provided in the IDE console, or click [http://localhost:5656/](http://localhost:5656/). The Admin App screen shown below should appear in your Browser.
|
|
109
110
|
|
|
110
111
|
The sections below explore the system that has been created (which would be similar for your own database).
|
|
111
112
|
<br><br>
|
|
@@ -118,7 +119,7 @@ The system creates an API with end points for each table, with filtering, sortin
|
|
|
118
119
|
|
|
119
120
|
<summary>See the Swagger </summary>
|
|
120
121
|
|
|
121
|
-

|
|
122
123
|
</details>
|
|
123
124
|
<br>
|
|
124
125
|
|
|
@@ -131,39 +132,54 @@ You can click Customer Alice, and see their Orders, and Items.
|
|
|
131
132
|
<details markdown>
|
|
132
133
|
|
|
133
134
|
<summary>See the Admin App </summary>
|
|
134
|
-

|
|
135
136
|
</details>
|
|
136
137
|
|
|
137
|
-
<br>
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
## 2. Custom UI: GenAI, Vibe
|
|
140
140
|
|
|
141
|
-
|
|
141
|
+
The app above is suitable for collaborative iteration to nail down the requirements, and back office data maintenance. It's also easy to make simple customizations, using the yaml file.
|
|
142
142
|
|
|
143
|
-
|
|
144
|
-
* 1 CLI command to create a project from an existing database
|
|
143
|
+
For more custom apps, you get complete control by generating app source code, which you can then customize in your IDE, e.g. using Vibe Natural Language:
|
|
145
144
|
|
|
146
|
-
|
|
145
|
+
```bash
|
|
146
|
+
# create react source (requires OpenAI key)
|
|
147
|
+
genai-logic genai-add-app --vibe
|
|
148
|
+
cd react-app
|
|
149
|
+
npm install
|
|
150
|
+
npm start
|
|
151
|
+
```
|
|
147
152
|
|
|
148
|
-
|
|
153
|
+
And you are ready to Vibe:
|
|
149
154
|
|
|
150
|
-
*
|
|
155
|
+
* Instead of creating data mockups, you have a **running API server with real data**
|
|
156
|
+
* Instead of starting from scratch, you have a **running multi-page app**
|
|
157
|
+
* And, you'll have projects that are **architecturally correct:** shared logic, enforced in the server, available for both User Interfaces and services.
|
|
158
|
+
* Then, use you favorite Vibe tools with your running API
|
|
151
159
|
|
|
152
|
-
|
|
153
|
-
|
|
160
|
+
<br>
|
|
161
|
+
|
|
162
|
+
```txt title='Customize using Natural Language'
|
|
163
|
+
Update the Customer list to provide users an option to see results in a list, or in cards
|
|
154
164
|
```
|
|
155
165
|
|
|
156
|
-
|
|
166
|
+

|
|
167
|
+
|
|
168
|
+
<br>
|
|
169
|
+
|
|
170
|
+
## 3. MCP-Ready APIs
|
|
171
|
+
|
|
172
|
+
Your project is MCP-ready - this will run a simple query *List customers with credit_limit > 1000* (we'll explore more interesting examples below, including provisions for user input):
|
|
157
173
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
174
|
+
```bash
|
|
175
|
+
python integration/mcp/mcp_client_executor.py
|
|
176
|
+
```
|
|
161
177
|
|
|
162
|
-
|
|
178
|
+

|
|
163
179
|
|
|
164
180
|
<br>
|
|
165
181
|
|
|
166
|
-
##
|
|
182
|
+
## 4. Declare Logic And Security
|
|
167
183
|
|
|
168
184
|
While API/MCP/UI automation is a great start, it's **critical to enforce logic and security.** You do this in your IDE. Here's how.
|
|
169
185
|
|
|
@@ -181,8 +197,8 @@ To add customizations, in a terminal window for your project:
|
|
|
181
197
|
**2. Add Customizations**
|
|
182
198
|
|
|
183
199
|
```bash
|
|
184
|
-
|
|
185
|
-
|
|
200
|
+
genai-logic add-cust
|
|
201
|
+
genai-logic add-auth --db_url=auth
|
|
186
202
|
```
|
|
187
203
|
|
|
188
204
|
|
|
@@ -221,7 +237,7 @@ Observe you now see fewer customers, since user `s1` has role `sales`. This rol
|
|
|
221
237
|
|
|
222
238
|
* The logging in the lower panel, to assist in debugging by showing which Grants (`+ Grant:`) are applied:
|
|
223
239
|
|
|
224
|
-

|
|
225
241
|
|
|
226
242
|
</details>
|
|
227
243
|
|
|
@@ -244,7 +260,7 @@ To see logic in action:
|
|
|
244
260
|
Observe the rules firing in the console log - see Logic In Action, below.
|
|
245
261
|
|
|
246
262
|
<br>
|
|
247
|
-
> 💡 Logic: Multi-table Derivations and Constraint Declarative Rules.<br>  Declarative Rules are 40X More Concise than procedural code.<br>  For more information, [click here](
|
|
263
|
+
> 💡 Logic: Multi-table Derivations and Constraint Declarative Rules.<br>  Declarative Rules are 40X More Concise than procedural code.<br>  For more information, [click here](Logic-Why.md){:target="_blank" rel="noopener"}.
|
|
248
264
|
|
|
249
265
|
<br>
|
|
250
266
|
|
|
@@ -252,9 +268,9 @@ Observe the rules firing in the console log - see Logic In Action, below.
|
|
|
252
268
|
|
|
253
269
|
<summary>See Logic In Action </summary>
|
|
254
270
|
|
|
255
|
-
<br>[Declare logic](Logic#declaring-rules) with WebGenAI, or in your IDE using code completion or Natural Language:
|
|
271
|
+
<br>[Declare logic](Logic.md#declaring-rules){:target="_blank" rel="noopener"} with WebGenAI, or in your IDE using code completion or Natural Language:
|
|
256
272
|
|
|
257
|
-

|
|
258
274
|
|
|
259
275
|
**a. Chaining**
|
|
260
276
|
|
|
@@ -262,13 +278,13 @@ The screenshot below shows our logic declarations, and the logging for inserting
|
|
|
262
278
|
|
|
263
279
|
Note that it's a `Multi-Table Transaction`, as indicated by the indentation. This is because - like a spreadsheet - **rules automatically chain, *including across tables.***
|
|
264
280
|
|
|
265
|
-

|
|
266
282
|
|
|
267
283
|
**b. 40X More Concise**
|
|
268
284
|
|
|
269
285
|
The 5 spreadsheet-like rules represent the same logic as 200 lines of code, [shown here](https://github.com/valhuber/LogicBank/wiki/by-code). That's a remarkable 40X decrease in the backend half of the system.
|
|
270
286
|
|
|
271
|
-
> 💡 No FrankenCode<br>Note the rules look like syntactically correct requirements. They are not turned into piles of unmanageable "frankencode" - see [models not frankencode](https://www.genai-logic.com/faqs#h.3fe4qv21qtbs).
|
|
287
|
+
> 💡 No FrankenCode<br>Note the rules look like syntactically correct requirements. They are not turned into piles of unmanageable "frankencode" - see [models not frankencode](https://www.genai-logic.com/faqs#h.3fe4qv21qtbs){:target="_blank" rel="noopener"}.
|
|
272
288
|
|
|
273
289
|
<br><br>
|
|
274
290
|
|
|
@@ -292,56 +308,50 @@ Optionally, you can use the Behave TDD approach to define tests, and the Rules R
|
|
|
292
308
|
|
|
293
309
|
|
|
294
310
|
|
|
295
|
-
### Logic
|
|
311
|
+
### MCP: Logic, User Interface
|
|
296
312
|
|
|
297
313
|
Logic is automatically executed in your MCP-enabled API. For example, consider the following MCP orchestration:
|
|
298
314
|
|
|
299
|
-
|
|
300
|
-
List the orders date_shipped is null and CreatedOn before 2023-07-14,
|
|
301
|
-
and send a discount email (subject: 'Discount Offer') to the customer for each one.
|
|
302
|
-
```
|
|
315
|
+

|
|
303
316
|
|
|
304
|
-
When sending email, we require business rules to ensure it respects the opt-out policy:
|
|
305
317
|
|
|
306
|
-
|
|
318
|
+
When sending email, we require ***business rules*** to ensure it respects the opt-out policy:
|
|
307
319
|
|
|
308
|
-
|
|
320
|
+

|
|
309
321
|
|
|
310
|
-
|
|
322
|
+
The server is automatically mcp-enabled, but we might also want an mcp user-interface client:
|
|
311
323
|
|
|
312
|
-
|
|
324
|
+
**1. Stop the Server**
|
|
313
325
|
|
|
314
|
-
|
|
326
|
+
**2. Create an MCP Client Executor like this:**
|
|
315
327
|
|
|
316
|
-
```
|
|
317
|
-
|
|
328
|
+
```
|
|
329
|
+
genai-logic genai-add-mcp-client
|
|
318
330
|
```
|
|
319
331
|
|
|
320
|
-
3.
|
|
321
|
-
|
|
322
|
-
You can do this in the command line, or via the admin app.
|
|
332
|
+
**3. Restart the Server**
|
|
323
333
|
|
|
324
|
-
|
|
325
|
-
python integration/mcp/mcp_client_executor.py mcp
|
|
326
|
-
```
|
|
334
|
+
<br>
|
|
327
335
|
|
|
328
|
-
|
|
336
|
+
With the server running, test it like this:
|
|
329
337
|
|
|
330
|
-
|
|
338
|
+
1. **Test MCP**
|
|
331
339
|
|
|
332
|
-
|
|
340
|
+
You can do this in the command line, or via the admin app.
|
|
333
341
|
|
|
334
|
-
```bash
|
|
335
|
-
|
|
342
|
+
```bash title='MCP from the command line'
|
|
343
|
+
python integration/mcp/mcp_client_executor.py mcp
|
|
336
344
|
```
|
|
337
345
|
|
|
346
|
+
Or, use the **Admin App:** (shown above), and follow step 4 on the Home page to see a Business-User-friendly example.
|
|
347
|
+
|
|
338
348
|
<br>
|
|
339
349
|
|
|
340
|
-
For more on MCP, [click here](
|
|
350
|
+
For more on MCP, [click here](Integration-MCP.md){:target="_blank" rel="noopener"}.
|
|
341
351
|
|
|
342
352
|
<br>
|
|
343
353
|
|
|
344
|
-
##
|
|
354
|
+
## 5. Iterate with Rules and Python
|
|
345
355
|
|
|
346
356
|
Not only are spreadsheet-like rules 40X more concise, they meaningfully simplify maintenance. Let's take an example:
|
|
347
357
|
|
|
@@ -377,10 +387,12 @@ To add this iteration, repeat the process above - in a terminal window for your
|
|
|
377
387
|
**2. Add Iteration**
|
|
378
388
|
|
|
379
389
|
```bash
|
|
380
|
-
|
|
381
|
-
|
|
390
|
+
genai-logic add-cust
|
|
391
|
+
genai-logic rebuild-from-database --db_url=sqlite:///database/db.sqlite
|
|
382
392
|
```
|
|
383
393
|
|
|
394
|
+
* You can ignore the warning regarding *'mcp-SysMcp' - not present*
|
|
395
|
+
|
|
384
396
|
**3. Set the breakpoint as shown in the screenshot below**
|
|
385
397
|
|
|
386
398
|
**4. Test: Start the Server, login as Admin**
|
|
@@ -389,7 +401,7 @@ als rebuild-from-database --db_url=sqlite:///database/db.sqlite
|
|
|
389
401
|
|
|
390
402
|
At the breakpoint, observe you can use standard debugger services to debug your logic (examine `Item` attributes, step, etc).
|
|
391
403
|
|
|
392
|
-

|
|
393
405
|
|
|
394
406
|
|
|
395
407
|
|
|
@@ -435,16 +447,20 @@ Of course, we all know that all businesses the world over depend on the `hello w
|
|
|
435
447
|
|
|
436
448
|
* and, for database access, SQLAlchemy. Note all updates from custom APIs also enforce your logic.
|
|
437
449
|
|
|
450
|
+
Explore the custom API in `api/api_discovery/order_b2b.py`, and test it using swagger:
|
|
451
|
+
|
|
452
|
+

|
|
453
|
+
|
|
438
454
|
|
|
439
455
|
|
|
440
456
|
### Messaging With Kafka
|
|
441
457
|
|
|
442
|
-
Along with APIs, messaging is another technology commonly employed for application integration. See the screenshot below; for more information, see [Sample Integration](Sample-Integration#produce-ordershipping-message).
|
|
458
|
+
Along with APIs, messaging is another technology commonly employed for application integration. See the screenshot below; for more information, see [Sample Integration](Sample-Integration.md#produce-ordershipping-message){:target="_blank" rel="noopener"}.
|
|
443
459
|
|
|
444
|
-

|
|
445
461
|
|
|
446
462
|
|
|
447
|
-
##
|
|
463
|
+
## 6. Deploy Containers: No Fees
|
|
448
464
|
|
|
449
465
|
API Logic Server also creates scripts for deployment. While these are ***not required at this demo,*** this means you can enable collaboration with Business Users:
|
|
450
466
|
|
|
@@ -452,9 +468,7 @@ API Logic Server also creates scripts for deployment. While these are ***not re
|
|
|
452
468
|
2. Upload to Docker Hub, and
|
|
453
469
|
3. Deploy for agile collaboration.
|
|
454
470
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
<br>
|
|
471
|
+
|
|
458
472
|
|
|
459
473
|
# Explore GenAI CLI
|
|
460
474
|
|
|
@@ -508,9 +522,9 @@ Verify it's operating properly:
|
|
|
508
522
|
|
|
509
523
|
2. Your created project is opened in your IDE, ready to execute and customize.
|
|
510
524
|
|
|
511
|
-
a. Review `Tutorial`, Explore Customizations.
|
|
525
|
+
a. Review `Tutorial.md`, Explore Customizations.
|
|
512
526
|
|
|
513
|
-

|
|
514
528
|
|
|
515
529
|
</details>
|
|
516
530
|
</br>
|
|
@@ -851,7 +865,7 @@ Enforce the Check Credit requirement (do not generate check constraints):
|
|
|
851
865
|
5. Store the Items.UnitPrice as a copy from Product.UnitPrice
|
|
852
866
|
```
|
|
853
867
|
|
|
854
|
-

|
|
855
869
|
</details>
|
|
856
870
|
|
|
857
871
|
<br>
|
|
@@ -1038,11 +1052,11 @@ Codespaces enables you to run in the cloud: VSCode via your Browser, courtesy Gi
|
|
|
1038
1052
|
|
|
1039
1053
|
__1. Open your project on GitHub__
|
|
1040
1054
|
|
|
1041
|
-

|
|
1042
1056
|
|
|
1043
1057
|
__2. Open it in Codespaces (takes a minute or 2):__
|
|
1044
1058
|
|
|
1045
|
-

|
|
1046
1060
|
|
|
1047
1061
|
> You will now see your project - running in VSCode, _in the Browser._ But that's just what you _see..._
|
|
1048
1062
|
|
|
@@ -1056,7 +1070,7 @@ __3. Start the Server and open the App in the Browser__
|
|
|
1056
1070
|
|
|
1057
1071
|
* Use the pre-defined Launch Configuration
|
|
1058
1072
|
|
|
1059
|
-

|
|
1060
1074
|
|
|
1061
1075
|
|
|
1062
1076
|
We think you'll find Codespaces pretty amazing - check it out!
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
See https://apilogicserver.github.io/Docs/Data-Model-Examples/
|
|
2
2
|
|
|
3
|
-
These files are symbolic links to pre-installed sqlite databases.
|
|
3
|
+
These files are symbolic links to pre-installed sqlite databases. These allow you to explore creating projects from existing databases.
|
|
4
|
+
|
|
5
|
+
For example, create Northwind like this:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
genai-logic create --project_name=nw --db_url=sqlite:///samples/dbs/nw.sqlite
|
|
9
|
+
```
|
|
4
10
|
|
|
5
11
|
> Note: If the symbolic links are missing, it is probably due to permission issues, e.g., on windows you must run the Shell with Admin privileges. You can continue using the abbeviations instead of a standard SQLAlchemy database uri.
|
|
@@ -7,7 +7,7 @@ Generate the {{resource.js}} file for a React Admin application using the follow
|
|
|
7
7
|
### Per-Resource Files (Required)
|
|
8
8
|
|
|
9
9
|
Sample code (follow these guidelines EXACTLY):
|
|
10
|
-
|
|
10
|
+
```
|
|
11
11
|
<sample-code>
|
|
12
12
|
// begin MANDATORY imports (always generated EXACTLY)
|
|
13
13
|
import React from 'react';
|
|
@@ -179,9 +179,10 @@ export default {
|
|
|
179
179
|
create: CustomerCreate,
|
|
180
180
|
edit: CustomerEdit,
|
|
181
181
|
};
|
|
182
|
-
|
|
182
|
+
```
|
|
183
183
|
</sample-code>
|
|
184
184
|
|
|
185
|
+
|
|
185
186
|
For each resource (`Customer`, `Order` etc) and **fully** implement:
|
|
186
187
|
* `CustomerList`
|
|
187
188
|
* `CustomerShow`
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
+
App Wiring
|
|
2
|
+
Sample code for react App.js (follow these guidelines EXACTLY):
|
|
1
3
|
|
|
2
|
-
|
|
3
|
-
### App Wiring
|
|
4
|
-
|
|
5
|
-
Sample code for react `App.js` (follow these guidelines EXACTLY):
|
|
6
|
-
|
|
7
|
-
```jsx
|
|
8
4
|
// begin constant imports (always included) -- generate this code EXACTLY
|
|
9
5
|
import React from 'react';
|
|
10
6
|
import { Admin, Resource, Loading } from 'react-admin'; // val? loading
|
|
@@ -59,13 +55,7 @@ const App = () => {
|
|
|
59
55
|
};
|
|
60
56
|
|
|
61
57
|
export default App;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## Response Format
|
|
67
|
-
|
|
58
|
+
Response Format
|
|
68
59
|
Format the response as a JSResponseFormat:
|
|
69
60
|
|
|
70
|
-
class JSResponseFormat(BaseModel):
|
|
71
|
-
code : str # generated javascript code (only)
|
|
61
|
+
class JSResponseFormat(BaseModel): # must match system/genai/prompt_inserts/response_format.prompt code : str # generated javascript code (only)
|
api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/README.md
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
# Getting Started with Genai-Logic react
|
|
1
|
+
# Getting Started with Genai-Logic react apps
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
GenAI-Logic created this app (`genai-logic genai-add-app`) [(docs here)](https://apilogicserver.github.io/Docs/Admin-Vibe/), typically from `ui/admin/admin.yaml`.
|
|
4
4
|
|
|
5
|
-
GenAI-Logic (`als genai-app`) then [created this project](https://apilogicserver.github.io/Docs/Admin-Vibe/).
|
|
6
|
-
|
|
7
|
-
<br>
|
|
8
5
|
|
|
9
6
|
# To run the app:
|
|
10
7
|
|
|
11
8
|
```bash
|
|
9
|
+
# security for react apps in progress, disable for now...
|
|
10
|
+
genai-logic add-auth --provider-type=None
|
|
12
11
|
cd ui/react-admin
|
|
13
12
|
npm install
|
|
14
13
|
npm start
|
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
# Getting Started with Genai-Logic react
|
|
1
|
+
# Getting Started with Genai-Logic react apps
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
GenAI-Logic (`genai-logic genai-add-app`) [docs here](https://apilogicserver.github.io/Docs/Admin-Vibe/), from `ui/admin/admin.yaml`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
We then *Vibed it* to add cards:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
Update the Customer list to provide users an option to see results in a list, or in cards
|
|
9
|
+
```
|
|
6
10
|
|
|
7
11
|
<br>
|
|
8
12
|
|
|
9
13
|
# To run the app:
|
|
10
14
|
|
|
11
15
|
```bash
|
|
16
|
+
# security for react apps in progress, disable for now...
|
|
17
|
+
genai-logic add-auth --provider-type=None
|
|
12
18
|
cd ui/react-admin
|
|
13
19
|
npm install
|
|
14
20
|
npm start
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
// begin MANDATORY imports (always generated EXACTLY)
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { List,
|
|
4
|
-
import {
|
|
5
|
-
import { TabbedShowLayout, Tab, SimpleShowLayout, TextInput, NumberInput
|
|
6
|
-
import {
|
|
7
|
-
import { Filter, Pagination,
|
|
8
|
-
import { EditButton, DeleteButton,
|
|
9
|
-
import { Grid, Typography, Box, Divider, Button } from '@mui/material';
|
|
10
|
-
import { useRecordContext, useRedirect,
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { List, Datagrid, TextField, DateField, NumberField } from 'react-admin';
|
|
4
|
+
import { ReferenceManyField } from 'react-admin';
|
|
5
|
+
import { TabbedShowLayout, Tab, SimpleShowLayout, TextInput, NumberInput } from 'react-admin';
|
|
6
|
+
import { SimpleForm, Show, Edit, Create } from 'react-admin';
|
|
7
|
+
import { Filter, Pagination, BooleanInput, Labeled } from 'react-admin';
|
|
8
|
+
import { EditButton, DeleteButton, ShowButton } from 'react-admin';
|
|
9
|
+
import { Grid, Typography, Box, Divider, Button, Card, CardContent, CardActions, ToggleButton, ToggleButtonGroup } from '@mui/material';
|
|
10
|
+
import { useRecordContext, useRedirect, useListContext, required } from 'react-admin';
|
|
11
11
|
import AddIcon from '@mui/icons-material/Add';
|
|
12
|
+
import ViewListIcon from '@mui/icons-material/ViewList';
|
|
13
|
+
import ViewModuleIcon from '@mui/icons-material/ViewModule';
|
|
14
|
+
import LocationOnIcon from '@mui/icons-material/LocationOn';
|
|
15
|
+
import PersonIcon from '@mui/icons-material/Person';
|
|
16
|
+
import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet';
|
|
12
17
|
// end mandatory imports
|
|
13
18
|
|
|
14
19
|
const CustomerFilter = (props) => (
|
|
@@ -18,21 +23,135 @@ const CustomerFilter = (props) => (
|
|
|
18
23
|
</Filter>
|
|
19
24
|
);
|
|
20
25
|
|
|
21
|
-
// Customer
|
|
22
|
-
|
|
23
|
-
<
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
// Customer Card View Component
|
|
27
|
+
const CustomerCard = ({ record }) => (
|
|
28
|
+
<Card sx={{
|
|
29
|
+
minWidth: 300,
|
|
30
|
+
maxWidth: 350,
|
|
31
|
+
height: 280,
|
|
32
|
+
margin: 1,
|
|
33
|
+
display: 'flex',
|
|
34
|
+
flexDirection: 'column',
|
|
35
|
+
transition: 'transform 0.2s, box-shadow 0.2s',
|
|
36
|
+
'&:hover': {
|
|
37
|
+
transform: 'translateY(-2px)',
|
|
38
|
+
boxShadow: 3
|
|
39
|
+
}
|
|
40
|
+
}}>
|
|
41
|
+
<CardContent sx={{ flexGrow: 1, pb: 1 }}>
|
|
42
|
+
<Typography variant="h6" component="div" sx={{
|
|
43
|
+
mb: 2,
|
|
44
|
+
fontWeight: 'bold',
|
|
45
|
+
color: 'primary.main',
|
|
46
|
+
overflow: 'hidden',
|
|
47
|
+
textOverflow: 'ellipsis',
|
|
48
|
+
whiteSpace: 'nowrap'
|
|
49
|
+
}}>
|
|
50
|
+
{record.CompanyName}
|
|
51
|
+
</Typography>
|
|
52
|
+
|
|
53
|
+
<Box sx={{ mb: 1.5, display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
54
|
+
<PersonIcon color="action" fontSize="small" />
|
|
55
|
+
<Typography variant="body2" color="text.secondary">
|
|
56
|
+
{record.ContactName || 'No contact name'}
|
|
57
|
+
</Typography>
|
|
58
|
+
</Box>
|
|
59
|
+
|
|
60
|
+
<Box sx={{ mb: 1.5, display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
61
|
+
<LocationOnIcon color="action" fontSize="small" />
|
|
62
|
+
<Typography variant="body2" color="text.secondary">
|
|
63
|
+
{record.City ? `${record.City}, ${record.Country || ''}` : record.Country || 'No location'}
|
|
64
|
+
</Typography>
|
|
65
|
+
</Box>
|
|
66
|
+
|
|
67
|
+
<Box sx={{ mb: 2, display: 'flex', alignItems: 'center', gap: 1 }}>
|
|
68
|
+
<AccountBalanceWalletIcon color="action" fontSize="small" />
|
|
69
|
+
<Typography variant="body1" sx={{ fontWeight: 'medium' }}>
|
|
70
|
+
{record.Balance ? `$${record.Balance.toLocaleString()}` : '$0.00'}
|
|
71
|
+
</Typography>
|
|
72
|
+
</Box>
|
|
73
|
+
</CardContent>
|
|
74
|
+
|
|
75
|
+
<CardActions sx={{ pt: 0, pb: 2, px: 2, justifyContent: 'space-between' }}>
|
|
76
|
+
<ShowButton record={record} size="small" />
|
|
77
|
+
<Box>
|
|
78
|
+
<EditButton record={record} size="small" sx={{ mr: 1 }} />
|
|
79
|
+
<DeleteButton record={record} size="small" />
|
|
80
|
+
</Box>
|
|
81
|
+
</CardActions>
|
|
82
|
+
</Card>
|
|
34
83
|
);
|
|
35
84
|
|
|
85
|
+
// Customer Grid View Component
|
|
86
|
+
const CustomerGridView = () => {
|
|
87
|
+
const { data, isLoading } = useListContext();
|
|
88
|
+
|
|
89
|
+
if (isLoading) return <div>Loading...</div>;
|
|
90
|
+
|
|
91
|
+
return (
|
|
92
|
+
<Grid container spacing={2} sx={{ mt: 1 }}>
|
|
93
|
+
{data?.map(record => (
|
|
94
|
+
<Grid item key={record.id} xs={12} sm={6} md={4} lg={3}>
|
|
95
|
+
<CustomerCard record={record} />
|
|
96
|
+
</Grid>
|
|
97
|
+
))}
|
|
98
|
+
</Grid>
|
|
99
|
+
);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// View Toggle Component
|
|
103
|
+
const ViewToggle = ({ viewMode, setViewMode }) => (
|
|
104
|
+
<Box sx={{ mb: 2, display: 'flex', justifyContent: 'flex-end' }}>
|
|
105
|
+
<ToggleButtonGroup
|
|
106
|
+
value={viewMode}
|
|
107
|
+
exclusive
|
|
108
|
+
onChange={(event, newViewMode) => {
|
|
109
|
+
if (newViewMode !== null) {
|
|
110
|
+
setViewMode(newViewMode);
|
|
111
|
+
}
|
|
112
|
+
}}
|
|
113
|
+
aria-label="view mode"
|
|
114
|
+
size="small"
|
|
115
|
+
>
|
|
116
|
+
<ToggleButton value="list" aria-label="list view">
|
|
117
|
+
<ViewListIcon />
|
|
118
|
+
</ToggleButton>
|
|
119
|
+
<ToggleButton value="cards" aria-label="card view">
|
|
120
|
+
<ViewModuleIcon />
|
|
121
|
+
</ToggleButton>
|
|
122
|
+
</ToggleButtonGroup>
|
|
123
|
+
</Box>
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
// Customer List
|
|
127
|
+
export const CustomerList = (props) => {
|
|
128
|
+
const [viewMode, setViewMode] = useState('list');
|
|
129
|
+
|
|
130
|
+
return (
|
|
131
|
+
<List
|
|
132
|
+
filters={<CustomerFilter />}
|
|
133
|
+
{...props}
|
|
134
|
+
sort={{ field: 'CompanyName', order: 'ASC' }}
|
|
135
|
+
pagination={<Pagination rowsPerPageOptions={[5, 10, 25]} showFirstLastButtons />}
|
|
136
|
+
>
|
|
137
|
+
<ViewToggle viewMode={viewMode} setViewMode={setViewMode} />
|
|
138
|
+
{viewMode === 'list' ? (
|
|
139
|
+
<Datagrid rowClick="show">
|
|
140
|
+
<TextField source="CompanyName" label="Company Name" />
|
|
141
|
+
<TextField source="ContactName" label="Contact Name" />
|
|
142
|
+
<TextField source="City" label="City" />
|
|
143
|
+
<TextField source="Country" label="Country" />
|
|
144
|
+
<NumberField source="Balance" label="Balance" options={{ style: 'currency', currency: 'USD' }} />
|
|
145
|
+
<EditButton />
|
|
146
|
+
<DeleteButton />
|
|
147
|
+
</Datagrid>
|
|
148
|
+
) : (
|
|
149
|
+
<CustomerGridView />
|
|
150
|
+
)}
|
|
151
|
+
</List>
|
|
152
|
+
);
|
|
153
|
+
};
|
|
154
|
+
|
|
36
155
|
// Customer Show
|
|
37
156
|
export const CustomerShow = (props) => (
|
|
38
157
|
<Show {...props}>
|
|
@@ -185,9 +304,11 @@ export const CustomerEdit = (props) => (
|
|
|
185
304
|
</Edit>
|
|
186
305
|
);
|
|
187
306
|
|
|
188
|
-
|
|
307
|
+
const CustomerResource = {
|
|
189
308
|
list: CustomerList,
|
|
190
309
|
show: CustomerShow,
|
|
191
310
|
create: CustomerCreate,
|
|
192
311
|
edit: CustomerEdit,
|
|
193
|
-
};
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
export default CustomerResource;
|
|
@@ -1,12 +1,12 @@
|
|
|
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=DvsEm6bDYUHuR9nrDsjYiwgs_yZkuk90WiiW6jXVuHI,97737
|
|
3
|
+
api_logic_server_cli/api_logic_server_info.yaml,sha256=8zbPG4nv00dFI02f9s1R2UPRWHel3-DILSeLA82-sfU,125
|
|
4
4
|
api_logic_server_cli/cli.py,sha256=3GdpAcaXsMeuMnWa-jx7tpi0x6OjIRoau4BeVT-Pw3A,87286
|
|
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
|
|
7
7
|
api_logic_server_cli/extended_builder.py,sha256=EhtXGAt_RrDR2tCtgvc2U82we7fr-F6pP-e6HS6dQWQ,13867
|
|
8
8
|
api_logic_server_cli/logging.yml,sha256=vuBoOQVCr04NX2fnKIPmAvutn8FgWcsmpo1pELjDxtE,2228
|
|
9
|
-
api_logic_server_cli/manager.py,sha256=
|
|
9
|
+
api_logic_server_cli/manager.py,sha256=TZqqAYrRSr41goozZoEnHcWUsDinaNkMgwY7-H-dnHc,12882
|
|
10
10
|
api_logic_server_cli/add_cust/add_cust.py,sha256=yi_6qoiBm19K1u5VNhDW-KaTVcnsU-uTQ8-GYioojMI,14034
|
|
11
11
|
api_logic_server_cli/create_from_model/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
|
|
12
12
|
api_logic_server_cli/create_from_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -469,7 +469,7 @@ api_logic_server_cli/fragments/db_typesZZ.txt,sha256=NoPSsxl86kDW91D7Jskbpe7C-Jy
|
|
|
469
469
|
api_logic_server_cli/fragments/declare_logic.py,sha256=a7wXI5JyMyIMZqUNOXDswBeJZVjN3OvOv76rvR08CxI,2844
|
|
470
470
|
api_logic_server_cli/fragments/declare_logic_begin.py,sha256=n1aIILmMCEahgkKedNdFjSskIa_VF66BZfuL8E6G83o,735
|
|
471
471
|
api_logic_server_cli/fragments/declare_logic_end.py,sha256=J_vF8Vks_jKRAOwSFv_KRW9wmG3-ay0ByRsajGcbm4w,2192
|
|
472
|
-
api_logic_server_cli/fragments/docker-compose.yml,sha256=
|
|
472
|
+
api_logic_server_cli/fragments/docker-compose.yml,sha256=efI8C9EfBFnBUduz4TNQJb1e3nB_YQVKEfAqnV8OQZA,834
|
|
473
473
|
api_logic_server_cli/fragments/mcp_admin.yml,sha256=FxzJeZEf9aTtjbC3oamZZRCrSDD7CgFKSlii7cVYTJc,214
|
|
474
474
|
api_logic_server_cli/fragments/modelsZZ.py,sha256=EDWnf4gyOoenPn5OuQyWWa2GJVMiw4YKHUtUd9QX994,12053
|
|
475
475
|
api_logic_server_cli/fragments/nw_virtual_attrs.py,sha256=7hgvhnO1UcJ6OoPKCxR5bn71zZEe7gsk4odtoswqKj8,888
|
|
@@ -638,8 +638,9 @@ api_logic_server_cli/prototypes/base/integration/kafka/kafka_consumer.py,sha256=
|
|
|
638
638
|
api_logic_server_cli/prototypes/base/integration/kafka/kafka_producer.py,sha256=g0nMAVfz1Y0iKJbbXfvRpdf-QUmyB4uUGZ6lyaVoXag,4470
|
|
639
639
|
api_logic_server_cli/prototypes/base/integration/kafka/kafka_readme.md,sha256=MlwykHWM2w41KzWh4vPuTnIodR8f-BQzrWpV4P1hrsI,161
|
|
640
640
|
api_logic_server_cli/prototypes/base/integration/mcp/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
|
|
641
|
-
api_logic_server_cli/prototypes/base/integration/mcp/mcp_client_executor.py,sha256=
|
|
641
|
+
api_logic_server_cli/prototypes/base/integration/mcp/mcp_client_executor.py,sha256=AGl6PVq2ss5_HtPzuetNzM2MbBvnjdftJ-mMCLcwxQM,25480
|
|
642
642
|
api_logic_server_cli/prototypes/base/integration/mcp/mcp_server_discovery.json,sha256=TUyInb67AWoGw7XFE9iDZxmM8UEID-ahQmdmzpF9AmQ,188
|
|
643
|
+
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_context_results.txt,sha256=27a8-MpBoE3i8UnCoMZINgeseFUxGhhwurgoV5EeP1k,8105
|
|
643
644
|
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_discovery_response.json,sha256=f1RP5kuTU8rkqxWsZoATBF8xdaVEgPTaB4MRoExIF-Q,3763
|
|
644
645
|
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_request.prompt,sha256=vmt_fvwOK-C2fnI1LLUMe5WbLk6qxv2RdVJkBUTo9zM,2601
|
|
645
646
|
api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_schema.txt,sha256=qmov7e0NdYiQTCxNJU2xzxf9HnYeXFej-c8GSB-y6MM,1143
|
|
@@ -810,16 +811,17 @@ api_logic_server_cli/prototypes/genai_demo/logic/readme_declare_logic.md,sha256=
|
|
|
810
811
|
api_logic_server_cli/prototypes/genai_demo/security/declare_security.py,sha256=L3AL1bgdqIWQxdkJZcFVDOQ0XRpmeLAKqwlAYChFWKo,2108
|
|
811
812
|
api_logic_server_cli/prototypes/genai_demo/ui/admin/admin.yaml,sha256=vMpr6to6g-h9gSuhxfpTeDMw5_R_eUKbV7qXzMEvIyk,3446
|
|
812
813
|
api_logic_server_cli/prototypes/manager/.gitignore,sha256=xfAjNQHokbo6GuN1ghx-eml8tQIzwUczLC_YVzElndI,195
|
|
813
|
-
api_logic_server_cli/prototypes/manager/README.md,sha256=
|
|
814
|
+
api_logic_server_cli/prototypes/manager/README.md,sha256=9hoALg3YpHMrLiYj22qc77jvOU8aagrEuHbXGYV2Kr8,38617
|
|
814
815
|
api_logic_server_cli/prototypes/manager/run_sample.sh,sha256=eRA-p_Snr7Pwk14wUw5mja2usEcjAKisHVhHMeSaQ68,781
|
|
815
816
|
api_logic_server_cli/prototypes/manager/run_web_genai.sh,sha256=sgjB3vKhkao93Ny3VN0AQ-wonvdBcBIT3rTbyNTMoG8,136
|
|
816
817
|
api_logic_server_cli/prototypes/manager/settings.txt,sha256=_jjL30jomIMxG21edDfrXYRT9Zfgr_0EdUWvcEUOnFQ,368
|
|
817
818
|
api_logic_server_cli/prototypes/manager/.vscode/ApiLogicServer.code-workspace,sha256=g062GyCFJ9XfuzVAfxk8Qsl5kWAB_v5Z1AQ3dzpcHMw,294
|
|
818
819
|
api_logic_server_cli/prototypes/manager/.vscode/launch.json,sha256=alh_fiuqMjY-uIk4ghfwyMs3y-U2dYr1W6rS9ncpNEY,33491
|
|
819
820
|
api_logic_server_cli/prototypes/manager/.vscode/settings.json,sha256=wQgpFvviPbZCmsf02UgrJSGAz7g3i4chDZ_AdSIOr5Y,625
|
|
820
|
-
api_logic_server_cli/prototypes/manager/samples/readme_samples.md,sha256=
|
|
821
|
-
api_logic_server_cli/prototypes/manager/samples/dbs/readme_samples.md,sha256=
|
|
821
|
+
api_logic_server_cli/prototypes/manager/samples/readme_samples.md,sha256=JyUOm5mcmLXtBCE30OFzfZaSCw7k_PKLZmGNanS4fwc,171
|
|
822
|
+
api_logic_server_cli/prototypes/manager/samples/dbs/readme_samples.md,sha256=FvxzBqR00Kgc5Z76JOslHju6HYmsYOwkoARe_U-dnY0,570
|
|
822
823
|
api_logic_server_cli/prototypes/manager/system/Manager_workspace.code-workspace,sha256=g062GyCFJ9XfuzVAfxk8Qsl5kWAB_v5Z1AQ3dzpcHMw,294
|
|
824
|
+
api_logic_server_cli/prototypes/manager/system/readme_ssystem.md,sha256=52zXRh5KJ4GSRWyNLwzbXqKMDJmR7M6PhS71-DIUoBI,106
|
|
823
825
|
api_logic_server_cli/prototypes/manager/system/style-guide.yaml,sha256=JaP3NDE29k4_e9ELeLTZfnWf2L8VgS1X7hO8J_BNqJU,673
|
|
824
826
|
api_logic_server_cli/prototypes/manager/system/app_model_editor/.gitignore,sha256=07msA6EiXJT_unwoat2B8vI6ANcIn9E-ntgIpQZj7g0,477
|
|
825
827
|
api_logic_server_cli/prototypes/manager/system/app_model_editor/api_logic_server_run.py,sha256=vf9Jc2vAz5npI6pD4kLNNdFTkqK8rO4erA03-k_mkcY,6363
|
|
@@ -1259,12 +1261,12 @@ api_logic_server_cli/prototypes/manager/system/app_model_editor/venv_setup/venv-
|
|
|
1259
1261
|
api_logic_server_cli/prototypes/manager/system/app_model_editor/venv_setup/venv.ps1,sha256=_-LfKkLw5HOkZsF59BGCqM9Zsk3n1oDIyDb4emy0O08,698
|
|
1260
1262
|
api_logic_server_cli/prototypes/manager/system/app_model_editor/venv_setup/venv.sh,sha256=aWX9fa8fe6aO9ifBIZEgGY5UGh4I0arOoCwBzDsxgU8,893
|
|
1261
1263
|
api_logic_server_cli/prototypes/manager/system/genai/.DS_Store,sha256=ndrcwHjeXXcVbvjdiQNuyCtmI6m-kvDLoEnr0fFJsuY,6148
|
|
1262
|
-
api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-Resource-Learning-Prompt.md,sha256=
|
|
1263
|
-
api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-js-Learning-Prompt.md,sha256=
|
|
1264
|
+
api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-Resource-Learning-Prompt.md,sha256=NaoanZbP9-lc7gqO5BUKbwp7gkQWhh9u8NRWhftoCxw,8094
|
|
1265
|
+
api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-js-Learning-Prompt.md,sha256=LafKtiWNGIjdv6eJpKPFbN4fiNnQq9pCIAKZyyeoCyE,2018
|
|
1264
1266
|
api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-config-prompt.md,sha256=fyP8X1q9tM3i6bTVioa7ieM_aTUfk4GPo08aOWZ60-0,932
|
|
1265
1267
|
api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-json-api-model-prompt.md,sha256=5Zp9q_lpY225qceQ3UhF4Fyd-85hDKkD-r3BWYmcs6Y,2890
|
|
1266
1268
|
api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/.DS_Store,sha256=AnV79PLm6F_E6PkLoTv-GaJZpUGP_xdRkNEqrAYGYuE,6148
|
|
1267
|
-
api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/README.md,sha256=
|
|
1269
|
+
api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/README.md,sha256=h7ePuwOqn3jv7YkjM4ruaP5rpYBmr_4Q3NChhb8pVJ4,452
|
|
1268
1270
|
api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/README_create_react_app.md,sha256=cOr7x6X9RmqjITtafhsqQTg8vl1Ob8X0WC78WL21CdE,3359
|
|
1269
1271
|
api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/package-lock.json,sha256=dG1s4WtUFp0ZhVWGwp_Ocv-Ii2c92Xb4FWqHFc0m7KU,698058
|
|
1270
1272
|
api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/package.json,sha256=6_nHZ8UzSaDWUPv6DyGJ3QAO392tc2rc8JPOp7V7gz4,1114
|
|
@@ -1990,7 +1992,7 @@ api_logic_server_cli/prototypes/nw/ui/images/Employee/leverling.jpg,sha256=w02cB
|
|
|
1990
1992
|
api_logic_server_cli/prototypes/nw/ui/images/Employee/peacock.jpg,sha256=UIfxEKOKruPKNW0w17bMebIaUsa1nD2vSVfFTk7uaCs,3862
|
|
1991
1993
|
api_logic_server_cli/prototypes/nw/ui/images/Employee/suyama.jpg,sha256=bp0xCJ-8EqQp_B7uR4glL6fVGxVlS10d5IHLNdw7rcA,4375
|
|
1992
1994
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/.DS_Store,sha256=AnV79PLm6F_E6PkLoTv-GaJZpUGP_xdRkNEqrAYGYuE,6148
|
|
1993
|
-
api_logic_server_cli/prototypes/nw/ui/reference_react_app/README.md,sha256=
|
|
1995
|
+
api_logic_server_cli/prototypes/nw/ui/reference_react_app/README.md,sha256=y4qGb4ZgovIFEzPyq18AbQjnpeYF8RrlCxsRTTwYujk,565
|
|
1994
1996
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/README_create_react_app.md,sha256=cOr7x6X9RmqjITtafhsqQTg8vl1Ob8X0WC78WL21CdE,3359
|
|
1995
1997
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/compile-errors.txt,sha256=HIYSnI2VW_Lz1MNCCw3TxZoeXFtuhpvxEDgDGY0A544,30782
|
|
1996
1998
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/package-lock.json,sha256=IzEHCLrrRzluTL-bw_d_u57dKsn8a9feoY2BKx7DjRc,699130
|
|
@@ -2006,7 +2008,7 @@ api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/App.js,sha256=cGZB
|
|
|
2006
2008
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/App.test.js,sha256=93hGkxlLhlfRv3DDfqcPSi1pTEVm7EFVCo5lDrYAqqQ,246
|
|
2007
2009
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Category.js,sha256=Nx1ILnyLn-QlHsBlEAVq-W_YIu0rJT8ERDPNmLTQMWo,5964
|
|
2008
2010
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Config.js,sha256=c2H9MMc3h2STlHPfjFRnu1FR-drNTRKzC8zVeZk7UkI,15025
|
|
2009
|
-
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Customer.js,sha256=
|
|
2011
|
+
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Customer.js,sha256=yY97oX1RIYVhe2ERtkrT0CXNniYg5mQcknUvKG88deQ,12358
|
|
2010
2012
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/CustomerDemographic.js,sha256=teJ2S5rLK1Ojp9meKhETE_bwU4lGvdu2q-hkpZ0Djd8,4109
|
|
2011
2013
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Department.js,sha256=S0ZaSEZuZ1XeiCEfeKmOlj-4QVHzOUG19rIw3QM4lVE,5739
|
|
2012
2014
|
api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Employee.js,sha256=XMBcUfQL1wG1P6wAPTpmJArnJWwHgSlXYV8Z5I8xhsw,10053
|
|
@@ -2338,9 +2340,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
|
|
|
2338
2340
|
api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
|
|
2339
2341
|
api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
|
|
2340
2342
|
api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
|
|
2341
|
-
apilogicserver-15.0.
|
|
2342
|
-
apilogicserver-15.0.
|
|
2343
|
-
apilogicserver-15.0.
|
|
2344
|
-
apilogicserver-15.0.
|
|
2345
|
-
apilogicserver-15.0.
|
|
2346
|
-
apilogicserver-15.0.
|
|
2343
|
+
apilogicserver-15.0.37.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
|
|
2344
|
+
apilogicserver-15.0.37.dist-info/METADATA,sha256=OJcnMVszKFzJZnC2_2H22YhIF31oGWRonGO9-MjS6oE,6553
|
|
2345
|
+
apilogicserver-15.0.37.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
2346
|
+
apilogicserver-15.0.37.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
|
|
2347
|
+
apilogicserver-15.0.37.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
|
|
2348
|
+
apilogicserver-15.0.37.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|