snow-flow 10.0.1-dev.475 → 10.0.1-dev.476

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
- "version": "10.0.1-dev.475",
3
+ "version": "10.0.1-dev.476",
4
4
  "name": "snow-flow",
5
5
  "description": "Snow-Flow - ServiceNow Multi-Agent Development Framework powered by AI",
6
6
  "license": "Elastic-2.0",
@@ -1148,102 +1148,114 @@ async function getFlowTriggerInfo(
1148
1148
  var tableLabel = '';
1149
1149
  var debug: any = {};
1150
1150
 
1151
+ // PRIMARY: Read flow via ProcessFlow REST API (same endpoint as Flow Designer UI)
1152
+ // This is how the UI loads the flow — returns JSON/XML with full trigger data
1151
1153
  try {
1152
- // Read the flow version payload which contains all flow elements
1153
- var resp = await client.get('/api/now/table/sys_hub_flow_version', {
1154
- params: {
1155
- sysparm_query: 'flow=' + flowId + '^ORDERBYDESCsys_created_on',
1156
- sysparm_fields: 'sys_id,payload',
1157
- sysparm_limit: 1
1158
- }
1159
- });
1160
- var versionRecord = resp.data.result?.[0];
1161
- debug.version_found = !!versionRecord;
1162
- debug.version_sys_id = versionRecord?.sys_id || null;
1163
- var payload = versionRecord?.payload;
1164
- debug.payload_exists = !!payload;
1165
- debug.payload_type = typeof payload;
1166
- if (payload) {
1167
- var parsed = typeof payload === 'string' ? JSON.parse(payload) : payload;
1168
- debug.payload_keys = Object.keys(parsed);
1169
- // The payload contains triggerInstances array with trigger data
1170
- var triggerInstances = parsed.triggerInstances || parsed.trigger_instances || [];
1171
- debug.triggerInstances_found = Array.isArray(triggerInstances) ? triggerInstances.length : 'not_array';
1172
- if (!Array.isArray(triggerInstances)) {
1173
- // Some payloads nest elements differently
1174
- if (parsed.elements) {
1175
- triggerInstances = (Array.isArray(parsed.elements) ? parsed.elements : []).filter(
1176
- (e: any) => e.type === 'trigger' || e.elementType === 'trigger'
1177
- );
1178
- debug.elements_trigger_count = triggerInstances.length;
1154
+ debug.processflow_api = 'attempting';
1155
+ var pfResp = await client.get('/api/now/processflow/flow/' + flowId);
1156
+ var pfData = pfResp.data?.result || pfResp.data;
1157
+ debug.processflow_api = 'success';
1158
+ debug.processflow_type = typeof pfData;
1159
+ debug.processflow_keys = pfData && typeof pfData === 'object' ? Object.keys(pfData).slice(0, 20) : null;
1160
+
1161
+ // The ProcessFlow API returns the flow with trigger instances
1162
+ // Try multiple possible structures for trigger data
1163
+ var pfTriggers = pfData?.triggerInstances || pfData?.trigger_instances || pfData?.triggers || [];
1164
+ if (!Array.isArray(pfTriggers) && pfData?.model?.triggerInstances) {
1165
+ pfTriggers = pfData.model.triggerInstances;
1166
+ }
1167
+ if (!Array.isArray(pfTriggers) && pfData?.definition?.triggerInstances) {
1168
+ pfTriggers = pfData.definition.triggerInstances;
1169
+ }
1170
+ debug.processflow_triggers = Array.isArray(pfTriggers) ? pfTriggers.length : typeof pfTriggers;
1171
+
1172
+ if (Array.isArray(pfTriggers) && pfTriggers.length > 0) {
1173
+ var pfTrig = pfTriggers[0];
1174
+ debug.processflow_trigger_keys = Object.keys(pfTrig);
1175
+ debug.processflow_trigger_name = pfTrig.name;
1176
+ triggerName = pfTrig.name || pfTrig.triggerName || '';
1177
+ if (pfTrig.inputs && Array.isArray(pfTrig.inputs)) {
1178
+ for (var pfi = 0; pfi < pfTrig.inputs.length; pfi++) {
1179
+ if (pfTrig.inputs[pfi].name === 'table') {
1180
+ table = pfTrig.inputs[pfi].value?.value || str(pfTrig.inputs[pfi].value) || '';
1181
+ break;
1182
+ }
1179
1183
  }
1180
1184
  }
1181
- if (triggerInstances.length > 0) {
1182
- var trigger = triggerInstances[0];
1183
- debug.trigger_keys = Object.keys(trigger);
1184
- debug.trigger_name_field = trigger.name;
1185
- debug.trigger_triggerName_field = trigger.triggerName;
1186
- triggerName = trigger.name || trigger.triggerName || '';
1187
- // Look for table in trigger inputs
1188
- if (trigger.inputs && Array.isArray(trigger.inputs)) {
1189
- debug.trigger_input_names = trigger.inputs.map(function (inp: any) { return inp.name; });
1190
- for (var ti = 0; ti < trigger.inputs.length; ti++) {
1191
- if (trigger.inputs[ti].name === 'table') {
1192
- table = trigger.inputs[ti].value?.value || trigger.inputs[ti].value || '';
1193
- break;
1185
+ }
1186
+
1187
+ // If trigger not found in expected structure, search recursively in the response
1188
+ if (!triggerName && pfData) {
1189
+ var searchForTrigger = function (obj: any, depth: number): void {
1190
+ if (depth > 4 || triggerName) return;
1191
+ if (!obj || typeof obj !== 'object') return;
1192
+ // Look for objects that have triggerDefinitionId or triggerType + name
1193
+ if (obj.triggerDefinitionId && obj.name) {
1194
+ triggerName = obj.name;
1195
+ debug.processflow_trigger_found_at = 'recursive_search';
1196
+ if (obj.inputs && Array.isArray(obj.inputs)) {
1197
+ for (var ri = 0; ri < obj.inputs.length; ri++) {
1198
+ if (obj.inputs[ri].name === 'table') {
1199
+ table = obj.inputs[ri].value?.value || str(obj.inputs[ri].value) || '';
1200
+ break;
1201
+ }
1194
1202
  }
1195
1203
  }
1204
+ return;
1205
+ }
1206
+ if (Array.isArray(obj)) {
1207
+ for (var ai = 0; ai < obj.length; ai++) searchForTrigger(obj[ai], depth + 1);
1196
1208
  } else {
1197
- debug.trigger_inputs = trigger.inputs ? typeof trigger.inputs : 'undefined';
1209
+ for (var key of Object.keys(obj)) searchForTrigger(obj[key], depth + 1);
1198
1210
  }
1199
- }
1200
- } else {
1201
- debug.payload_raw = 'null_or_empty';
1211
+ };
1212
+ searchForTrigger(pfData, 0);
1202
1213
  }
1203
- } catch (e: any) {
1204
- debug.error = e.message;
1214
+ } catch (pfErr: any) {
1215
+ debug.processflow_api = 'error: ' + pfErr.message;
1205
1216
  }
1206
1217
 
1207
- // Fallback 1: no-op GraphQL mutation to read current flow state (same API as our INSERT/UPDATE)
1208
- // Sending just flowId with no changes returns the current state including trigger instances
1218
+ // Fallback 1: Read version payload (legacy approach)
1209
1219
  if (!triggerName || !table) {
1210
- debug.fallback_noop_mutation = 'attempting';
1220
+ debug.version_fallback = 'attempting';
1211
1221
  try {
1212
- var noopMutation = 'mutation { global { snFlowDesigner { flow(flowPatch: {flowId: "' + flowId + '"}) { id triggerInstances { name type inputs { name value { value } } __typename } __typename } __typename } __typename } }';
1213
- var noopResp = await client.post('/api/now/graphql', { variables: {}, query: noopMutation });
1214
- var noopFlow = noopResp.data?.data?.global?.snFlowDesigner?.flow;
1215
- debug.fallback_noop_response_keys = noopFlow ? Object.keys(noopFlow) : 'null';
1216
- var noopTriggers = noopFlow?.triggerInstances || [];
1217
- debug.fallback_noop_triggers = Array.isArray(noopTriggers) ? noopTriggers.length : noopTriggers;
1218
- if (Array.isArray(noopTriggers) && noopTriggers.length > 0) {
1219
- var nt = noopTriggers[0];
1220
- debug.fallback_noop_trigger = { name: nt.name, type: nt.type, inputCount: nt.inputs?.length };
1221
- if (!triggerName && nt.name) triggerName = nt.name;
1222
- if (!table && nt.inputs) {
1223
- for (var ni = 0; ni < nt.inputs.length; ni++) {
1224
- if (nt.inputs[ni].name === 'table') {
1225
- table = nt.inputs[ni].value?.value || '';
1226
- break;
1222
+ var resp = await client.get('/api/now/table/sys_hub_flow_version', {
1223
+ params: {
1224
+ sysparm_query: 'flow=' + flowId + '^ORDERBYDESCsys_created_on',
1225
+ sysparm_fields: 'sys_id,payload',
1226
+ sysparm_limit: 1
1227
+ }
1228
+ });
1229
+ var payload = resp.data.result?.[0]?.payload;
1230
+ if (payload) {
1231
+ var parsed = typeof payload === 'string' ? JSON.parse(payload) : payload;
1232
+ debug.version_payload_keys = Object.keys(parsed);
1233
+ var trigInst = parsed.triggerInstances || parsed.trigger_instances || [];
1234
+ if (Array.isArray(trigInst) && trigInst.length > 0) {
1235
+ if (!triggerName) triggerName = trigInst[0].name || trigInst[0].triggerName || '';
1236
+ if (!table && trigInst[0].inputs) {
1237
+ for (var vi = 0; vi < trigInst[0].inputs.length; vi++) {
1238
+ if (trigInst[0].inputs[vi].name === 'table') {
1239
+ table = trigInst[0].inputs[vi].value?.value || '';
1240
+ break;
1241
+ }
1227
1242
  }
1228
1243
  }
1229
1244
  }
1230
1245
  }
1231
- } catch (noopErr: any) {
1232
- debug.fallback_noop_mutation = 'error: ' + noopErr.message;
1233
- }
1246
+ } catch (_) {}
1234
1247
  }
1235
1248
 
1236
1249
  // Fallback 2: query sys_hub_flow for table + trigger definition for name
1237
1250
  if (!triggerName || !table) {
1238
- debug.fallback_flow_table = 'attempting';
1251
+ debug.flow_record_fallback = 'attempting';
1239
1252
  try {
1240
1253
  var flowResp = await client.get('/api/now/table/sys_hub_flow', {
1241
1254
  params: { sysparm_query: 'sys_id=' + flowId, sysparm_fields: 'sys_id,name,table,trigger_type', sysparm_limit: 1 }
1242
1255
  });
1243
1256
  var flowRec = flowResp.data.result?.[0];
1244
- debug.fallback_flow_record = { table: str(flowRec?.table), trigger_type: str(flowRec?.trigger_type) };
1257
+ debug.flow_record = { table: str(flowRec?.table), trigger_type: str(flowRec?.trigger_type) };
1245
1258
  if (!table && flowRec?.table) table = str(flowRec.table);
1246
- // Try to resolve trigger name from trigger_type reference
1247
1259
  var trigTypeId = str(flowRec?.trigger_type);
1248
1260
  if (!triggerName && trigTypeId) {
1249
1261
  try {
@@ -1252,7 +1264,7 @@ async function getFlowTriggerInfo(
1252
1264
  });
1253
1265
  var trigDef = trigDefResp.data.result?.[0];
1254
1266
  if (trigDef?.name) triggerName = str(trigDef.name);
1255
- debug.fallback_trigger_def = { name: str(trigDef?.name), type: str(trigDef?.type) };
1267
+ debug.trigger_def = { name: str(trigDef?.name), type: str(trigDef?.type) };
1256
1268
  } catch (_) {}
1257
1269
  }
1258
1270
  } catch (_) {}