snow-flow 10.0.1-dev.412 → 10.0.1-dev.414

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.412",
3
+ "version": "10.0.1-dev.414",
4
4
  "name": "snow-flow",
5
5
  "description": "Snow-Flow - ServiceNow Multi-Agent Development Framework powered by AI",
6
6
  "license": "Elastic-2.0",
@@ -124,11 +124,11 @@ async function createFlowViaScheduledJob(
124
124
  " } catch(t1e) { r.steps.tier1 = { success: false, error: t1e.getMessage ? t1e.getMessage() : t1e + '' }; }",
125
125
  "",
126
126
  // ── TIER 2: GlideRecord ──
127
- // Reference flow analysis shows:
128
- // - flow_definition on flow record = null (working flows don't have it)
129
- // - latest_snapshot = 32-char sys_id (reference, NOT JSON!)
130
- // - latest_version = null (normal on this instance)
131
- // So: DON'T set flow_definition on flow, set latest_snapshot = version sys_id.
127
+ // Reference flow analysis:
128
+ // - latest_snapshot points to sys_hub_flow_snapshot (NOT version, NOT JSON)
129
+ // - flow_definition on flow record = null
130
+ // - latest_version = null (normal)
131
+ // Pipeline: flow version snapshot set latest_snapshot on flow
132
132
  " if (!flowSysId) {",
133
133
  " try {",
134
134
  " var f = new GlideRecord('sys_hub_flow');",
@@ -138,11 +138,10 @@ async function createFlowViaScheduledJob(
138
138
  " f.setValue('run_as', runAs); f.setValue('active', false);",
139
139
  " f.setValue('status', 'draft'); f.setValue('validated', true);",
140
140
  " f.setValue('type', isSubflow ? 'subflow' : 'flow');",
141
- // Do NOT set flow_definition (null on working flows)
142
- // Do NOT set latest_snapshot yet (set after version insert — it's a sys_id ref)
143
141
  " flowSysId = f.insert();",
144
142
  " r.steps.flow_insert = { success: !!flowSysId, sys_id: flowSysId + '' };",
145
143
  " if (flowSysId) {",
144
+ // Version record
146
145
  " var v = new GlideRecord('sys_hub_flow_version');",
147
146
  " v.initialize();",
148
147
  " v.setValue('flow', flowSysId); v.setValue('name', '1.0');",
@@ -153,16 +152,35 @@ async function createFlowViaScheduledJob(
153
152
  " verSysId = v.insert();",
154
153
  " r.steps.version_insert = { success: !!verSysId, sys_id: verSysId + '' };",
155
154
  "",
156
- // Set latest_snapshot on flow record to version sys_id (reference field, not JSON)
157
- " if (verSysId) {",
155
+ // Create snapshot in sys_hub_flow_snapshot (this is what latest_snapshot points to!)
156
+ " var snapId = null;",
157
+ " try {",
158
+ " var snap = new GlideRecord('sys_hub_flow_snapshot');",
159
+ " if (snap.isValid()) {",
160
+ " snap.initialize();",
161
+ " snap.setValue('name', flowName);",
162
+ // Try setting common fields — some may not exist, that's OK
163
+ " try { snap.setValue('flow', flowSysId); } catch(e) {}",
164
+ " try { snap.setValue('version', verSysId); } catch(e) {}",
165
+ " try { snap.setValue('state', 'draft'); } catch(e) {}",
166
+ " try { snap.setValue('active', true); } catch(e) {}",
167
+ " if (flowDefStr) { try { snap.setValue('flow_definition', flowDefStr); } catch(e) {} }",
168
+ " snapId = snap.insert();",
169
+ " r.steps.snapshot_insert = { success: !!snapId, sys_id: snapId + '' };",
170
+ " } else { r.steps.snapshot_insert = { success: false, error: 'table not valid' }; }",
171
+ " } catch(snapE) { r.steps.snapshot_insert = { success: false, error: snapE.getMessage ? snapE.getMessage() : snapE + '' }; }",
172
+ "",
173
+ // Set latest_snapshot on flow to point to the snapshot record
174
+ " var snapshotRef = snapId || verSysId;",
175
+ " if (snapshotRef) {",
158
176
  " try {",
159
177
  " var flowUpd = new GlideRecord('sys_hub_flow');",
160
178
  " if (flowUpd.get(flowSysId)) {",
161
- " flowUpd.setValue('latest_snapshot', verSysId);",
179
+ " flowUpd.setValue('latest_snapshot', snapshotRef);",
162
180
  " flowUpd.update();",
163
- " r.steps.latest_snapshot_set = verSysId + '';",
181
+ " r.steps.latest_snapshot_set = { value: snapshotRef + '', source: snapId ? 'snapshot' : 'version' };",
164
182
  " }",
165
- " } catch(lsE) { r.steps.latest_snapshot_set = 'error:' + (lsE.getMessage ? lsE.getMessage() : lsE + ''); }",
183
+ " } catch(lsE) { r.steps.latest_snapshot_set = { error: lsE.getMessage ? lsE.getMessage() : lsE + '' }; }",
166
184
  " }",
167
185
  " r.tier_used = 'gliderecord_scheduled'; r.success = true;",
168
186
  " }",
@@ -273,7 +291,7 @@ async function createFlowViaScheduledJob(
273
291
  " }",
274
292
  " r.steps.variables = { success: true, created: varsCreated };",
275
293
  "",
276
- // ── Reference: query an existing published flow to see what it looks like ──
294
+ // ── Reference: deep-inspect a published flow to find what latest_snapshot points to ──
277
295
  " r.steps.reference_flow = null;",
278
296
  " try {",
279
297
  " var refGr = new GlideRecord('sys_hub_flow');",
@@ -282,83 +300,63 @@ async function createFlowViaScheduledJob(
282
300
  " refGr.setLimit(1); refGr.query();",
283
301
  " if (refGr.next()) {",
284
302
  " var refId = refGr.getUniqueValue();",
285
- " var refFd = refGr.getValue('flow_definition') + '';",
286
303
  " var refLs = refGr.getValue('latest_snapshot') + '';",
287
- " var refLv = refGr.getValue('latest_version') + '';",
288
304
  " r.steps.reference_flow = {",
289
305
  " sys_id: refId,",
290
306
  " name: refGr.getValue('name'),",
291
- " has_flow_definition: refFd !== 'null' && refFd.length > 0,",
292
- " flow_definition_length: refFd.length,",
293
- " flow_definition_prefix: refFd.substring(0, 200),",
294
- " has_latest_snapshot: refLs !== 'null' && refLs.length > 0,",
295
- " latest_snapshot_length: refLs.length,",
296
- " latest_version: refLv,",
297
- " has_latest_version: refLv !== 'null' && refLv.length > 5",
307
+ " latest_snapshot_value: refLs,",
308
+ " latest_version: refGr.getValue('latest_version') + ''",
298
309
  " };",
299
- // Query version records for reference flow (by flow= since latest_version is null)
300
- " var refVer = new GlideRecord('sys_hub_flow_version');",
301
- " refVer.addQuery('flow', refId);",
302
- " refVer.orderByDesc('sys_created_on');",
303
- " refVer.setLimit(1); refVer.query();",
304
- " if (refVer.next()) {",
305
- " var refVFd = refVer.getValue('flow_definition') + '';",
306
- " r.steps.reference_flow.version_sys_id = refVer.getUniqueValue();",
307
- " r.steps.reference_flow.version_state = refVer.getValue('state');",
308
- " r.steps.reference_flow.version_compile_state = refVer.getValue('compile_state');",
309
- " r.steps.reference_flow.version_is_current = refVer.getValue('is_current');",
310
- " r.steps.reference_flow.version_active = refVer.getValue('active');",
311
- " r.steps.reference_flow.version_has_flow_def = refVFd !== 'null' && refVFd.length > 0;",
312
- " r.steps.reference_flow.version_flow_def_length = refVFd.length;",
313
- " r.steps.reference_flow.version_flow_def_prefix = refVFd.substring(0, 200);",
314
- // Check if latest_snapshot matches this version sys_id
315
- " r.steps.reference_flow.snapshot_matches_version = (refLs === refVer.getUniqueValue());",
316
- " } else { r.steps.reference_flow.version_found = false; }",
310
+ // Read the reference snapshot record fields (sys_hub_flow_snapshot)
311
+ " if (refLs !== 'null' && refLs.length === 32) {",
312
+ " try {",
313
+ " var refSnap = new GlideRecord('sys_hub_flow_snapshot');",
314
+ " if (refSnap.get(refLs)) {",
315
+ " r.steps.reference_flow.snapshot_table = 'sys_hub_flow_snapshot';",
316
+ // Read all non-null fields to learn the schema
317
+ " var snapFields = {};",
318
+ " var snapEl = refSnap.getFields();",
319
+ " for (var si = 0; si < snapEl.size(); si++) {",
320
+ " var sField = snapEl.get(si);",
321
+ " var sName = sField.getName() + '';",
322
+ " var sVal = refSnap.getValue(sName);",
323
+ " if (sVal && sName.indexOf('sys_') !== 0) {",
324
+ " var sStr = sVal + '';",
325
+ " snapFields[sName] = sStr.length > 100 ? sStr.substring(0, 100) + '...(len:' + sStr.length + ')' : sStr;",
326
+ " }",
327
+ " }",
328
+ " r.steps.reference_flow.snapshot_fields = snapFields;",
329
+ " }",
330
+ " } catch(snapRefE) { r.steps.reference_flow.snapshot_error = snapRefE + ''; }",
331
+ " }",
332
+ // Count trigger/action instances for reference flow
333
+ " var refTrig = new GlideAggregate('sys_hub_trigger_instance');",
334
+ " refTrig.addQuery('flow', refId); refTrig.addAggregate('COUNT'); refTrig.query();",
335
+ " r.steps.reference_flow.trigger_count = refTrig.next() ? parseInt(refTrig.getAggregate('COUNT')) : 0;",
336
+ " var refAct = new GlideAggregate('sys_hub_action_instance');",
337
+ " refAct.addQuery('flow', refId); refAct.addAggregate('COUNT'); refAct.query();",
338
+ " r.steps.reference_flow.action_count = refAct.next() ? parseInt(refAct.getAggregate('COUNT')) : 0;",
317
339
  " }",
318
340
  " } catch(refE) { r.steps.reference_flow = { error: refE + '' }; }",
319
341
  "",
320
- // ── Engine: try FlowAPI.compile() now that flow_definition is set ──
321
- // DO NOT try publish (StackOverflowError). Only compile.
322
- " r.steps.engine = { apis_found: [], mode: 'compile_with_flowdef' };",
342
+ // ── Engine: skip compile (returns error, doesn't help) ──
343
+ " r.steps.engine = { mode: 'probe_only' };",
323
344
  " try {",
324
345
  " if (typeof sn_fd !== 'undefined') {",
325
346
  " r.steps.engine.sn_fd = 'available';",
326
- " if (sn_fd.FlowAPI && typeof sn_fd.FlowAPI.compile === 'function') {",
327
- " r.steps.engine.apis_found.push('FlowAPI');",
328
- " try {",
329
- " var compileResult = sn_fd.FlowAPI.compile(flowSysId);",
330
- " r.steps.engine.compile = 'success';",
331
- " r.steps.engine.compile_result = (compileResult + '').substring(0, 200);",
332
- " } catch(ce) {",
333
- " r.steps.engine.compile = 'error:' + (ce.getMessage ? ce.getMessage() : ce + '');",
334
- " }",
335
- // Check latest_version immediately after compile
336
- " var postCompile = new GlideRecord('sys_hub_flow');",
337
- " if (postCompile.get(flowSysId)) {",
338
- " r.steps.engine.latest_version_after_compile = postCompile.getValue('latest_version') + '';",
339
- " }",
340
- " }",
341
- " } else {",
342
- " r.steps.engine.sn_fd = 'unavailable';",
343
- " }",
344
- " } catch(engineErr) {",
345
- " r.steps.engine.error = engineErr.getMessage ? engineErr.getMessage() : engineErr + '';",
346
- " }",
347
+ " } else { r.steps.engine.sn_fd = 'unavailable'; }",
348
+ " } catch(engineErr) {}",
347
349
  " }",
348
350
  "",
349
351
  " r.flow_sys_id = flowSysId ? flowSysId + '' : null;",
350
352
  " r.version_sys_id = verSysId ? verSysId + '' : null;",
351
- // ── Final check: re-read latest_version + compare our flow to reference ──
353
+ // ── Final check: read back our flow's latest_snapshot to confirm ──
352
354
  " if (flowSysId) {",
353
355
  " var cf = new GlideRecord('sys_hub_flow');",
354
356
  " if (cf.get(flowSysId)) {",
355
- " r.latest_version_set = !cf.latest_version.nil();",
356
357
  " r.latest_version_value = cf.getValue('latest_version') + '';",
357
- // Also read our flow_definition to verify it was stored
358
- " var ourFd = cf.getValue('flow_definition') + '';",
359
- " r.our_flow_definition_stored = ourFd !== 'null' && ourFd.length > 0;",
360
- " r.our_flow_definition_length = ourFd.length;",
361
- " r.our_flow_definition_prefix = ourFd.substring(0, 200);",
358
+ " r.our_latest_snapshot = cf.getValue('latest_snapshot') + '';",
359
+ " r.our_latest_snapshot_length = (cf.getValue('latest_snapshot') + '').length;",
362
360
  " }",
363
361
  " }",
364
362
  " } catch(e) { r.success = false; r.error = e.getMessage ? e.getMessage() : e + ''; }",