@a5c-ai/triggers 5.0.1-staging.f672fe79b → 5.0.1-staging.f6da8cd208d2

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.
Files changed (3) hide show
  1. package/README.md +156 -22
  2. package/action.yml +215 -35
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @a5c-ai/triggers
2
2
 
3
- Trigger glue for running `amux` from automation systems. It normalizes GitHub, GitLab, Bitbucket, and generic webhook payloads into one event shape, enriches GitHub events with changed files and optional diffs, and evaluates compact trigger queries before launching agent-mux.
3
+ Trigger glue for running any coding agent from CI. Normalizes GitHub, GitLab, Bitbucket, and generic webhook payloads into one event shape, enriches GitHub events with changed files and optional diffs, and evaluates compact trigger queries before launching agent-mux.
4
4
 
5
5
  ## CLI
6
6
 
@@ -11,39 +11,173 @@ triggers enrich --backend github --include-diff --output event.json
11
11
 
12
12
  ## GitHub Action
13
13
 
14
- The reusable action lives at `packages/triggers/action.yml` and installs the requested harness before installing adapter plugins, then runs `amux` only when the trigger query matches.
14
+ The reusable action at `packages/triggers/action.yml` supports all harnesses, providers, and invocation modes.
15
15
 
16
- ### Issue comment mention
16
+ ### Quick Start
17
17
 
18
18
  ```yaml
19
- - uses: ./packages/triggers
19
+ - uses: a5c-ai/babysitter/packages/triggers@main
20
20
  with:
21
- trigger-backend: github
22
- trigger-query: event:issue_comment text:@develop-this
23
- adapter: codex
24
- prompt: Implement the requested issue-comment task.
21
+ harness: claude
22
+ provider: foundry
23
+ model: gpt-5.5
24
+ prompt: Review this PR for bugs and style issues
25
+ env:
26
+ AZURE_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
27
+ AMUX_API_BASE: ${{ vars.AZURE_OPENAI_ENDPOINT }}
25
28
  ```
26
29
 
27
- ### Changed-file glob and diff mention
30
+ ## Supported Harnesses
31
+
32
+ | Harness | `harness:` value | Provider examples | Notes |
33
+ |---------|-----------------|-------------------|-------|
34
+ | Claude Code | `claude` | foundry, google, anthropic | Full bridge support |
35
+ | Codex | `codex` | foundry | Native OpenAI support |
36
+ | Pi | `pi` | foundry | Proxy via models.json |
37
+ | Gemini CLI | `gemini` | google, foundry | Needs `GEMINI_CLI_TRUST_WORKSPACE` (auto-set) |
38
+ | Copilot CLI | `copilot` | foundry | Via `gh extension` |
39
+ | Cursor | `cursor` | foundry | Manual install |
40
+ | OpenCode | `opencode` | foundry, anthropic | Multiple install methods |
41
+ | Hermes | `hermes` | foundry | NousResearch agent |
42
+
43
+ ## Invocation Modes
44
+
45
+ Set `interaction-mode` to control how the harness runs in CI:
46
+
47
+ | Mode | Flag | Description | Use case |
48
+ |------|------|-------------|----------|
49
+ | `non-interactive` | `--no-interactive` | Plain NI — harness runs with `-p` / `exec` | Simple one-shot tasks |
50
+ | `bridged-hooks` | `--no-interactive --bridge-hooks` | NI + emulated babysitter lifecycle hooks | Babysitter-plugin orchestrated tasks |
51
+ | `bridged-interactive` | `--no-interactive --bridge-interactive` | NI externally, interactive via PTY internally | Tool-heavy tasks needing full harness capabilities |
52
+
53
+ ### When to use each mode
54
+
55
+ - **`non-interactive`** (default) — fastest, simplest. The harness gets a prompt, does the work, exits. Good for single-task automation.
56
+ - **`bridged-hooks`** — use with `babysitter-plugin: true`. The BridgeHookEmulator wraps the harness execution with session-start/stop/end hooks, enabling the babysitter orchestration lifecycle.
57
+ - **`bridged-interactive`** — spawns the harness via PTY for full interactive capabilities (tool use, multi-turn) while presenting structured NDJSON output externally. Use when the harness needs TTY features but you want machine-readable output.
58
+
59
+ ## Babysitter Plugin
60
+
61
+ Set `babysitter-plugin: true` to install the babysitter plugin before running:
28
62
 
29
63
  ```yaml
30
- - uses: ./packages/triggers
64
+ - uses: a5c-ai/babysitter/packages/triggers@main
31
65
  with:
32
- trigger-query: path:packages/agent-mux/** diff:@develop-this
33
- include-diff: 'true'
34
- adapter: claude-code
35
- args-json: '["--tag", "github action", "--max-turns", "8"]'
66
+ harness: claude
67
+ provider: foundry
68
+ model: gpt-5.5
69
+ interaction-mode: bridged-hooks
70
+ babysitter-plugin: 'true'
71
+ babysitter-prompt-prefix: '/babysitter:yolo'
72
+ prompt: Implement the feature described in the issue
73
+ process-file: .a5c/processes/feature-impl.mjs
36
74
  ```
37
75
 
38
- ### Pipeline hooks around agent-mux
76
+ The action will:
77
+ 1. Install the harness CLI
78
+ 2. Generate per-harness plugins (`npm run generate:plugins`)
79
+ 3. Install the babysitter SDK globally
80
+ 4. Install the babysitter plugin into the harness (`babysitter harness:install-plugin`)
81
+ 5. Copy the process file to `.a5c/processes/` (if provided)
82
+ 6. Launch with the appropriate bridge flags
83
+
84
+ ### Babysitter prompt prefixes
39
85
 
86
+ Each harness uses a different prefix to invoke the babysitter skill:
87
+
88
+ | Harness | Prefix |
89
+ |---------|--------|
90
+ | Claude Code | `/babysitter:yolo` |
91
+ | Codex | `$babysitter:yolo` |
92
+ | Others | `Invoke the babysitter:yolo command to:` |
93
+
94
+ ## Provider Configuration
95
+
96
+ The action uses `amux launch` which handles provider resolution and proxy setup automatically. Set credentials via environment variables:
97
+
98
+ ### Azure Foundry (OpenAI)
40
99
  ```yaml
41
- - uses: ./packages/triggers
42
- with:
43
- trigger-query: event:pull_request path:packages/triggers/**
44
- pre-run: npm run build --workspace=@a5c-ai/triggers
45
- post-run: npm run test:coverage --workspace=@a5c-ai/triggers
46
- args-json: '["--output-format", "json"]'
100
+ env:
101
+ AZURE_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
102
+ AMUX_API_BASE: https://your-resource.services.ai.azure.com
103
+ ```
104
+
105
+ ### Google / Vertex AI
106
+ ```yaml
107
+ env:
108
+ GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
109
+ GOOGLE_CLOUD_PROJECT: ${{ secrets.GOOGLE_CLOUD_PROJECT }}
110
+ GOOGLE_GENAI_USE_VERTEXAI: 'true'
47
111
  ```
48
112
 
49
- Use `args-json` instead of `args` when an argument contains spaces, quotes, or shell-sensitive characters.
113
+ ### Anthropic (direct)
114
+ ```yaml
115
+ env:
116
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
117
+ ```
118
+
119
+ ## Trigger Queries
120
+
121
+ Filter which events trigger the agent using `trigger-query`:
122
+
123
+ ```yaml
124
+ trigger-query: |
125
+ event: pull_request
126
+ action: [opened, synchronize]
127
+ paths: src/**/*.ts
128
+ labels: needs-review
129
+ ```
130
+
131
+ ### Query fields
132
+
133
+ | Field | Description | Example |
134
+ |-------|-------------|---------|
135
+ | `event` | GitHub event name | `push`, `pull_request`, `issues` |
136
+ | `action` | Event action | `opened`, `synchronize`, `created` |
137
+ | `text` | Match text in title/body | `@develop-this`, `fix:` |
138
+ | `diff` | Match text in diff patches | `TODO`, `FIXME` |
139
+ | `paths` | Match changed file paths | `src/**/*.ts`, `packages/sdk/**` |
140
+ | `branch` | Match target branch | `main`, `release/*` |
141
+ | `labels` | Match issue/PR labels | `bug`, `needs-review` |
142
+
143
+ ## Inputs Reference
144
+
145
+ | Input | Required | Default | Description |
146
+ |-------|----------|---------|-------------|
147
+ | `harness` | **yes** | — | Coding agent to use |
148
+ | `provider` | no | — | Model provider |
149
+ | `model` | no | — | Model name |
150
+ | `prompt` | no | — | Task prompt |
151
+ | `interaction-mode` | no | `non-interactive` | NI mode variant |
152
+ | `max-turns` | no | `15` | Max model turns |
153
+ | `with-proxy` | no | `true` | Start proxy if needed |
154
+ | `babysitter-plugin` | no | `false` | Install babysitter plugin |
155
+ | `process-file` | no | — | Babysitter process definition |
156
+ | `babysitter-prompt-prefix` | no | — | Skill invocation prefix |
157
+ | `trigger-backend` | no | `github` | Event backend |
158
+ | `trigger-query` | no | — | Event filter query |
159
+ | `include-diff` | no | `true` | Include diffs in enrichment |
160
+ | `github-token` | no | `${{ github.token }}` | GitHub API token |
161
+ | `pre-run` | no | — | Shell commands before agent |
162
+ | `post-run` | no | — | Shell commands after agent |
163
+ | `working-directory` | no | `${{ github.workspace }}` | Working directory |
164
+ | `node-version` | no | `22` | Node.js version |
165
+
166
+ ## Example Workflows
167
+
168
+ See [`.github/workflows/`](./.github/workflows/) for complete examples:
169
+
170
+ - **[claude-code-pr-review.yml](./.github/workflows/claude-code-pr-review.yml)** — Claude Code + Foundry + babysitter-plugin + bridged-hooks for PR review
171
+ - **[codex-issue-triage.yml](./.github/workflows/codex-issue-triage.yml)** — Codex + Foundry + vanilla NI for issue classification
172
+ - **[gemini-scheduled-audit.yml](./.github/workflows/gemini-scheduled-audit.yml)** — Gemini CLI + Google/Vertex + scheduled docs audit
173
+ - **[multi-harness-quality-gates.yml](./.github/workflows/multi-harness-quality-gates.yml)** — Matrix of claude + codex + pi with babysitter-plugin
174
+ - **[copilot-webhook-dispatch.yml](./.github/workflows/copilot-webhook-dispatch.yml)** — Copilot CLI + bridged-interactive for repository_dispatch
175
+ - **[pi-comment-command.yml](./.github/workflows/pi-comment-command.yml)** — Pi + NI triggered by `/agent` comment commands
176
+
177
+ ## Outputs
178
+
179
+ | Output | Description |
180
+ |--------|-------------|
181
+ | `matched` | Whether the trigger query matched (`true`/`false`) |
182
+ | `event` | Path to the enriched event JSON file |
183
+ | `exit-code` | Agent-mux exit code (empty if trigger didn't match) |
package/action.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  name: Agent Mux
2
- description: Run the agent-mux CLI from GitHub Actions with event triggers, harness setup, plugin install, and optional a5c token exchange.
2
+ description: Run any coding agent from GitHub Actions — supports all harnesses (Claude Code, Codex, Pi, Gemini CLI, Copilot CLI, etc.) with trigger evaluation, provider proxy, babysitter plugin, and bridge modes.
3
3
  author: a5c-ai
4
4
 
5
5
  branding:
@@ -7,10 +7,65 @@ branding:
7
7
  color: purple
8
8
 
9
9
  inputs:
10
+ # ── Core inputs ──────────────────────────────────────────────────────
10
11
  command:
11
12
  description: agent-mux command to execute after trigger evaluation.
12
13
  required: false
13
- default: run
14
+ default: launch
15
+ harness:
16
+ description: Coding agent harness to use (claude, codex, pi, gemini, copilot, cursor, opencode, hermes).
17
+ required: true
18
+ provider:
19
+ description: Model provider (foundry, google, anthropic, bedrock, openai).
20
+ required: false
21
+ model:
22
+ description: Model name to use (e.g. gpt-5.5, gemini-3.1-pro-preview, claude-sonnet-4).
23
+ required: false
24
+ prompt:
25
+ description: Prompt or task to send to the agent.
26
+ required: false
27
+
28
+ # ── Invocation mode ──────────────────────────────────────────────────
29
+ interaction-mode:
30
+ description: |
31
+ How to launch the harness in CI:
32
+ non-interactive — plain NI mode (-p / exec)
33
+ bridged-hooks — NI + emulated babysitter lifecycle hooks (--bridge-hooks)
34
+ bridged-interactive — NI externally, interactive internally via PTY (--bridge-interactive)
35
+ required: false
36
+ default: non-interactive
37
+ max-turns:
38
+ description: Maximum model turns before the agent exits.
39
+ required: false
40
+ default: '15'
41
+
42
+ # ── Provider / proxy ─────────────────────────────────────────────────
43
+ with-proxy:
44
+ description: Start transport-mux proxy if the harness doesn't support the provider natively.
45
+ required: false
46
+ default: 'true'
47
+ proxy-log-level:
48
+ description: Proxy log level (error, warn, info, debug).
49
+ required: false
50
+ default: error
51
+
52
+ # ── Babysitter plugin ────────────────────────────────────────────────
53
+ babysitter-plugin:
54
+ description: Install the babysitter plugin into the harness before running.
55
+ required: false
56
+ default: 'false'
57
+ process-file:
58
+ description: Path to a babysitter process definition (.mjs) to copy into .a5c/processes/.
59
+ required: false
60
+ babysitter-prompt-prefix:
61
+ description: |
62
+ Slash command prefix for babysitter invocation. Harness-specific:
63
+ claude → /babysitter:yolo
64
+ codex → $babysitter:yolo
65
+ other → Invoke the babysitter:yolo command to:
66
+ required: false
67
+
68
+ # ── Legacy / compatibility ───────────────────────────────────────────
14
69
  args:
15
70
  description: Space-delimited fallback arguments passed to amux after the command.
16
71
  required: false
@@ -18,17 +73,13 @@ inputs:
18
73
  description: JSON string array of additional arguments passed to amux after the command. Prefer this for values containing spaces or shell-sensitive characters.
19
74
  required: false
20
75
  adapter:
21
- description: Agent adapter/agent name passed to amux via --agent when set.
22
- required: false
23
- prompt:
24
- description: Prompt passed to amux run via --prompt when set.
25
- required: false
26
- harness:
27
- description: Harness to install before plugin installation.
76
+ description: Alias for harness (backward compatibility).
28
77
  required: false
29
78
  plugins:
30
79
  description: Newline-delimited plugin specs installed after harness setup. Each line is passed to amux plugin install <adapter> <plugin>.
31
80
  required: false
81
+
82
+ # ── Trigger evaluation ───────────────────────────────────────────────
32
83
  trigger-backend:
33
84
  description: Trigger backend to normalize. Supports github, gitlab, bitbucket, generic-webhook.
34
85
  required: false
@@ -40,6 +91,8 @@ inputs:
40
91
  description: Include local git diff patches in trigger enrichment.
41
92
  required: false
42
93
  default: 'true'
94
+
95
+ # ── Auth / tokens ────────────────────────────────────────────────────
43
96
  use-a5c-token-exchange:
44
97
  description: Use a5c-ai/generate-token-action@main before running trigger enrichment and agent-mux.
45
98
  required: false
@@ -48,6 +101,8 @@ inputs:
48
101
  description: GitHub token fallback for API enrichment.
49
102
  required: false
50
103
  default: ${{ github.token }}
104
+
105
+ # ── Environment ──────────────────────────────────────────────────────
51
106
  node-version:
52
107
  description: Node.js version.
53
108
  required: false
@@ -88,32 +143,97 @@ runs:
88
143
  continue-on-error: true
89
144
  uses: a5c-ai/generate-token-action@main
90
145
 
91
- - name: Build agent-mux action runtime
146
+ - name: Resolve action runtime
147
+ id: resolve-runtime
92
148
  shell: bash
93
149
  env:
94
- ACTION_ROOT: ${{ github.action_path }}
150
+ ACTION_REF: ${{ github.action_ref }}
95
151
  run: |
96
152
  set -euo pipefail
97
- REPO_ROOT=$(cd "$ACTION_ROOT/../.." && pwd)
98
- cd "$REPO_ROOT"
99
- npm ci
100
- npm run build:agent-mux
101
- npm run build --workspace=@a5c-ai/triggers
153
+ WORKSPACE="${GITHUB_WORKSPACE:-$(pwd)}"
154
+ if [ -d "$WORKSPACE/packages/agent-mux/cli" ] && [ -f "$WORKSPACE/packages/triggers/action.yml" ]; then
155
+ echo "mode=monorepo" >> "$GITHUB_OUTPUT"
156
+ echo "tag=staging" >> "$GITHUB_OUTPUT"
157
+ elif [ "$ACTION_REF" = "staging" ]; then
158
+ echo "mode=external" >> "$GITHUB_OUTPUT"
159
+ echo "tag=staging" >> "$GITHUB_OUTPUT"
160
+ else
161
+ echo "mode=external" >> "$GITHUB_OUTPUT"
162
+ echo "tag=latest" >> "$GITHUB_OUTPUT"
163
+ fi
164
+
165
+ - name: Install runtime packages
166
+ shell: bash
167
+ env:
168
+ NPM_TAG: ${{ steps.resolve-runtime.outputs.tag }}
169
+ run: |
170
+ set -euo pipefail
171
+ echo "Installing @a5c-ai packages with tag: $NPM_TAG"
172
+ npm install -g --legacy-peer-deps @a5c-ai/agent-mux-cli@$NPM_TAG @a5c-ai/babysitter-sdk@$NPM_TAG @a5c-ai/triggers@$NPM_TAG
173
+ npm install -g --legacy-peer-deps @a5c-ai/hooks-mux-cli@$NPM_TAG 2>/dev/null || echo "hooks-mux-cli install skipped (optional)"
174
+ which amux && amux --version || { echo "ERROR: amux not found after install"; exit 1; }
102
175
 
103
176
  - name: Install harness
104
- if: ${{ inputs.harness != '' }}
177
+ if: ${{ inputs.harness != '' || inputs.adapter != '' }}
105
178
  shell: bash
106
179
  env:
107
- ACTION_ROOT: ${{ github.action_path }}
108
- INPUT_HARNESS: ${{ inputs.harness }}
180
+ INPUT_HARNESS: ${{ inputs.harness || inputs.adapter }}
109
181
  INPUT_WORKING_DIRECTORY: ${{ inputs.working-directory }}
110
182
  run: |
111
183
  set -euo pipefail
112
- REPO_ROOT=$(cd "$ACTION_ROOT/../.." && pwd)
113
184
  cd "$INPUT_WORKING_DIRECTORY"
114
- node "$REPO_ROOT/packages/agent-mux/sdk/dist/bin/amux.js" install "$INPUT_HARNESS"
185
+ # Map adapter names to amux agent aliases
186
+ AMUX_AGENT="$INPUT_HARNESS"
187
+ case "$INPUT_HARNESS" in
188
+ claude-code) AMUX_AGENT="claude" ;;
189
+ gemini-cli) AMUX_AGENT="gemini" ;;
190
+ copilot-cli) AMUX_AGENT="copilot" ;;
191
+ cursor-cli) AMUX_AGENT="cursor" ;;
192
+ esac
193
+ amux install "$AMUX_AGENT" || true
194
+
195
+ - name: Install babysitter plugin
196
+ if: ${{ inputs.babysitter-plugin == 'true' }}
197
+ shell: bash
198
+ env:
199
+ INPUT_HARNESS: ${{ inputs.harness || inputs.adapter }}
200
+ INPUT_WORKING_DIRECTORY: ${{ inputs.working-directory }}
201
+ INPUT_PROCESS_FILE: ${{ inputs.process-file }}
202
+ run: |
203
+ set -euo pipefail
204
+ cd "$INPUT_WORKING_DIRECTORY"
205
+
206
+ # Map to SDK harness names
207
+ SDK_HARNESS="$INPUT_HARNESS"
208
+ case "$INPUT_HARNESS" in
209
+ claude-code) SDK_HARNESS="claude" ;;
210
+ gemini-cli) SDK_HARNESS="gemini" ;;
211
+ copilot-cli) SDK_HARNESS="copilot" ;;
212
+ cursor-cli) SDK_HARNESS="cursor" ;;
213
+ esac
214
+
215
+ # Install babysitter plugin — try SDK installer first, fall back to direct harness commands
216
+ if ! babysitter harness:install-plugin "$SDK_HARNESS" --workspace "$INPUT_WORKING_DIRECTORY" 2>/dev/null; then
217
+ echo "Plugin installer unavailable — installing plugin directly"
218
+ case "$SDK_HARNESS" in
219
+ claude)
220
+ claude plugin marketplace add a5c-ai/babysitter-claude 2>/dev/null || true
221
+ claude plugin install --scope project babysitter@a5c.ai 2>/dev/null || true
222
+ ;;
223
+ *)
224
+ mkdir -p .a5c
225
+ echo '{"type":"module"}' > .a5c/package.json 2>/dev/null || true
226
+ ;;
227
+ esac
228
+ fi
229
+
230
+ # Copy process file if provided
231
+ if [ -n "$INPUT_PROCESS_FILE" ]; then
232
+ mkdir -p .a5c/processes
233
+ cp "$INPUT_PROCESS_FILE" .a5c/processes/
234
+ fi
115
235
 
116
- - name: Install plugins
236
+ - name: Install plugins (legacy)
117
237
  if: ${{ inputs.plugins != '' }}
118
238
  shell: bash
119
239
  env:
@@ -122,10 +242,9 @@ runs:
122
242
  INPUT_PLUGINS: ${{ inputs.plugins }}
123
243
  run: |
124
244
  set -euo pipefail
125
- REPO_ROOT=$(cd "$ACTION_ROOT/../.." && pwd)
126
245
  while IFS= read -r plugin; do
127
246
  [ -z "$plugin" ] && continue
128
- node "$REPO_ROOT/packages/agent-mux/sdk/dist/bin/amux.js" plugin install "$INPUT_ADAPTER" "$plugin"
247
+ amux plugin install "$INPUT_ADAPTER" "$plugin"
129
248
  done <<< "$INPUT_PLUGINS"
130
249
 
131
250
  - name: Evaluate trigger
@@ -139,21 +258,20 @@ runs:
139
258
  EFFECTIVE_GITHUB_TOKEN: ${{ steps.a5c-token.outputs.a5c_token || inputs.github-token }}
140
259
  run: |
141
260
  set -euo pipefail
142
- REPO_ROOT=$(cd "$ACTION_ROOT/../.." && pwd)
143
261
  EVENT_FILE="$RUNNER_TEMP/agent-mux-event.json"
144
262
  RESULT_FILE="$RUNNER_TEMP/agent-mux-trigger.json"
145
263
  INCLUDE_DIFF_ARGS=()
146
264
  if [ "$INPUT_INCLUDE_DIFF" = "true" ]; then
147
265
  INCLUDE_DIFF_ARGS+=(--include-diff)
148
266
  fi
149
- node "$REPO_ROOT/packages/triggers/dist/cli.js" enrich \
267
+ triggers enrich \
150
268
  --backend "$INPUT_TRIGGER_BACKEND" \
151
269
  --token "$EFFECTIVE_GITHUB_TOKEN" \
152
270
  "${INCLUDE_DIFF_ARGS[@]}" \
153
271
  --output "$EVENT_FILE"
154
272
  if [ -z "$INPUT_TRIGGER_QUERY" ]; then
155
273
  echo '{"matched":true,"reasons":["no trigger query configured"]}' > "$RESULT_FILE"
156
- elif node "$REPO_ROOT/packages/triggers/dist/cli.js" evaluate \
274
+ elif triggers evaluate \
157
275
  --backend "$INPUT_TRIGGER_BACKEND" \
158
276
  --query "$INPUT_TRIGGER_QUERY" \
159
277
  --token "$EFFECTIVE_GITHUB_TOKEN" \
@@ -190,21 +308,80 @@ runs:
190
308
  env:
191
309
  ACTION_ROOT: ${{ github.action_path }}
192
310
  INPUT_COMMAND: ${{ inputs.command }}
311
+ INPUT_HARNESS: ${{ inputs.harness || inputs.adapter }}
312
+ INPUT_PROVIDER: ${{ inputs.provider }}
313
+ INPUT_MODEL: ${{ inputs.model }}
314
+ INPUT_PROMPT: ${{ inputs.prompt }}
315
+ INPUT_INTERACTION_MODE: ${{ inputs.interaction-mode }}
316
+ INPUT_MAX_TURNS: ${{ inputs.max-turns }}
317
+ INPUT_WITH_PROXY: ${{ inputs.with-proxy }}
318
+ INPUT_PROXY_LOG_LEVEL: ${{ inputs.proxy-log-level }}
319
+ INPUT_BABYSITTER_PLUGIN: ${{ inputs.babysitter-plugin }}
320
+ INPUT_BABYSITTER_PREFIX: ${{ inputs.babysitter-prompt-prefix }}
193
321
  INPUT_ARGS: ${{ inputs.args }}
194
322
  INPUT_ARGS_JSON: ${{ inputs.args-json }}
195
- INPUT_ADAPTER: ${{ inputs.adapter }}
196
- INPUT_PROMPT: ${{ inputs.prompt }}
197
323
  AMUX_TRIGGER_EVENT_PATH: ${{ steps.trigger.outputs.event }}
198
324
  run: |
199
325
  set -euo pipefail
200
- REPO_ROOT=$(cd "$ACTION_ROOT/../.." && pwd)
201
- ARGS=("$INPUT_COMMAND")
202
- if [ -n "$INPUT_ADAPTER" ]; then
203
- ARGS+=(--agent "$INPUT_ADAPTER")
326
+ AMUX="amux"
327
+
328
+ # Map harness names to amux aliases
329
+ AMUX_HARNESS="$INPUT_HARNESS"
330
+ case "$INPUT_HARNESS" in
331
+ claude-code) AMUX_HARNESS="claude" ;;
332
+ gemini-cli) AMUX_HARNESS="gemini" ;;
333
+ copilot-cli) AMUX_HARNESS="copilot" ;;
334
+ cursor-cli) AMUX_HARNESS="cursor" ;;
335
+ esac
336
+
337
+ # Build command args
338
+ ARGS=()
339
+ if [ "$INPUT_COMMAND" = "launch" ] || [ "$INPUT_COMMAND" = "run" ]; then
340
+ ARGS+=("$INPUT_COMMAND")
341
+ [ -n "$AMUX_HARNESS" ] && ARGS+=("$AMUX_HARNESS")
342
+ [ -n "$INPUT_PROVIDER" ] && ARGS+=("$INPUT_PROVIDER")
343
+ else
344
+ ARGS+=("$INPUT_COMMAND")
204
345
  fi
346
+
347
+ # Model
348
+ [ -n "$INPUT_MODEL" ] && ARGS+=(--model "$INPUT_MODEL")
349
+
350
+ # Prompt — with optional babysitter prefix
205
351
  if [ -n "$INPUT_PROMPT" ]; then
206
- ARGS+=(--prompt "$INPUT_PROMPT")
352
+ EFFECTIVE_PROMPT="$INPUT_PROMPT"
353
+ if [ "$INPUT_BABYSITTER_PLUGIN" = "true" ] && [ -n "$INPUT_BABYSITTER_PREFIX" ]; then
354
+ EFFECTIVE_PROMPT="$INPUT_BABYSITTER_PREFIX $INPUT_PROMPT"
355
+ fi
356
+ ARGS+=(--prompt "$EFFECTIVE_PROMPT")
207
357
  fi
358
+
359
+ # Interaction mode flags
360
+ case "$INPUT_INTERACTION_MODE" in
361
+ non-interactive)
362
+ ARGS+=(--no-interactive)
363
+ ;;
364
+ bridged-hooks)
365
+ ARGS+=(--no-interactive --bridge-hooks)
366
+ ;;
367
+ bridged-interactive)
368
+ ARGS+=(--no-interactive --bridge-interactive)
369
+ ;;
370
+ esac
371
+
372
+ # Max turns
373
+ [ -n "$INPUT_MAX_TURNS" ] && ARGS+=(--max-turns "$INPUT_MAX_TURNS")
374
+
375
+ # Proxy
376
+ if [ "$INPUT_WITH_PROXY" = "true" ]; then
377
+ ARGS+=(--with-proxy-if-needed)
378
+ [ -n "$INPUT_PROXY_LOG_LEVEL" ] && ARGS+=(--proxy-log-level "$INPUT_PROXY_LOG_LEVEL")
379
+ fi
380
+
381
+ # Auto-approve permissions
382
+ ARGS+=(--yolo)
383
+
384
+ # Extra args
208
385
  if [ -n "$INPUT_ARGS_JSON" ]; then
209
386
  mapfile -t EXTRA_ARGS < <(node -e "const value = JSON.parse(process.env.INPUT_ARGS_JSON || '[]'); if (!Array.isArray(value)) throw new Error('args-json must be a JSON array'); for (const item of value) console.log(String(item));")
210
387
  ARGS+=("${EXTRA_ARGS[@]}")
@@ -212,13 +389,16 @@ runs:
212
389
  read -r -a EXTRA_ARGS <<< "$INPUT_ARGS"
213
390
  ARGS+=("${EXTRA_ARGS[@]}")
214
391
  fi
215
- if node "$REPO_ROOT/packages/agent-mux/sdk/dist/bin/amux.js" "${ARGS[@]}"; then
392
+
393
+ echo "::group::amux ${ARGS[*]}"
394
+ if $AMUX "${ARGS[@]}"; then
216
395
  echo "exit-code=0" >> "$GITHUB_OUTPUT"
217
396
  else
218
397
  status=$?
219
398
  echo "exit-code=$status" >> "$GITHUB_OUTPUT"
220
399
  exit "$status"
221
400
  fi
401
+ echo "::endgroup::"
222
402
 
223
403
  - name: Post-run pipeline commands
224
404
  if: ${{ steps.trigger.outputs.matched == 'true' && inputs.post-run != '' }}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a5c-ai/triggers",
3
- "version": "5.0.1-staging.f672fe79b",
3
+ "version": "5.0.1-staging.f6da8cd208d2",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Event trigger normalization, enrichment, and filtering helpers for automation actions",