orbit-code-ai 0.1.22 → 0.1.24

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.
@@ -85,7 +85,7 @@ PASSTHRU('SELECT * FROM users WHERE id = ?' TO Database.DSN VALUES(userId));
85
85
  ## Coding Standards — Error Handling
86
86
  - Do NOT use THROW USER EXCEPTION for business logic validations
87
87
  - Set error state via: `SET Environment.Variables.MWResponse.status = '<error_code>';`
88
- - Use `CALL getEsbChannlsErrorCodeDescriptionFrom(errorCode, language, errorDescription)` for localized error messages
88
+ - Use `CALL getEsbChannlsErrorCodeDescriptionFrom(errorCode, channelId, serviceCode, OUT englishDesc, OUT arabicDesc, OUT status)` for localized error messages (see [common-utils](components/common-utils.md))
89
89
  - Use `CALL Create_esbXML_Response_Header(...)` for standardized XML response headers
90
90
  - All error flows MUST route through the framework `LogError` subflow
91
91
  - Route validation failures using `PROPAGATE TO TERMINAL 'out2'; RETURN FALSE;`
@@ -94,7 +94,7 @@ PASSTHRU('SELECT * FROM users WHERE id = ?' TO Database.DSN VALUES(userId));
94
94
 
95
95
  | Artifact | Convention | Example |
96
96
  |---|---|---|
97
- | BROKER SCHEMA | com.qiwa.esb.<flow_name_lowercase> | com.qiwa.esb.employeeflow |
97
+ | BROKER SCHEMA | com.qiwa.esb.<msgflowname-lower> | com.qiwa.esb.getaccountdetails |
98
98
  | ESQL module | <FlowName>_<NodeName> | CheckValTransEmployeeFlow_CallDB_GetUser |
99
99
  | Node names | UpperCamelCase, descriptive | ValidateRequest, CallEmployeeDB |
100
100
  | Subflow names | UpperCamelCase | GetEmployeeData |
@@ -93,16 +93,28 @@ Message flows use a specific XML format based on EMF (Eclipse Modeling Framework
93
93
 
94
94
  Always use these instead of building raw nodes:
95
95
 
96
- | Subflow | Purpose | Typical Properties |
96
+ These are the real subflows in `Qiwa/Framework/Lib/` (xmi:type prefix `Qiwa.Framework.Lib:<Name>`):
97
+
98
+ | Subflow | Purpose | Typical node properties (EXTERNAL) |
97
99
  |---|---|---|
98
- | Qiwa.Framework.Lib:MQ_Input_Node | Standard MQ input with error handling | LOG_ENABLED, PROPERTIES_ENABLED, queueName, messageDomainProperty, PropertiesGroup, PropertyFilename |
99
- | Qiwa.Framework.Lib:MQ_Output_Node | Standard MQ output | queueName |
100
- | Qiwa.Framework.Lib:LogError | Structured error logging | (none) |
101
- | Qiwa.Framework.Lib:Rest_Input_Node | HTTP REST gateway entry | ServiceCallCorrIDOffset, Service_URL, waitInterval |
102
- | Qiwa.Framework.Lib:SOAP_Input_Node | SOAP gateway entry | (service-specific) |
103
- | Qiwa.Framework.Lib:Create_Response | Standard response builder | (service-specific) |
104
- | Qiwa.Framework.Lib:Validate_Request | Request schema validation | (service-specific) |
105
- | Qiwa.Framework.Lib:MWBusinessErrorResponse | Business error response handler | LOG_ENABLED, OUT_QUEUE |
100
+ | MQ_Input_Node | MQ input: properties, audit, retry, validation, rollback | PROPERTIES_ENABLED, LOG_ENABLED, RETRY_ENABLED, SCHEMA_VALIDATION_ENABLED, ROLL_BACK_TRANSACTION, queueName, PropertiesGroup, PropertyFilename |
101
+ | MQ_Output_Node | MQ output (defaults CorrelId, applies Priority, optional audit) | ENABLE_AUDIT_OUTPUT |
102
+ | MQ_Dynamic_Output_Node | Output to a runtime-resolved queue | (queue from LocalEnvironment.Destination) |
103
+ | MQ_Dead_Output_Node | Dead / backout routing | DEAD_FLOW |
104
+ | MQ_ReplyToQ_Node | Reply to `MQMD.ReplyToQ` | (none) |
105
+ | Rest_Input_Node | HTTP REST gateway entry | ServiceURL, TimeoutInSec |
106
+ | File_Input_Node / File_Output_Node | File in / out | PROPERTIES_ENABLED, LOG_ENABLED, SCHEMA_VALIDATION_ENABLED |
107
+ | FileCopy | Copy a file within a flow | (Directory/Filename) |
108
+ | PropertyReader | Load the properties XML into `Environment.Properties` | PropertyFilename, PropertiesGroup, LogicalTreePath |
109
+ | ErrorHandler | Central error handling | Is&lt;Backend&gt;Adapter flags, IsAtomic |
110
+ | LogError | Structured error audit | (none) |
111
+ | LogAudit / LogOutgoingAudit | Incoming / outgoing audit | FLOW_START |
112
+ | MWBusinessErrorResponse | Business error response builder | (service-specific) |
113
+ | HTTPRequestAdapter / HTTPResponseAdapter | Outbound HTTP/SOAP call + response normalize | ServiceURL, TimeoutInSec |
114
+ | InternalServiceCaller | Call another ESB flow in-broker | callCorrIDOffset |
115
+ | InternalHTTPRequestAdapter / HTTPInternalCaller | Internal HTTP call variants | ServiceURL |
116
+ | RetryPoint | Re-queue with delay (runs SetRetryProperties) | MAX_RETRY_COUNT, MIN_WAIT_TIME_SEC |
117
+ | SendEmailNotification / SendSMSNotification | Email / SMS notification | (service-specific) |
106
118
 
107
119
  **Framework rule:** Always check the framework index before writing any ESQL or creating any flow node. If a framework subflow or function already does what is needed, use it — never reimplement it. Standard MQ input/output and error handling MUST use framework subflows.
108
120
 
@@ -178,8 +190,12 @@ Main processing flows use:
178
190
 
179
191
  ## Standard Message Structure (Always Required)
180
192
 
193
+ The outer element is the **service-specific** request/response name (e.g. `GetMyDataRq` / `GetMyDataRs`),
194
+ **not** a literal `<Root>` — framework ESQL reaches it via `InputRoot.XMLNSC.*:*[<]`. `<Root>` below is a
195
+ placeholder for that element:
196
+
181
197
  ```xml
182
- <Root>
198
+ <Root> <!-- = the service request/response element, e.g. GetMyDataRq -->
183
199
  <Header>
184
200
  <TransactionId/>
185
201
  <ChannelId/>
@@ -190,16 +206,21 @@ Main processing flows use:
190
206
  <ServiceCode/>
191
207
  <SessionId/>
192
208
  <RequestTime/>
209
+ <MWRequestTime/> <!-- set/copied by the framework -->
210
+ <MWResponseTime/>
193
211
  <ResponseStatus>
194
212
  <Code/>
195
213
  <Status/> <!-- Success | Error -->
196
214
  <EnglishMsg/>
215
+ <ArabicMsg/>
197
216
  </ResponseStatus>
198
217
  </Header>
199
218
  <Body/>
200
219
  </Root>
201
220
  ```
202
221
 
222
+ (See [components/common-utils](components/common-utils.md) for the full header field list.)
223
+
203
224
  ## Key Constants (from CommonUtils.esql)
204
225
  - Success code: `'00000000'`
205
226
  - Technical error: `'99999999'`
@@ -24,7 +24,7 @@ MyServiceApp/
24
24
  ```
25
25
  [File_Input_Node] ← reads file from directory
26
26
  ↓ out
27
- [PropertyReader] ← ApplicationLabel="BS_MyService", PropertiesFileName="MYSERVICE-PROPERTIES.xml"
27
+ [PropertyReader] ← PropertyFilename="${broker.name}/MYSERVICE.xml", PropertiesGroup="BS_MyService.ProcessMyFile"
28
28
  ↓ out
29
29
  [LogAudit] ← flowStart=TRUE
30
30
  ↓ out
@@ -64,7 +64,8 @@ All failure terminals → [ErrorHandler] → [LogError] → [MQ_Dead_Output_Node
64
64
  ## ProcessMyFile_Compute.esql
65
65
 
66
66
  ```esql
67
- BROKER SCHEMA Qiwa.BS_MyService
67
+ BROKER SCHEMA com.qiwa.esb.processmyfile
68
+ PATH Qiwa.Framework.Lib;
68
69
 
69
70
  CREATE COMPUTE MODULE ProcessMyFile_Compute
70
71
  CREATE FUNCTION Main() RETURNS BOOLEAN
@@ -97,7 +98,8 @@ END MODULE;
97
98
  ## ProcessMyFile_MapOutput.esql
98
99
 
99
100
  ```esql
100
- BROKER SCHEMA Qiwa.BS_MyService
101
+ BROKER SCHEMA com.qiwa.esb.processmyfile
102
+ PATH Qiwa.Framework.Lib;
101
103
 
102
104
  CREATE COMPUTE MODULE ProcessMyFile_MapOutput
103
105
  CREATE FUNCTION Main() RETURNS BOOLEAN
@@ -206,7 +208,8 @@ For simple file routing/archival within a flow:
206
208
  - [ ] Create MapOutput ESQL for output formatting
207
209
  - [ ] Add properties group to properties XML file
208
210
  - [ ] Wire ALL failure terminals to `ErrorHandler` → `LogError` → `MQ_Dead_Output_Node`
209
- - [ ] Set `ApplicationLabel` and `PropertiesFileName` on `PropertyReader` node
211
+ - [ ] Set `PropertyFilename` and `PropertiesGroup` on `PropertyReader` node
212
+ - [ ] BROKER SCHEMA is `com.qiwa.esb.<msgflowname-lower>` with `PATH Qiwa.Framework.Lib;`
210
213
  - [ ] Set output filename dynamically in `MapOutput` ESQL
211
214
  - [ ] Consider `FileCopy` for archiving input before processing
212
215
  - [ ] If schema validation needed: set `ValidationEnabled=TRUE` and provide XSD
@@ -23,13 +23,13 @@ MyServiceApp/
23
23
  ```
24
24
  [Rest_Input_Node] ← HTTP input, parses JSON to XMLNSC
25
25
  ↓ out
26
- [PropertyReader] ← ApplicationLabel="BS_MyService", PropertiesFileName="MYSERVICE-PROPERTIES.xml"
26
+ [PropertyReader] ← PropertyFilename="${broker.name}/MYSERVICE.xml", PropertiesGroup="BS_MyService.GetMyData"
27
27
  ↓ out
28
28
  [LogAudit] ← flowStart=TRUE
29
29
  ↓ out
30
30
  [GetMyData_Compute] ← validate input, set routing
31
31
  ↓ out
32
- [HTTPRequestAdapter] ← call backend (set IsT24Adapter=TRUE or relevant flag)
32
+ [HTTPRequestAdapter] ← call backend (set ServiceURL / TimeoutInSec)
33
33
  ↓ out
34
34
  [HTTPResponseAdapter] ← normalize backend response
35
35
  ↓ out
@@ -49,7 +49,8 @@ Note: HTTP flows use `MWBusinessErrorResponse` (not `MQ_Dead_Output_Node`) on th
49
49
  ## GetMyData_Compute.esql
50
50
 
51
51
  ```esql
52
- BROKER SCHEMA Qiwa.BS_MyService
52
+ BROKER SCHEMA com.qiwa.esb.getmydata
53
+ PATH Qiwa.Framework.Lib;
53
54
 
54
55
  CREATE COMPUTE MODULE GetMyData_Compute
55
56
  CREATE FUNCTION Main() RETURNS BOOLEAN
@@ -57,24 +58,21 @@ CREATE COMPUTE MODULE GetMyData_Compute
57
58
  CALL CopyMessageHeaders();
58
59
  CALL CopyEntireMessage();
59
60
 
60
- -- JSON input arrives as XMLNSC (Rest_Input_Node converts it)
61
- DECLARE customerId CHARACTER InputRoot.XMLNSC.Root.Body.CustomerId;
61
+ -- JSON input arrives as XMLNSC (Rest_Input_Node converts it); reference the service element
62
+ DECLARE rIn REFERENCE TO InputRoot.XMLNSC.*:*[<];
63
+ DECLARE customerId CHARACTER rIn.Body.CustomerId;
62
64
 
63
- -- Validate
65
+ -- Validate (business error → set MWResponse.status, route to error branch)
64
66
  IF customerId IS NULL OR customerId = '' THEN
65
- SET Environment.ErrorDetails.Code = '99999999';
66
- SET Environment.ErrorDetails.EnglishMsg = 'CustomerId is required';
67
+ SET Environment.Variables.MWResponse.status = 'E5500003';
68
+ PROPAGATE TO TERMINAL 'out2';
67
69
  RETURN FALSE;
68
70
  END IF;
69
71
 
70
- -- Generate correlation ID
71
- DECLARE corrId CHARACTER;
72
- CALL getChannelCorrelationID(
73
- InputRoot.XMLNSC.Root.Header.ChannelId,
74
- InputRoot.XMLNSC.Root.Header.SessionId,
75
- corrId
76
- );
77
- SET OutputRoot.HTTPInputHeader.X-Correlation-Id = corrId;
72
+ -- Generate correlation ID (FUNCTION returns BLOB → cast for the header string)
73
+ SET OutputRoot.HTTPInputHeader."X-Correlation-Id" =
74
+ CAST(getChannelCorrelationID(FIELDVALUE(rIn.Header.ChannelId),
75
+ FIELDVALUE(rIn.Header.TransactionId), '') AS CHAR);
78
76
 
79
77
  RETURN TRUE;
80
78
  END;
@@ -86,20 +84,21 @@ END MODULE;
86
84
  ## GetMyData_PrepareRequest.esql
87
85
 
88
86
  ```esql
89
- BROKER SCHEMA Qiwa.BS_MyService
87
+ BROKER SCHEMA com.qiwa.esb.getmydata
88
+ PATH Qiwa.Framework.Lib;
90
89
 
91
90
  CREATE COMPUTE MODULE GetMyData_PrepareRequest
92
91
  CREATE FUNCTION Main() RETURNS BOOLEAN
93
92
  BEGIN
94
93
  CALL CopyMessageHeaders();
94
+ DECLARE rIn REFERENCE TO InputRoot.XMLNSC.*:*[<];
95
95
 
96
- -- Set target URL from properties
96
+ -- Set target URL from the routing-service property (3rd value = URL)
97
97
  SET Environment.Destination.HTTP.RequestURL =
98
98
  Environment.Properties.BS_MyService.GetMyData.BankIdForRoutingService.qiwa[3];
99
99
 
100
100
  -- Build backend request payload
101
- SET OutputRoot.XMLNSC.BackendRequest.CustomerId =
102
- InputRoot.XMLNSC.Root.Body.CustomerId;
101
+ SET OutputRoot.XMLNSC.BackendRequest.CustomerId = rIn.Body.CustomerId;
103
102
 
104
103
  RETURN TRUE;
105
104
  END;
@@ -111,21 +110,22 @@ END MODULE;
111
110
  ## GetMyData_MapResponse.esql
112
111
 
113
112
  ```esql
114
- BROKER SCHEMA Qiwa.BS_MyService
113
+ BROKER SCHEMA com.qiwa.esb.getmydata
114
+ PATH Qiwa.Framework.Lib;
115
115
 
116
116
  CREATE COMPUTE MODULE GetMyData_MapResponse
117
117
  CREATE FUNCTION Main() RETURNS BOOLEAN
118
118
  BEGIN
119
119
  CALL CopyMessageHeaders();
120
+ DECLARE rOut REFERENCE TO OutputRoot.XMLNSC.*:*[<];
120
121
 
121
122
  -- Build standard ESB response
122
- SET OutputRoot.XMLNSC.Root.Header.ResponseStatus.Code = '00000000';
123
- SET OutputRoot.XMLNSC.Root.Header.ResponseStatus.Status = 'Success';
124
- SET OutputRoot.XMLNSC.Root.Header.ResponseStatus.EnglishMsg = 'Success';
123
+ SET rOut.Header.ResponseStatus.Code = GetESBSuccessCode(); -- '00000000'
124
+ SET rOut.Header.ResponseStatus.Status = 'Success';
125
+ SET rOut.Header.ResponseStatus.EnglishMsg = 'Success';
125
126
 
126
127
  -- Map business data from backend response
127
- SET OutputRoot.XMLNSC.Root.Body.AccountBalance =
128
- InputRoot.XMLNSC.BackendResponse.Balance;
128
+ SET rOut.Body.AccountBalance = InputRoot.XMLNSC.BackendResponse.Balance;
129
129
 
130
130
  -- Set HTTP response code
131
131
  SET OutputRoot.HTTPResponseHeader."$statusCode" = 200;
@@ -177,8 +177,9 @@ HTTP status code: `200` (ESB pattern — errors are in the payload, not HTTP sta
177
177
  - [ ] Create Compute, PrepareRequest, MapResponse ESQL modules
178
178
  - [ ] Add properties group to properties XML file
179
179
  - [ ] Wire ALL failure terminals to `ErrorHandler` → `MWBusinessErrorResponse`
180
- - [ ] Set `ApplicationLabel` and `PropertiesFileName` on `PropertyReader` node
181
- - [ ] Set correct backend adapter flag on `HTTPRequestAdapter` node
180
+ - [ ] Set `PropertyFilename` and `PropertiesGroup` on `PropertyReader` node
181
+ - [ ] Set `ServiceURL`/`TimeoutInSec` on `HTTPRequestAdapter`; backend error-mapping flag goes on `ErrorHandler`
182
+ - [ ] BROKER SCHEMA is `com.qiwa.esb.<msgflowname-lower>` with `PATH Qiwa.Framework.Lib;`
182
183
  - [ ] Set `HTTP Reply Node` as the success terminal exit
183
184
  - [ ] Set `OutputRoot.HTTPResponseHeader."$statusCode"` = 200 in MapResponse
184
185
  - [ ] Confirm `UserPassword` is masked in audit config
@@ -32,13 +32,13 @@ MyServiceDBScript.sql
32
32
  ```
33
33
  [MQ_Input_Node]
34
34
  ↓ out
35
- [PropertyReader] ← ApplicationLabel="BS_MyService", PropertiesFileName="MYSERVICE-PROPERTIES.xml"
35
+ [PropertyReader] ← PropertyFilename="${broker.name}/MYSERVICE.xml", PropertiesGroup="BS_MyService.GetMyData"
36
36
  ↓ out
37
37
  [LogAudit] ← flowStart=TRUE
38
38
  ↓ out
39
39
  [GetMyData_Compute] ← your ESQL: validate input, prepare backend call
40
40
  ↓ out
41
- [HTTPRequestAdapter] ← set IsT24Adapter=TRUE (or relevant backend flag)
41
+ [HTTPRequestAdapter] ← set ServiceURL / TimeoutInSec (backend error-mapping flag goes on ErrorHandler)
42
42
  ↓ out
43
43
  [HTTPResponseAdapter]
44
44
  ↓ out
@@ -56,7 +56,8 @@ All failure terminals → [ErrorHandler] → [LogError] → [MQ_Dead_Output_Node
56
56
  ## GetMyData_Compute.esql
57
57
 
58
58
  ```esql
59
- BROKER SCHEMA Qiwa.BS_MyService
59
+ BROKER SCHEMA com.qiwa.esb.getmydata
60
+ PATH Qiwa.Framework.Lib;
60
61
 
61
62
  CREATE COMPUTE MODULE GetMyData_Compute
62
63
  CREATE FUNCTION Main() RETURNS BOOLEAN
@@ -64,22 +65,21 @@ CREATE COMPUTE MODULE GetMyData_Compute
64
65
  CALL CopyMessageHeaders();
65
66
  CALL CopyEntireMessage();
66
67
 
67
- -- Validate required input fields
68
- DECLARE customerId CHARACTER InputRoot.XMLNSC.Root.Body.CustomerId;
68
+ -- The ESB wraps a per-service element; reference its first child, then Header/Body
69
+ DECLARE rIn REFERENCE TO InputRoot.XMLNSC.*:*[<];
70
+
71
+ -- Validate required input fields (business error → set MWResponse.status, route to error)
72
+ DECLARE customerId CHARACTER rIn.Body.CustomerId;
69
73
  IF customerId IS NULL OR customerId = '' THEN
70
- SET Environment.ErrorDetails.Code = '99999999';
71
- SET Environment.ErrorDetails.EnglishMsg = 'CustomerId is required';
72
- RETURN FALSE; -- routes to failure terminal → ErrorHandler
74
+ SET Environment.Variables.MWResponse.status = 'E5500003'; -- an ESB_ERROR_CODES value
75
+ PROPAGATE TO TERMINAL 'out2'; -- business-error branch
76
+ RETURN FALSE;
73
77
  END IF;
74
78
 
75
- -- Set correlation ID
76
- DECLARE corrId CHARACTER;
77
- CALL getChannelCorrelationID(
78
- InputRoot.XMLNSC.Root.Header.ChannelId,
79
- InputRoot.XMLNSC.Root.Header.SessionId,
80
- corrId
81
- );
82
- SET OutputRoot.MQMD.CorrelId = CAST(corrId AS BLOB CCSID 1208);
79
+ -- Set correlation ID (FUNCTION returning BLOB: ChannelId, TransactionId, offset)
80
+ SET OutputRoot.MQMD.CorrelId =
81
+ getChannelCorrelationID(FIELDVALUE(rIn.Header.ChannelId),
82
+ FIELDVALUE(rIn.Header.TransactionId), '');
83
83
 
84
84
  RETURN TRUE;
85
85
  END;
@@ -91,20 +91,21 @@ END MODULE;
91
91
  ## GetMyData_PrepareRequest.esql
92
92
 
93
93
  ```esql
94
- BROKER SCHEMA Qiwa.BS_MyService
94
+ BROKER SCHEMA com.qiwa.esb.getmydata
95
+ PATH Qiwa.Framework.Lib;
95
96
 
96
97
  CREATE COMPUTE MODULE GetMyData_PrepareRequest
97
98
  CREATE FUNCTION Main() RETURNS BOOLEAN
98
99
  BEGIN
99
100
  CALL CopyMessageHeaders();
101
+ DECLARE rIn REFERENCE TO InputRoot.XMLNSC.*:*[<];
100
102
 
101
103
  -- Build backend request (adjust structure for your backend)
102
- SET OutputRoot.XMLNSC.BackendRequest.CustomerId =
103
- InputRoot.XMLNSC.Root.Body.CustomerId;
104
- SET OutputRoot.XMLNSC.BackendRequest.RequestTime =
105
- InputRoot.XMLNSC.Root.Header.RequestTime;
104
+ SET OutputRoot.XMLNSC.BackendRequest.CustomerId = rIn.Body.CustomerId;
105
+ SET OutputRoot.XMLNSC.BackendRequest.RequestTime = rIn.Header.RequestTime;
106
106
 
107
- -- Set HTTP destination from properties
107
+ -- Target URL from the routing-service property (3rd value = URL).
108
+ -- ApplicationLabel/flowName resolve at runtime; this is the literal-path equivalent:
108
109
  SET Environment.Destination.HTTP.RequestURL =
109
110
  Environment.Properties.BS_MyService.GetMyData.BankIdForRoutingService.qiwa[3];
110
111
 
@@ -118,22 +119,23 @@ END MODULE;
118
119
  ## GetMyData_MapResponse.esql
119
120
 
120
121
  ```esql
121
- BROKER SCHEMA Qiwa.BS_MyService
122
+ BROKER SCHEMA com.qiwa.esb.getmydata
123
+ PATH Qiwa.Framework.Lib;
122
124
 
123
125
  CREATE COMPUTE MODULE GetMyData_MapResponse
124
126
  CREATE FUNCTION Main() RETURNS BOOLEAN
125
127
  BEGIN
126
128
  CALL CopyMessageHeaders();
127
129
  CALL CopyEntireMessage();
130
+ DECLARE rOut REFERENCE TO OutputRoot.XMLNSC.*:*[<];
128
131
 
129
132
  -- Map backend response to ESB standard structure
130
- SET OutputRoot.XMLNSC.Root.Header.ResponseStatus.Code = '00000000';
131
- SET OutputRoot.XMLNSC.Root.Header.ResponseStatus.Status = 'Success';
132
- SET OutputRoot.XMLNSC.Root.Header.ResponseStatus.EnglishMsg = 'Success';
133
+ SET rOut.Header.ResponseStatus.Code = GetESBSuccessCode(); -- '00000000'
134
+ SET rOut.Header.ResponseStatus.Status = 'Success';
135
+ SET rOut.Header.ResponseStatus.EnglishMsg = 'Success';
133
136
 
134
137
  -- Map business data
135
- SET OutputRoot.XMLNSC.Root.Body.AccountBalance =
136
- InputRoot.XMLNSC.BackendResponse.Balance;
138
+ SET rOut.Body.AccountBalance = InputRoot.XMLNSC.BackendResponse.Balance;
137
139
  -- ... map other fields
138
140
 
139
141
  RETURN TRUE;
@@ -225,9 +227,8 @@ INSERT INTO MCR_CHANNESBFUNC_TBL (ESBFUNCID, ESBFUNCNAME, REQUEST_QUEUE_NAME, RE
225
227
  VALUES ('GMYD0001', 'GET_MY_DATA', 'BS.GET.MY.DATA.RQ', 'BS.GET.MY.DATA.RS');
226
228
 
227
229
  -- Grant channel access
228
- INSERT INTO MCR_CHANNAUTH_TBL (CHANNID, ESBFUNCID)
229
- VALUES ('MOBILE', 'GMYD0001');
230
- VALUES ('WEB', 'GMYD0001');
230
+ INSERT INTO MCR_CHANNAUTH_TBL (CHANNID, ESBFUNCID) VALUES ('MOBILE', 'GMYD0001');
231
+ INSERT INTO MCR_CHANNAUTH_TBL (CHANNID, ESBFUNCID) VALUES ('WEB', 'GMYD0001');
231
232
  ```
232
233
 
233
234
  ---
@@ -243,6 +244,7 @@ VALUES ('WEB', 'GMYD0001');
243
244
  - [ ] Create queue definition shell script
244
245
  - [ ] Create DB script to register service and channel auth
245
246
  - [ ] Wire ALL failure terminals to `ErrorHandler`
246
- - [ ] Set `ApplicationLabel` and `PropertiesFileName` on `PropertyReader` node
247
- - [ ] Set correct backend adapter flag on `HTTPRequestAdapter` node
247
+ - [ ] Set `PropertyFilename` and `PropertiesGroup` on `PropertyReader` node
248
+ - [ ] Set `ServiceURL`/`TimeoutInSec` on `HTTPRequestAdapter`; set the backend error-mapping flag on `ErrorHandler`
249
+ - [ ] BROKER SCHEMA is `com.qiwa.esb.<msgflowname-lower>` with `PATH Qiwa.Framework.Lib;`
248
250
  - [ ] Confirm `UserPassword` is in `maskingIn` and `maskingOut`
package/dist/cli.mjs CHANGED
@@ -83759,7 +83759,7 @@ async function printStartupScreen() {
83759
83759
  const sLen = ` ● ${sL} Ready — type /help to begin`.length;
83760
83760
  out.push(boxRow(sRow, W2, sLen));
83761
83761
  out.push(`${rgb(...BORDER)}╚${"═".repeat(W2 - 2)}╝${RESET}`);
83762
- out.push(` ${DIM}${rgb(...DIMCOL)}orbit-code ${RESET}${rgb(...ACCENT)}v${"0.1.22"}${RESET}`);
83762
+ out.push(` ${DIM}${rgb(...DIMCOL)}orbit-code ${RESET}${rgb(...ACCENT)}v${"0.1.24"}${RESET}`);
83763
83763
  out.push("");
83764
83764
  process.stdout.write(out.join(`
83765
83765
  `) + `
@@ -327879,6 +327879,15 @@ function getSimplePrompt() {
327879
327879
  ]
327880
327880
  ];
327881
327881
  const backgroundNote = getBackgroundUsageNote2();
327882
+ const windowsShellNote = getPlatform() === "windows" ? [
327883
+ "",
327884
+ "IMPORTANT — Windows shell: this tool runs in **Git Bash (POSIX sh)**, NOT cmd.exe or PowerShell. Use Unix syntax only:",
327885
+ ...prependBullets([
327886
+ "List/find files with the dedicated tools, or POSIX `ls`/`find` — NEVER cmd `dir /s /b` (it exits 2: `/s` `/b` are read as paths).",
327887
+ "Redirect to `/dev/null`, not `nul` (`2>/dev/null`, never `2>nul`).",
327888
+ "Use forward slashes in paths and `$VAR` (not `%VAR%`); avoid backslash path separators."
327889
+ ])
327890
+ ] : [];
327882
327891
  const instructionItems = [
327883
327892
  "If your command will create new directories or files, first use this tool to run `ls` to verify the parent directory exists and is the correct location.",
327884
327893
  'Always quote file paths that contain spaces with double quotes in your command (e.g., cd "path with spaces/file.txt")',
@@ -327899,6 +327908,7 @@ function getSimplePrompt() {
327899
327908
  "Executes a given bash command and returns its output.",
327900
327909
  "",
327901
327910
  "The working directory persists between commands, but shell state does not. The shell environment is initialized from the user's profile (bash or zsh).",
327911
+ ...windowsShellNote,
327902
327912
  "",
327903
327913
  `IMPORTANT: Avoid using this tool to run ${avoidCommands} commands, unless explicitly instructed or after you have verified that a dedicated tool cannot accomplish your task. Instead, use the appropriate dedicated tool as this will provide a much better experience for the user:`,
327904
327914
  "",
@@ -327919,6 +327929,7 @@ var init_prompt21 = __esm(() => {
327919
327929
  init_envUtils();
327920
327930
  init_gitSettings();
327921
327931
  init_filesystem();
327932
+ init_platform();
327922
327933
  init_sandbox_adapter();
327923
327934
  init_slowOperations();
327924
327935
  init_constants3();
@@ -334230,7 +334241,7 @@ function getAnthropicEnvMetadata() {
334230
334241
  function getBuildAgeMinutes() {
334231
334242
  if (false)
334232
334243
  ;
334233
- const buildTime = new Date("2026-06-28T07:25:11.496Z").getTime();
334244
+ const buildTime = new Date("2026-06-28T09:29:30.750Z").getTime();
334234
334245
  if (isNaN(buildTime))
334235
334246
  return;
334236
334247
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -358647,7 +358658,7 @@ function buildPrimarySection() {
358647
358658
  }, undefined, false, undefined, this);
358648
358659
  return [{
358649
358660
  label: "Version",
358650
- value: "0.1.22"
358661
+ value: "0.1.24"
358651
358662
  }, {
358652
358663
  label: "Session name",
358653
358664
  value: nameValue
@@ -410387,7 +410398,7 @@ function getAceSystemPromptSection() {
410387
410398
  return `# IBM App Connect Enterprise (ACE) Expertise
410388
410399
 
410389
410400
  You are an expert IBM App Connect Enterprise (ACE) developer and autonomous coding assistant.
410390
- You specialize in writing, modifying, debugging, and architecting ACE artifacts — ESQL routines (.esql), Message flows (.msgflow), Subflows (.subflow), XSD schemas (.xsd), and project configuration files. You understand the Qiwa ESB framework conventions deeply.
410401
+ You specialize in writing, modifying, debugging, and architecting ACE artifacts — ESQL routines (.esql), Message flows (.msgflow), Subflows (.subflow), XSD schemas (.xsd), and project configuration files. You understand the ESB framework conventions deeply.
410391
410402
 
410392
410403
  ## ACE File Types You Work With
410393
410404
  - **.esql** — ESQL modules (Compute, Filter, Database modules, Functions, Procedures)
@@ -410405,7 +410416,7 @@ These hold for every ACE task, even quick edits. Load the detailed reference fil
410405
410416
  - **Write complete files** — read before modifying, then write the full updated file. Never partial snippets.
410406
410417
  - **ESQL:** use REFERENCE TO for repeated tree paths; evaluate CARDINALITY() once before loops (never in a WHILE condition); use \`SET OutputRoot = InputRoot;\` for full copies.
410407
410418
  - **Security:** PASSTHRU with string concatenation is FORBIDDEN — always parameterize with \`?\` placeholders. Never introduce SQL/command injection.
410408
- - **Framework first:** never reimplement what a Qiwa framework subflow/function already does. Standard MQ I/O and error handling MUST use framework subflows.
410419
+ - **Framework first:** never reimplement what a framework subflow/function already does. Standard MQ I/O and error handling MUST use framework subflows.
410409
410420
  - **Flows:** every node type needs a matching xmlns; wire all failure terminals to error handlers; subflow terminals use Capital I/O (InTerminal.Input/OutTerminal.Output), built-in nodes use lowercase (InTerminal.in/OutTerminal.out).
410410
410421
  - **Naming:** BROKER SCHEMA \`com.qiwa.esb.<flow_lowercase>\`; ESQL module \`<FlowName>_<NodeName>\` must match the computeExpression/filterExpression exactly.
410411
410422
  - **application.descriptor** must always be a SINGLE LINE of XML.
@@ -470725,7 +470736,7 @@ function WelcomeV2() {
470725
470736
  dimColor: true,
470726
470737
  children: [
470727
470738
  "v",
470728
- "0.1.22",
470739
+ "0.1.24",
470729
470740
  " "
470730
470741
  ]
470731
470742
  }, undefined, true, undefined, this)
@@ -470925,7 +470936,7 @@ function WelcomeV2() {
470925
470936
  dimColor: true,
470926
470937
  children: [
470927
470938
  "v",
470928
- "0.1.22",
470939
+ "0.1.24",
470929
470940
  " "
470930
470941
  ]
470931
470942
  }, undefined, true, undefined, this)
@@ -471151,7 +471162,7 @@ function AppleTerminalWelcomeV2(t0) {
471151
471162
  dimColor: true,
471152
471163
  children: [
471153
471164
  "v",
471154
- "0.1.22",
471165
+ "0.1.24",
471155
471166
  " "
471156
471167
  ]
471157
471168
  }, undefined, true, undefined, this);
@@ -471405,7 +471416,7 @@ function AppleTerminalWelcomeV2(t0) {
471405
471416
  dimColor: true,
471406
471417
  children: [
471407
471418
  "v",
471408
- "0.1.22",
471419
+ "0.1.24",
471409
471420
  " "
471410
471421
  ]
471411
471422
  }, undefined, true, undefined, this);
@@ -474766,7 +474777,7 @@ ${args || "The user wants to generate a new ACE application. Follow Step 1: ask
474766
474777
  });
474767
474778
  registerBundledSkill({
474768
474779
  name: "ace-review",
474769
- description: "Perform a thorough code review of IBM ACE artifacts — ESQL correctness, flow wiring, naming conventions, error handling, framework usage, and Qiwa coding standards",
474780
+ description: "Perform a thorough code review of IBM ACE artifacts — ESQL correctness, flow wiring, naming conventions, error handling, framework usage, and ESQL coding standards",
474770
474781
  aliases: ["ace-audit"],
474771
474782
  model: "gemini-3.1-flash-lite",
474772
474783
  whenToUse: 'When the user wants a code review of their ACE project, ESQL modules, message flows, or subflows. Triggered by mentions of "review", "audit", "check" in the context of ACE/ESQL/msgflow files',
@@ -474808,7 +474819,7 @@ Perform a thorough code review of the specified IBM ACE file(s) or the entire pr
474808
474819
  - **application.descriptor:** Is it single-line XML? Are all shared library references present?
474809
474820
  - **.project:** Are all dependencies listed?
474810
474821
  - **File organization:** Does the package path follow com/qiwa/esb/<service>/ convention?
474811
- - **Qiwa standards adherence:** BROKER SCHEMA format, error handling via Environment.Variables.MWResponse.status, LogError routing
474822
+ - **Standards adherence:** BROKER SCHEMA format, error handling via Environment.Variables.MWResponse.status, LogError routing
474812
474823
 
474813
474824
  ## Instructions
474814
474825
 
@@ -474918,7 +474929,7 @@ Use the real node names and terminal labels from THIS app.
474918
474929
  4. **Key transformations:** What the ESQL does to the message tree; which fields are mapped.
474919
474930
  5. **Error handling:** How errors are caught and routed; which terminals wire to error handlers.
474920
474931
  6. **External dependencies:** DB calls (stored procedures), SOAP/REST backends, queue names.
474921
- 7. **Framework usage:** Which Qiwa framework subflows are used and why.
474932
+ 7. **Framework usage:** Which framework subflows are used and why.
474922
474933
  8. **State management:** How Environment.Variables carries intermediate state.
474923
474934
  9. **Non-obvious design decisions:** Anything a new developer might find confusing.
474924
474935
 
@@ -474932,7 +474943,7 @@ ${args || "The user did not specify a target. Ask which file, application folder
474932
474943
  });
474933
474944
  registerBundledSkill({
474934
474945
  name: "ace-refactor",
474935
- description: "Refactor IBM ACE ESQL code for performance, clarity, and alignment with Qiwa coding standards",
474946
+ description: "Refactor IBM ACE ESQL code for performance, clarity, and alignment with ESQL coding standards",
474936
474947
  aliases: [],
474937
474948
  model: "gemini-3.1-pro-preview",
474938
474949
  whenToUse: "When the user wants to improve, clean up, optimize, or refactor their ESQL code or message flows",
@@ -474947,7 +474958,7 @@ ${readInstructions([
474947
474958
  "components/error-handling.md"
474948
474959
  ])}
474949
474960
 
474950
- Refactor the specified file for performance and clarity following strict Qiwa ESQL coding standards. Always read the file first, then write the complete refactored version.
474961
+ Refactor the specified file for performance and clarity following strict ESQL coding standards. Always read the file first, then write the complete refactored version.
474951
474962
 
474952
474963
  ## Refactoring Rules (Apply ALL)
474953
474964
 
@@ -475057,7 +475068,7 @@ ${args || "No flow specified. Ask the user which flow or ESQL module needs test
475057
475068
  });
475058
475069
  registerBundledSkill({
475059
475070
  name: "ace-scaffold",
475060
- description: "Scaffold a new IBM ACE message flow with ESQL from a description — creates .msgflow and .esql files following Qiwa conventions",
475071
+ description: "Scaffold a new IBM ACE message flow with ESQL from a description — creates .msgflow and .esql files following framework conventions",
475061
475072
  aliases: ["ace-flow"],
475062
475073
  model: "gemini-3.1-pro-preview",
475063
475074
  whenToUse: "When the user wants to create a single new message flow, add a new subflow to an existing project, or quickly scaffold a flow from a description",
@@ -492042,7 +492053,7 @@ Usage: orbit --remote "your task description"`, () => gracefulShutdown(1));
492042
492053
  pendingHookMessages
492043
492054
  }, renderAndRun);
492044
492055
  }
492045
- }).version("0.1.22 (Orbit AI)", "-v, --version", "Output the version number");
492056
+ }).version("0.1.24 (Orbit AI)", "-v, --version", "Output the version number");
492046
492057
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
492047
492058
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
492048
492059
  if (canUserConfigureAdvisor()) {
@@ -492564,7 +492575,7 @@ if (false) {}
492564
492575
  async function main2() {
492565
492576
  const args = process.argv.slice(2);
492566
492577
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
492567
- console.log(`${"0.1.22"} (Orbit AI)`);
492578
+ console.log(`${"0.1.24"} (Orbit AI)`);
492568
492579
  return;
492569
492580
  }
492570
492581
  if (args.includes("--provider")) {
@@ -492668,4 +492679,4 @@ async function main2() {
492668
492679
  }
492669
492680
  main2();
492670
492681
 
492671
- //# debugId=464CEC6DB47A292F64756E2164756E21
492682
+ //# debugId=B5A9F37005B0954864756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orbit-code-ai",
3
- "version": "0.1.22",
3
+ "version": "0.1.24",
4
4
  "description": "Orbit AI – Your AI-powered IBM ACE coding companion",
5
5
  "type": "module",
6
6
  "author": "moenawaf",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: apic-api
3
- description: Generate a complete IBM API Connect (APIC) API definition for the DataPower API Gateway — full OpenAPI 2.0 (or 3.0) YAML including the x-ibm-configuration assembly (middleware logging, JWT validate, token-expiration switch, ESB response envelope, and catch handlers). Standard NHC/Qiwa middleware is baked in with opt-out flags.
3
+ description: Generate a complete IBM API Connect (APIC) API definition for the DataPower API Gateway — full OpenAPI 2.0 (or 3.0) YAML including the x-ibm-configuration assembly (middleware logging, JWT validate, token-expiration switch, ESB response envelope, and catch handlers). Standard NHC middleware is baked in with opt-out flags.
4
4
  trigger: /apic-api
5
5
  ---
6
6