lazycodex-ai 5.0.0-beta.86 → 5.0.0-beta.87
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/dist/cli/index.js +27 -21
- package/dist/cli-node/index.js +27 -21
- package/package.json +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +2 -0
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +63 -89
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/directive.md +2 -2
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +63 -89
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +8 -2
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -2
- package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +26 -14
- package/packages/omo-codex/plugin/skills/browser/SKILL.md +65 -52
- package/packages/omo-codex/plugin/skills/browser/references/commands.md +81 -66
- package/packages/omo-codex/plugin/skills/browser/references/install.md +31 -34
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +41 -21
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +24 -22
- package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +35 -15
- package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +13 -11
- package/packages/omo-codex/plugin/skills/browser/references/remote.md +5 -4
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +31 -44
- package/packages/omo-codex/plugin/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/omo-codex/plugin/skills/debugging/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/omo-codex/plugin/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/omo-codex/plugin/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/SKILL.md +12 -18
- package/packages/omo-codex/plugin/skills/programming/references/rust/README.md +43 -15
- package/packages/omo-codex/plugin/skills/programming/references/rust/api-design.md +81 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/omo-codex/plugin/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/omo-codex/plugin/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/omo-codex/plugin/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust/libraries.md +35 -25
- package/packages/omo-codex/plugin/skills/programming/references/rust/macros.md +63 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/omo-codex/plugin/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/omo-codex/plugin/skills/programming/references/rust/type-state.md +50 -12
- package/packages/omo-codex/plugin/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/omo-codex/plugin/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/omo-codex/plugin/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/SKILL.md +27 -20
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +63 -89
- package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +2 -3
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/visual-qa/references/browser-setup.md +46 -46
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +2 -2
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +4 -2
- package/packages/prompts-core/prompts/ultrawork/codex.md +63 -89
- package/packages/shared-skills/skills/browser/ATTRIBUTION.md +26 -14
- package/packages/shared-skills/skills/browser/SKILL.md +65 -52
- package/packages/shared-skills/skills/browser/references/commands.md +81 -66
- package/packages/shared-skills/skills/browser/references/install.md +31 -34
- package/packages/shared-skills/skills/browser/references/owned-engine/README.md +41 -21
- package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +33 -20
- package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +24 -22
- package/packages/shared-skills/skills/browser/references/owned-engine/network.md +35 -15
- package/packages/shared-skills/skills/browser/references/recipes/1password.md +13 -11
- package/packages/shared-skills/skills/browser/references/remote.md +5 -4
- package/packages/shared-skills/skills/browser/runtime/omowright/index.js +1534 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +9 -0
- package/packages/shared-skills/skills/browser/runtime/omowright/page-bundle.js +1395 -0
- package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +37 -32
- package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +31 -44
- package/packages/shared-skills/skills/browser/scripts/omowright.mjs +25 -0
- package/packages/shared-skills/skills/debugging/SKILL.md +2 -2
- package/packages/shared-skills/skills/debugging/references/methodology/06-fix.md +3 -3
- package/packages/shared-skills/skills/debugging/references/methodology/08-qa.md +1 -1
- package/packages/shared-skills/skills/debugging/references/tools/browser-qa.md +104 -0
- package/packages/shared-skills/skills/frontend/SKILL.md +1 -1
- package/packages/shared-skills/skills/frontend/references/design/clone-from-url.md +1 -1
- package/packages/shared-skills/skills/programming/SKILL.md +12 -18
- package/packages/shared-skills/skills/programming/references/rust/README.md +43 -15
- package/packages/shared-skills/skills/programming/references/rust/api-design.md +81 -0
- package/packages/shared-skills/skills/programming/references/rust/async-tokio.md +60 -28
- package/packages/shared-skills/skills/programming/references/rust/axum-stack.md +1 -13
- package/packages/shared-skills/skills/programming/references/rust/cargo-strict.md +44 -8
- package/packages/shared-skills/skills/programming/references/rust/clap-stack.md +8 -3
- package/packages/shared-skills/skills/programming/references/rust/concurrency.md +66 -52
- package/packages/shared-skills/skills/programming/references/rust/libraries.md +35 -25
- package/packages/shared-skills/skills/programming/references/rust/macros.md +63 -0
- package/packages/shared-skills/skills/programming/references/rust/one-liners.md +5 -3
- package/packages/shared-skills/skills/programming/references/rust/proptest-insta.md +8 -0
- package/packages/shared-skills/skills/programming/references/rust/type-state.md +50 -12
- package/packages/shared-skills/skills/programming/references/rust/unsafe-discipline.md +34 -6
- package/packages/shared-skills/skills/programming/references/rust/zero-cost-safety.md +62 -52
- package/packages/shared-skills/skills/programming/references/rust-ub/miri-sanitizers-loom.md +1 -1
- package/packages/shared-skills/skills/programming/references/rust-ub/ub-taxonomy.md +6 -3
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.sh +86 -75
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.test.ts +83 -0
- package/packages/shared-skills/skills/programming/scripts/rust/new-project.py +31 -28
- package/packages/shared-skills/skills/review-work/SKILL.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/SKILL.md +27 -20
- package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +32 -100
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/README.md +5 -11
- package/packages/shared-skills/skills/ultimate-browsing/references/insane-search/playwright.md +20 -37
- package/packages/shared-skills/skills/ulw-execute/SKILL.md +4 -4
- package/packages/shared-skills/skills/visual-qa/SKILL.md +1 -1
- package/packages/shared-skills/skills/visual-qa/references/browser-setup.md +46 -46
- package/packages/omo-codex/plugin/skills/browser/scripts/browser-env.mjs +0 -41
- package/packages/omo-codex/plugin/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/packages/omo-codex/plugin/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
- package/packages/shared-skills/skills/browser/scripts/browser-env.mjs +0 -41
- package/packages/shared-skills/skills/debugging/references/tools/playwright-cli.md +0 -112
- package/packages/shared-skills/skills/programming/scripts/rust/check-no-excuse-rules.py +0 -296
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sisyphuslabs/omo-codex-plugin",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.87",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@sisyphuslabs/omo-codex-plugin",
|
|
9
|
-
"version": "5.0.0-beta.
|
|
9
|
+
"version": "5.0.0-beta.87",
|
|
10
10
|
"workspaces": [
|
|
11
11
|
"components/comment-checker",
|
|
12
12
|
"components/git-bash",
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
},
|
|
96
96
|
"components/comment-checker": {
|
|
97
97
|
"name": "@code-yeongyu/codex-comment-checker",
|
|
98
|
-
"version": "5.0.0-beta.
|
|
98
|
+
"version": "5.0.0-beta.87",
|
|
99
99
|
"license": "MIT",
|
|
100
100
|
"bin": {
|
|
101
101
|
"omo-comment-checker": "dist/cli.js"
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
},
|
|
118
118
|
"components/git-bash": {
|
|
119
119
|
"name": "@sisyphuslabs/codex-git-bash-hook",
|
|
120
|
-
"version": "5.0.0-beta.
|
|
120
|
+
"version": "5.0.0-beta.87",
|
|
121
121
|
"bin": {
|
|
122
122
|
"omo-git-bash-hook": "dist/cli.js"
|
|
123
123
|
},
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
},
|
|
132
132
|
"components/lazycodex-executor-verify": {
|
|
133
133
|
"name": "@code-yeongyu/codex-lazycodex-executor-verify",
|
|
134
|
-
"version": "5.0.0-beta.
|
|
134
|
+
"version": "5.0.0-beta.87",
|
|
135
135
|
"license": "MIT",
|
|
136
136
|
"bin": {
|
|
137
137
|
"lazycodex-executor-verify": "dist/cli.js"
|
|
@@ -149,7 +149,7 @@
|
|
|
149
149
|
},
|
|
150
150
|
"components/lsp": {
|
|
151
151
|
"name": "@code-yeongyu/codex-lsp",
|
|
152
|
-
"version": "5.0.0-beta.
|
|
152
|
+
"version": "5.0.0-beta.87",
|
|
153
153
|
"license": "MIT",
|
|
154
154
|
"dependencies": {
|
|
155
155
|
"@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon",
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
},
|
|
172
172
|
"components/rules": {
|
|
173
173
|
"name": "@code-yeongyu/codex-rules",
|
|
174
|
-
"version": "5.0.0-beta.
|
|
174
|
+
"version": "5.0.0-beta.87",
|
|
175
175
|
"license": "MIT",
|
|
176
176
|
"dependencies": {
|
|
177
177
|
"picomatch": "^4.0.7"
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
},
|
|
195
195
|
"components/teammode": {
|
|
196
196
|
"name": "@sisyphuslabs/codex-teammode",
|
|
197
|
-
"version": "5.0.0-beta.
|
|
197
|
+
"version": "5.0.0-beta.87",
|
|
198
198
|
"devDependencies": {
|
|
199
199
|
"@types/node": "^26.6.2",
|
|
200
200
|
"@vitest/coverage-v8": "5.0.1",
|
|
@@ -208,7 +208,7 @@
|
|
|
208
208
|
},
|
|
209
209
|
"components/telemetry": {
|
|
210
210
|
"name": "@code-yeongyu/codex-telemetry",
|
|
211
|
-
"version": "5.0.0-beta.
|
|
211
|
+
"version": "5.0.0-beta.87",
|
|
212
212
|
"license": "MIT",
|
|
213
213
|
"bin": {
|
|
214
214
|
"omo-telemetry": "dist/cli.js"
|
|
@@ -227,7 +227,7 @@
|
|
|
227
227
|
},
|
|
228
228
|
"components/ultrawork": {
|
|
229
229
|
"name": "@code-yeongyu/codex-ultrawork",
|
|
230
|
-
"version": "5.0.0-beta.
|
|
230
|
+
"version": "5.0.0-beta.87",
|
|
231
231
|
"license": "MIT",
|
|
232
232
|
"bin": {
|
|
233
233
|
"omo-ultrawork": "dist/cli.js"
|
|
@@ -246,7 +246,7 @@
|
|
|
246
246
|
},
|
|
247
247
|
"components/ulw-execute-continuation": {
|
|
248
248
|
"name": "@code-yeongyu/codex-ulw-execute-continuation",
|
|
249
|
-
"version": "5.0.0-beta.
|
|
249
|
+
"version": "5.0.0-beta.87",
|
|
250
250
|
"license": "MIT",
|
|
251
251
|
"bin": {
|
|
252
252
|
"omo-ulw-execute-continuation": "dist/cli.js"
|
|
@@ -264,7 +264,7 @@
|
|
|
264
264
|
},
|
|
265
265
|
"components/ulw-loop": {
|
|
266
266
|
"name": "@code-yeongyu/codex-ulw-loop",
|
|
267
|
-
"version": "5.0.0-beta.
|
|
267
|
+
"version": "5.0.0-beta.87",
|
|
268
268
|
"license": "MIT",
|
|
269
269
|
"bin": {
|
|
270
270
|
"omo-ulw-loop": "dist/cli.js",
|
|
@@ -6,8 +6,10 @@ import { isCliEntry } from "./entry-guard.mjs";
|
|
|
6
6
|
|
|
7
7
|
const pluginScriptsDir = dirname(fileURLToPath(import.meta.url));
|
|
8
8
|
const repoRoot = join(pluginScriptsDir, "..", "..", "..", "..");
|
|
9
|
-
const
|
|
9
|
+
const sharedSkillsRoot = join(repoRoot, "packages", "shared-skills");
|
|
10
|
+
const sharedSkillsScripts = join(sharedSkillsRoot, "scripts");
|
|
10
11
|
const materializeScript = join(sharedSkillsScripts, "materialize-frontend-refs.mjs");
|
|
12
|
+
const stageOmowrightScript = join(sharedSkillsRoot, "stage-omowright-runtime.mjs");
|
|
11
13
|
|
|
12
14
|
const upstreamPaths = [
|
|
13
15
|
"packages/shared-skills/upstreams/open-design",
|
|
@@ -34,7 +36,11 @@ function initSubmodules({ strict }) {
|
|
|
34
36
|
export async function materializeSharedUpstreams({ strict }) {
|
|
35
37
|
initSubmodules({ strict });
|
|
36
38
|
const { materializeFrontendRefs } = await import(pathToFileURL(materializeScript).href);
|
|
37
|
-
|
|
39
|
+
const result = await materializeFrontendRefs({ strict });
|
|
40
|
+
const { stageOmowrightRuntime } = await import(pathToFileURL(stageOmowrightScript).href);
|
|
41
|
+
const omowright = await stageOmowrightRuntime();
|
|
42
|
+
process.stdout.write(`[materialize] staged omowright ${omowright.version} into the browser skill\n`);
|
|
43
|
+
return result;
|
|
38
44
|
}
|
|
39
45
|
|
|
40
46
|
if (isCliEntry(import.meta.url)) {
|
|
@@ -183,7 +183,7 @@ export const ulwExecuteOriginalCompletion = [
|
|
|
183
183
|
"4. Print an `ORCHESTRATION COMPLETE` block with the plan path, verification commands, artifacts, and cleanup receipts.",
|
|
184
184
|
].join("\n");
|
|
185
185
|
export const ulwExecuteOriginalHardRule = [
|
|
186
|
-
"- No production change before
|
|
186
|
+
"- No production change before the tests covering that behavior were read and a bug's reproduction captured; existing tests are green on the unchanged code first, and one that contradicts the intent is a FINDING, never edited green.",
|
|
187
187
|
"- No `--dry-run` as completion evidence.",
|
|
188
188
|
"- No tests-only completion claim. A Manual-QA artifact is required.",
|
|
189
189
|
"- **NO DIRECT IMPLEMENTATION BY THE ORCHESTRATOR.** Root NEVER edits product files, writes tests, or runs QA itself — a spawned worker does.",
|
|
@@ -203,7 +203,7 @@ const ulwExecuteCodexCompletion = [
|
|
|
203
203
|
"6. Print an `ORCHESTRATION COMPLETE` block with the plan path, verification commands, artifacts, and cleanup receipts.",
|
|
204
204
|
].join("\n");
|
|
205
205
|
const ulwExecuteCodexHardRule = [
|
|
206
|
-
"- No production change before
|
|
206
|
+
"- No production change before the tests covering that behavior were read and a bug's reproduction captured; existing tests are green on the unchanged code first, and one that contradicts the intent is a FINDING, never edited green.",
|
|
207
207
|
"- No `--dry-run` as completion evidence.",
|
|
208
208
|
"- No tests-only completion claim. A Manual-QA artifact is required.",
|
|
209
209
|
"- **NO DIRECT IMPLEMENTATION BY THE ORCHESTRATOR.** Root NEVER edits product files, writes tests, or runs QA itself — a spawned worker does.",
|
|
@@ -1,25 +1,37 @@
|
|
|
1
1
|
# ATTRIBUTION / NOTICE
|
|
2
2
|
|
|
3
|
-
This skill (`browser`, part of `@oh-my-opencode/shared-skills`) is project-original documentation
|
|
4
|
-
|
|
3
|
+
This skill (`browser`, part of `@oh-my-opencode/shared-skills`) is project-original documentation
|
|
4
|
+
plus a staged copy of one library it drives.
|
|
5
|
+
|
|
6
|
+
## omowright — bundled
|
|
7
|
+
|
|
8
|
+
Both engines this skill documents are provided by **omowright**.
|
|
9
|
+
|
|
10
|
+
- Upstream: the `omowright` repository on GitHub, pinned by commit in the root `package.json`
|
|
11
|
+
devDependency.
|
|
12
|
+
- License: MIT
|
|
13
|
+
- What ships here: `runtime/omowright/index.js` (the library bundled into one ESM file, including
|
|
14
|
+
its `ws` and `zod` dependencies) and `runtime/omowright/page-bundle.js` (the in-page snapshot
|
|
15
|
+
script it reads at import time), staged at build time by
|
|
16
|
+
`packages/shared-skills/stage-omowright-runtime.mjs` from the pinned root devDependency, with a
|
|
17
|
+
`manifest.json` recording the version and file digests. The repository holds no copy; the
|
|
18
|
+
staged files are gitignored and packed through the sibling `.npmignore`.
|
|
19
|
+
- omowright's own license notice is preserved inside the bundled file.
|
|
5
20
|
|
|
6
21
|
## BrowserSkill — driven, not vendored
|
|
7
22
|
|
|
8
|
-
The attached engine
|
|
23
|
+
The attached engine reaches the user's browser through **BrowserSkill** by Tencent.
|
|
9
24
|
|
|
10
25
|
- Upstream: https://github.com/Tencent/BrowserSkill
|
|
11
26
|
- License: MIT
|
|
12
|
-
- What ships here:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
MIT permits redistribution; we simply have no reason to, because upstream publishes signed
|
|
18
|
-
per-platform releases and store builds that stay current on their own.
|
|
27
|
+
- What ships here: nothing of upstream's. omowright speaks the daemon's IPC protocol; the user
|
|
28
|
+
installs the `bsk` CLI from upstream's own installer (run by `scripts/browser-install.mjs`) and
|
|
29
|
+
the extension from the Chrome Web Store / Edge Add-ons listings (registered by the same script
|
|
30
|
+
through Chrome's external-extension mechanism). This package never bundles a browser binary or
|
|
31
|
+
an extension payload.
|
|
19
32
|
|
|
20
33
|
## Owned-engine references
|
|
21
34
|
|
|
22
|
-
`references/owned-engine/`
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
source is reproduced.
|
|
35
|
+
`references/owned-engine/` summarizes omowright's own skill and presets (escalation ladder,
|
|
36
|
+
network-first reading, frames, dialogs, human handoff) as routing text; the library's repository
|
|
37
|
+
is the authoritative treatment.
|
|
@@ -1,89 +1,102 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browser
|
|
3
|
-
description: "Drives a real browser: sites the user is already signed into, forms and clicks, JS-rendered pages, screenshots, web QA, extension popups,
|
|
3
|
+
description: "Drives a real browser through the omowright library from the js eval kernel: sites the user is already signed into, forms and clicks, JS-rendered pages, screenshots, web QA, extension popups, a human handoff for login, CAPTCHA or OTP, and a browser you own for scraping, bot-scored targets, network capture and QA traces. Use for any interactive browser task; not for a plain search or an unblocked static fetch."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Browser
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
One library, two engines. omowright ships inside this skill; choose the engine before you act:
|
|
9
9
|
|
|
10
|
-
| You need | Engine |
|
|
10
|
+
| You need | Engine | Entry point |
|
|
11
11
|
|---|---|---|
|
|
12
|
-
| A site the user is signed into, a form, a click-through, a screenshot, web QA, an extension popup | **attached** — the user's own browser |
|
|
13
|
-
| A throwaway profile, bot-scoring evasion, a CAPTCHA, network interception, a QA flight trace, coordinate control | **owned** — a browser your code launches | [references/owned-engine/README.md](references/owned-engine/README.md) |
|
|
12
|
+
| A site the user is signed into, their open tabs, a form, a click-through, a screenshot, web QA, an extension popup | **attached** — the user's own browser through BrowserSkill | `connectBrowserSkill()` |
|
|
13
|
+
| A throwaway profile, bot-scoring evasion, a CAPTCHA, network interception, a QA flight trace, coordinate control, headless runs | **owned** — a browser your code launches | `connectPipe()` / `connectCloakProfile()` — [references/owned-engine/README.md](references/owned-engine/README.md) |
|
|
14
14
|
| Text out of a URL, a 403 bypass, a platform that blocks fetchers | neither | the `ultimate-browsing` skill |
|
|
15
15
|
|
|
16
16
|
**Attached is the default,** because it is the only engine carrying the user's logins and the only
|
|
17
|
-
one where a human is a single
|
|
18
|
-
|
|
17
|
+
one where a human is a single call away. Never substitute one engine for the other silently: if
|
|
18
|
+
the attached engine is not set up, run the onboarding script and tell the user its one remaining
|
|
19
|
+
step.
|
|
19
20
|
|
|
20
|
-
## Step 0 — prove the stack
|
|
21
|
+
## Step 0 — load omowright and prove the stack
|
|
21
22
|
|
|
22
|
-
```
|
|
23
|
-
|
|
23
|
+
```js
|
|
24
|
+
const { loadOmowright } = await import("<skill-root>/scripts/omowright.mjs")
|
|
25
|
+
const { omowright } = await loadOmowright() // { connectBrowserSkill, bskSnapshot, connectPipe, ... }
|
|
24
26
|
```
|
|
25
27
|
|
|
26
|
-
|
|
28
|
+
```bash
|
|
29
|
+
node "<skill-root>/scripts/browser-doctor.mjs" --json
|
|
30
|
+
```
|
|
27
31
|
|
|
28
32
|
| State | Meaning | Next |
|
|
29
33
|
|---|---|---|
|
|
30
34
|
| `ready` | CLI, daemon and a connected browser | start a session |
|
|
31
|
-
| `no-
|
|
32
|
-
| `no-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
35
|
+
| `no-cli` / `no-daemon` / `no-extension` | something is missing | `node "<skill-root>/scripts/browser-install.mjs"` prepares everything it can, then prints the **single** step only the user can do (relaunch the browser and click **Enable**); relay it verbatim, wait, re-run the doctor |
|
|
36
|
+
| `no-browser-support` | no Chromium-family profile on this machine | say so and stop |
|
|
37
|
+
|
|
38
|
+
**Never launch a headless browser because the attached one is missing.** It has none of the
|
|
39
|
+
user's sessions, so every login turns into a ladder you should not be climbing. Say which state
|
|
40
|
+
you hit and ask.
|
|
41
|
+
|
|
42
|
+
## The loop (attached)
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
const session = await omowright.connectBrowserSkill({ name: "<task>", focused: false })
|
|
46
|
+
try {
|
|
47
|
+
await session.navigate("https://example.com/", { waitUntil: "load" })
|
|
48
|
+
const { tree, refs, css } = await omowright.bskSnapshot(session, { interactive: true }) // OmOWright tree + refs, no trace in the page
|
|
49
|
+
await session.click({ selector: css.e3 }) // css[ref] is null inside shadow roots:
|
|
50
|
+
const vom = await session.observe({ maxTokens: 4000 }) // then read the daemon's own tree ...
|
|
51
|
+
await session.click("@e7") // ... and click its @eN ref
|
|
52
|
+
await session.fill(css.e5, "hello")
|
|
53
|
+
await session.press("Enter")
|
|
54
|
+
await session.waitForNavigation({ waitUntil: "load" })
|
|
55
|
+
const shot = await session.screenshot() // { buffer, width, height, captureId }
|
|
56
|
+
} finally {
|
|
57
|
+
await session.stop() // success AND failure; returns borrowed tabs
|
|
58
|
+
}
|
|
48
59
|
```
|
|
49
60
|
|
|
50
|
-
1. **
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
2. **Navigation and large DOM changes stale every ref.** Observe again rather than reusing.
|
|
61
|
+
1. **Read before every action.** `bskSnapshot` refs and `observe` `@eN` refs are reissued on each
|
|
62
|
+
call; use a ref in the same cycle you read it.
|
|
63
|
+
2. **Navigation and large DOM changes stale every ref.** Read again rather than reusing.
|
|
54
64
|
3. **Two identical failures mean change approach, not retry.** A third identical attempt is a defect.
|
|
55
|
-
4. **Borrow a user tab explicitly** (`
|
|
65
|
+
4. **Borrow a user tab explicitly** (`tabList({ scope: "user" })`, `tabBorrow(id)`, `tabReturn(id)`).
|
|
56
66
|
Borrowing prompts the user; never invent tab ids and never repeat a denied borrow.
|
|
57
|
-
5. **Always stop the session,** on success and on failure.
|
|
67
|
+
5. **Always `stop()` the session,** on success and on failure.
|
|
58
68
|
|
|
59
|
-
|
|
60
|
-
[references/commands.md](references/commands.md).
|
|
69
|
+
Every method, its options, and the failure codes are in [references/commands.md](references/commands.md).
|
|
61
70
|
|
|
62
71
|
## When a human is the only way through
|
|
63
72
|
|
|
64
73
|
Login, CAPTCHA, OTP, a payment confirmation, a consent dialog:
|
|
65
74
|
|
|
66
|
-
```
|
|
67
|
-
|
|
75
|
+
```js
|
|
76
|
+
const outcome = await session.requestHelp({ prompt: "<what you need done>", targets: ["@e4"], timeoutMs: 300_000 })
|
|
68
77
|
```
|
|
69
78
|
|
|
70
|
-
Then
|
|
71
|
-
the extension's automation settings.
|
|
79
|
+
Then read the page again. Respect a `cancelled` or `timed_out` outcome; do not work around it by
|
|
80
|
+
changing the extension's automation settings.
|
|
72
81
|
|
|
73
82
|
## Rules
|
|
74
83
|
|
|
75
|
-
- **Never read credentials through the page.** No `evaluate` that extracts a password, token,
|
|
76
|
-
or recovery code. The value of
|
|
84
|
+
- **Never read credentials through the page.** No `evaluate` that extracts a password, token,
|
|
85
|
+
cookie or recovery code. The value of the attached engine is that the browser is already signed in.
|
|
77
86
|
- **Never clear cookies, cache or site data.** It is the user's real profile; clearing it logs them
|
|
78
87
|
out everywhere. No flow here needs it.
|
|
79
|
-
-
|
|
88
|
+
- **`focused: false` by default.** The browser belongs to someone who is probably using it.
|
|
80
89
|
- **One short, named session per task,** always stopped.
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
- **Bot-scored or WAF targets go to the owned engine.** The attached engine's daemon enables console
|
|
91
|
+
capture on every tab it drives, which is a known automation signal; CloakBrowser through
|
|
92
|
+
`connectCloakProfile()` is the stealth path.
|
|
93
|
+
|
|
94
|
+
## Where the rest lives
|
|
95
|
+
|
|
96
|
+
| Topic | Read |
|
|
97
|
+
|---|---|
|
|
98
|
+
| Session methods, targets, options, error codes | [references/commands.md](references/commands.md) |
|
|
99
|
+
| Installing: CLI, daemon, extension, the one human step, blocklisted extension | [references/install.md](references/install.md) |
|
|
100
|
+
| Agent on one machine, browser on another | [references/remote.md](references/remote.md) |
|
|
101
|
+
| Owned engine: launch, snapshot ladder, network, frames, human handoff | [references/owned-engine/README.md](references/owned-engine/README.md) |
|
|
102
|
+
| Reading a 1Password vault the user has unlocked | [references/recipes/1password.md](references/recipes/1password.md) |
|
|
@@ -1,90 +1,105 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Session methods
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`connectBrowserSkill()` returns a `BskSession`. Every method is one call on the BrowserSkill
|
|
4
|
+
daemon's tool surface; options are the daemon's parameter names in camelCase.
|
|
4
5
|
|
|
5
6
|
## Sessions
|
|
6
7
|
|
|
7
|
-
```
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
```js
|
|
9
|
+
const session = await omowright.connectBrowserSkill({ name: "<task>", focused: false, browser: "<instance id>", width: 1200, height: 800 })
|
|
10
|
+
session.sessionId // four letters, e.g. "ckhg"
|
|
11
|
+
session.browserInstanceId // which connected browser owns the Agent Window
|
|
12
|
+
await session.stop() // ALWAYS, on success and failure
|
|
11
13
|
```
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
stealing focus; drop it only when the user is watching
|
|
15
|
+
`browser` is needed only when more than one browser is connected (`bskDoctor()` lists them).
|
|
16
|
+
`focused: false` keeps the Agent Window from stealing focus; drop it only when the user is watching
|
|
17
|
+
on purpose. Throws `BskRpcError` `no_browser_connected` when no extension is attached — that is a
|
|
18
|
+
stop, not a cue to launch something else.
|
|
15
19
|
|
|
16
|
-
##
|
|
20
|
+
## Targets
|
|
17
21
|
|
|
18
|
-
|
|
|
22
|
+
| Form | Meaning |
|
|
19
23
|
|---|---|
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `evaluate "<js>" --session <id> --json` | `{ok, value}` — **check `.ok`; exit code 0 does not mean the script succeeded** |
|
|
25
|
-
| `console` / `network` | buffered log lines and responses |
|
|
24
|
+
| `"@e3"` / `"e3"` | a ref from the last `observe()` / `snapshot()` |
|
|
25
|
+
| `"#login > button"` | a CSS selector, resolved live |
|
|
26
|
+
| `{ captureId, x, y }` | a point in a screenshot, from `screenshot()` |
|
|
27
|
+
| `css.e3` from `bskSnapshot` | the light-DOM CSS path of an OmOWright ref (`null` inside shadow roots — use the daemon ref instead) |
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
cycle. A ref captured two calls ago silently addresses a different element — this is how a click
|
|
29
|
-
lands on the neighbouring row.
|
|
29
|
+
## Reading
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
| Call | Returns |
|
|
32
|
+
|---|---|
|
|
33
|
+
| `bskSnapshot(session, { interactive, maxDepth })` | `{ tree, refs, css }` — the OmOWright accessibility tree with refs, computed in the page **without** leaving a global or touching the DOM |
|
|
34
|
+
| `session.observe({ maxTokens, cursor, probeHover })` | the daemon's semantic tree (`@vom`) with `@eN` refs, layers and hover probes — **the default read for shadow DOM and iframes** |
|
|
35
|
+
| `session.snapshot({ maxDepth, maxTokens })` | the daemon's plain accessibility tree |
|
|
36
|
+
| `session.getHtml({ ref, maxBytes })` | exact markup |
|
|
37
|
+
| `session.screenshot({ ref })` / `screenshot({ fullPage: true })` | `{ buffer, width, height, captureId }`; full-page captures stream back in chunks |
|
|
38
|
+
| `session.evaluate(expression, { awaitPromise, timeoutMs })` | `{ ok, value, error }` — **check `.ok`**; a resolved promise does not mean the script succeeded |
|
|
39
|
+
| `session.console({ since })` / `session.network({ since })` | buffered console entries / request metadata (no bodies) |
|
|
40
|
+
|
|
41
|
+
**Refs are reissued by every read.** Read a ref and act on it in the same cycle. A ref captured
|
|
42
|
+
two calls ago silently addresses a different element — this is how a click lands on the
|
|
43
|
+
neighbouring row.
|
|
32
44
|
|
|
33
45
|
## Acting
|
|
34
46
|
|
|
35
|
-
| Need |
|
|
47
|
+
| Need | Call |
|
|
36
48
|
|---|---|
|
|
37
|
-
| Click | `click
|
|
38
|
-
| Fill | `fill
|
|
39
|
-
| Select | `select
|
|
40
|
-
| Key | `press
|
|
41
|
-
| Hover | `hover
|
|
42
|
-
| Scroll into view | `
|
|
43
|
-
| Wheel | `wheel
|
|
44
|
-
| Focus / blur | `focus
|
|
45
|
-
|
|
|
49
|
+
| Click | `session.click(target, { button, clickCount, modifiers })` |
|
|
50
|
+
| Fill | `session.fill(target, value, { clearBefore })` |
|
|
51
|
+
| Select | `session.select(target, ["<option value>"])` |
|
|
52
|
+
| Key | `session.press("Enter", { target, modifiers, holdMs })` |
|
|
53
|
+
| Hover | `session.hover(target, { settleMs })` |
|
|
54
|
+
| Scroll into view | `session.scrollTo(target)` |
|
|
55
|
+
| Wheel | `session.wheel({ deltaY: 600, target })` |
|
|
56
|
+
| Focus / blur | `session.focus(target)` / `session.blur(target)` |
|
|
57
|
+
| Navigate | `session.navigate(url, { waitUntil: "load" \| "domcontentloaded" \| "networkidle" \| "commit", timeoutMs })`, `back()`, `forward()`, `reload({ hard })`, `waitForNavigation()` |
|
|
58
|
+
| Window | `session.resize(width, height)`, `session.emulate({ overrides: { width, mobile } })` |
|
|
46
59
|
|
|
47
60
|
Traps:
|
|
48
61
|
|
|
49
62
|
- `select` takes the option's **value attribute**, not its visible label.
|
|
50
|
-
- `
|
|
51
|
-
|
|
52
|
-
- A menu that a `click` opens can be toggled shut by that same click. `focus` then
|
|
53
|
-
|
|
54
|
-
- Hover-only controls report `element not visible`: hover the trigger,
|
|
55
|
-
revealed item's fresh ref.
|
|
56
|
-
|
|
57
|
-
- The clipboard is unavailable in a window started
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
- `press` without `target` goes to the focused node; `press` with a CSS selector is fine, but a
|
|
64
|
+
daemon ref must come from the current read.
|
|
65
|
+
- A menu that a `click` opens can be toggled shut by that same click. `focus` then `press("Enter")`
|
|
66
|
+
opens it reliably.
|
|
67
|
+
- Hover-only controls report `element not visible`: hover the trigger, read again, then act on the
|
|
68
|
+
revealed item's fresh ref. `observe({ probeHover: true })` finds one when no marker does, at the
|
|
69
|
+
cost of touching the live page.
|
|
70
|
+
- The clipboard is unavailable in a window started `focused: false`, so read values out of the DOM.
|
|
71
|
+
|
|
72
|
+
## Tabs
|
|
73
|
+
|
|
74
|
+
```js
|
|
75
|
+
const { tabs } = await session.tabList({ scope: "user" }) // "user" | "agent" | "all"
|
|
76
|
+
await session.tabBorrow(tabId) // the user confirms in the browser (60 s)
|
|
77
|
+
await session.tabReturn(tabId) // stop() returns anything still borrowed
|
|
78
|
+
await session.tabCreate({ url }); await session.tabSelect(id); await session.tabClose(id)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Never invent tab ids and never repeat a denied borrow.
|
|
82
|
+
|
|
83
|
+
## Humans
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
const { outcome } = await session.requestHelp({ prompt, title, targets: ["@e4"], completionCriteria, timeoutMs })
|
|
87
|
+
// outcome: "completed" | "continued" | "cancelled" | "timed_out" | "navigated" | "disabled"
|
|
66
88
|
```
|
|
67
89
|
|
|
68
|
-
|
|
69
|
-
always return what you borrowed (`session stop` also returns them).
|
|
90
|
+
## Errors
|
|
70
91
|
|
|
71
|
-
|
|
92
|
+
Every refusal is a `BskRpcError` with the daemon's own `code`:
|
|
72
93
|
|
|
73
|
-
|
|
|
94
|
+
| `code` | Meaning | Do |
|
|
74
95
|
|---|---|---|
|
|
75
|
-
| `
|
|
76
|
-
|
|
|
77
|
-
| `
|
|
78
|
-
| `permission_denied
|
|
79
|
-
| `
|
|
80
|
-
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
If the host kills background children after each command, the daemon cannot survive between calls.
|
|
87
|
-
Set `BSK_AUTO_START=0`, share one `BSK_HOME` across every call, and start
|
|
88
|
-
`bsk daemon start --foreground` in the host's persistent background task. Check readiness with
|
|
89
|
-
`bsk status --json` in a separate call before continuing. Do not loop on launches, delete runtime
|
|
90
|
-
files, or restart a daemon another task is using.
|
|
96
|
+
| `no_browser_connected` | no extension attached | run the onboarding script, relay the human step, wait |
|
|
97
|
+
| `not_found` | stale ref or unknown session | read again; if the session is gone, start a new one |
|
|
98
|
+
| `invalid_params` | wrong option shape | fix the call, do not retry as-is |
|
|
99
|
+
| `permission_denied` | `evaluate` on a tab outside the Agent Window, or a denied borrow | stop; the user said no |
|
|
100
|
+
| `timeout` | the tool did not finish in its budget | read the page state before retrying once |
|
|
101
|
+
| `user_aborted` | the user pressed Stop in the browser | stop the task and report |
|
|
102
|
+
| `cdp_failed` | the page cannot be attached (restricted URL, DevTools open) | say which page and why |
|
|
103
|
+
|
|
104
|
+
Long calls can be cancelled: `const h = session.client.callWithHandle("tool.navigate", {...})`
|
|
105
|
+
then `await session.client.cancel(h.rpcId)`.
|