orbit-code-ai 0.1.20 → 0.1.23

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.20"}${RESET}`);
83762
+ out.push(` ${DIM}${rgb(...DIMCOL)}orbit-code ${RESET}${rgb(...ACCENT)}v${"0.1.23"}${RESET}`);
83763
83763
  out.push("");
83764
83764
  process.stdout.write(out.join(`
83765
83765
  `) + `
@@ -334230,7 +334230,7 @@ function getAnthropicEnvMetadata() {
334230
334230
  function getBuildAgeMinutes() {
334231
334231
  if (false)
334232
334232
  ;
334233
- const buildTime = new Date("2026-06-25T13:10:17.647Z").getTime();
334233
+ const buildTime = new Date("2026-06-28T08:19:59.996Z").getTime();
334234
334234
  if (isNaN(buildTime))
334235
334235
  return;
334236
334236
  return Math.floor((Date.now() - buildTime) / 60000);
@@ -358647,7 +358647,7 @@ function buildPrimarySection() {
358647
358647
  }, undefined, false, undefined, this);
358648
358648
  return [{
358649
358649
  label: "Version",
358650
- value: "0.1.20"
358650
+ value: "0.1.23"
358651
358651
  }, {
358652
358652
  label: "Session name",
358653
358653
  value: nameValue
@@ -410387,7 +410387,7 @@ function getAceSystemPromptSection() {
410387
410387
  return `# IBM App Connect Enterprise (ACE) Expertise
410388
410388
 
410389
410389
  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.
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 ESB framework conventions deeply.
410391
410391
 
410392
410392
  ## ACE File Types You Work With
410393
410393
  - **.esql** — ESQL modules (Compute, Filter, Database modules, Functions, Procedures)
@@ -410405,7 +410405,7 @@ These hold for every ACE task, even quick edits. Load the detailed reference fil
410405
410405
  - **Write complete files** — read before modifying, then write the full updated file. Never partial snippets.
410406
410406
  - **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
410407
  - **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.
410408
+ - **Framework first:** never reimplement what a framework subflow/function already does. Standard MQ I/O and error handling MUST use framework subflows.
410409
410409
  - **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
410410
  - **Naming:** BROKER SCHEMA \`com.qiwa.esb.<flow_lowercase>\`; ESQL module \`<FlowName>_<NodeName>\` must match the computeExpression/filterExpression exactly.
410411
410411
  - **application.descriptor** must always be a SINGLE LINE of XML.
@@ -410444,8 +410444,15 @@ The \`_agent_reference\` folder contains the authoritative detailed standards, t
410444
410444
 
410445
410445
  ---
410446
410446
 
410447
+ ## Code Navigation — Be Surgical (find the relevant file, read only it)
410448
+ Work like a precise engineer, not a crawler. Reading unneeded files wastes time and money and dilutes focus — find the file that matters, read it, and stop.
410449
+ - **Locate before you read.** Start from a concrete signal: a file/module/flow name, a symbol, an error or BIP code, a field. Use \`Grep\` (for a symbol or string) or \`Glob\` (for a filename), **scoped to the current working directory**, to find the exact file. Do not open files speculatively.
410450
+ - **Read only what the search points to**, plus the one or two files it directly references (e.g. a .msgflow's computeExpression → that .esql). Open a file ONLY when you have a concrete reason to.
410451
+ - **Never crawl.** Do not bulk-read directories, do not "read all the files first," and never read the shared framework/libraries to understand an application — anything under \`Framework/\`, \`Utils/\`, \`Qiwa/Framework/Lib\`, or \`lib/\` is shared infrastructure. Use the \`_agent_reference\` docs above for framework behavior instead of opening its source.
410452
+ - **Narrow, don't widen.** If a search returns many matches, refine the query — don't read them all.
410453
+
410447
410454
  ## General Behavior
410448
- - Always read files before modifying them
410455
+ - Always read a file before modifying it (the specific file you will edit — not the whole project)
410449
410456
  - Always write complete file content — never partial snippets
410450
410457
  - When generating a full application, generate every required file — do not stop halfway
410451
410458
  - Prioritize correctness and security. Never introduce SQL injection, command injection, or other vulnerabilities
@@ -470718,7 +470725,7 @@ function WelcomeV2() {
470718
470725
  dimColor: true,
470719
470726
  children: [
470720
470727
  "v",
470721
- "0.1.20",
470728
+ "0.1.23",
470722
470729
  " "
470723
470730
  ]
470724
470731
  }, undefined, true, undefined, this)
@@ -470918,7 +470925,7 @@ function WelcomeV2() {
470918
470925
  dimColor: true,
470919
470926
  children: [
470920
470927
  "v",
470921
- "0.1.20",
470928
+ "0.1.23",
470922
470929
  " "
470923
470930
  ]
470924
470931
  }, undefined, true, undefined, this)
@@ -471144,7 +471151,7 @@ function AppleTerminalWelcomeV2(t0) {
471144
471151
  dimColor: true,
471145
471152
  children: [
471146
471153
  "v",
471147
- "0.1.20",
471154
+ "0.1.23",
471148
471155
  " "
471149
471156
  ]
471150
471157
  }, undefined, true, undefined, this);
@@ -471398,7 +471405,7 @@ function AppleTerminalWelcomeV2(t0) {
471398
471405
  dimColor: true,
471399
471406
  children: [
471400
471407
  "v",
471401
- "0.1.20",
471408
+ "0.1.23",
471402
471409
  " "
471403
471410
  ]
471404
471411
  }, undefined, true, undefined, this);
@@ -474759,7 +474766,7 @@ ${args || "The user wants to generate a new ACE application. Follow Step 1: ask
474759
474766
  });
474760
474767
  registerBundledSkill({
474761
474768
  name: "ace-review",
474762
- description: "Perform a thorough code review of IBM ACE artifacts — ESQL correctness, flow wiring, naming conventions, error handling, framework usage, and Qiwa coding standards",
474769
+ description: "Perform a thorough code review of IBM ACE artifacts — ESQL correctness, flow wiring, naming conventions, error handling, framework usage, and ESQL coding standards",
474763
474770
  aliases: ["ace-audit"],
474764
474771
  model: "gemini-3.1-flash-lite",
474765
474772
  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',
@@ -474801,7 +474808,7 @@ Perform a thorough code review of the specified IBM ACE file(s) or the entire pr
474801
474808
  - **application.descriptor:** Is it single-line XML? Are all shared library references present?
474802
474809
  - **.project:** Are all dependencies listed?
474803
474810
  - **File organization:** Does the package path follow com/qiwa/esb/<service>/ convention?
474804
- - **Qiwa standards adherence:** BROKER SCHEMA format, error handling via Environment.Variables.MWResponse.status, LogError routing
474811
+ - **Standards adherence:** BROKER SCHEMA format, error handling via Environment.Variables.MWResponse.status, LogError routing
474805
474812
 
474806
474813
  ## Instructions
474807
474814
 
@@ -474911,7 +474918,7 @@ Use the real node names and terminal labels from THIS app.
474911
474918
  4. **Key transformations:** What the ESQL does to the message tree; which fields are mapped.
474912
474919
  5. **Error handling:** How errors are caught and routed; which terminals wire to error handlers.
474913
474920
  6. **External dependencies:** DB calls (stored procedures), SOAP/REST backends, queue names.
474914
- 7. **Framework usage:** Which Qiwa framework subflows are used and why.
474921
+ 7. **Framework usage:** Which framework subflows are used and why.
474915
474922
  8. **State management:** How Environment.Variables carries intermediate state.
474916
474923
  9. **Non-obvious design decisions:** Anything a new developer might find confusing.
474917
474924
 
@@ -474925,7 +474932,7 @@ ${args || "The user did not specify a target. Ask which file, application folder
474925
474932
  });
474926
474933
  registerBundledSkill({
474927
474934
  name: "ace-refactor",
474928
- description: "Refactor IBM ACE ESQL code for performance, clarity, and alignment with Qiwa coding standards",
474935
+ description: "Refactor IBM ACE ESQL code for performance, clarity, and alignment with ESQL coding standards",
474929
474936
  aliases: [],
474930
474937
  model: "gemini-3.1-pro-preview",
474931
474938
  whenToUse: "When the user wants to improve, clean up, optimize, or refactor their ESQL code or message flows",
@@ -474940,7 +474947,7 @@ ${readInstructions([
474940
474947
  "components/error-handling.md"
474941
474948
  ])}
474942
474949
 
474943
- 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.
474950
+ Refactor the specified file for performance and clarity following strict ESQL coding standards. Always read the file first, then write the complete refactored version.
474944
474951
 
474945
474952
  ## Refactoring Rules (Apply ALL)
474946
474953
 
@@ -475050,7 +475057,7 @@ ${args || "No flow specified. Ask the user which flow or ESQL module needs test
475050
475057
  });
475051
475058
  registerBundledSkill({
475052
475059
  name: "ace-scaffold",
475053
- description: "Scaffold a new IBM ACE message flow with ESQL from a description — creates .msgflow and .esql files following Qiwa conventions",
475060
+ description: "Scaffold a new IBM ACE message flow with ESQL from a description — creates .msgflow and .esql files following framework conventions",
475054
475061
  aliases: ["ace-flow"],
475055
475062
  model: "gemini-3.1-pro-preview",
475056
475063
  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",
@@ -475122,7 +475129,23 @@ ${readInstructions([
475122
475129
  "components/common-utils.md"
475123
475130
  ])}
475124
475131
 
475125
- Diagnose and fix the bug or error described by the user. Read all relevant project files first, then use the error-handling reference to understand framework error patterns. Write complete corrected versions.
475132
+ Diagnose and fix the bug or error described by the user. Write complete corrected files.
475133
+
475134
+ ## Investigate surgically — find the relevant file, read only it
475135
+
475136
+ Work like a precise debugger, NOT a crawler. Do NOT bulk-read directories or "read all the files" —
475137
+ that wastes time and money. Locate the specific file(s) that matter, read those, and stop:
475138
+
475139
+ 1. Start from the concrete signal in the bug report — a BIP code, an ESQL module name, a flow/node
475140
+ name, a field, or an error string.
475141
+ 2. Find it with a SCOPED search: \`Grep\` for the symbol/string, or \`Glob\` for the filename,
475142
+ restricted to the current working directory. Let the search point you to the exact file.
475143
+ 3. Read ONLY the file(s) the search identifies, plus the one or two they directly reference (e.g. a
475144
+ \`.msgflow\`'s computeExpression → that \`.esql\`). Open a file ONLY when you have a concrete reason.
475145
+ 4. **Never crawl shared infrastructure or unrelated apps** — do not read under \`Framework/\`,
475146
+ \`Utils/\`, \`Qiwa/Framework/Lib\`, \`lib/\`, or other application folders. Use the error-handling
475147
+ and common-utils references above for framework behavior instead of opening library source.
475148
+ 5. If a search returns many hits, narrow the term — don't read them all.
475126
475149
 
475127
475150
  ## Common ACE Bugs to Check
475128
475151
 
@@ -475149,9 +475172,9 @@ Diagnose and fix the bug or error described by the user. Read all relevant proje
475149
475172
 
475150
475173
  ## Instructions
475151
475174
 
475152
- 1. Read the reference files listed in Step 0 (error handling, common utils)
475153
- 2. Read the file(s) mentioned by the user
475154
- 3. If error is a BIP message, use Glob scoped to the current working directory to find matching module/flow names — do NOT search outside cwd
475175
+ 1. From the bug report, pick the concrete signal (BIP code, module/flow name, field, error text)
475176
+ 2. Locate the file with a cwd-scoped Grep/Glob — never search outside cwd, never crawl the framework
475177
+ 3. Read ONLY the matched file(s) and any file they directly reference — do not bulk-read
475155
475178
  4. Identify the EXACT root cause — quote the problematic line
475156
475179
  5. Explain the bug in plain language
475157
475180
  6. Apply the minimal correct fix
@@ -492019,7 +492042,7 @@ Usage: orbit --remote "your task description"`, () => gracefulShutdown(1));
492019
492042
  pendingHookMessages
492020
492043
  }, renderAndRun);
492021
492044
  }
492022
- }).version("0.1.20 (Orbit AI)", "-v, --version", "Output the version number");
492045
+ }).version("0.1.23 (Orbit AI)", "-v, --version", "Output the version number");
492023
492046
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
492024
492047
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
492025
492048
  if (canUserConfigureAdvisor()) {
@@ -492541,7 +492564,7 @@ if (false) {}
492541
492564
  async function main2() {
492542
492565
  const args = process.argv.slice(2);
492543
492566
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
492544
- console.log(`${"0.1.20"} (Orbit AI)`);
492567
+ console.log(`${"0.1.23"} (Orbit AI)`);
492545
492568
  return;
492546
492569
  }
492547
492570
  if (args.includes("--provider")) {
@@ -492645,4 +492668,4 @@ async function main2() {
492645
492668
  }
492646
492669
  main2();
492647
492670
 
492648
- //# debugId=A39291B213A3EECA64756E2164756E21
492671
+ //# debugId=636F7570F245EA3D64756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orbit-code-ai",
3
- "version": "0.1.20",
3
+ "version": "0.1.23",
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