@open-agent-toolkit/cli 0.2.23 → 0.2.25
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/assets/agents/oat-reviewer.md +12 -1
- package/assets/docs/cli-utilities/configuration.md +2 -4
- package/assets/docs/cli-utilities/workflow-gates.md +27 -3
- package/assets/docs/reference/cli-reference.md +1 -1
- package/assets/docs/workflows/projects/reviews.md +19 -10
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +3 -3
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +3 -3
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +3 -3
- package/assets/skills/oat-project-implement/references/phase-execution.md +29 -0
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +3 -3
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +3 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +124 -26
- package/assets/skills/oat-project-review-provide-remote/SKILL.md +64 -15
- package/assets/skills/oat-project-review-receive/SKILL.md +21 -1
- package/assets/skills/oat-project-review-receive-remote/SKILL.md +39 -2
- package/assets/skills/oat-review-provide-remote/SKILL.md +55 -12
- package/assets/templates/plan.md +13 -7
- package/dist/commands/config/index.js +8 -8
- package/dist/commands/gate/child-process.d.ts +32 -0
- package/dist/commands/gate/child-process.d.ts.map +1 -0
- package/dist/commands/gate/child-process.js +210 -0
- package/dist/commands/gate/index.d.ts +2 -31
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +24 -150
- package/dist/commands/review/latest.d.ts.map +1 -1
- package/dist/commands/review/latest.js +22 -9
- package/dist/config/resolve.js +1 -1
- package/dist/review-remote/body-builder.d.ts +12 -3
- package/dist/review-remote/body-builder.d.ts.map +1 -1
- package/dist/review-remote/body-builder.js +11 -0
- package/dist/review-remote/marker-parser.d.ts +8 -3
- package/dist/review-remote/marker-parser.d.ts.map +1 -1
- package/dist/review-remote/marker-parser.js +13 -2
- package/dist/review-remote/narrowing.d.ts +44 -8
- package/dist/review-remote/narrowing.d.ts.map +1 -1
- package/dist/review-remote/narrowing.js +106 -10
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-project-review-receive-remote
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.5.0
|
|
4
4
|
description: Use when processing GitHub PR review comments within project context. Fetches PR comments, creates plan tasks, and updates project artifacts.
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
user-invocable: true
|
|
@@ -115,6 +115,33 @@ Confirm resolved PR number with user.
|
|
|
115
115
|
npx agent-reviews --json --unresolved --pr <N>
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
Resolve provenance from the GitHub review event that produced the fetched
|
|
119
|
+
feedback, not from the PR's current head. Parse its OAT marker block when
|
|
120
|
+
present:
|
|
121
|
+
|
|
122
|
+
- accept `oat_review_head_sha` only as a full 40-character hexadecimal SHA;
|
|
123
|
+
- preserve `oat_review_invocation` as the invocation kind;
|
|
124
|
+
- preserve `oat_gate_target` only for a gate invocation.
|
|
125
|
+
|
|
126
|
+
If the source review is legacy, multiple source reviews disagree, or the
|
|
127
|
+
lineage cannot be associated with this receive event, leave the corresponding
|
|
128
|
+
ledger cells unknown (`-`). Never infer lineage from the reviewer identity or
|
|
129
|
+
substitute the current PR head for the commit that was actually reviewed.
|
|
130
|
+
|
|
131
|
+
**Reviews ledger write contract (all receive paths):**
|
|
132
|
+
|
|
133
|
+
- Resolve `Scope`, `Type`, `Status`, `Date`, `Artifact`, `Reviewed Head`,
|
|
134
|
+
`Invocation`, and `Gate Target` by header name before mutating a row; never
|
|
135
|
+
use fixed cell positions.
|
|
136
|
+
- If the Reviews table has only the legacy five columns, add `Reviewed Head`,
|
|
137
|
+
`Invocation`, and `Gate Target` to its header and separator and pad every
|
|
138
|
+
existing row with `-`. In an already widened table, pad a shorter row with
|
|
139
|
+
`-` through the current header width before mutation.
|
|
140
|
+
- Mutate only the event selected by the event-identity rules below. Preserve
|
|
141
|
+
every unknown column in its original position and every existing known value
|
|
142
|
+
unless the operation explicitly advances that cell. Never truncate a row to
|
|
143
|
+
five, eight, or any other assumed width.
|
|
144
|
+
|
|
118
145
|
If no unresolved comments:
|
|
119
146
|
|
|
120
147
|
1. Create a UTC timestamp and event-distinct filename:
|
|
@@ -125,10 +152,14 @@ If no unresolved comments:
|
|
|
125
152
|
remain in top-level `reviews/`.
|
|
126
153
|
3. Record the clean result as a `passed` Reviews event whose event identity
|
|
127
154
|
combines `Scope`, `Type`, and artifact filename:
|
|
155
|
+
- Apply the Reviews ledger write contract above before claiming, appending,
|
|
156
|
+
or mutating the event.
|
|
128
157
|
- Claim only an unbound `pending` placeholder with matching Scope + Type and
|
|
129
158
|
Artifact `-`; otherwise append a distinct row.
|
|
130
159
|
- Set Date and Artifact to this clean event. Advance only this event and
|
|
131
160
|
never mutate another row by scope alone.
|
|
161
|
+
- Populate `Reviewed Head`, `Invocation`, and `Gate Target` only from the
|
|
162
|
+
validated source-review provenance above; use `-` when it is unknown.
|
|
132
163
|
4. Commit `plan.md` and the clean review artifact atomically with
|
|
133
164
|
`chore(oat): record clean remote review (pr-#<N>)`. Do not stop with
|
|
134
165
|
uncommitted bookkeeping.
|
|
@@ -176,7 +207,8 @@ For each converted finding:
|
|
|
176
207
|
### Step 6: Update Project Artifacts
|
|
177
208
|
|
|
178
209
|
Before changing the ledger, write an event-distinct review artifact containing
|
|
179
|
-
the PR number, fetch timestamp, normalized findings, and
|
|
210
|
+
the PR number, fetch timestamp, normalized findings, dispositions, and any
|
|
211
|
+
validated source-review head/invocation/gate-target provenance:
|
|
180
212
|
`reviews/archived/remote-pr-<N>-review-YYYY-MM-DDTHHMMSSZ.md`. Remote receive
|
|
181
213
|
fully dispositions the event as `passed` or `fixes_added`, so the artifact is
|
|
182
214
|
consumed immediately and belongs in `reviews/archived/`, not top-level
|
|
@@ -198,11 +230,16 @@ Update `plan.md`:
|
|
|
198
230
|
- status `passed` when no actionable findings remain
|
|
199
231
|
- date set to today
|
|
200
232
|
- artifact `reviews/archived/remote-pr-<N>-review-YYYY-MM-DDTHHMMSSZ.md`
|
|
233
|
+
- reviewed head set to the validated full source-review SHA, or `-`
|
|
234
|
+
- invocation set to the source-review invocation kind, or `-`
|
|
235
|
+
- gate target set only for a gate source review, or `-`
|
|
201
236
|
- Claim an unbound `pending` placeholder only when its Scope + Type matches and
|
|
202
237
|
its Artifact is `-`; otherwise append the event. Later mutations select it by
|
|
203
238
|
Scope + Type + artifact filename, never by scope or `github-pr #<N>` alone.
|
|
204
239
|
- Never move an event status backward or overwrite an earlier event from the
|
|
205
240
|
same PR.
|
|
241
|
+
- Apply the Reviews ledger write contract above before claiming, appending, or
|
|
242
|
+
mutating the event.
|
|
206
243
|
- Update `## Implementation Complete` totals.
|
|
207
244
|
|
|
208
245
|
Update `implementation.md`:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-review-provide-remote
|
|
3
|
-
version: 1.0
|
|
3
|
+
version: 1.1.0
|
|
4
4
|
description: Use when reviewing a GitHub PR opened on another machine and posting findings back as a single PR review, outside any OAT project context. Fetches the PR via gh, reviews it, and posts via gh api.
|
|
5
5
|
disable-model-invocation: true
|
|
6
6
|
user-invocable: true
|
|
@@ -77,7 +77,7 @@ oat-review-provide-remote [--pr <N>] [--no-checkout] [--narrow|--no-narrow]
|
|
|
77
77
|
|
|
78
78
|
- `--pr <N>`: target PR number. When omitted, auto-detect from the current branch.
|
|
79
79
|
- `--no-checkout`: skip the ephemeral worktree and review from `gh pr diff` only (degraded context).
|
|
80
|
-
- `--narrow` / `--no-narrow`: force or forbid re-review narrowing against a prior provide-remote review. When neither is passed, honor `workflow.autoNarrowReReviewScope`
|
|
80
|
+
- `--narrow` / `--no-narrow`: force or forbid re-review narrowing against a prior ad-hoc provide-remote review. `--narrow` takes precedence over the configured preference; `--no-narrow` forces full scope. When neither is passed, honor `workflow.autoNarrowReReviewScope`: unset and `true` narrow automatically, while only `false` forces full scope. This path never prompts for a narrowing decision.
|
|
81
81
|
|
|
82
82
|
Inputs are CLI-style args parsed from `$ARGUMENTS`. No file inputs. No file outputs on this machine.
|
|
83
83
|
|
|
@@ -143,26 +143,63 @@ gh pr view "$PR" --json title,body,headRefOid,baseRefName,state
|
|
|
143
143
|
|
|
144
144
|
### Step 3: Detect Prior Reviews + Narrow Scope
|
|
145
145
|
|
|
146
|
-
|
|
146
|
+
Resolve preference and per-invocation flags before candidate enumeration:
|
|
147
|
+
|
|
148
|
+
1. `--no-narrow` forces full PR scope with reason `narrowing-disabled` and skips `gh api` review enumeration entirely.
|
|
149
|
+
2. `--narrow` forces a narrowing attempt even when the configured preference is `false`.
|
|
150
|
+
3. With neither flag, unset and `true` attempt narrowing; only `false` forces full PR scope with reason `narrowing-disabled` and skips `gh api` review enumeration entirely.
|
|
151
|
+
|
|
152
|
+
Only when narrowing will be attempted, list prior PR reviews and parse each body's GitHub review marker block. Capture command status and stderr separately:
|
|
147
153
|
|
|
148
154
|
```bash
|
|
149
|
-
|
|
155
|
+
REVIEWS_ERROR_FILE=""
|
|
156
|
+
REVIEWS_DIAGNOSTIC=""
|
|
157
|
+
REVIEWS_DISCOVERY_OK=false
|
|
158
|
+
|
|
159
|
+
if ! REVIEWS_ERROR_FILE=$(mktemp "${TMPDIR:-/tmp}/oat-review-errors.XXXXXX"); then
|
|
160
|
+
REVIEWS_DIAGNOSTIC="diagnostic-file-unavailable: unable to create a temporary stderr file"
|
|
161
|
+
elif REVIEWS_JSON=$(gh api "/repos/{owner}/{repo}/pulls/$PR/reviews" 2>"$REVIEWS_ERROR_FILE"); then
|
|
162
|
+
REVIEWS_DISCOVERY_OK=true
|
|
163
|
+
rm -f -- "$REVIEWS_ERROR_FILE"
|
|
164
|
+
REVIEWS_ERROR_FILE=""
|
|
165
|
+
else
|
|
166
|
+
REVIEWS_DIAGNOSTIC=$(dd if="$REVIEWS_ERROR_FILE" bs=500 count=1 2>/dev/null)
|
|
167
|
+
rm -f -- "$REVIEWS_ERROR_FILE"
|
|
168
|
+
REVIEWS_ERROR_FILE=""
|
|
169
|
+
fi
|
|
150
170
|
```
|
|
151
171
|
|
|
152
|
-
|
|
172
|
+
Do not run `gh api` when diagnostic-file creation fails. Treat that failure, a nonzero `gh api` result, or a response-level enumeration/parsing failure as discovery failure. Before removing the diagnostic file, preserve at most 500 bytes from stderr. If response parsing later fails, set `REVIEWS_DISCOVERY_OK=false` and put at most 500 characters of the parse error in `REVIEWS_DIAGNOSTIC`. Apply the forced/automatic policy below whenever `REVIEWS_DISCOVERY_OK=false`. Do not treat individual irrelevant or lineage-ineligible marker blocks as response-level failure.
|
|
173
|
+
|
|
174
|
+
- With forced `--narrow`, discovery failure is a hard error with reason `prior-reviews-unavailable`; report the diagnostic and stop instead of pretending to narrow.
|
|
175
|
+
- On the automatic path, discovery failure fails open to full PR scope with stable reason `prior-reviews-unavailable` plus the diagnostic detail, then continues to review the full PR diff.
|
|
176
|
+
|
|
177
|
+
After successful enumeration, candidate discovery belongs to this rail: use only marker blocks where `oat_provide_remote: true`, `oat_review_scope == "ad-hoc"`, no `oat_project` key is present, and the invocation is in the ad-hoc lifecycle lineage (`manual` or `auto`). Project-rail, gate, and invocation-less or unknown legacy markers remain unknown and ineligible. This rail has no project-plan or local lifecycle Reviews-table fallback.
|
|
178
|
+
|
|
179
|
+
Take the most recent eligible marker by submitted timestamp. Candidate discovery and marker provenance remain rail-specific; only after this rail supplies that candidate apply the shared guard, fallback, and classification semantics mirrored by `packages/cli/src/review-remote/narrowing.ts`. When no eligible marker supplies a full 40-character hexadecimal `oat_review_head_sha`, use full PR scope with reason `no-prior-review`. Do not run Git guards for an invalid candidate.
|
|
180
|
+
|
|
181
|
+
Before accepting `<prior_sha>..<PR_HEAD_SHA>`, run the stale-SHA guard (design.md → Error Handling → Stale prior-review SHA):
|
|
153
182
|
|
|
154
183
|
Run the guard in the available git context `$GIT_CTX` — `$EPHEMERAL_PATH` in rich-context (checkout) mode, or `$REPO_ROOT` in diff-only mode (where no worktree exists):
|
|
155
184
|
|
|
156
185
|
1. **Existence:** `git -C "$GIT_CTX" cat-file -e <prior_sha>` (diff-only mode: `git -C "$REPO_ROOT" fetch origin <prior_sha>:refs/oat-prior-review` first, then re-check; if that fetch fails, fall back to full PR scope).
|
|
157
186
|
2. **Ancestry:** `git -C "$GIT_CTX" merge-base --is-ancestor <prior_sha> "$PR_HEAD_SHA"`.
|
|
158
187
|
|
|
159
|
-
Guard outcomes:
|
|
188
|
+
Guard outcomes and reasons:
|
|
160
189
|
|
|
161
|
-
- Both pass -> narrow to `<prior_sha>..<
|
|
162
|
-
-
|
|
190
|
+
- Both pass -> narrow to exactly `<prior_sha>..<PR_HEAD_SHA>` with reason `narrowed from guarded prior reviewed head`.
|
|
191
|
+
- Object missing or fetch failure -> fall back to full PR scope with reason `stale-sha` and detail `prior-commit-missing`.
|
|
192
|
+
- Ancestry failure -> fall back to full PR scope with reason `stale-sha` and detail `prior-commit-not-ancestor`.
|
|
163
193
|
- `--narrow` set AND guard fails -> hard error; surface unreachability and stop.
|
|
164
|
-
-
|
|
165
|
-
|
|
194
|
+
- The automatic path fails open for every candidate or guard failure and preserves the applicable reason.
|
|
195
|
+
|
|
196
|
+
When a guarded narrow range is accepted, enumerate its changed files with `git diff --name-only "<prior_sha>..<PR_HEAD_SHA>"` and classify it for reporting:
|
|
197
|
+
|
|
198
|
+
- `empty`: no changed files.
|
|
199
|
+
- `substantive`: any non-empty range. The ad-hoc rail has no active project prefix, so it cannot classify a range as `bookkeeping-only`.
|
|
200
|
+
- If changed-file enumeration fails, conservatively classify as `substantive` and add `changed-files-unavailable` to the reason.
|
|
201
|
+
|
|
202
|
+
The shared vocabulary remains `empty`, `bookkeeping-only`, or `substantive`; `bookkeeping-only` is reachable only on a project rail with an exact active-project prefix. Classification is reporting-only: it never skips, gates, or shortens the review. Print one narrowing resolution line containing the resolved full-scope or narrow range, classification when narrowed, and the explicit reason. Do not print another narrowing prompt or decision line elsewhere.
|
|
166
203
|
|
|
167
204
|
### Step 4: Run the Review (Inline)
|
|
168
205
|
|
|
@@ -233,6 +270,9 @@ Posting failure handling (design.md → Error Handling → Posting failures): on
|
|
|
233
270
|
Always release the ephemeral worktree in a `finally`, even when review or posting fails:
|
|
234
271
|
|
|
235
272
|
```bash
|
|
273
|
+
if [[ -n "${REVIEWS_ERROR_FILE:-}" ]]; then
|
|
274
|
+
rm -f -- "$REVIEWS_ERROR_FILE"
|
|
275
|
+
fi
|
|
236
276
|
git -C "$REPO_ROOT" worktree remove --force "$EPHEMERAL_PATH" || git -C "$REPO_ROOT" worktree prune
|
|
237
277
|
rm -rf "$EPHEMERAL_PATH"
|
|
238
278
|
```
|
|
@@ -252,7 +292,7 @@ At completion, report:
|
|
|
252
292
|
|
|
253
293
|
- PR number and HEAD SHA reviewed.
|
|
254
294
|
- Read mode (worktree checkout vs diff-only).
|
|
255
|
-
- Narrowing decision (full scope vs `<prior_sha>..<
|
|
295
|
+
- Narrowing decision (full scope vs `<prior_sha>..<PR_HEAD_SHA>`), reporting-only classification when narrowed, and the explicit reason.
|
|
256
296
|
- Severity counts and total findings.
|
|
257
297
|
- Inline-comment count posted vs findings downgraded to the body (out-of-diff).
|
|
258
298
|
- Verdict (`REQUEST_CHANGES` or `COMMENT`).
|
|
@@ -263,7 +303,10 @@ At completion, report:
|
|
|
263
303
|
|
|
264
304
|
- PR scope resolved and confirmed.
|
|
265
305
|
- PR content acquired via ephemeral worktree (or diff-only fallback) without mutating the caller's working tree.
|
|
266
|
-
- Prior
|
|
306
|
+
- Prior ad-hoc GitHub markers detected and restricted to the ad-hoc lifecycle lineage; project and gate markers are ineligible, and no project-plan or local Reviews-table fallback is used.
|
|
307
|
+
- Re-review narrowing applies only after the full-SHA, existence, and ancestry guards pass, with explicit fail-open reasons.
|
|
308
|
+
- Unset and `true` narrow automatically, only `false` forces full scope, per-invocation flags retain precedence, and no narrowing prompt remains.
|
|
309
|
+
- Narrowed ranges are classified as `empty` or `substantive` for reporting only; changed-file enumeration failure conservatively reports `substantive`.
|
|
267
310
|
- Findings produced with consistent 4-tier severities and file:line references.
|
|
268
311
|
- Inline comments mapped to in-diff positions; out-of-diff findings downgraded to the body, never dropped.
|
|
269
312
|
- Posted-review body carries the marker block first, correct severity counts, and the minor-fix nudge when minors are present.
|
package/assets/templates/plan.md
CHANGED
|
@@ -168,13 +168,19 @@ git commit -m "feat(p01-t02): {description}"
|
|
|
168
168
|
|
|
169
169
|
{Keep both code + artifact rows below. Add additional code rows (p03, p04, etc.) as needed, but do not delete `spec`/`design`.}
|
|
170
170
|
|
|
171
|
-
| Scope | Type | Status | Date | Artifact |
|
|
172
|
-
| ------ | -------- | ------- | ---- | -------- |
|
|
173
|
-
| p01 | code | pending | - | - |
|
|
174
|
-
| p02 | code | pending | - | - |
|
|
175
|
-
| final | code | pending | - | - |
|
|
176
|
-
| spec | artifact | pending | - | - |
|
|
177
|
-
| design | artifact | pending | - | - |
|
|
171
|
+
| Scope | Type | Status | Date | Artifact | Reviewed Head | Invocation | Gate Target |
|
|
172
|
+
| ------ | -------- | ------- | ---- | -------- | ------------- | ---------- | ----------- |
|
|
173
|
+
| p01 | code | pending | - | - | - | - | - |
|
|
174
|
+
| p02 | code | pending | - | - | - | - | - |
|
|
175
|
+
| final | code | pending | - | - | - | - | - |
|
|
176
|
+
| spec | artifact | pending | - | - | - | - | - |
|
|
177
|
+
| design | artifact | pending | - | - | - | - | - |
|
|
178
|
+
|
|
179
|
+
For code-review events, `Reviewed Head` is the full 40-character SHA at the
|
|
180
|
+
head of the reviewed range. `Invocation` records `manual`, `auto`, or `gate`;
|
|
181
|
+
`Gate Target` is populated only for gate events. Legacy five-column rows remain
|
|
182
|
+
valid. Writers must preserve every existing row and every unknown trailing
|
|
183
|
+
cell; never truncate a widened row back to five columns.
|
|
178
184
|
|
|
179
185
|
**Status values:** `pending` → `received` → `fixes_added` → `fixes_completed` → `passed`
|
|
180
186
|
|
|
@@ -508,7 +508,7 @@ const CONFIG_CATALOG = [
|
|
|
508
508
|
defaultValue: 'unset',
|
|
509
509
|
mutability: 'read/write',
|
|
510
510
|
owningCommand: 'oat config set workflow.hillCheckpointDefault <value>',
|
|
511
|
-
description: 'Default HiLL checkpoint behavior in oat-project-implement: "every" pauses after every phase, "final" pauses only after the last phase. When unset, the skill prompts. Resolution:
|
|
511
|
+
description: 'Default HiLL checkpoint behavior in oat-project-implement: "every" pauses after every phase, "final" pauses only after the last phase. When unset, the skill prompts. Resolution: local > shared > user > default.',
|
|
512
512
|
},
|
|
513
513
|
{
|
|
514
514
|
key: 'workflow.archiveOnComplete',
|
|
@@ -519,7 +519,7 @@ const CONFIG_CATALOG = [
|
|
|
519
519
|
defaultValue: 'unset',
|
|
520
520
|
mutability: 'read/write',
|
|
521
521
|
owningCommand: 'oat config set workflow.archiveOnComplete <true|false>',
|
|
522
|
-
description: 'Skip the "Archive after completion?" prompt in oat-project-complete. When unset, the skill prompts. Resolution:
|
|
522
|
+
description: 'Skip the "Archive after completion?" prompt in oat-project-complete. When unset, the skill prompts. Resolution: local > shared > user > default.',
|
|
523
523
|
},
|
|
524
524
|
{
|
|
525
525
|
key: 'workflow.createPrOnComplete',
|
|
@@ -530,7 +530,7 @@ const CONFIG_CATALOG = [
|
|
|
530
530
|
defaultValue: 'unset',
|
|
531
531
|
mutability: 'read/write',
|
|
532
532
|
owningCommand: 'oat config set workflow.createPrOnComplete <true|false>',
|
|
533
|
-
description: 'Skip the "Open a PR?" prompt in oat-project-complete. When true, completion auto-triggers PR creation. Resolution:
|
|
533
|
+
description: 'Skip the "Open a PR?" prompt in oat-project-complete. When true, completion auto-triggers PR creation. Resolution: local > shared > user > default.',
|
|
534
534
|
},
|
|
535
535
|
{
|
|
536
536
|
key: 'workflow.postImplementSequence',
|
|
@@ -541,7 +541,7 @@ const CONFIG_CATALOG = [
|
|
|
541
541
|
defaultValue: 'unset',
|
|
542
542
|
mutability: 'read/write',
|
|
543
543
|
owningCommand: "oat config set workflow.postImplementSequence '<legacy-or-json>'",
|
|
544
|
-
description: 'Default post-implementation chaining. Legacy strings remain supported unchanged. Structured JSON uses {"preApproval":[...],"postApproval":[...]} with the canonical sequence steps. Plain get/list/dump output serializes structured values as compact JSON; get --json preserves the object value. When unset, the skill prompts. Resolution:
|
|
544
|
+
description: 'Default post-implementation chaining. Legacy strings remain supported unchanged. Structured JSON uses {"preApproval":[...],"postApproval":[...]} with the canonical sequence steps. Plain get/list/dump output serializes structured values as compact JSON; get --json preserves the object value. When unset, the skill prompts. Resolution: local > shared > user > default.',
|
|
545
545
|
},
|
|
546
546
|
{
|
|
547
547
|
key: 'workflow.reviewExecutionModel',
|
|
@@ -552,7 +552,7 @@ const CONFIG_CATALOG = [
|
|
|
552
552
|
defaultValue: 'unset',
|
|
553
553
|
mutability: 'read/write',
|
|
554
554
|
owningCommand: 'oat config set workflow.reviewExecutionModel <value>',
|
|
555
|
-
description: 'Default execution model for the final review step in oat-project-implement: "subagent" dispatches a review subagent, "inline" runs the review in-context, "fresh-session" prints guidance for running the review in a separate session (with an escape hatch to subagent/inline). When unset, the skill prompts. Resolution:
|
|
555
|
+
description: 'Default execution model for the final review step in oat-project-implement: "subagent" dispatches a review subagent, "inline" runs the review in-context, "fresh-session" prints guidance for running the review in a separate session (with an escape hatch to subagent/inline). When unset, the skill prompts. Resolution: local > shared > user > default.',
|
|
556
556
|
},
|
|
557
557
|
{
|
|
558
558
|
key: 'workflow.autoReviewAtHillCheckpoints',
|
|
@@ -563,7 +563,7 @@ const CONFIG_CATALOG = [
|
|
|
563
563
|
defaultValue: 'unset',
|
|
564
564
|
mutability: 'read/write',
|
|
565
565
|
owningCommand: 'oat config set workflow.autoReviewAtHillCheckpoints <true|false>',
|
|
566
|
-
description: 'Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase oat-reviewer gates. When unset, the skill prompts. Resolution:
|
|
566
|
+
description: 'Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase oat-reviewer gates. When unset, the skill prompts. Resolution: local > shared > user > legacy autoReviewAtCheckpoints > default.',
|
|
567
567
|
},
|
|
568
568
|
{
|
|
569
569
|
key: 'workflow.autoNarrowReReviewScope',
|
|
@@ -571,10 +571,10 @@ const CONFIG_CATALOG = [
|
|
|
571
571
|
file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
|
|
572
572
|
scope: 'workflow',
|
|
573
573
|
type: 'boolean',
|
|
574
|
-
defaultValue: '
|
|
574
|
+
defaultValue: 'true',
|
|
575
575
|
mutability: 'read/write',
|
|
576
576
|
owningCommand: 'oat config set workflow.autoNarrowReReviewScope <true|false>',
|
|
577
|
-
description: '
|
|
577
|
+
description: 'Automatically narrows re-review scope to changes since the prior same-lineage review. Narrowing is enabled by default; false opts out to full scope. Has no effect on initial reviews (there is nothing to narrow to). Resolution: local > shared > user > default.',
|
|
578
578
|
},
|
|
579
579
|
{
|
|
580
580
|
key: 'workflow.autoArtifactReview.plan',
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { GateActivityEvidence, GateActivityProbe, GateActivityProbeStatus } from './activity-probes.js';
|
|
2
|
+
export interface ProcessRunOptions {
|
|
3
|
+
activityProbe?: GateActivityProbe;
|
|
4
|
+
cwd: string;
|
|
5
|
+
env: NodeJS.ProcessEnv;
|
|
6
|
+
livenessIntervalMs?: number;
|
|
7
|
+
onLiveness?: (snapshot: GateLivenessSnapshot) => void;
|
|
8
|
+
purpose: 'host-detection' | 'availability' | 'execute';
|
|
9
|
+
stdin: 'ignore' | 'inherit';
|
|
10
|
+
stdio: 'ignore' | 'inherit' | 'pipe';
|
|
11
|
+
stdoutDestination?: 'stdout' | 'stderr';
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ProcessRunResult {
|
|
15
|
+
activityEvidence?: GateActivityEvidence;
|
|
16
|
+
exitCode: number;
|
|
17
|
+
refusal?: string;
|
|
18
|
+
stderrBytes: number;
|
|
19
|
+
stdoutBytes: number;
|
|
20
|
+
timedOut?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface GateLivenessSnapshot {
|
|
23
|
+
elapsedMs: number;
|
|
24
|
+
hardBudgetMs: number;
|
|
25
|
+
idleMs: number;
|
|
26
|
+
processAlive: boolean;
|
|
27
|
+
activityProbeStatus?: GateActivityProbeStatus;
|
|
28
|
+
lastActivityEvidence?: GateActivityEvidence;
|
|
29
|
+
}
|
|
30
|
+
export declare function runChildProcess(command: string, args: string[], options: ProcessRunOptions): Promise<ProcessRunResult>;
|
|
31
|
+
export declare function extractStructuredRefusal(output: string): string | undefined;
|
|
32
|
+
//# sourceMappingURL=child-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-process.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/child-process.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAS3B,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACtD,OAAO,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;IACvD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAgN3B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3E"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
// Keep these safety bounds fixed rather than environment-tunable. In particular,
|
|
3
|
+
// changing the force-kill fallback would alter the hard-timeout contract.
|
|
4
|
+
// Revisit the observation grace only if field evidence shows large transcript
|
|
5
|
+
// directories routinely exceed it.
|
|
6
|
+
const FORCE_KILL_GRACE_MS = 5_000;
|
|
7
|
+
const ACTIVITY_OBSERVATION_GRACE_MS = 1_000;
|
|
8
|
+
export async function runChildProcess(command, args, options) {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
let timedOut = false;
|
|
11
|
+
let suppressLiveness = false;
|
|
12
|
+
let killTimeout = null;
|
|
13
|
+
let stderrBytes = 0;
|
|
14
|
+
let stdoutBytes = 0;
|
|
15
|
+
let refusal;
|
|
16
|
+
let stdoutLineBuffer = '';
|
|
17
|
+
let stderrLineBuffer = '';
|
|
18
|
+
let latestActivityEvidence;
|
|
19
|
+
let latestActivityProbeStatus;
|
|
20
|
+
let activityObservationSequence = 0;
|
|
21
|
+
let latestActivityEvidenceSequence = 0;
|
|
22
|
+
let livenessProbePending = false;
|
|
23
|
+
let pendingPeriodicObservation;
|
|
24
|
+
let finalActivityObservation;
|
|
25
|
+
const startedAt = Date.now();
|
|
26
|
+
let lastActivityAt = startedAt;
|
|
27
|
+
const child = spawn(command, args, {
|
|
28
|
+
cwd: options.cwd,
|
|
29
|
+
env: options.env,
|
|
30
|
+
stdio: options.stdio === 'pipe'
|
|
31
|
+
? [options.stdin, 'pipe', 'pipe']
|
|
32
|
+
: options.stdio,
|
|
33
|
+
});
|
|
34
|
+
const recordActivity = () => {
|
|
35
|
+
lastActivityAt = Date.now();
|
|
36
|
+
};
|
|
37
|
+
const scanChunk = (buffer, chunk) => {
|
|
38
|
+
const combined = buffer + chunk.toString('utf8');
|
|
39
|
+
const lines = combined.split('\n');
|
|
40
|
+
const remainder = lines.pop() ?? '';
|
|
41
|
+
if (!refusal) {
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
refusal = extractStructuredRefusal(line.replace(/\r$/, ''));
|
|
44
|
+
if (refusal) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return remainder;
|
|
50
|
+
};
|
|
51
|
+
child.stdout?.on('data', (chunk) => {
|
|
52
|
+
stdoutBytes += chunk.byteLength;
|
|
53
|
+
stdoutLineBuffer = scanChunk(stdoutLineBuffer, chunk);
|
|
54
|
+
recordActivity();
|
|
55
|
+
const destination = options.stdoutDestination === 'stderr'
|
|
56
|
+
? process.stderr
|
|
57
|
+
: process.stdout;
|
|
58
|
+
destination.write(chunk);
|
|
59
|
+
});
|
|
60
|
+
child.stderr?.on('data', (chunk) => {
|
|
61
|
+
stderrBytes += chunk.byteLength;
|
|
62
|
+
stderrLineBuffer = scanChunk(stderrLineBuffer, chunk);
|
|
63
|
+
recordActivity();
|
|
64
|
+
process.stderr.write(chunk);
|
|
65
|
+
});
|
|
66
|
+
const processAlive = () => {
|
|
67
|
+
if (child.pid === undefined)
|
|
68
|
+
return false;
|
|
69
|
+
try {
|
|
70
|
+
process.kill(child.pid, 0);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const observeActivity = async (observedAt) => {
|
|
78
|
+
if (!options.activityProbe)
|
|
79
|
+
return undefined;
|
|
80
|
+
const sequence = ++activityObservationSequence;
|
|
81
|
+
try {
|
|
82
|
+
const activityProbeStatus = await options.activityProbe.observe(observedAt);
|
|
83
|
+
const evidence = activityProbeStatus.evidence;
|
|
84
|
+
if (evidence && sequence > latestActivityEvidenceSequence) {
|
|
85
|
+
latestActivityEvidence = evidence;
|
|
86
|
+
latestActivityEvidenceSequence = sequence;
|
|
87
|
+
}
|
|
88
|
+
return activityProbeStatus;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Activity evidence is diagnostic only. Preserve the last valid sample.
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const settleWithinActivityGrace = (observation) => new Promise((resolveObservation) => {
|
|
96
|
+
// Keep this timer referenced so a closed child cannot end the process
|
|
97
|
+
// before the bounded diagnostic observation settles.
|
|
98
|
+
const graceTimeout = setTimeout(resolveObservation, ACTIVITY_OBSERVATION_GRACE_MS);
|
|
99
|
+
const settle = () => {
|
|
100
|
+
clearTimeout(graceTimeout);
|
|
101
|
+
resolveObservation();
|
|
102
|
+
};
|
|
103
|
+
void observation.then(settle, settle);
|
|
104
|
+
});
|
|
105
|
+
const livenessInterval = options.onLiveness && options.livenessIntervalMs
|
|
106
|
+
? setInterval(() => {
|
|
107
|
+
if (livenessProbePending)
|
|
108
|
+
return;
|
|
109
|
+
livenessProbePending = true;
|
|
110
|
+
const now = Date.now();
|
|
111
|
+
const observation = (async () => {
|
|
112
|
+
const activityProbeStatus = await observeActivity(now);
|
|
113
|
+
if (activityProbeStatus) {
|
|
114
|
+
latestActivityProbeStatus = activityProbeStatus;
|
|
115
|
+
}
|
|
116
|
+
if (suppressLiveness)
|
|
117
|
+
return;
|
|
118
|
+
options.onLiveness?.({
|
|
119
|
+
elapsedMs: now - startedAt,
|
|
120
|
+
hardBudgetMs: options.timeoutMs,
|
|
121
|
+
idleMs: now - lastActivityAt,
|
|
122
|
+
processAlive: processAlive(),
|
|
123
|
+
...(latestActivityProbeStatus
|
|
124
|
+
? { activityProbeStatus: latestActivityProbeStatus }
|
|
125
|
+
: {}),
|
|
126
|
+
...(latestActivityEvidence
|
|
127
|
+
? { lastActivityEvidence: latestActivityEvidence }
|
|
128
|
+
: {}),
|
|
129
|
+
});
|
|
130
|
+
})();
|
|
131
|
+
pendingPeriodicObservation = observation;
|
|
132
|
+
const clearPending = () => {
|
|
133
|
+
if (pendingPeriodicObservation === observation) {
|
|
134
|
+
pendingPeriodicObservation = undefined;
|
|
135
|
+
}
|
|
136
|
+
livenessProbePending = false;
|
|
137
|
+
};
|
|
138
|
+
void observation.then(clearPending, clearPending);
|
|
139
|
+
}, options.livenessIntervalMs)
|
|
140
|
+
: null;
|
|
141
|
+
livenessInterval?.unref();
|
|
142
|
+
const timeout = setTimeout(() => {
|
|
143
|
+
timedOut = true;
|
|
144
|
+
suppressLiveness = true;
|
|
145
|
+
if (livenessInterval) {
|
|
146
|
+
clearInterval(livenessInterval);
|
|
147
|
+
}
|
|
148
|
+
child.kill('SIGTERM');
|
|
149
|
+
killTimeout = setTimeout(() => {
|
|
150
|
+
child.kill('SIGKILL');
|
|
151
|
+
}, FORCE_KILL_GRACE_MS);
|
|
152
|
+
killTimeout.unref();
|
|
153
|
+
finalActivityObservation = observeActivity(Date.now());
|
|
154
|
+
}, options.timeoutMs);
|
|
155
|
+
timeout.unref();
|
|
156
|
+
child.on('error', (error) => {
|
|
157
|
+
clearTimeout(timeout);
|
|
158
|
+
if (livenessInterval) {
|
|
159
|
+
clearInterval(livenessInterval);
|
|
160
|
+
}
|
|
161
|
+
if (killTimeout) {
|
|
162
|
+
clearTimeout(killTimeout);
|
|
163
|
+
}
|
|
164
|
+
reject(error);
|
|
165
|
+
});
|
|
166
|
+
child.on('close', (code) => {
|
|
167
|
+
suppressLiveness = true;
|
|
168
|
+
clearTimeout(timeout);
|
|
169
|
+
if (livenessInterval) {
|
|
170
|
+
clearInterval(livenessInterval);
|
|
171
|
+
}
|
|
172
|
+
if (killTimeout) {
|
|
173
|
+
clearTimeout(killTimeout);
|
|
174
|
+
}
|
|
175
|
+
void (async () => {
|
|
176
|
+
if (finalActivityObservation) {
|
|
177
|
+
const periodicObservation = pendingPeriodicObservation;
|
|
178
|
+
const finalThenFallback = finalActivityObservation.then(async (activityProbeStatus) => {
|
|
179
|
+
if (!activityProbeStatus?.evidence && periodicObservation) {
|
|
180
|
+
await periodicObservation;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
await settleWithinActivityGrace(finalThenFallback);
|
|
184
|
+
}
|
|
185
|
+
else if (pendingPeriodicObservation) {
|
|
186
|
+
// Preserve evidence already in flight on a normal close. This can add
|
|
187
|
+
// up to the bounded grace to an otherwise successful execution.
|
|
188
|
+
await settleWithinActivityGrace(pendingPeriodicObservation);
|
|
189
|
+
}
|
|
190
|
+
refusal ??=
|
|
191
|
+
extractStructuredRefusal(stdoutLineBuffer.replace(/\r$/, '')) ??
|
|
192
|
+
extractStructuredRefusal(stderrLineBuffer.replace(/\r$/, ''));
|
|
193
|
+
resolve({
|
|
194
|
+
...(latestActivityEvidence
|
|
195
|
+
? { activityEvidence: latestActivityEvidence }
|
|
196
|
+
: {}),
|
|
197
|
+
exitCode: timedOut ? 124 : (code ?? 1),
|
|
198
|
+
...(refusal ? { refusal } : {}),
|
|
199
|
+
stderrBytes,
|
|
200
|
+
stdoutBytes,
|
|
201
|
+
...(timedOut ? { timedOut: true } : {}),
|
|
202
|
+
});
|
|
203
|
+
})();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
export function extractStructuredRefusal(output) {
|
|
208
|
+
const match = output.match(/^OAT_GATE_REFUSAL: (.*)$/m);
|
|
209
|
+
return match?.[1]?.replace(/\r$/, '');
|
|
210
|
+
}
|
|
@@ -5,8 +5,9 @@ import { type ResolvedConfig } from '../../config/resolve.js';
|
|
|
5
5
|
import { type ModelFamily } from '../../providers/identity/family.js';
|
|
6
6
|
import { type IdentityConfidence, type IdentityProvenance } from '../../providers/identity/provenance.js';
|
|
7
7
|
import { Command } from 'commander';
|
|
8
|
-
import { createGateActivityProbe
|
|
8
|
+
import { createGateActivityProbe } from './activity-probes.js';
|
|
9
9
|
import { createBranchLocalGateCli, currentGateCliLaunch, readGateRouteReceipt, removeBranchLocalGateCli } from './branch-local-cli.js';
|
|
10
|
+
import { type ProcessRunOptions, type ProcessRunResult } from './child-process.js';
|
|
10
11
|
import { parseReviewGateVerdict } from './review-verdict.js';
|
|
11
12
|
interface GateCommandDependencies {
|
|
12
13
|
buildCommandContext: (options: GlobalOptions) => CommandContext;
|
|
@@ -31,36 +32,6 @@ interface GateCommandDependencies {
|
|
|
31
32
|
removeGateRunMarker: (path: string, warn: (message: string) => void) => Promise<void>;
|
|
32
33
|
writeDiagnostic: (message: string) => void;
|
|
33
34
|
}
|
|
34
|
-
interface ProcessRunOptions {
|
|
35
|
-
activityProbe?: GateActivityProbe;
|
|
36
|
-
cwd: string;
|
|
37
|
-
env: NodeJS.ProcessEnv;
|
|
38
|
-
livenessIntervalMs?: number;
|
|
39
|
-
onLiveness?: (snapshot: GateLivenessSnapshot) => void;
|
|
40
|
-
purpose: 'host-detection' | 'availability' | 'execute';
|
|
41
|
-
stdin: 'ignore' | 'inherit';
|
|
42
|
-
stdio: 'ignore' | 'inherit' | 'pipe';
|
|
43
|
-
stdoutDestination?: 'stdout' | 'stderr';
|
|
44
|
-
timeoutMs: number;
|
|
45
|
-
}
|
|
46
|
-
interface ProcessRunResult {
|
|
47
|
-
activityEvidence?: GateActivityEvidence;
|
|
48
|
-
activityProbeStatus?: GateActivityProbeStatus;
|
|
49
|
-
capturedOutput?: string;
|
|
50
|
-
exitCode: number;
|
|
51
|
-
refusal?: string;
|
|
52
|
-
stderrBytes: number;
|
|
53
|
-
stdoutBytes: number;
|
|
54
|
-
timedOut?: boolean;
|
|
55
|
-
}
|
|
56
|
-
interface GateLivenessSnapshot {
|
|
57
|
-
elapsedMs: number;
|
|
58
|
-
hardBudgetMs: number;
|
|
59
|
-
idleMs: number;
|
|
60
|
-
processAlive: boolean;
|
|
61
|
-
activityProbeStatus?: GateActivityProbeStatus;
|
|
62
|
-
lastActivityEvidence?: GateActivityEvidence;
|
|
63
|
-
}
|
|
64
35
|
type GateTimeoutSource = 'cli' | 'target' | 'config' | 'env' | 'scope-default' | 'default';
|
|
65
36
|
interface GateRunMarker {
|
|
66
37
|
runId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAShE,OAAO,EAWL,KAAK,UAAU,EAIf,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAEhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAC;AAWzB,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAExB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EACL,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/gate/index.ts"],"names":[],"mappings":"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"}
|