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.
Files changed (21) hide show
  1. api_logic_server_cli/api_logic_server.py +5 -3
  2. api_logic_server_cli/api_logic_server_info.yaml +2 -2
  3. api_logic_server_cli/fragments/docker-compose.yml +1 -0
  4. api_logic_server_cli/manager.py +13 -11
  5. api_logic_server_cli/prototypes/base/integration/mcp/examples/mcp_context_results.txt +142 -0
  6. api_logic_server_cli/prototypes/base/integration/mcp/mcp_client_executor.py +65 -29
  7. api_logic_server_cli/prototypes/manager/README.md +106 -92
  8. api_logic_server_cli/prototypes/manager/samples/dbs/readme_samples.md +7 -1
  9. api_logic_server_cli/prototypes/manager/samples/readme_samples.md +1 -1
  10. api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-Resource-Learning-Prompt.md +3 -2
  11. api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-js-Learning-Prompt.md +4 -14
  12. api_logic_server_cli/prototypes/manager/system/genai/app_templates/react-admin-template/README.md +4 -5
  13. api_logic_server_cli/prototypes/manager/system/readme_ssystem.md +2 -0
  14. api_logic_server_cli/prototypes/nw/ui/reference_react_app/README.md +9 -3
  15. api_logic_server_cli/prototypes/nw/ui/reference_react_app/src/Customer.js +145 -24
  16. {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/METADATA +1 -1
  17. {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/RECORD +21 -19
  18. {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/WHEEL +0 -0
  19. {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/entry_points.txt +0 -0
  20. {apilogicserver-15.0.33.dist-info → apilogicserver-15.0.37.dist-info}/licenses/LICENSE +0 -0
  21. {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.33" # last public release: 15.00.25 (15.00.12)
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'\nCreation complete - Opening {project.open_with} at {project.project_name}')
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'\nProject created at: {str(self.project_directory_path)}\n')
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: June 30, 2025 09:36:49
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.32
3
+ last_created_version: 15.00.35
@@ -3,6 +3,7 @@
3
3
  # cd webgenai
4
4
 
5
5
  # docker compose up
6
+ # for local machines, browse to: localhost:8282
6
7
  # docker compose down
7
8
 
8
9
  name: webgenai
@@ -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/db/basic_demo.sqlite')
58
- print("Link created")
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
- pass
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
- file_src = f"https://raw.githubusercontent.com/ApiLogicServer/ApiLogicServer-src/main/api_logic_server_cli/prototypes/manager/README.md"
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(file_src) # , params=params)
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
- pass # just fall back to using the pip-installed version
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'Failed to copy manager readme from installed: {e}')
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. secure API calls may not work as expected.")
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
- print_print = each_context_result
454
- if isinstance(each_context_result, dict):
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\n")
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.00 (06/08/2025)
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 "We'll illustrate" up to "Explore GenAI CLI")
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](https://apilogicserver.github.io/Docs/Manager). This is a good place to manage projects, create notes and resources, etc.
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
  &nbsp;
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](https://apilogicserver.github.io/Docs/Sample-Basic-Tour).
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
+ ![product-tour](images/basic_demo/product-tour.png)
44
+
41
45
 
42
46
  &nbsp;
43
47
 
44
- ## 1. Automation: Project Creation
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
- $ ApiLogicServer create --project_name=basic_demo --db_url=basic_demo
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
- ![basic_demo_data_model](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/basic_demo/basic_demo_data_model.jpeg?raw=true)
68
+ ![basic_demo_data_model](images/basic_demo/basic_demo_data_model.jpeg)
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](https://apilogicserver.github.io/Docs/WebGenAI), or
75
- * [GenAI - in the Browser, via docker](https://apilogicserver.github.io/Docs/WebGenAI-install), or
76
- * [GenAI CLI](https://apilogicserver.github.io/Docs/WebGenAI-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
- als genai --using=system/genai/examples/genai_demo/genai_demo.prompt --project-name=genai_demo
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
  &nbsp;
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. **Create Virtual Environment:** automated in most cases; see the Appendix (Procedures / Detail Procedures) if that's not working.
105
+ 1. **Start the Server:** F5 (also described in the Appendix).
105
106
 
106
- 2. **Start the Server:** F5 (also described in the Appendix).
107
+ * Your virtual environment is automatically configured in most cases; see the Appendix (Procedures / Detail Procedures) if that's not working.
107
108
 
108
- 3. **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
+ 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
- ![swagger](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/basic_demo/api-swagger.jpeg?raw=true)
122
+ ![swagger](images/basic_demo/api-swagger.jpeg)
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
- ![admin-app-initial](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/basic_demo/admin-app-initial.jpeg?raw=true)
135
+ ![admin-app-initial](images/basic_demo/admin-app-initial.jpeg)
135
136
  </details>
136
137
 
137
- <br>
138
138
 
139
- ### MCP, Vibe, Collaboration
139
+ ## 2. Custom UI: GenAI, Vibe
140
140
 
141
- In little more than a minute, you've used either
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
- * **GenAI** to create a database and project using Natural Language, or
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
- The project is standard Python, which you can customize in a standard IDE.
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
- This means you are ready for:
153
+ And you are ready to Vibe:
149
154
 
150
- * **MCP:** your project is MCP-ready - this will run a simple query *List customers with credit_limit > 1000* (we'll explore more interesting examples below):
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
- ```bash
153
- python integration/mcp/mcp_client_executor.py
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
- * **Vibe:** unblock UI dev
166
+ ![vibe-cards](images/basic_demo/vibe-cards.png)
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
- * Instead of creating data mockups, use GenAI to create real data
159
- * Use you favorite Vibe tools with your running API
160
- * And, you'll have projects that are architecturally correct: shared logic, enforced in the server, available for both User Interfaces and services.
174
+ ```bash
175
+ python integration/mcp/mcp_client_executor.py
176
+ ```
161
177
 
162
- * **Collaboration to Get Requirements Right:** Business Users can use GenAI to create systems, and the Admin app to verify their business idea, in minutes. And iterate.
178
+ ![mcp-retrieval](images/basic_demo/mcp-retrieval.png)
163
179
 
164
180
  <br>
165
181
 
166
- ## 3. Declare Logic And Security
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
- als add-cust
185
- als add-auth --db_url=auth
200
+ genai-logic add-cust
201
+ genai-logic add-auth --db_url=auth
186
202
  ```
187
203
  &nbsp;
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
- ![security-filters](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/basic_demo/security-filters.jpeg?raw=true)
240
+ ![security-filters](images/basic_demo/security-filters.jpeg)
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>&emsp;&emsp;Declarative Rules are 40X More Concise than procedural code.<br>&emsp;&emsp;For more information, [click here](https://apilogicserver.github.io/Docs/Logic-Why).
263
+ > 💡 Logic: Multi-table Derivations and Constraint Declarative Rules.<br>&emsp;&emsp;Declarative Rules are 40X More Concise than procedural code.<br>&emsp;&emsp;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
- ![Nat Lang Logic](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/sample-ai/copilot/copilot-logic-chat.png?raw=true)
273
+ ![Nat Lang Logic](images/sample-ai/copilot/copilot-logic-chat.png)
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
- ![logic-chaining](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/basic_demo/logic-chaining.jpeg?raw=true)
281
+ ![logic-chaining](images/basic_demo/logic-chaining.jpeg)
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
  &nbsp;
294
310
 
295
- ### Logic-Enabled MCP
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
+ ![mcp-ui](images/basic_demo/mcp-ui.png)
303
316
 
304
- When sending email, we require business rules to ensure it respects the opt-out policy:
305
317
 
306
- ![email request](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/integration/mcp/3a-email-logic.png?raw=true)
318
+ When sending email, we require ***business rules*** to ensure it respects the opt-out policy:
307
319
 
308
- With the server running, test it like this:
320
+ ![email request](images/integration/mcp/3a-email-logic.png)
309
321
 
310
- 1. **Stop** the Server
322
+ The server is automatically mcp-enabled, but we might also want an mcp user-interface client:
311
323
 
312
- 2. **Disable Security**
324
+ **1. Stop the Server**
313
325
 
314
- The MCP client executor does not currently support security (planned enhancement), so we must first disable it:
326
+ **2. Create an MCP Client Executor like this:**
315
327
 
316
- ```bash
317
- als add-auth --provider-type=none
328
+ ```
329
+ genai-logic genai-add-mcp-client
318
330
  ```
319
331
 
320
- 3. **Test MCP**
321
-
322
- You can do this in the command line, or via the admin app.
332
+ **3. Restart the Server**
323
333
 
324
- ```bash
325
- python integration/mcp/mcp_client_executor.py mcp
326
- ```
334
+ <br>
327
335
 
328
- Or, use the **Admin App:** follow step 4 on the Home page to see a Business-User-friendly example.
336
+ With the server running, test it like this:
329
337
 
330
- 4. **Re-enable Security**
338
+ 1. **Test MCP**
331
339
 
332
- Reactivate security:
340
+ You can do this in the command line, or via the admin app.
333
341
 
334
- ```bash
335
- als add-auth --provider-type=sql
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](https://apilogicserver.github.io/Docs/Integration-MCP).
350
+ For more on MCP, [click here](Integration-MCP.md){:target="_blank" rel="noopener"}.
341
351
 
342
352
  <br>
343
353
 
344
- ## 4. Iterate with Rules and Python
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
- als add-cust
381
- als rebuild-from-database --db_url=sqlite:///database/db.sqlite
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
- ![logic-debugging](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/basic_demo/logic-debugging.jpeg?raw=true)
404
+ ![logic-debugging](images/basic_demo/logic-debugging.jpeg)
393
405
 
394
406
  &nbsp;
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
+ ![b2b_swagger](images/integration/b2b_swagger.png)
453
+
438
454
  &nbsp;
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
- ![order-to-shipping](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/integration/order-to-shipping.jpg?raw=true)
460
+ ![order-to-shipping](images/integration/order-to-shipping.jpg)
445
461
  &nbsp;
446
462
 
447
- ## 5. Deploy Containers: No Fees
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
- <br>
456
-
457
- <br>
471
+ &nbsp;
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
- ![GenAI Automation](system/https://github.com/ApiLogicServer/Docs/blob/main/docs/images/genai.png?raw=true)
527
+ ![GenAI Automation](system/images/genai.png)
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
- ![copilot](system/https://github.com/ApiLogicServer/Docs/blob/main/docs/images/copilot.png?raw=true)
868
+ ![copilot](system/images/copilot.png)
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
- ![API Logic Server Intro](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/sample-ai/genai/open-github.png?raw=true)
1055
+ ![API Logic Server Intro](images/sample-ai/genai/open-github.png)
1042
1056
 
1043
1057
  __2. Open it in Codespaces (takes a minute or 2):__
1044
1058
 
1045
- ![API Logic Server Intro](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/sample-ai/genai/start-codespaces.png?raw=true)
1059
+ ![API Logic Server Intro](images/sample-ai/genai/start-codespaces.png)
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
- ![API Logic Server Intro](https://github.com/ApiLogicServer/Docs/blob/main/docs/images/git-codespaces/start-codespaces.png?raw=true)
1073
+ ![API Logic Server Intro](images/git-codespaces/start-codespaces.png)
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.
@@ -1,3 +1,3 @@
1
1
  See https://apilogicserver.github.io/Docs/Data-Model-Examples/
2
2
 
3
- dbs are symblinks
3
+ These created `samples/nw_sample` illustrates important customization sample code - a key part of training.
@@ -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): # must match system/genai/prompt_inserts/response_format.prompt
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)
@@ -1,14 +1,13 @@
1
- # Getting Started with Genai-Logic react-admin
1
+ # Getting Started with Genai-Logic react apps
2
2
 
3
- This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). For more information, see [README_create_react_app](README_create_react_app.md).
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
@@ -0,0 +1,2 @@
1
+ These files support genai services to create systems and apps,
2
+ such as LLM training and genai work files.
@@ -1,14 +1,20 @@
1
- # Getting Started with Genai-Logic react-admin
1
+ # Getting Started with Genai-Logic react apps
2
2
 
3
- This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). For more information, see [README_create_react_app](README_create_react_app.md).
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
- GenAI-Logic (`als genai-app`) then [created this project](https://apilogicserver.github.io/Docs/Admin-Vibe/).
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, FunctionField, Datagrid, TextField, EmailField, DateField, NumberField } from 'react-admin';
4
- import { ReferenceField, ReferenceManyField } from 'react-admin';
5
- import { TabbedShowLayout, Tab, SimpleShowLayout, TextInput, NumberInput, DateTimeInput } from 'react-admin';
6
- import { ReferenceInput, SelectInput, SimpleForm, Show, Edit, Create } from 'react-admin';
7
- import { Filter, Pagination, BooleanField, BooleanInput, Labeled } from 'react-admin';
8
- import { EditButton, DeleteButton, CreateButton, ShowButton } from 'react-admin';
9
- import { Grid, Typography, Box, Divider, Button } from '@mui/material';
10
- import { useRecordContext, useRedirect, Link, required } from 'react-admin';
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 List
22
- export const CustomerList = (props) => (
23
- <List filters={<CustomerFilter />} {...props} sort={{ field: 'CompanyName', order: 'ASC' }} pagination={<Pagination rowsPerPageOptions={[5, 10, 25]} showFirstLastButtons />}>
24
- <Datagrid rowClick="show">
25
- <TextField source="CompanyName" label="Company Name" />
26
- <TextField source="ContactName" label="Contact Name" />
27
- <TextField source="City" label="City" />
28
- <TextField source="Country" label="Country" />
29
- <NumberField source="Balance" label="Balance" options={{ style: 'currency', currency: 'USD' }} />
30
- <EditButton />
31
- <DeleteButton />
32
- </Datagrid>
33
- </List>
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
- export default {
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ApiLogicServer
3
- Version: 15.0.33
3
+ Version: 15.0.37
4
4
  Author-email: Val Huber <apilogicserver@gmail.com>
5
5
  License: BSD-3-Clause
6
6
  Project-URL: Homepage, https://www.genai-logic.com
@@ -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=vAVxQF6vJnaq5QBhMn2vAP5T5g2LMmMicrecePSJWYk,97531
3
- api_logic_server_cli/api_logic_server_info.yaml,sha256=9-OCY-5WQlihdcUNgIuxAjgcYP66ektb4A8n-Ou_Lls,125
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=LkilE0FUJ-q2KMvIFyadH_lJaxc3KpeJoSjJqncVhP0,12363
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=1ZbfpS8sMd7XPvfwZZ-hNTe9UklxMi0rM5yp2YpXWmQ,786
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=IdHKs2rgXcotc3dcDCxgKyG5wKUDFluinEahe61tPyI,24092
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=yWwkxddzLPiZN1htp4OxO2NafkLBkwJx-OA6bzHaEmY,38551
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=ViC9PHNYs6fRnCabgbhcbeHbtyk2sQRvtO2OgXQAhds,81
821
- api_logic_server_cli/prototypes/manager/samples/dbs/readme_samples.md,sha256=krSF-JP3pkd9eN6RrDFMdpmJhV56O57Y5oFsOn8Kcpw,365
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=jvBa4eF1-4Yi8bELO6ltjUV8_5mlsIpGcZFfTnNcnd8,8087
1263
- api_logic_server_cli/prototypes/manager/system/genai/app_templates/app_learning/Admin-App-js-Learning-Prompt.md,sha256=75FA3txqJ1viIyqt9O6nGpi17As7aSgVyUJ1rImriKc,2054
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=XZWAqxnRWxZ1yVS65g3j6etrcdxX1QDf2TZSms67Yd0,489
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=XZWAqxnRWxZ1yVS65g3j6etrcdxX1QDf2TZSms67Yd0,489
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=DItcfzeoOB2N7bEMKmdo6GLp01pOJI6TqfSa2E42Etg,8104
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.33.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
2342
- apilogicserver-15.0.33.dist-info/METADATA,sha256=-OJiZbxUJ7YTAnDr0ziDj2z4iD7wHcJatNsiYrYggU4,6553
2343
- apilogicserver-15.0.33.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
2344
- apilogicserver-15.0.33.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
2345
- apilogicserver-15.0.33.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
2346
- apilogicserver-15.0.33.dist-info/RECORD,,
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,,