Developer Day

Sirenia — Nov 2022

© 2022 SIRENIA ~ CONFIDENTIAL

Plan for today

09:30 Breakfast
10:00 Plan for the day
10:05 Introductions: Sirenia, RN, RSD
11:00 Next version I
12:00 Lunch
12:45 Next version II + management breakout session
13:45 Coffee break
14:00 Next version III and input for roadmap (v2.0)
15:15 Conclusions, feedback
15:30 Beers and goodbyes

Slides are available at http://slides.sirenia.io/praying-hands.
Cuesta at https://praying-hands.sirenia.io and Manatee at https://releases.sirenia.io/demo/praying-hands/peruser/Setup.exe.

© 2022 SIRENIA ~ CONFIDENTIAL

Introductions

  • Sirenia
  • Region Nord
  • Region Syd
© 2022 SIRENIA ~ CONFIDENTIAL

Upgrade highlights

  • Login
  • Hub
  • Flow restrictions
  • Dynamic apps and fields
  • Fields: New editor and field traversal
  • New approaches to launch
  • Zookeeper and alerting
  • Grouped groups
  • Tips
  • Progress bars
  • Dialog changes
© 2022 SIRENIA ~ CONFIDENTIAL

Logging in

New features related to logging into Cuesta

Two-factor authentication using a TOTP code.

Landing page with:

  • Global search
  • Three configurable slots
    • Last edited
    • Saved custom search (eg ‘my flows’)
    • Favorites (coming soon!)
© 2022 SIRENIA ~ CONFIDENTIAL

Hub

Designed for local use but with options to allow propagation of flows from a subscribed feed.

So a locally installed hub can be allowed access to a hub covering a larger region (e.g. a country) intermittently to retrieve items.

© 2022 SIRENIA ~ CONFIDENTIAL

Hub

Sharing of flows.

Staging a flow for release.

Inlining externals.

Documenting a flow.

Extension points.

© 2022 SIRENIA ~ CONFIDENTIAL

Flow restrictions

An approach to defining global rules for

  • What is allowed with regards to module API
  • Tracking API usage
  • Linting rules (work in progress)

An example is if you e.g. want to limit Http.get request to certain urls.

© 2022 SIRENIA ~ CONFIDENTIAL

Dynamic applications

New, more lightweight take on app automation.

  • Defined and instantiated during the execution of a flow
  • Easier cross-application automations

Dynamically created applications are attached to or launched on-the-fly.

// create new notepad application
var notepad = new Application({ 
  titleBarContains: "Notepad", 
  launchWith: "notepad.exe",
  type: ApplicationTypes.NATIVE 
}).launchOrAttach();
© 2022 SIRENIA ~ CONFIDENTIAL

Fields in dynamic applications

Fields that are instantiated at run-time can belong to a dynamic application.

// notepad is the application from the previous slide
var content = new Field("**/(class)RichEditD2DPT", notepad);
// or via the newField func on the application
content = notepad.newField("**/(class)RichEditD2DPT");
// we can now use the field
var notepadContent = content.read();

This approach allows for more self-contained flows by avoiding Flow.runs and stand-alone application definitions.

Great for hybrid applications (web/native, java/native).

© 2022 SIRENIA ~ CONFIDENTIAL

Native access in all app types

A convenient way to access native parts of web/java apps (e.g. print dialogs).

  • Match all windows on desktop
  • Always uses a native driver
new Field('{!Print}**/OK').click();
© 2022 SIRENIA ~ CONFIDENTIAL

Fields

New field editor features

More help for field editing. New tree for browsing the app structure.

  • Easier field editing
  • Tree
  • Automatic field verification (coming soon)
© 2022 SIRENIA ~ CONFIDENTIAL

Field traversal

  • Generalized path index support
  • Inspect results now consists of interactive field objects
var structure = Fields["DetailsPanel"].inspect();
var cpr_a = structure.find('cpr').read();

var cpr_b = Fields["DetailsPanel"].find('cpr').read();

Fields["PatientList"].findAll('Discharge')[4].click();
© 2022 SIRENIA ~ CONFIDENTIAL

New launch features

Simpler plugin management

  • No more separate plugin loading flows.

Launch flows

  • Provide full flexibility for complex launch situations.
© 2022 SIRENIA ~ CONFIDENTIAL

Improved plugin concept

Manatee automatically installs and starts required driver plugins

  • Based on app group match
  • Simplified plugin upgrade flow
  • Plugin specific settings available in Cuesta
  • No attach criteria required for Kant/Krom plugins
  • Automatic installation retries
© 2022 SIRENIA ~ CONFIDENTIAL

Launch flows

Start application with a designated flow.

Example use cases

  • Compute authentication token before launching a web page
  • Build a complicated dynamic url

Three ways to control app startup

  • Return string: executable path/url. Application will be launched on return.
  • Launch application, return { hwnd: windowHandle, pid: processId };
  • Launch application, return { command: launchCmd, arguments: args };
© 2022 SIRENIA ~ CONFIDENTIAL

Zookeeper and alerting

The Zookeeper aka the Conductor aka Estero is a serverside component that keeps track of running Manatees.

Commands include:

  • Shutdown
  • Restart
  • Run flow
  • Update settings

Events are e.g. when flows are run.

© 2022 SIRENIA ~ CONFIDENTIAL

Real-time zoo

Cuesta interfaces with the Zookeeper to provide

  • a real-time overview of Manatees,
  • drill-down via filters/search, and
  • a details page for each Manatee with access to restart etc

Scenario for use is RPA or as a support tool.

© 2022 SIRENIA ~ CONFIDENTIAL

Alerting (zoo)

Enables alerts for a specific user at a specific machine. It is primarily intended for RPA monitoring.

Alert checks are performed by the Zookeeper to be able to do downtime etc checks.

  • uptime, downtime queries
  • run flows

Alert actions are email, chat messages. Hooks into existing service definitions. Also as a built-in notification which looks like .

© 2022 SIRENIA ~ CONFIDENTIAL

Grouped groups

Groups can now include other groups. All included groups are applied to whatever application, flow etc it is attached to.

This means that you can essentially created hierarchies of groups similar to how AD groups are structured.

Should provide a better overview and easier assignment of apps and flows.

© 2022 SIRENIA ~ CONFIDENTIAL

Tips

Information shown in-situ for a field.

  • Will track the if field is relocated.
  • Limited support for user interaction (buttons).
  • Customizable appearance and markdown.
var t = Fields.MiddleButton.tip({ 
  text: "I am a tip", 
  color: "MistyRose", 
  icon: "BellSolid" 
});
© 2022 SIRENIA ~ CONFIDENTIAL

Progress

A new concept for keeping track of simple or complex long-running tasks.

var p = new Progress("Simple progress");
// indicate some progress has been made
p.complete(0.75); // 75%

The Progress object can now be shown in a Sticky (for example):

Sticky.open(
  "progressExample",
  {
    items: [{ type: 'PROGRESS', progress: p }]
  }
);
© 2022 SIRENIA ~ CONFIDENTIAL

Nested progress

Also supports recursive nesting.

var step1 = new Progress("Step 1");
var step2 = new Progress("Step 2");
var step3 = new Progress("Step 3");
var main  = new Progress("Main", [step1, step2, step3]);
Wait.forSeconds(1);
main.next();          // start step 1
Wait.forSeconds(1);
main.next();          // complete step 1, start step 2
Wait.forSeconds(1);
main.next();          // complete step 2, start step 3
Wait.forSeconds(1);
main.next();          // complete step 3 (all done)
© 2022 SIRENIA ~ CONFIDENTIAL

Percentages

And partial completion.

step1.complete(0.23);
step2.complete(0.67);
step3.complete(0.86);

And custom colors, icons and indeterminate state.
And can be shown (in a more basic UI) in notifications also.

© 2022 SIRENIA ~ CONFIDENTIAL

Dialogs

Masked input

Dialog.input(
  ...
  m: {
    type: "MASKED",
    mask: "00/00/0000"
  },
  ...
)
© 2022 SIRENIA ~ CONFIDENTIAL

Dialogs

Datetime input

...
dt1: { 
  type: "DATETIME",
  notBefore: new Date("August 19, 1975 23:15:30"),
  notAfter: new Date("'August 19, 2025 23:15:30")
},
dt2: {
  type: "DATETIME",
  format: "H:mm"
}
...
© 2022 SIRENIA ~ CONFIDENTIAL

Dialogs

Numeric input

...
// Increment/decrement 100 each 
// time up/down is selected
num1: {
  type: 'NUMERIC',
  increment: 100
},
// Set limits and increment size
num2: {
  type: 'NUMERIC',
  increment: 10,
  min: 5, 
  max: 89
},
...
© 2022 SIRENIA ~ CONFIDENTIAL

Dialogs

Function-based input elements can now depend on other function-based input elements.

count: { type: "NUMERIC" },
select: v => ({
    type: "SELECT",
    selectBetween: _.times(v.count)
  })
result: v => parseInt(v.select, 10) > 5 ? { type: "TEXT" } : null
  • result implicitly depends on select and
  • select implicitly depends on count.
© 2022 SIRENIA ~ CONFIDENTIAL

A bit of the rest

Cuesta: ES6, list of flows, “no certs needed, baby”, inlining for debug, IndexedDb and i18n.
Triggers: Priorities, no-launch option and space in keyboard trigger
Services:: Chat, received-time for emails, OAuth for Exchange.
Tables: Synchronization.
Http: Multipart/form upload, headers, cookies.
Html: Encode/decode
Sticky: UI overhaul
HID: Mouse scroll simulation.
Fs: .cp(...) and .mv(...) may overwrite target files, new .buildPath func.
Env: .sessionType and .connected properties and .kwanza() func.
WindowProxy: .transparency property and perf.

and markdown and webviews, console-switch + restart (RPA), radio-button and checkbox.

© 2022 SIRENIA ~ CONFIDENTIAL

Breaking changes 💔

  • New versions of all modules and plugins
    Existing modules and plugins will be updated and new versions released.

  • Web-based applications no longer automatically include invisible elements by default
    To get the old behaviour back use includeInvisible in Field constructor, checkbox in field UI or set StellerLegacyInvisibleFieldBehavior setting to true.

© 2022 SIRENIA ~ CONFIDENTIAL

Discussion and feedback

  • Last minute feature requests (no promises)
  • Roadmap v2.0 input
  • Should we setup a space for knowledge sharing RSD and RN?
© 2022 SIRENIA ~ CONFIDENTIAL

© 2022 SIRENIA ~ CONFIDENTIAL

2FA: 1. Log on with los/larsole 2. enable 2FA via preferences 3. show user list icon 4. mention site wide 2FA requirement

Landing page: 1. Log on with los/larsole 2. show landing page 3. show preferences 4. configure stuff

Documentation includes; - description - extension points - application and categories - attachments - release notes Notes for demo: - use ES5 - remember to publish using a different name (use a short name "Hi") - show how downloaded flows look like (inlined and non-inlined?) - make a mistake in first flow - update to newly published version - show changelog for original flow - show how it appears on the hub (incl changelogs)

Feature is not fully implemented

Describe/run CrossAppFun

Run HelloChrome flow

Demo with PatientFeedback app

Generalized indexing: field find row header

Show FieldTraversal flow (PatientFeedback app)

Uses Zookeeper behind the scenes

- show that the tip tries to find a good placement - show some weird buttons buttons: [ { value: "OK", foregroundColor: "White", backgroundColor: "Green", isDefault: true }, { icon: "SadCrySolid", backgroundColor: "Yellow", isCancel: true } ] if (t.wait(10000) == "OK") { // user clicked ok within 10s } - show some markdown - show timeout (default 5m)

(and markdown/html)