Skip to content
Merged
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
48c93f7
feat: add continue_on_error column to step_executions (migration 014)
michaelmcnees Mar 25, 2026
a05ba76
feat: add continue_on_error field to Step struct
michaelmcnees Mar 25, 2026
9ed8f48
feat: expose steps.<name>.error in CEL context (null for success)
michaelmcnees Mar 25, 2026
8305564
feat: implement continue_on_error with CEL error exposure and checkpo…
michaelmcnees Mar 25, 2026
d6e7782
feat: support continue_on_error in distributed worker execution path
michaelmcnees Mar 25, 2026
22b1429
docs: add continue_on_error example and documentation
michaelmcnees Mar 25, 2026
6561755
feat: add shared IMAP connection helper for email connectors
michaelmcnees Mar 25, 2026
2492f90
feat: add email/receive connector for IMAP message fetching
michaelmcnees Mar 25, 2026
0e354ea
feat: add email/move connector for IMAP folder management
michaelmcnees Mar 25, 2026
f42ff37
feat: add email/delete connector
michaelmcnees Mar 25, 2026
cec4998
feat: add email/flag connector for IMAP flag and tag management
michaelmcnees Mar 25, 2026
db86f8a
feat: register email/move, email/delete, email/flag connectors
michaelmcnees Mar 25, 2026
4faec21
feat: add email trigger columns to workflow_triggers (migration 015)
michaelmcnees Mar 25, 2026
30acd76
feat: add email trigger type to workflow schema with validation
michaelmcnees Mar 25, 2026
573cbd9
feat: implement email trigger poller with persistent IMAP connections…
michaelmcnees Mar 25, 2026
b0bda29
fix: populate headers field in email trigger context from IMAP HEADER…
michaelmcnees Mar 25, 2026
95b6feb
docs: add email connector reference, trigger guide, and inbox triage …
michaelmcnees Mar 25, 2026
550b519
feat: add browser/run connector wrapping Playwright in Docker containers
michaelmcnees Mar 25, 2026
3d20b31
feat: add browser/run param validation
michaelmcnees Mar 25, 2026
add654a
docs: add browser automation examples and connector documentation
michaelmcnees Mar 25, 2026
abecf10
feat: update docker-volume-backup example with continue_on_error and …
michaelmcnees Mar 25, 2026
dff833a
test: add v0.3.0 integration test covering continue_on_error with dow…
michaelmcnees Mar 25, 2026
9139594
fix: address CodeRabbit review findings — TLS hardening, TS support, …
michaelmcnees Mar 25, 2026
37cf337
fix: address release review findings — distributed CEL context, email…
michaelmcnees Mar 25, 2026
107cc62
docs: fix output field names, filter values, config keys, and add ema…
michaelmcnees Mar 25, 2026
3aa38d7
fix: suppress gosec G118 false positive — cancel stored in pollers ma…
michaelmcnees Mar 25, 2026
bafd5b5
fix: make integration tests CI-resilient — install playwright inline,…
michaelmcnees Mar 25, 2026
491070f
fix: use pre-installed playwright in Docker images via NODE_PATH inst…
michaelmcnees Mar 25, 2026
200c362
fix: cap email trigger UID fetch and use teamCtx for audit events
michaelmcnees Mar 25, 2026
ccda97b
fix: cleanup email poller on server start failure, add UIDs to mark-s…
michaelmcnees Mar 25, 2026
d61a2c9
fix: eliminate race in Reload — atomic check-and-start under single lock
michaelmcnees Mar 25, 2026
c24a462
fix: install playwright packages inline in Docker, add retry to email…
michaelmcnees Mar 25, 2026
d2222b4
fix: pin playwright package version to match Docker image (v1.52.0)
michaelmcnees Mar 25, 2026
fcc63cf
fix: gracefully skip browser integration tests when playwright unavai…
michaelmcnees Mar 25, 2026
59adbd8
fix: remove redundant header canonicalization, stop cron on email pol…
michaelmcnees Mar 25, 2026
73c5631
fix: TS stderr visibility, skip JSON parse on failure, remove unsafe …
michaelmcnees Mar 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions examples/browser-form-submit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: browser-form-submit
description: >
Log into a web portal and submit a form using TypeScript.

inputs:
username:
type: string
password:
type: string

steps:
- name: submit-form
action: browser/run
timeout: "2m"
params:
language: typescript
output_format: json
env:
PORTAL_USER: "{{ inputs.username }}"
PORTAL_PASS: "{{ inputs.password }}"
script: |
const page = await browser.newPage();
await page.goto('https://portal.example.com/login');
await page.fill('#username', process.env.PORTAL_USER);
await page.fill('#password', process.env.PORTAL_PASS);
await page.click('#login-button');
await page.waitForSelector('nav.main-menu');

await page.goto('https://portal.example.com/submit');
await page.fill('#report-field', 'Automated report submission');
await page.click('#submit-button');
await page.waitForSelector('.success-message');

const confirmationId = await page.textContent('.confirmation-id');
console.log(JSON.stringify({ submitted: true, confirmation_id: confirmationId }));
51 changes: 51 additions & 0 deletions examples/browser-scrape.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: browser-scrape-portal
description: >
Scrape data from a web portal that requires login,
take a screenshot, and post results to Slack.

inputs:
username:
type: string
description: Portal username
password:
type: string
description: Portal password

steps:
- name: scrape-data
action: browser/run
timeout: "2m"
params:
language: javascript
output_format: json
env:
PORTAL_USER: "{{ inputs.username }}"
PORTAL_PASS: "{{ inputs.password }}"
script: |
const page = await browser.newPage();
await page.goto('https://portal.example.com/login');
await page.fill('#username', process.env.PORTAL_USER);
await page.fill('#password', process.env.PORTAL_PASS);
await page.click('#login-button');
await page.waitForSelector('.dashboard');

const data = await page.evaluate(() => {
const rows = document.querySelectorAll('.data-table tr');
return Array.from(rows).map(row => ({
name: row.querySelector('.name')?.textContent,
value: row.querySelector('.value')?.textContent,
}));
});

await page.screenshot({ path: '/mantle/artifacts/dashboard.png' });
console.log(JSON.stringify({ records: data, count: data.length }));
artifacts:
- path: dashboard.png
name: dashboard-screenshot

- name: notify
action: slack/send
credential: slack-token
params:
channel: "#data-updates"
text: "Scraped {{ steps['scrape-data'].output.json.count }} records from portal"
11 changes: 10 additions & 1 deletion examples/docker-volume-backup.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,26 @@ steps:
- name: upload-to-s3
action: s3/put
credential: aws-prod
continue_on_error: true
timeout: "5m"
params:
bucket: my-backups
key: "volumes/my-app-data/backup.tar.gz"
content: "{{ artifacts['backup-archive'].url }}"
content_type: "application/gzip"

- name: notify-failure
action: slack/send
credential: slack-token
if: "steps['upload-to-s3'].error != null"
params:
channel: "#ops-alerts"
text: "Volume backup upload failed: {{ steps['upload-to-s3'].error }}"

- name: notify-success
action: slack/send
credential: slack-token
depends_on: [upload-to-s3]
if: "steps['upload-to-s3'].error == null"
params:
channel: "#ops-alerts"
text: "Volume backup completed — {{ artifacts['backup-archive'].size }} bytes uploaded to s3://my-backups/volumes/my-app-data/"
64 changes: 64 additions & 0 deletions examples/email-inbox-triage.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: email-inbox-triage
description: >
AI-powered email triage: reads new emails, classifies them,
moves to appropriate folders, and flags important ones.

triggers:
- type: email
mailbox: company-inbox
folder: INBOX
filter: unseen
poll_interval: 30s

steps:
- name: classify
action: ai/completion
credential: openai-key
params:
model: gpt-4o
system_prompt: >
Classify this email into one of: important, actionable, newsletter, spam.
Respond with JSON: {"category": "...", "summary": "...", "priority": "high|medium|low"}
prompt: |
From: {{ trigger.from }}
Subject: {{ trigger.subject }}
Body: {{ trigger.body }}
output_schema:
type: object
properties:
category:
type: string
enum: [important, actionable, newsletter, spam]
summary:
type: string
priority:
type: string
enum: [high, medium, low]
required: [category, summary, priority]

- name: flag-important
action: email/flag
credential: company-inbox
if: "steps.classify.output.json.priority == 'high'"
params:
uid: "{{ trigger.uid }}"
flags: ["flagged", "important"]
action: add

- name: move-to-folder
action: email/move
credential: company-inbox
params:
uid: "{{ trigger.uid }}"
target_folder: "{{ steps.classify.output.json.category }}"

- name: notify-important
action: slack/send
credential: slack-token
if: "steps.classify.output.json.priority == 'high'"
params:
channel: "#important-emails"
text: |
New important email from {{ trigger.from }}:
Subject: {{ trigger.subject }}
Summary: {{ steps.classify.output.json.summary }}
37 changes: 37 additions & 0 deletions examples/error-notification.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: error-notification
description: >
Demonstrates continue_on_error: when upload fails,
a Slack notification fires with the error details.

steps:
- name: fetch-data
action: http/request
params:
url: https://api.example.com/export
method: GET

- name: upload-to-s3
action: s3/put
credential: aws-prod
continue_on_error: true
timeout: "5m"
params:
bucket: my-backups
key: "data/export.csv"
content: "{{ steps['fetch-data'].output.body }}"

- name: notify-failure
action: slack/send
credential: slack-token
if: "steps['upload-to-s3'].error != null"
params:
channel: "#ops-alerts"
text: "Upload failed: {{ steps['upload-to-s3'].error }}"

- name: notify-success
action: slack/send
credential: slack-token
if: "steps['upload-to-s3'].error == null"
params:
channel: "#ops-alerts"
text: "Upload succeeded"
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.1
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.41.4
github.com/coreos/go-oidc/v3 v3.17.0
github.com/docker/docker v28.5.2+incompatible
github.com/golang-jwt/jwt/v5 v5.3.0
github.com/google/cel-go v0.27.0
github.com/googleapis/gax-go/v2 v2.15.0
Expand All @@ -22,7 +23,6 @@ require (
github.com/spf13/cobra v1.10.2
github.com/spf13/viper v1.21.0
github.com/stretchr/testify v1.11.1
github.com/docker/docker v28.5.2+incompatible
github.com/testcontainers/testcontainers-go v0.41.0
github.com/testcontainers/testcontainers-go/modules/postgres v0.41.0
golang.org/x/oauth2 v0.35.0
Expand Down Expand Up @@ -72,6 +72,9 @@ require (
github.com/docker/go-connections v0.6.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/ebitengine/purego v0.10.0 // indirect
github.com/emersion/go-imap/v2 v2.0.0-beta.8 // indirect
github.com/emersion/go-message v0.18.2 // indirect
github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
Expand Down
37 changes: 37 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,12 @@ github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkp
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU=
github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/emersion/go-imap/v2 v2.0.0-beta.8 h1:5IXZK1E33DyeP526320J3RS7eFlCYGFgtbrfapqDPug=
github.com/emersion/go-imap/v2 v2.0.0-beta.8/go.mod h1:dhoFe2Q0PwLrMD7oZw8ODuaD0vLYPe5uj2wcOMnvh48=
github.com/emersion/go-message v0.18.2 h1:rl55SQdjd9oJcIoQNhubD2Acs1E6IzlZISRTK7x/Lpg=
github.com/emersion/go-message v0.18.2/go.mod h1:XpJyL70LwRvq2a8rVbHXikPgKj8+aI0kGdHlg16ibYA=
github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6 h1:oP4q0fw+fOSWn3DfFi4EXdT+B+gTtzx8GC9xsc26Znk=
github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA=
github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g=
github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98=
Expand Down Expand Up @@ -284,6 +290,7 @@ github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYI
github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI=
github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=
github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
Expand Down Expand Up @@ -316,29 +323,59 @@ go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0=
golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0=
golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw=
golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ=
golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo=
golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU=
golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
Expand Down
10 changes: 8 additions & 2 deletions internal/audit/audit.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ const (
ActionStepStarted Action = "step.started"
ActionStepCompleted Action = "step.completed"
ActionStepFailed Action = "step.failed"
ActionStepSkipped Action = "step.skipped"
ActionExecutionCancelled Action = "execution.cancelled"
ActionStepSkipped Action = "step.skipped"
ActionStepContinuedOnError Action = "step.continued_on_error"
ActionExecutionCancelled Action = "execution.cancelled"
ActionArtifactPersisted Action = "artifact.persisted"

// Admin operations.
Expand All @@ -31,6 +32,11 @@ const (
ActionCredentialRotated Action = "credential.rotated"
ActionAuthFailed Action = "auth.failed"

// Email trigger operations.
ActionEmailTriggerFired Action = "email.trigger.fired"
ActionEmailConnectionEstablished Action = "email.connection.established"
ActionEmailConnectionFailed Action = "email.connection.failed"

// Budget operations.
ActionBudgetExceeded Action = "budget.exceeded"
ActionBudgetWarning Action = "budget.warning"
Expand Down
Loading
Loading