Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
043b771
Convert SVG diagrams to ASCII art in Chapter 7 for PDF compatibility
KrisSimon Feb 21, 2026
d3019a8
Add plugin-registered qualifiers for custom value transformations
KrisSimon Feb 21, 2026
64a1273
Merge branch 'feature/fixes-language-guide' into 'main'
KrisSimon Feb 22, 2026
fab532f
Fix SVG diagram in Chapter 11.10 Repository Observers
KrisSimon Feb 22, 2026
235daed
Add underscore separators in numeric literals (ARO-0052)
KrisSimon Feb 22, 2026
f014f9f
Fix broken SVG diagrams across 17 Language Guide chapters
KrisSimon Feb 22, 2026
f961df9
Optimize Lexer keyword/article/preposition lookup (ARO-0053)
KrisSimon Feb 22, 2026
180f7ee
Optimize Lexer keyword lookup (ARO-0055)
KrisSimon Feb 22, 2026
fc26163
Add underscore separators in decimal numeric literals (ARO-0056)
KrisSimon Feb 22, 2026
001fac8
Cache peekNext() index in Lexer (ARO-0057)
KrisSimon Feb 22, 2026
5fea3e1
Refactor ExecutionEngine to reduce duplication (ARO-0054)
KrisSimon Feb 22, 2026
c471d4b
Add structured logging system (ARO-0059)
KrisSimon Feb 22, 2026
940817a
Add raw string literals with r-prefix (ARO-0060)
KrisSimon Feb 22, 2026
77c0f80
Document and test AST visitor pattern (ARO-0061)
KrisSimon Feb 22, 2026
1fc7c1a
Enhance dead code detection with when guard support (ARO-0062)
KrisSimon Feb 22, 2026
27de16d
Document value type AST nodes (ARO-0063)
KrisSimon Feb 22, 2026
75a9091
Optimize event subscription matching with indexed lookup (ARO-0064)
KrisSimon Feb 22, 2026
a3ecb9b
Fix pipeline failures in MR !121
KrisSimon Feb 22, 2026
ea75156
Implement pipeline operator |> (ARO-0067, closes #105)
KrisSimon Feb 22, 2026
432f023
Document extract-within-case syntax (ARO-0068, closes #104)
KrisSimon Feb 22, 2026
9b6bf74
Merge main into features/book, keep SVG diagrams in Chapter 7
KrisSimon Feb 22, 2026
3fb134b
Complete 13 remaining GitLab issues (#101-#122)
KrisSimon Feb 22, 2026
1342e69
Merge branch 'features/book' into 'main'
KrisSimon Feb 22, 2026
15ca03c
Add debug output and timeout to integration:linux job
KrisSimon Feb 22, 2026
519711a
Add expected.txt with binary output for NumericSeparators example
KrisSimon Feb 22, 2026
0de83c8
Merge branch 'feature/dead-code-detection' into 'main'
KrisSimon Feb 22, 2026
901411a
Merge remote-tracking branch 'adt/main' into feature/issue-106-refact…
KrisSimon Feb 22, 2026
6a491f9
Fix lexer lookup optimization
KrisSimon Feb 22, 2026
f207c8b
Merge branch 'feature/issue-98-numeric-separators' into 'main'
KrisSimon Feb 22, 2026
4ccad2c
Use single quotes for raw strings instead of r-prefix
KrisSimon Feb 22, 2026
6502281
Update Book documentation for raw string literals (single quotes)
KrisSimon Feb 22, 2026
c4f5aaf
Add wiki update checklist for raw string literals
KrisSimon Feb 22, 2026
1fc89e7
Merge main into feature/issue-106-refactor-execution-engine
KrisSimon Feb 22, 2026
acd9c7e
Add plugin qualifier namespace support and clean up committed binaries
KrisSimon Feb 22, 2026
d28fdb6
Merge main into feature/raw-strings
KrisSimon Feb 22, 2026
426d489
Add ARO-0067: Automatic Pipeline Detection proposal
KrisSimon Feb 22, 2026
4a0c5dc
Document ARO-0067 automatic pipeline detection in books and wiki notes
KrisSimon Feb 22, 2026
bd59c36
Add ARO-0067: Automatic Pipeline Detection proposal
KrisSimon Feb 22, 2026
f4f4d8e
Document ARO-0067 automatic pipeline detection in books and wiki notes
KrisSimon Feb 22, 2026
6283b63
Add ARO-0052: Terminal UI System proposal
KrisSimon Feb 22, 2026
bf19cc9
Merge branch 'feature/issue-106-refactor-execution-engine' into 'main'
KrisSimon Feb 22, 2026
68ee867
Merge main into feature/raw-strings
KrisSimon Feb 22, 2026
75cc416
Implement plugin qualifier handler namespace (ARO-0045)
KrisSimon Feb 22, 2026
951c147
Merge main into feature/issue-96-lexer-lookup
KrisSimon Feb 22, 2026
57813b9
Implement plugin action namespacing (ARO #95)
KrisSimon Feb 22, 2026
55c3cba
Implement ARO-0052 Terminal UI System - Core Implementation
KrisSimon Feb 22, 2026
ce95b00
Document ARO-0052 Terminal UI System in proposal, book, and website
KrisSimon Feb 22, 2026
5d87965
Implement ARO-0053: Terminal Shadow Buffer Optimization
KrisSimon Feb 22, 2026
8a0f4de
Remove backward compat: only register namespaced verb when handler is…
KrisSimon Feb 22, 2026
55e04f3
Add test.hint to skip TerminalUI collection directory
KrisSimon Feb 23, 2026
3da164d
Merge branch 'feature/pipeline-operator' into 'main'
KrisSimon Feb 23, 2026
dca039c
Merge remote-tracking branch 'adt/main' into feature/computations
KrisSimon Feb 23, 2026
9897c51
Merge remote-tracking branch 'adt/main' into feature/term
KrisSimon Feb 23, 2026
cb54925
Merge remote-tracking branch 'adt/main' into feature/ast-visitor
KrisSimon Feb 23, 2026
317b164
Merge remote-tracking branch 'adt/main' into feature/raw-strings
KrisSimon Feb 23, 2026
d9bd18d
Merge remote-tracking branch 'adt/main' into feature/issue-96-lexer-l…
KrisSimon Feb 23, 2026
a1300d1
Merge remote-tracking branch 'adt/main' into feature/optimize-event-s…
KrisSimon Feb 23, 2026
d57e908
Merge remote-tracking branch 'adt/main' into feature/value-types-docu…
KrisSimon Feb 23, 2026
a59139a
Merge remote-tracking branch 'adt/main' into feature/logging-structured
KrisSimon Feb 23, 2026
f7c0a58
Fix TerminalUI tests and add expected.txt for examples (76/79 passing)
KrisSimon Feb 23, 2026
fdd3e20
Achieve 100% test pass rate (79/79 passing) using occurrence-check
KrisSimon Feb 23, 2026
3b613f8
Merge branch 'feature/raw-strings' into 'main'
KrisSimon Feb 23, 2026
f091d7a
Fix plugin action namespacing: pass plain verb to aro_plugin_execute
KrisSimon Feb 23, 2026
e99e4b3
Fix Swift 6 concurrency-safety errors for CI build
KrisSimon Feb 23, 2026
821c5d8
Merge branch 'feature/computations' into 'main'
KrisSimon Feb 23, 2026
9a90b7b
Merge branch 'feature/logging-structured' into 'main'
KrisSimon Feb 23, 2026
3ef321a
Fix EventBus actor isolation: withLock prefix and nonisolated unsubsc…
KrisSimon Feb 23, 2026
d47d3a3
Fix Swift 6 concurrency: use fflush(nil) instead of Darwin/Glibc.stdout
KrisSimon Feb 23, 2026
9d71510
Fix O(1) lexer lookup: tokenize 'for' and 'at' as prepositions
KrisSimon Feb 23, 2026
d3d5a6a
Add missing PipelineStatement visit methods to test visitors
KrisSimon Feb 23, 2026
cddfbec
Merge branch 'feature/value-types-documentation' into 'main'
KrisSimon Feb 23, 2026
31796e0
Fix terminal example tests: remove committed macOS binaries, add skip…
KrisSimon Feb 23, 2026
1e2d598
Merge branch 'feature/issue-96-lexer-lookup' into 'main'
KrisSimon Feb 23, 2026
3800d34
Merge branch 'feature/ast-visitor' into 'main'
KrisSimon Feb 23, 2026
4094b57
Fix subscribe race condition: block until subscription is registered
KrisSimon Feb 23, 2026
4cc1200
Merge branch 'feature/term' into 'main'
KrisSimon Feb 23, 2026
b255a66
Improve subscribe: use nonisolated(unsafe)+lock instead of semaphore
KrisSimon Feb 23, 2026
a3e1fd7
Merge branch 'feature/optimize-event-subscriptions' into 'main'
KrisSimon Feb 23, 2026
d4ada84
add ignores
KrisSimon Feb 23, 2026
e587119
Fix: Allow run command flags after path argument
KrisSimon Feb 23, 2026
99c4da0
delete binaries
KrisSimon Feb 23, 2026
b2c8013
more ignores
KrisSimon Feb 23, 2026
0855b57
Add multi-context testing to ContextAware example
KrisSimon Feb 23, 2026
c4c1648
Clenup
KrisSimon Feb 23, 2026
80db06c
Implement multi-context testing infrastructure
KrisSimon Feb 23, 2026
b0f0189
ignorew outputs of examples
KrisSimon Feb 23, 2026
b0bb32e
Use for loop to print file list in DirectoryLister example
KrisSimon Feb 24, 2026
ffeeaa0
Implement event recording and replay via command-line flags
KrisSimon Feb 24, 2026
4565c61
Document event recording and replay in Language Guide
KrisSimon Feb 24, 2026
04e94e9
Document manual testing for event recording/replay
KrisSimon Feb 24, 2026
f6ec051
Fix EventRecorder.saveToFile and add automated test for recording/replay
KrisSimon Feb 24, 2026
7bb5095
Fix Start/Stop action prepositions and add magic variables
KrisSimon Feb 24, 2026
30ba6a3
Update expected outputs and add TemplateEngine workdir hint
KrisSimon Feb 24, 2026
0b71ca9
Enable binary mode testing for additional examples
KrisSimon Feb 24, 2026
081c864
Add binary mode support for multi-context tests
KrisSimon Feb 24, 2026
566aca0
Disable ContextAware binary mode due to runtime bug
KrisSimon Feb 24, 2026
ab980a7
Fix published variables in binary mode (Issue #111)
KrisSimon Feb 24, 2026
1439e49
Fix test failures: --keep-alive binary mode and EventBus actor correc…
KrisSimon Feb 24, 2026
52bd96a
Fix SIGBUS crash and add FileWatcher event verification
KrisSimon Feb 25, 2026
155c3b2
Fix test failures: suppress lifecycle responses, enable file event bi…
KrisSimon Feb 26, 2026
7838d70
Fix MetricsDemo: extract event:item not event:data
KrisSimon Feb 26, 2026
1ea3ea3
Validate single Application-Start when running from a directory
KrisSimon Feb 26, 2026
50c369b
Fix socket event handler registration and MultiService example
KrisSimon Feb 26, 2026
700eda6
Add NotifyExample with handler when guards and document in book
KrisSimon Feb 27, 2026
d3b69c1
Improve homepage: animated AI diagram, typewriter slogans, UX fixes
KrisSimon Feb 28, 2026
98cdf4b
Simplify imprint to personal project attribution
KrisSimon Feb 28, 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
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ testrun.log
**/Plugins/**/*.dylib
**/Plugins/**/*.so
**/Plugins/**/*.dll
**/*.dSYM/
**/Cargo.lock
/Examples/MultiService/MultiService
/Examples/AuditLogDemo/AuditLogDemo
Expand All @@ -130,3 +131,17 @@ core
/Examples/SourceStructure/SourceStructure
/Examples/StreamingDemo/StreamingDemo
/Examples/StreamingPipeline/StreamingPipeline
/Examples/QualifierPlugin/QualifierPlugin
/Examples/QualifierPluginC/QualifierPluginC
/Examples/QualifierPluginPython/QualifierPluginPython
/Examples/DataSync/DataSync
/Examples/URLClient/URLClient
/Examples/TerminalUI/TerminalUI
/Examples/TerminalSystemMonitor/TerminalSystemMonitor
/Examples/PipelineDemo/PipelineDemo
/Examples/NumericSeparators/NumericSeparators
/Examples/ExtractInCase/ExtractInCase
/Examples/PipelineDemo/events.jsonl
/Examples/PipelineDemo/demo-output
/Examples/PipelineDemo/output
/Examples/FormatAwareIO/output
6 changes: 5 additions & 1 deletion .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,11 @@ integration:linux:
- which clang && clang --version | head -1
- which llc && llc --version | head -1
- ls -la /usr/share/swift/usr/lib/swift/linux/ | head -5
- ./aro-dist/aro build ./Examples/HelloWorld --verbose 2>&1 || echo "Build failed with exit code $?"
- echo "=== About to run aro build ==="
- ls -la ./aro-dist/aro || echo "aro binary not found"
- file ./aro-dist/aro || echo "file command failed"
- timeout 60 ./aro-dist/aro build ./Examples/HelloWorld --verbose 2>&1 || echo "Build failed with exit code $?"
- echo "=== aro build completed ==="

- chmod +x test-examples.pl
- perl test-examples.pl --verbose
Expand Down
56 changes: 43 additions & 13 deletions Book/TheLanguageGuide/AppendixA-ActionReference.md
Original file line number Diff line number Diff line change
Expand Up @@ -671,49 +671,79 @@ Emit a <PaymentProcessed: event> with <payment>.

### Notify

Sends notifications to users, administrators, or systems. The action automatically emits a `NotificationSentEvent` that can be handled by feature sets with `NotificationSent Handler` business activity.
Sends notifications to a user, an object, or every item in a collection. The action automatically emits a `NotificationSentEvent` for each notified target, and these events can be handled by feature sets with `NotificationSent Handler` business activity.

**Verbs:** `notify`, `alert`, `signal`

**Syntax:**

Two forms are supported depending on how you structure the arguments:

```aro
(* Form 1: target is the result, message is the "with" payload *)
Notify the <target> with <message>.

(* Form 2: message is the result, recipient is the "to" object *)
Notify the <message> to the <recipient>.
Alert the <message> to the <recipient>.
Signal the <message> to the <recipient>.
```

Form 1 (`with`) treats the result variable as the entity being notified. This is the preferred form when you want handlers to access the notified object's fields (for example, to use a `when` guard). Form 2 (`to`) is equivalent but places the notification message in the result position.

**Collection Dispatch:**
When the target (or recipient) resolves to a list, the runtime emits one `NotificationSentEvent` per item. Each event carries the item as the target value, allowing handlers to inspect the item's fields independently.

**Examples:**
```aro
(* User notification *)
Notify the <welcome-message> to the <user>.
(* Notify a single user object *)
Create the <alice> with { name: "Alice", age: 30, email: "alice@example.com" }.
Notify the <alice> with "Welcome to ARO!".

(* Admin alert *)
Alert the <system-warning> to the <admin>.
(* Notify every item in a collection — one event per item *)
Create the <group> with [
{ name: "Bob", age: 14 },
{ name: "Carol", age: 25 },
{ name: "Eve", age: 20 }
].
Notify the <group> with "Hello everyone!".

(* System signal *)
(* Legacy to-form *)
Notify the <welcome-message> to the <user>.
Alert the <system-warning> to the <admin>.
Signal the <shutdown-notice> to the <processes>.
```

**NotificationSent Handler:**
Feature sets can subscribe to notification events:
Feature sets subscribe to notification events by using `NotificationSent Handler` as their business activity. A `when` guard on the handler declaration acts as a per-delivery filter — the guard is evaluated before the handler body runs, and the target object's fields are available directly in the condition:

```aro
(* Unconditional handler — fires for every notification *)
(Log All Notifications: NotificationSent Handler) {
Extract the <message> from the <event: message>.
Extract the <type> from the <event: type>.
Log "Notification [${type}]: ${message}" to the <console>.
Log "Notification: " ++ <message> to the <console>.
Return an <OK: status> for the <logging>.
}

(* Conditional handler — fires only when age >= 16 *)
(Greet User: NotificationSent Handler) when <age> >= 16 {
Extract the <user> from the <event: user>.
Extract the <name> from the <user: name>.
Log "hello " ++ <name> to the <console>.
Return an <OK: status> for the <notification>.
}
```

In the second handler, `<age>` is resolved from the notified object's fields before the body executes. If the condition is false, the handler is silently skipped for that delivery.

**Event Payload:**
- `message` - The notification content
- `recipient` - Target of the notification
- `user` - The notified target object (when using the `with` form)
- `recipient` - Target name (when using the `to` form)
- `type` - One of: "notify", "alert", or "signal"
- `timestamp` - When the notification was sent

**Valid Prepositions:** `to`, `for`, `with`

> **See Also:** Section 5.4 (Handler Guards), Chapter 13.4 (Handler Guards) for a full explanation of the `when` guard on handler declarations.

---

### Write
Expand Down
Loading
Loading