mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-21 02:06:43 +00:00
chore(tooling): enforce formatting and refresh TypeScript checks (#104239)
* chore(tooling): enforce current formatter and refresh checks * chore(tooling): keep release changelog formatter-owned * chore(tooling): retain compatible Node type surface * ci: enforce formatting for docs-only changes * ci: isolate docs formatter check * chore(tooling): apply updated lint and format rules * chore(tooling): satisfy updated switch lint * style(ui): apply Linux formatter layout * test(doctor): match quiet local audio contribution * test(doctor): assert quiet output only * test(doctor): follow restored information contract
This commit is contained in:
@@ -213,22 +213,22 @@ The helper accepts `--model` globally or per engine (`engine=model`) and `--thin
|
||||
|
||||
Recommended model defaults:
|
||||
|
||||
| Engine | Default model | Source note |
|
||||
|--------|---------------|-------------|
|
||||
| **codex** (default) | `gpt-5.5` | OpenAI's current GPT-5.5 alias |
|
||||
| **claude** | `claude-fable-5` | Anthropic's most capable widely released Claude model |
|
||||
| Engine | Default model | Source note |
|
||||
| ------------------- | ---------------- | ----------------------------------------------------- |
|
||||
| **codex** (default) | `gpt-5.5` | OpenAI's current GPT-5.5 alias |
|
||||
| **claude** | `claude-fable-5` | Anthropic's most capable widely released Claude model |
|
||||
|
||||
CLI flags and environment variables override these defaults. Droid, Copilot, Pi, Cursor, and OpenCode do not get built-in model defaults here because their provider catalogs are external to the Codex/Claude closeout path and may vary by installation.
|
||||
|
||||
| Engine | Model flag | Example model IDs | Thinking flag | Accepted levels |
|
||||
|--------|------------|-------------------|---------------|-----------------|
|
||||
| **codex** (default) | `codex --model X exec ...` | `gpt-5.5`, `gpt-5.5-2026-04-23` | `-c model_reasoning_effort=Y` | `none`, `minimal`, `low`, `medium`, `high`, `xhigh` |
|
||||
| **claude** | `claude --model X` | `claude-fable-5`, `claude-opus-4-8`, `claude-sonnet-4-6`, `claude-haiku-4-5` | `--effort Y` | `low`, `medium`, `high`, `xhigh`, `max` |
|
||||
| **droid** | currently refused | Factory model IDs | `-r, --reasoning-effort Y` | `off`, `none`, `low`, `medium`, `high`, `xhigh`, `max` |
|
||||
| **copilot** | `copilot --model X` | `gpt-5.2`, Copilot model aliases | not supported | n/a |
|
||||
| **pi** | `pi --model X` | `anthropic/claude-sonnet-4`, `openai/gpt-4o` | `--thinking Y` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` |
|
||||
| **cursor** | `cursor-agent --model X` | `auto`, Cursor model aliases | not supported | n/a |
|
||||
| **opencode** | `opencode run -m X` | `opencode/north-mini-code-free`, OpenCode provider/model IDs | `--variant Y` | `minimal`, `low`, `medium`, `high`, `max` |
|
||||
| Engine | Model flag | Example model IDs | Thinking flag | Accepted levels |
|
||||
| ------------------- | -------------------------- | ---------------------------------------------------------------------------- | ----------------------------- | ------------------------------------------------------ |
|
||||
| **codex** (default) | `codex --model X exec ...` | `gpt-5.5`, `gpt-5.5-2026-04-23` | `-c model_reasoning_effort=Y` | `none`, `minimal`, `low`, `medium`, `high`, `xhigh` |
|
||||
| **claude** | `claude --model X` | `claude-fable-5`, `claude-opus-4-8`, `claude-sonnet-4-6`, `claude-haiku-4-5` | `--effort Y` | `low`, `medium`, `high`, `xhigh`, `max` |
|
||||
| **droid** | currently refused | Factory model IDs | `-r, --reasoning-effort Y` | `off`, `none`, `low`, `medium`, `high`, `xhigh`, `max` |
|
||||
| **copilot** | `copilot --model X` | `gpt-5.2`, Copilot model aliases | not supported | n/a |
|
||||
| **pi** | `pi --model X` | `anthropic/claude-sonnet-4`, `openai/gpt-4o` | `--thinking Y` | `off`, `minimal`, `low`, `medium`, `high`, `xhigh` |
|
||||
| **cursor** | `cursor-agent --model X` | `auto`, Cursor model aliases | not supported | n/a |
|
||||
| **opencode** | `opencode run -m X` | `opencode/north-mini-code-free`, OpenCode provider/model IDs | `--variant Y` | `minimal`, `low`, `medium`, `high`, `max` |
|
||||
|
||||
Claude also supports `--fallback-model a,b` for availability-based fallback chains ([model-config](https://code.claude.com/docs/en/model-config)). Current Claude docs note that auth, billing, rate-limit, request-size, and transport errors do not trigger fallback, and the changelog documents interactive-session support in `v2.1.166`.
|
||||
|
||||
@@ -272,17 +272,17 @@ Store persistent personal defaults in your shell startup file or launcher
|
||||
environment. For repository-local defaults, use an existing local environment
|
||||
loader such as an untracked `.envrc`; the helper does not write a config file.
|
||||
|
||||
| Variable | Purpose |
|
||||
|----------|---------|
|
||||
| `AUTOREVIEW_MODEL` | Override the built-in default `--model` for all engines |
|
||||
| `AUTOREVIEW_THINKING` | Default `--thinking` for all engines |
|
||||
| `AUTOREVIEW_FALLBACK_MODEL` | Default Claude `--fallback-model` chain |
|
||||
| `AUTOREVIEW_<ENGINE>_MODEL` | Per-engine model override, for example `AUTOREVIEW_CODEX_MODEL=gpt-5.5` |
|
||||
| `AUTOREVIEW_<ENGINE>_THINKING` | Per-engine thinking override |
|
||||
| `AUTOREVIEW_CODEX_CONFIG` | Default Codex `-c key=value` overrides, semicolon-separated, e.g. `service_tier="fast"`; isolation flags still win |
|
||||
| `AUTOREVIEW_CODEX_SPEED` | Default Codex service tier: `fast` (priority), `flex`, or `default`; silently standard when the model does not list the tier |
|
||||
| `AUTOREVIEW_CLAUDE_FALLBACK_MODEL` | Claude-only fallback chain |
|
||||
| `AUTOREVIEW_CURSOR_ALLOW_WORKSPACE_INSTRUCTIONS` | Required `1`/true opt-in for Cursor reviews of trusted repositories |
|
||||
| Variable | Purpose |
|
||||
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `AUTOREVIEW_MODEL` | Override the built-in default `--model` for all engines |
|
||||
| `AUTOREVIEW_THINKING` | Default `--thinking` for all engines |
|
||||
| `AUTOREVIEW_FALLBACK_MODEL` | Default Claude `--fallback-model` chain |
|
||||
| `AUTOREVIEW_<ENGINE>_MODEL` | Per-engine model override, for example `AUTOREVIEW_CODEX_MODEL=gpt-5.5` |
|
||||
| `AUTOREVIEW_<ENGINE>_THINKING` | Per-engine thinking override |
|
||||
| `AUTOREVIEW_CODEX_CONFIG` | Default Codex `-c key=value` overrides, semicolon-separated, e.g. `service_tier="fast"`; isolation flags still win |
|
||||
| `AUTOREVIEW_CODEX_SPEED` | Default Codex service tier: `fast` (priority), `flex`, or `default`; silently standard when the model does not list the tier |
|
||||
| `AUTOREVIEW_CLAUDE_FALLBACK_MODEL` | Claude-only fallback chain |
|
||||
| `AUTOREVIEW_CURSOR_ALLOW_WORKSPACE_INSTRUCTIONS` | Required `1`/true opt-in for Cursor reviews of trusted repositories |
|
||||
|
||||
Codex maps thinking to `model_reasoning_effort`. Claude maps thinking to `--effort`. Droid maps thinking to `-r, --reasoning-effort`. Pi maps thinking to `--thinking`. OpenCode maps thinking to `--variant`. Copilot and Cursor reject `--thinking`. Only Claude accepts `--fallback-model`; global CLI/env fallback requires at least one Claude reviewer, and engine-specific fallback overrides require that reviewer to be selected. Non-Claude fallback overrides, including `AUTOREVIEW_<NONCLAUDE>_FALLBACK_MODEL`, fail closed instead of being silently ignored.
|
||||
|
||||
@@ -290,14 +290,14 @@ Codex maps thinking to `model_reasoning_effort`. Claude maps thinking to `--effo
|
||||
|
||||
When autoreview runs inside the repository under review, external reviewer CLIs must not load project-local trust or configuration that the branch controls.
|
||||
|
||||
| Engine | Isolation flags | Reference |
|
||||
|--------|-----------------|-----------|
|
||||
| **codex** | Auth-only config overrides, `-c project_doc_max_bytes=0`, repo `trust_level="untrusted"`, `exec --ignore-user-config --ignore-rules`, plus read-only sandbox | Codex CLI `exec --help` |
|
||||
| **claude** | `--safe-mode --setting-sources user --strict-mcp-config --disallowedTools mcp__*` plus explicit `--allowedTools` (`--safe-mode` requires Claude Code `v2.1.169+`) | Claude Code [CLI reference](https://code.claude.com/docs/en/cli-reference) |
|
||||
| **droid** | Fails closed: current CLI cannot disable both project instructions and all tools | Droid CLI `exec --help` and `--list-tools` |
|
||||
| **pi** | `--no-approve --no-session --no-context-files --no-extensions --no-skills --no-prompt-templates --no-themes --no-tools` | Pi CLI `--help`; requires Pi `v0.79.0+` |
|
||||
| **opencode** | `opencode run --dir <repo> --pure --format json`, prompt over stdin, neutral subprocess cwd, injected deny-by-default permissions, project config disabled | OpenCode CLI `--help` |
|
||||
| **cursor** | `cursor-agent --print --mode ask --sandbox enabled --output-format json|stream-json`, prompt over stdin, temporary read-only permission config, help-probed flags, and mandatory explicit trusted-workspace opt-in | Cursor CLI [headless mode](https://cursor.com/docs/cli/headless), [output format](https://cursor.com/docs/cli/reference/output-format), [permissions](https://cursor.com/docs/cli/reference/permissions), [configuration](https://cursor.com/docs/cli/reference/configuration) |
|
||||
| Engine | Isolation flags | Reference |
|
||||
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **codex** | Auth-only config overrides, `-c project_doc_max_bytes=0`, repo `trust_level="untrusted"`, `exec --ignore-user-config --ignore-rules`, plus read-only sandbox | Codex CLI `exec --help` |
|
||||
| **claude** | `--safe-mode --setting-sources user --strict-mcp-config --disallowedTools mcp__*` plus explicit `--allowedTools` (`--safe-mode` requires Claude Code `v2.1.169+`) | Claude Code [CLI reference](https://code.claude.com/docs/en/cli-reference) |
|
||||
| **droid** | Fails closed: current CLI cannot disable both project instructions and all tools | Droid CLI `exec --help` and `--list-tools` |
|
||||
| **pi** | `--no-approve --no-session --no-context-files --no-extensions --no-skills --no-prompt-templates --no-themes --no-tools` | Pi CLI `--help`; requires Pi `v0.79.0+` |
|
||||
| **opencode** | `opencode run --dir <repo> --pure --format json`, prompt over stdin, neutral subprocess cwd, injected deny-by-default permissions, project config disabled | OpenCode CLI `--help` |
|
||||
| **cursor** | `cursor-agent --print --mode ask --sandbox enabled --output-format json\|stream-json`, prompt over stdin, temporary read-only permission config, help-probed flags, and mandatory explicit trusted-workspace opt-in | Cursor CLI [headless mode](https://cursor.com/docs/cli/headless), [output format](https://cursor.com/docs/cli/reference/output-format), [permissions](https://cursor.com/docs/cli/reference/permissions), [configuration](https://cursor.com/docs/cli/reference/configuration) |
|
||||
|
||||
Codex `--ignore-user-config` skips config loading for the exec run. Autoreview reconstructs only the documented `cli_auth_credentials_store`, `forced_login_method`, and `forced_chatgpt_workspace_id` settings from `CODEX_HOME/config.toml`, keeping authentication and workspace restrictions usable without forwarding unrelated user configuration. The explicit repo trust override and zero project-doc budget keep reviewed-repo `AGENTS.md` and `.codex/` trust surfaces out of the review prompt. `--ignore-rules` skips user/project execpolicy rules. Claude `--safe-mode` disables project hooks, skills, plugins, MCP servers, and CLAUDE.md while preserving normal authentication, model selection, built-in tools, and permissions; managed settings policy can still apply. `--setting-sources user` avoids project/local settings from the reviewed checkout, and current Claude Code docs note the project-skill blocking behavior was fixed in `v2.1.69`. `--strict-mcp-config` and `--disallowedTools mcp__*` keep MCP unavailable to the review run. `--bare` is not used here because Claude's headless docs say it skips OAuth and keychain reads. Droid fails closed because its CLI cannot disable reviewed-repository `AGENTS.md` loading and all tools in the same run. Pi `--no-approve` ignores project-local files for one run; the helper requires Pi `v0.79.0+` plus help output that advertises every required isolation flag because older legacy binaries can ignore unknown flags. The current package is `@earendil-works/pi-coding-agent`; deprecated `@mariozechner/pi-coding-agent` `0.73.x` is intentionally rejected. Pi version/help probes and the review command run from neutral temporary directories, not the reviewed repo. Pi `--no-context-files` removes `AGENTS.md`/`CLAUDE.md`, the resource-disable flags keep `.pi` extensions, skills, prompts, and themes out of the run, `--no-session` avoids writing review sessions, and `--no-tools` prevents built-in read tools from escaping the repository through absolute paths. OpenCode starts from a neutral temporary directory, points at the reviewed repo with `--dir`, disables project config through `OPENCODE_DISABLE_PROJECT_CONFIG=1`, and injects `OPENCODE_CONFIG_CONTENT`; permissions default to deny, allow read/grep/glob, preserve OpenCode's `.env` ask rules, and gate `websearch`/`webfetch` with `--no-web-search`. The injected config also clears command/instruction/plugin arrays and disables write/edit/bash/task/skill/todowrite tools without changing user auth storage. Cursor's documented headless path is print mode with JSON output and workspace-relative project-resource discovery. Because the CLI exposes no per-run flag that disables every current and future project instruction surface, autoreview requires `--cursor-allow-workspace-instructions` (or its environment equivalent) for every Cursor run. Project-local Cursor/Claude hook settings, project MCP config, and global Cursor MCP config remain hard refusals because hooks execute host commands and MCP tools cannot be constrained to read-only review access. Cursor capability probes run from neutral temporary directories with the sanitized engine environment. Review runs set documented `CURSOR_CONFIG_DIR` to an ephemeral configuration that allows workspace reads while denying shell commands and relative or absolute writes. The helper sends review prompts to OpenCode and Cursor over stdin rather than argv and extracts final structured JSON from terminal result/text events. OpenCode and Cursor reject `--no-tools`; Cursor also rejects `--no-web-search` because the CLI does not expose a documented per-run web-search disable flag.
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ Triage reviews, proves, and patches local fixes first; publishing waits for Pete
|
||||
|
||||
Peter always wants to review code before commits.
|
||||
Default flow:
|
||||
|
||||
1. Review each issue deeply enough to prove current behavior and root cause.
|
||||
2. Fix only easy, high-confidence bugs with narrow ownership and focused proof.
|
||||
3. Stop with the dirty diff summary, touched files, and test/gate output for Peter's manual review.
|
||||
|
||||
@@ -150,7 +150,7 @@ commands.
|
||||
tools to require an IMDSv2 token, prove the IAM credentials endpoint returns
|
||||
404, and compare remote `git rev-parse HEAD` with the full reviewed head SHA.
|
||||
Unset all `CRABBOX_TAILSCALE*` overrides, pass `--network public
|
||||
--tailscale=false`, clear exit-node/LAN flags, then require `crabbox inspect`
|
||||
--tailscale=false`, clear exit-node/LAN flags, then require `crabbox inspect`
|
||||
to report `network=public` and no Tailscale state before uploading any script.
|
||||
Upload trusted `scripts/crabbox-untrusted-bootstrap.sh` with `--fresh-pr`; it
|
||||
bootstraps Node 24 and repository-pinned pnpm before executing PR code and
|
||||
|
||||
@@ -1335,6 +1335,7 @@ jobs:
|
||||
;;
|
||||
lint)
|
||||
pnpm lint --threads=8
|
||||
pnpm format:check
|
||||
;;
|
||||
dependencies)
|
||||
if pnpm run --silent 2>/dev/null | grep -q '^ deadcode:dependencies$'; then
|
||||
@@ -1550,6 +1551,9 @@ jobs:
|
||||
with:
|
||||
install-bun: "false"
|
||||
|
||||
- name: Check formatting
|
||||
run: pnpm format:check
|
||||
|
||||
- name: Checkout ClawHub docs source
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
@@ -552,7 +552,14 @@ jobs:
|
||||
|
||||
# Create multi-platform manifests
|
||||
create-manifest:
|
||||
needs: [approve_manual_backfill, validate_publish_config, resolve_build_provenance, build-amd64, build-arm64]
|
||||
needs:
|
||||
[
|
||||
approve_manual_backfill,
|
||||
validate_publish_config,
|
||||
resolve_build_provenance,
|
||||
build-amd64,
|
||||
build-arm64,
|
||||
]
|
||||
if: ${{ always() && needs.validate_publish_config.result == 'success' && needs.build-amd64.result == 'success' && needs.build-arm64.result == 'success' && (github.event_name != 'workflow_dispatch' || needs.approve_manual_backfill.result == 'success') }}
|
||||
# WARNING: DO NOT REVERT THIS TO A BLACKSMITH RUNNER WITHOUT RE-VALIDATING TAG BACKFILLS.
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
"useTabs": false,
|
||||
"ignorePatterns": [
|
||||
"apps/",
|
||||
"CHANGELOG.md",
|
||||
"CLAUDE.md",
|
||||
"docker-compose.yml",
|
||||
"dist/",
|
||||
|
||||
@@ -181,9 +181,7 @@ messages.
|
||||
},
|
||||
flexMessage: {
|
||||
altText: "Status card",
|
||||
contents: {
|
||||
/* Flex payload */
|
||||
},
|
||||
contents: {/* Flex payload */},
|
||||
},
|
||||
templateMessage: {
|
||||
type: "confirm",
|
||||
|
||||
@@ -196,16 +196,10 @@ change:
|
||||
"aliases": { "<table>": { "<value>": "<label>" } },
|
||||
"output": {
|
||||
"sep": "", // joins surviving pieces
|
||||
"default": [
|
||||
/* pieces */
|
||||
], // fallback for any surface
|
||||
"default": [/* pieces */], // fallback for any surface
|
||||
"surfaces": {
|
||||
"discord": [
|
||||
/* pieces */
|
||||
],
|
||||
"telegram": [
|
||||
/* pieces */
|
||||
],
|
||||
"discord": [/* pieces */],
|
||||
"telegram": [/* pieces */],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -40,20 +40,14 @@ Vendor plugins register capability metadata (which provider supports which media
|
||||
tools: {
|
||||
media: {
|
||||
concurrency: 2, // max concurrent capability runs (default)
|
||||
models: [
|
||||
/* shared list, gate with capabilities */
|
||||
],
|
||||
image: {
|
||||
/* optional overrides */
|
||||
},
|
||||
models: [/* shared list, gate with capabilities */],
|
||||
image: {/* optional overrides */},
|
||||
audio: {
|
||||
/* optional overrides */
|
||||
echoTranscript: true,
|
||||
echoFormat: '📝 "{transcript}"',
|
||||
},
|
||||
video: {
|
||||
/* optional overrides */
|
||||
},
|
||||
video: {/* optional overrides */},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -69,8 +69,7 @@ type MessagePresentationBlock =
|
||||
};
|
||||
|
||||
type MessagePresentationAction =
|
||||
| { type: "command"; command: string }
|
||||
| { type: "callback"; value: string };
|
||||
{ type: "command"; command: string } | { type: "callback"; value: string };
|
||||
|
||||
type MessagePresentationButton = {
|
||||
label: string;
|
||||
|
||||
@@ -114,12 +114,8 @@ export default definePluginEntry({
|
||||
name: "My Plugin",
|
||||
description: "Short summary",
|
||||
register(api) {
|
||||
api.registerProvider({
|
||||
/* ... */
|
||||
});
|
||||
api.registerTool({
|
||||
/* ... */
|
||||
});
|
||||
api.registerProvider({/* ... */});
|
||||
api.registerTool({/* ... */});
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
@@ -129,9 +129,7 @@ describe("stripInferenceProfilePrefix", () => {
|
||||
});
|
||||
|
||||
it("strips apac prefix", () => {
|
||||
expect(testing.stripInferenceProfilePrefix("apac.cohere.embed-v4:0")).toBe(
|
||||
"cohere.embed-v4:0",
|
||||
);
|
||||
expect(testing.stripInferenceProfilePrefix("apac.cohere.embed-v4:0")).toBe("cohere.embed-v4:0");
|
||||
});
|
||||
|
||||
it("strips au prefix", () => {
|
||||
|
||||
@@ -24,10 +24,20 @@
|
||||
border-radius: 50%;
|
||||
background: #6b7280;
|
||||
}
|
||||
.dot.on { background: #34c759; }
|
||||
.dot.connecting { background: #f59e0b; }
|
||||
.dot.error { background: #ff3b30; }
|
||||
p { font-size: 12px; color: #98989f; margin: 6px 0; }
|
||||
.dot.on {
|
||||
background: #34c759;
|
||||
}
|
||||
.dot.connecting {
|
||||
background: #f59e0b;
|
||||
}
|
||||
.dot.error {
|
||||
background: #ff3b30;
|
||||
}
|
||||
p {
|
||||
font-size: 12px;
|
||||
color: #98989f;
|
||||
margin: 6px 0;
|
||||
}
|
||||
textarea {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
@@ -55,16 +65,20 @@
|
||||
background: #3a3a3c;
|
||||
color: #f2f2f7;
|
||||
}
|
||||
.hidden { display: none; }
|
||||
#error { color: #ff453a; }
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
#error {
|
||||
color: #ff453a;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1><span id="statusDot" class="dot"></span>OpenClaw</h1>
|
||||
<div id="pairSection">
|
||||
<p>
|
||||
Run <code>openclaw browser extension pair</code> on this machine and
|
||||
paste the pairing string:
|
||||
Run <code>openclaw browser extension pair</code> on this machine and paste the pairing
|
||||
string:
|
||||
</p>
|
||||
<textarea id="pairingString" placeholder="ws://127.0.0.1:18797/extension#…"></textarea>
|
||||
<p id="error" class="hidden"></p>
|
||||
|
||||
@@ -215,7 +215,7 @@ export class ExtensionRelayBridge {
|
||||
this.emitDetachedFromTarget(msg.tabId, tab.attached.sessionId, tab.attached.targetId);
|
||||
tab.attached = undefined;
|
||||
}
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case "pong":
|
||||
case "hello":
|
||||
|
||||
@@ -67,8 +67,10 @@ function findExecutableOnPath(command, envPath, platform, env, cwd) {
|
||||
}
|
||||
const extensions =
|
||||
platform === "win32"
|
||||
? (env[Object.keys(env).find((key) => key.toLowerCase() === "pathext") ?? "PATHEXT"] ??
|
||||
".COM;.EXE;.BAT;.CMD")
|
||||
? (
|
||||
env[Object.keys(env).find((key) => key.toLowerCase() === "pathext") ?? "PATHEXT"] ??
|
||||
".COM;.EXE;.BAT;.CMD"
|
||||
)
|
||||
.split(";")
|
||||
.filter(Boolean)
|
||||
.map((extension) => extension.toLowerCase())
|
||||
@@ -84,7 +86,7 @@ function findExecutableOnPath(command, envPath, platform, env, cwd) {
|
||||
: pathImpl.resolve(cwd, directory);
|
||||
for (const extension of extensions) {
|
||||
const candidate = pathImpl.join(resolvedDirectory, `${command}${extension}`);
|
||||
if ((platform === "win32" ? isFile(candidate) : isExecutableFile(candidate))) {
|
||||
if (platform === "win32" ? isFile(candidate) : isExecutableFile(candidate)) {
|
||||
return candidate;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,10 +7,7 @@ import {
|
||||
emitTrustedDiagnosticEventWithPrivateData,
|
||||
type DiagnosticModelCallContent,
|
||||
} from "openclaw/plugin-sdk/diagnostic-runtime";
|
||||
import type {
|
||||
CodexAppServerRuntimeOptions,
|
||||
resolveCodexPluginsPolicy,
|
||||
} from "./config.js";
|
||||
import type { CodexAppServerRuntimeOptions, resolveCodexPluginsPolicy } from "./config.js";
|
||||
|
||||
type TrustedDiagnosticEventInput = Parameters<typeof emitTrustedDiagnosticEventWithPrivateData>[0];
|
||||
|
||||
|
||||
@@ -793,9 +793,7 @@ describe("Codex plugin thread config", () => {
|
||||
apps: {
|
||||
"chatgpt-meetings": {
|
||||
tools:
|
||||
configReadCount === 1
|
||||
? { import_meeting: { approval_mode: "approve" } }
|
||||
: {},
|
||||
configReadCount === 1 ? { import_meeting: { approval_mode: "approve" } } : {},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -52,9 +52,7 @@ export type AccountAppPolicyContextEntry = {
|
||||
};
|
||||
|
||||
/** Policy context for any app exposed to a native Codex thread. */
|
||||
export type CodexAppPolicyContextEntry =
|
||||
| PluginAppPolicyContextEntry
|
||||
| AccountAppPolicyContextEntry;
|
||||
export type CodexAppPolicyContextEntry = PluginAppPolicyContextEntry | AccountAppPolicyContextEntry;
|
||||
|
||||
/** Stable app-to-plugin ownership context persisted with Codex thread bindings. */
|
||||
export type PluginAppPolicyContext = {
|
||||
@@ -136,17 +134,18 @@ export async function buildCodexPluginThreadConfig(
|
||||
});
|
||||
}
|
||||
|
||||
let inventory = policy.pluginPolicies.length > 0
|
||||
? await readCodexPluginInventory({
|
||||
pluginConfig: params.pluginConfig,
|
||||
policy,
|
||||
request: params.request,
|
||||
appCache,
|
||||
appCacheKey: params.appCacheKey,
|
||||
nowMs: params.nowMs,
|
||||
suppressAppInventoryRefresh: true,
|
||||
})
|
||||
: emptyCodexPluginInventory(policy);
|
||||
let inventory =
|
||||
policy.pluginPolicies.length > 0
|
||||
? await readCodexPluginInventory({
|
||||
pluginConfig: params.pluginConfig,
|
||||
policy,
|
||||
request: params.request,
|
||||
appCache,
|
||||
appCacheKey: params.appCacheKey,
|
||||
nowMs: params.nowMs,
|
||||
suppressAppInventoryRefresh: true,
|
||||
})
|
||||
: emptyCodexPluginInventory(policy);
|
||||
const appInventoryRefreshDeferredForActivation =
|
||||
inventory.records.some((record) => record.activationRequired) &&
|
||||
shouldRefreshMissingAppInventory(params, policy, inventory);
|
||||
@@ -243,9 +242,7 @@ export async function buildCodexPluginThreadConfig(
|
||||
}
|
||||
|
||||
const accountAppsResult: Awaited<ReturnType<typeof readAccessibleAccountApps>> =
|
||||
policy.allowAllPlugins
|
||||
? await readAccessibleAccountApps(params, appCache)
|
||||
: { apps: [] };
|
||||
policy.allowAllPlugins ? await readAccessibleAccountApps(params, appCache) : { apps: [] };
|
||||
|
||||
const diagnostics: CodexPluginThreadConfigDiagnostic[] = [
|
||||
...inventory.diagnostics,
|
||||
@@ -649,9 +646,9 @@ async function readAccessibleAccountApps(
|
||||
};
|
||||
}
|
||||
return {
|
||||
apps: snapshot.apps.filter((app) => app.isAccessible).toSorted((left, right) =>
|
||||
left.id.localeCompare(right.id),
|
||||
),
|
||||
apps: snapshot.apps
|
||||
.filter((app) => app.isAccessible)
|
||||
.toSorted((left, right) => left.id.localeCompare(right.id)),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@ import type { ChildProcessWithoutNullStreams } from "node:child_process";
|
||||
import { EventEmitter } from "node:events";
|
||||
import { PassThrough } from "node:stream";
|
||||
import type { SandboxContext } from "openclaw/plugin-sdk/sandbox";
|
||||
import type { WebSocket } from "ws";
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import type { WebSocket } from "ws";
|
||||
|
||||
const spawnMock = vi.hoisted(() => vi.fn());
|
||||
vi.mock("node:child_process", async (importOriginal) => {
|
||||
@@ -116,9 +116,10 @@ describe("Codex sandbox exec-server lifecycle", () => {
|
||||
timedOut: false,
|
||||
token: "process-token",
|
||||
});
|
||||
expect(
|
||||
socket.send.mock.calls.map(([payload]) => JSON.parse(String(payload)).method),
|
||||
).toEqual(["process/exited", "process/closed"]);
|
||||
expect(socket.send.mock.calls.map(([payload]) => JSON.parse(String(payload)).method)).toEqual([
|
||||
"process/exited",
|
||||
"process/closed",
|
||||
]);
|
||||
});
|
||||
|
||||
it.each([
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
// Copilot tests cover permission bridge plugin behavior.
|
||||
import type {
|
||||
PermissionRequest as SdkPermissionRequest,
|
||||
} from "@github/copilot-sdk";
|
||||
import type { PermissionRequest as SdkPermissionRequest } from "@github/copilot-sdk";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import {
|
||||
createPermissionBridge,
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
// Copilot tests cover usage bridge plugin behavior.
|
||||
import type { NormalizedUsage } from "openclaw/plugin-sdk/agent-harness-runtime";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
buildCopilotAssistantUsage,
|
||||
normalizeCopilotUsage,
|
||||
} from "./usage-bridge.js";
|
||||
import { buildCopilotAssistantUsage, normalizeCopilotUsage } from "./usage-bridge.js";
|
||||
|
||||
const ZERO_SNAPSHOT: NormalizedUsage = {
|
||||
cacheRead: undefined,
|
||||
@@ -249,5 +246,4 @@ describe("usage-bridge", () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -17,14 +17,17 @@ export function applyDeepInfraConfig(
|
||||
alias: models[modelRef]?.alias ?? "DeepInfra",
|
||||
};
|
||||
|
||||
return applyAgentDefaultModelPrimary({
|
||||
...cfg,
|
||||
agents: {
|
||||
...cfg.agents,
|
||||
defaults: {
|
||||
...cfg.agents?.defaults,
|
||||
models,
|
||||
return applyAgentDefaultModelPrimary(
|
||||
{
|
||||
...cfg,
|
||||
agents: {
|
||||
...cfg.agents,
|
||||
defaults: {
|
||||
...cfg.agents?.defaults,
|
||||
models,
|
||||
},
|
||||
},
|
||||
},
|
||||
}, modelRef);
|
||||
modelRef,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3992,10 +3992,10 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
|
||||
return;
|
||||
case "session.state":
|
||||
recordSessionState(evt);
|
||||
return;
|
||||
break;
|
||||
case "session.long_running":
|
||||
case "session.stalled":
|
||||
return;
|
||||
break;
|
||||
case "session.turn.created":
|
||||
recordSessionTurnCreated(evt);
|
||||
return;
|
||||
@@ -4010,9 +4010,9 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
|
||||
return;
|
||||
case "run.attempt":
|
||||
recordRunAttempt(evt);
|
||||
return;
|
||||
break;
|
||||
case "run.progress":
|
||||
return;
|
||||
break;
|
||||
case "diagnostic.heartbeat":
|
||||
recordHeartbeat(evt);
|
||||
return;
|
||||
@@ -4066,9 +4066,9 @@ export function createDiagnosticsOtelService(): OpenClawPluginService {
|
||||
return;
|
||||
case "exec.process.completed":
|
||||
recordExecProcessCompleted(evt);
|
||||
return;
|
||||
break;
|
||||
case "exec.approval.followup_suppressed":
|
||||
return;
|
||||
break;
|
||||
case "log.record":
|
||||
recordLogRecord?.(evt, metadata);
|
||||
return;
|
||||
|
||||
@@ -967,9 +967,9 @@ function recordDiagnosticEvent(
|
||||
{},
|
||||
numericValue(evt.queueLength),
|
||||
);
|
||||
return;
|
||||
break;
|
||||
case "diagnostic.heartbeat":
|
||||
return;
|
||||
break;
|
||||
case "telemetry.exporter":
|
||||
store.counter("openclaw_telemetry_exporter_total", "Telemetry exporter lifecycle events.", {
|
||||
exporter: lowCardinalityLabel(evt.exporter),
|
||||
|
||||
@@ -322,9 +322,7 @@ describe("fetchDiscord", () => {
|
||||
});
|
||||
|
||||
it("throws DiscordApiError on malformed JSON success response body", async () => {
|
||||
const fetcher = withFetchPreconnect(
|
||||
async () => new Response("NOT JSON {{{", { status: 200 }),
|
||||
);
|
||||
const fetcher = withFetchPreconnect(async () => new Response("NOT JSON {{{", { status: 200 }));
|
||||
|
||||
let error: unknown;
|
||||
try {
|
||||
|
||||
@@ -206,10 +206,7 @@ export async function requestDiscord<T>(
|
||||
try {
|
||||
return JSON.parse(text) as T;
|
||||
} catch {
|
||||
throw new DiscordApiError(
|
||||
`Discord API ${path} returned malformed JSON`,
|
||||
0,
|
||||
);
|
||||
throw new DiscordApiError(`Discord API ${path} returned malformed JSON`, 0);
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -102,7 +102,7 @@ function findWhitespaceBreak(window: string) {
|
||||
}
|
||||
|
||||
function findCjkPunctuationBreak(window: string) {
|
||||
for (let end = window.length; end > 0; ) {
|
||||
for (let end = window.length; end > 0;) {
|
||||
const code = window.charCodeAt(end - 1);
|
||||
const start = isLowSurrogate(code) && end > 1 ? end - 2 : end - 1;
|
||||
const char = window.slice(start, end);
|
||||
|
||||
@@ -27,9 +27,11 @@ const mockMessage = {
|
||||
} as unknown as Parameters<MaybeCreateDiscordAutoThreadFn>[0]["message"];
|
||||
|
||||
function createMockMessage(overrides: Record<string, unknown>) {
|
||||
return Object.assign({}, mockMessage, overrides) as Parameters<
|
||||
MaybeCreateDiscordAutoThreadFn
|
||||
>[0]["message"];
|
||||
return Object.assign(
|
||||
{},
|
||||
mockMessage,
|
||||
overrides,
|
||||
) as Parameters<MaybeCreateDiscordAutoThreadFn>[0]["message"];
|
||||
}
|
||||
|
||||
function createBaseParams(
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
// Discord plugin module implements pluralkit behavior.
|
||||
import { resolveFetch } from "openclaw/plugin-sdk/fetch-runtime";
|
||||
import { readProviderJsonResponse, readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
|
||||
import {
|
||||
readProviderJsonResponse,
|
||||
readResponseTextLimited,
|
||||
} from "openclaw/plugin-sdk/provider-http";
|
||||
|
||||
const PLURALKIT_API_BASE = "https://api.pluralkit.me/v2";
|
||||
const PLURALKIT_ERROR_BODY_LIMIT_BYTES = 8 * 1024;
|
||||
|
||||
@@ -162,9 +162,7 @@ describe("exa web search provider", () => {
|
||||
};
|
||||
const defaultKey = testing.buildExaCacheKey(base);
|
||||
|
||||
expect(
|
||||
testing.buildExaCacheKey({ ...base, contents: { highlights: true } }),
|
||||
).toBe(defaultKey);
|
||||
expect(testing.buildExaCacheKey({ ...base, contents: { highlights: true } })).toBe(defaultKey);
|
||||
|
||||
const disabledKeys = [
|
||||
testing.buildExaCacheKey({ ...base, contents: { highlights: false } }),
|
||||
|
||||
@@ -101,10 +101,7 @@ export function waitForAbortableDelay(
|
||||
return;
|
||||
}
|
||||
|
||||
timer = setTimeout(
|
||||
() => finish(true),
|
||||
resolveTimerTimeoutMs(delayMs, 1),
|
||||
);
|
||||
timer = setTimeout(() => finish(true), resolveTimerTimeoutMs(delayMs, 1));
|
||||
timer.unref?.();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -516,9 +516,7 @@ describe("Feishu Card Action Handler", () => {
|
||||
createFeishuClientMock.mockReturnValueOnce({
|
||||
im: {
|
||||
chat: {
|
||||
get: vi
|
||||
.fn()
|
||||
.mockResolvedValue({ code: 99, msg: `${"x".repeat(499)}😀tail` }),
|
||||
get: vi.fn().mockResolvedValue({ code: 99, msg: `${"x".repeat(499)}😀tail` }),
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@@ -13,7 +13,9 @@ import {
|
||||
import { CREATE_MEET_FROM_BROWSER_SCRIPT } from "./src/transports/chrome-create.js";
|
||||
|
||||
const voiceCallMocks = vi.hoisted(() => ({
|
||||
createVoiceCallGateway: vi.fn(({ runtime }: { runtime: { gateway: unknown } }) => runtime.gateway),
|
||||
createVoiceCallGateway: vi.fn(
|
||||
({ runtime }: { runtime: { gateway: unknown } }) => runtime.gateway,
|
||||
),
|
||||
joinMeetViaVoiceCallGateway: vi.fn(async () => ({
|
||||
callId: "call-1",
|
||||
dtmfSent: true,
|
||||
|
||||
@@ -552,7 +552,7 @@ export class GoogleMeetRuntime {
|
||||
: prefixDtmfWait(rawDtmfSequence, this.params.config.voiceCall.dtmfDelayMs);
|
||||
const hasExplicitDelegatedAgent = Boolean(
|
||||
normalizeOptionalString(request.agentId) ||
|
||||
normalizeOptionalString(this.params.config.realtime.agentId),
|
||||
normalizeOptionalString(this.params.config.realtime.agentId),
|
||||
);
|
||||
const delegatedAgentId = hasExplicitDelegatedAgent ? agentId : undefined;
|
||||
const voiceCallResult = this.params.config.voiceCall.enabled
|
||||
@@ -766,8 +766,7 @@ export class GoogleMeetRuntime {
|
||||
mode,
|
||||
message: request.message ?? "Say exactly: Google Meet speech test complete.",
|
||||
});
|
||||
const startOutputBytes =
|
||||
existingSession?.id === result.session.id ? existingOutputBytes : 0;
|
||||
const startOutputBytes = existingSession?.id === result.session.id ? existingOutputBytes : 0;
|
||||
let health = result.session.chrome?.health;
|
||||
const shouldWaitForOutput =
|
||||
result.spoken === true &&
|
||||
|
||||
@@ -10,11 +10,7 @@ import {
|
||||
KILOCODE_DEFAULT_COST,
|
||||
KILOCODE_DEFAULT_MODEL_ID,
|
||||
} from "./api.js";
|
||||
import {
|
||||
applyKilocodeConfig,
|
||||
KILOCODE_BASE_URL,
|
||||
KILOCODE_DEFAULT_MODEL_REF,
|
||||
} from "./onboard.js";
|
||||
import { applyKilocodeConfig, KILOCODE_BASE_URL, KILOCODE_DEFAULT_MODEL_REF } from "./onboard.js";
|
||||
|
||||
const emptyCfg: OpenClawConfig = {};
|
||||
const KILOCODE_MODEL_IDS = ["kilo/auto"];
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
// Kimi Coding tests cover onboard plugin behavior.
|
||||
import { resolveAgentModelPrimaryValue } from "openclaw/plugin-sdk/provider-onboard";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
applyKimiCodeConfig,
|
||||
KIMI_CODING_MODEL_REF,
|
||||
KIMI_MODEL_REF,
|
||||
} from "./onboard.js";
|
||||
import { applyKimiCodeConfig, KIMI_CODING_MODEL_REF, KIMI_MODEL_REF } from "./onboard.js";
|
||||
|
||||
describe("kimi coding onboard", () => {
|
||||
it("keeps the historical Kimi model ref alias pointed at the coding default", () => {
|
||||
|
||||
@@ -14,10 +14,7 @@ afterAll(() => {
|
||||
vi.resetModules();
|
||||
});
|
||||
|
||||
import {
|
||||
resolveLineOutboundMedia,
|
||||
validateLineMediaUrl,
|
||||
} from "./outbound-media.js";
|
||||
import { resolveLineOutboundMedia, validateLineMediaUrl } from "./outbound-media.js";
|
||||
|
||||
describe("validateLineMediaUrl", () => {
|
||||
beforeEach(() => {
|
||||
|
||||
@@ -44,7 +44,7 @@ export function getMatrixScopedEnvVarNames(accountId: string): {
|
||||
|
||||
function decodeMatrixEnvAccountToken(token: string): string | undefined {
|
||||
let decoded = "";
|
||||
for (let index = 0; index < token.length; ) {
|
||||
for (let index = 0; index < token.length;) {
|
||||
const hexEscape = /^_X([0-9A-F]+)_/.exec(token.slice(index));
|
||||
if (hexEscape) {
|
||||
const hex = hexEscape[1];
|
||||
|
||||
@@ -55,10 +55,9 @@ export class MatrixAuthedHttpClient {
|
||||
try {
|
||||
return JSON.parse(text);
|
||||
} catch {
|
||||
throw Object.assign(
|
||||
new Error("Matrix homeserver returned malformed JSON"),
|
||||
{ statusCode: response.status },
|
||||
);
|
||||
throw Object.assign(new Error("Matrix homeserver returned malformed JSON"), {
|
||||
statusCode: response.status,
|
||||
});
|
||||
}
|
||||
}
|
||||
return text;
|
||||
|
||||
@@ -2091,7 +2091,7 @@ function extractTargetHeadingBodySnippet(
|
||||
return null;
|
||||
}
|
||||
const normalizedBody = normalizeSnippet(bodySnippet);
|
||||
for (let separatorIndex = targetSnippet.indexOf(": "); separatorIndex > 0; ) {
|
||||
for (let separatorIndex = targetSnippet.indexOf(": "); separatorIndex > 0;) {
|
||||
const targetBody = normalizeSnippet(targetSnippet.slice(separatorIndex + 2));
|
||||
if (targetBody && normalizedBody.startsWith(targetBody)) {
|
||||
return targetBody;
|
||||
|
||||
@@ -136,8 +136,8 @@ export function assessClaimFreshness(params: {
|
||||
claim: WikiClaim;
|
||||
now?: Date;
|
||||
}): WikiFreshness {
|
||||
let hasClaimTimestamp = typeof params.claim.updatedAt === "string" &&
|
||||
params.claim.updatedAt.trim().length > 0;
|
||||
let hasClaimTimestamp =
|
||||
typeof params.claim.updatedAt === "string" && params.claim.updatedAt.trim().length > 0;
|
||||
let latestTimestamp = resolveLatestTimestamp([params.claim.updatedAt]);
|
||||
let latestMs = parseTimestamp(latestTimestamp) ?? -1;
|
||||
for (const evidence of params.claim.evidence) {
|
||||
|
||||
@@ -5,11 +5,7 @@ import {
|
||||
createModelCatalogPresetAppliers,
|
||||
type OpenClawConfig,
|
||||
} from "openclaw/plugin-sdk/provider-onboard";
|
||||
import {
|
||||
buildMetaModelDefinition,
|
||||
META_BASE_URL,
|
||||
META_MODEL_CATALOG,
|
||||
} from "./models.js";
|
||||
import { buildMetaModelDefinition, META_BASE_URL, META_MODEL_CATALOG } from "./models.js";
|
||||
|
||||
/** Default Meta model reference used after onboarding. */
|
||||
export const META_DEFAULT_MODEL_REF = "meta/muse-spark-1.1";
|
||||
|
||||
@@ -32,9 +32,7 @@ export function createMetaResponsesWrapper(baseStreamFn: StreamFn | undefined):
|
||||
});
|
||||
}
|
||||
|
||||
export function wrapMetaProviderStream(
|
||||
ctx: ProviderWrapStreamFnContext,
|
||||
): StreamFn | undefined {
|
||||
export function wrapMetaProviderStream(ctx: ProviderWrapStreamFnContext): StreamFn | undefined {
|
||||
if (ctx.provider !== "meta" || ctx.model?.api !== "openai-responses") {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
@@ -14,8 +14,6 @@ const META_THINKING_PROFILE = {
|
||||
defaultLevel: "high",
|
||||
} satisfies ProviderThinkingProfile;
|
||||
|
||||
export function resolveMetaThinkingProfile(
|
||||
modelId: string,
|
||||
): ProviderThinkingProfile | undefined {
|
||||
export function resolveMetaThinkingProfile(modelId: string): ProviderThinkingProfile | undefined {
|
||||
return isMetaReasoningModelId(modelId) ? META_THINKING_PROFILE : undefined;
|
||||
}
|
||||
|
||||
@@ -1521,13 +1521,7 @@ describe("microsoft-foundry plugin", () => {
|
||||
params: { canonicalModelId: modelName },
|
||||
}),
|
||||
).toMatchObject({
|
||||
levels: [
|
||||
{ id: "off" },
|
||||
{ id: "minimal" },
|
||||
{ id: "low" },
|
||||
{ id: "medium" },
|
||||
{ id: "high" },
|
||||
],
|
||||
levels: [{ id: "off" }, { id: "minimal" }, { id: "low" }, { id: "medium" }, { id: "high" }],
|
||||
});
|
||||
}
|
||||
expect(
|
||||
|
||||
@@ -26,7 +26,6 @@ vi.mock("openclaw/plugin-sdk/ssrf-runtime-internal", () => ({
|
||||
fetchConfiguredLocalOriginWithSsrFGuard: fetchConfiguredLocalOriginWithSsrFGuardMock,
|
||||
}));
|
||||
|
||||
|
||||
let createOllamaEmbeddingProvider: typeof import("./embedding-provider.js").createOllamaEmbeddingProvider;
|
||||
let ollamaMemoryEmbeddingProviderAdapter: typeof import("./memory-embedding-adapter.js").ollamaMemoryEmbeddingProviderAdapter;
|
||||
|
||||
|
||||
@@ -52,15 +52,16 @@ There is only ONE skill: `open-prose`. There are NO separate skills like `prose-
|
||||
3. Run with: `prose run examples/28-gas-town.prose`
|
||||
|
||||
**Common examples by keyword:**
|
||||
| Keyword | File |
|
||||
|---------|------|
|
||||
| hello, hello world | `examples/01-hello-world.prose` |
|
||||
| gas town, gastown | `examples/28-gas-town.prose` |
|
||||
| captain, chair | `examples/29-captains-chair.prose` |
|
||||
| forge, browser | `examples/37-the-forge.prose` |
|
||||
| parallel | `examples/16-parallel-reviews.prose` |
|
||||
| pipeline | `examples/21-pipeline-operations.prose` |
|
||||
| error, retry | `examples/22-error-handling.prose` |
|
||||
|
||||
| Keyword | File |
|
||||
| ------------------ | --------------------------------------- |
|
||||
| hello, hello world | `examples/01-hello-world.prose` |
|
||||
| gas town, gastown | `examples/28-gas-town.prose` |
|
||||
| captain, chair | `examples/29-captains-chair.prose` |
|
||||
| forge, browser | `examples/37-the-forge.prose` |
|
||||
| parallel | `examples/16-parallel-reviews.prose` |
|
||||
| pipeline | `examples/21-pipeline-operations.prose` |
|
||||
| error, retry | `examples/22-error-handling.prose` |
|
||||
|
||||
### Remote Programs
|
||||
|
||||
|
||||
@@ -282,9 +282,7 @@ describe("runQaCharacterEval", () => {
|
||||
});
|
||||
|
||||
expect(path.dirname(result.outputDir)).toBe(path.join(tempRoot, ".artifacts", "qa-e2e"));
|
||||
expect(path.basename(result.outputDir)).toMatch(
|
||||
/^character-eval-[a-z0-9]+-[a-f0-9]{8}$/u,
|
||||
);
|
||||
expect(path.basename(result.outputDir)).toMatch(/^character-eval-[a-z0-9]+-[a-f0-9]{8}$/u);
|
||||
await expect(fs.stat(result.reportPath).then((stats) => stats.isFile())).resolves.toBe(true);
|
||||
});
|
||||
|
||||
|
||||
@@ -468,10 +468,7 @@ export function registerQaLabCli(program: Command) {
|
||||
.option("--runner <kind>", "Execution runner: host or multipass", "host")
|
||||
.option("--transport <id>", "QA transport id", "qa-channel")
|
||||
.option("--channel-driver <id>", "QA channel driver: qa-channel, crabline, or live")
|
||||
.option(
|
||||
"--channel <id>",
|
||||
"Channel id for --channel-driver crabline or live",
|
||||
)
|
||||
.option("--channel <id>", "Channel id for --channel-driver crabline or live")
|
||||
.option("--provider-mode <mode>", formatQaProviderModeHelp())
|
||||
.option("--model <ref>", "Primary provider/model ref")
|
||||
.option("--alt-model <ref>", "Alternate provider/model ref")
|
||||
|
||||
@@ -485,9 +485,9 @@ function formatSuiteCommand(matches: readonly QaScenarioSearchMatch[]) {
|
||||
const scenarioArgs = matches.map((match) => `--scenario ${match.id}`).join(" ");
|
||||
const requiredDrivers = [
|
||||
...new Set(
|
||||
matches.map((match) => match.requiredChannelDriver).filter((driver): driver is string =>
|
||||
Boolean(driver),
|
||||
),
|
||||
matches
|
||||
.map((match) => match.requiredChannelDriver)
|
||||
.filter((driver): driver is string => Boolean(driver)),
|
||||
),
|
||||
];
|
||||
const driverArg =
|
||||
@@ -495,9 +495,11 @@ function formatSuiteCommand(matches: readonly QaScenarioSearchMatch[]) {
|
||||
? ` --channel-driver ${requiredDrivers[0]}`
|
||||
: "";
|
||||
const channels = [
|
||||
...new Set(matches.map((match) => match.channel).filter((channel): channel is string =>
|
||||
Boolean(channel),
|
||||
)),
|
||||
...new Set(
|
||||
matches
|
||||
.map((match) => match.channel)
|
||||
.filter((channel): channel is string => Boolean(channel)),
|
||||
),
|
||||
];
|
||||
const channelArg = driverArg && channels.length === 1 ? ` --channel ${channels[0]}` : "";
|
||||
return `pnpm openclaw qa suite${driverArg}${channelArg} ${scenarioArgs}`;
|
||||
|
||||
@@ -15,10 +15,7 @@ vi.mock("./slack/cli.runtime.js", () => ({ runQaSlackCommand: runSlack }));
|
||||
vi.mock("./telegram/cli.runtime.js", () => ({ runQaTelegramCommand: runTelegram }));
|
||||
vi.mock("./whatsapp/cli.runtime.js", () => ({ runQaWhatsAppCommand: runWhatsApp }));
|
||||
|
||||
import {
|
||||
listLiveTransportQaAdapterFactories,
|
||||
listLiveTransportQaCliRegistrations,
|
||||
} from "./cli.js";
|
||||
import { listLiveTransportQaAdapterFactories, listLiveTransportQaCliRegistrations } from "./cli.js";
|
||||
|
||||
const matrixFactory = {
|
||||
id: "matrix",
|
||||
|
||||
@@ -301,18 +301,16 @@ describe("mantis discord smoke runtime", () => {
|
||||
// and never truncate the legitimate payload.
|
||||
const paddedUsername = `Mantis${"_".repeat(1024 * 1024)}`;
|
||||
const baseImpl = fetchWithSsrFGuard.getMockImplementation();
|
||||
fetchWithSsrFGuard.mockImplementation(
|
||||
async (request: { url: string; init?: RequestInit }) => {
|
||||
const pathname = new URL(request.url).pathname;
|
||||
if (pathname === "/api/v10/users/@me") {
|
||||
return {
|
||||
response: jsonResponse({ id: "1489650053747314748", username: paddedUsername }),
|
||||
release: vi.fn(),
|
||||
};
|
||||
}
|
||||
return baseImpl!(request);
|
||||
},
|
||||
);
|
||||
fetchWithSsrFGuard.mockImplementation(async (request: { url: string; init?: RequestInit }) => {
|
||||
const pathname = new URL(request.url).pathname;
|
||||
if (pathname === "/api/v10/users/@me") {
|
||||
return {
|
||||
response: jsonResponse({ id: "1489650053747314748", username: paddedUsername }),
|
||||
release: vi.fn(),
|
||||
};
|
||||
}
|
||||
return baseImpl!(request);
|
||||
});
|
||||
|
||||
const result = await runMantisDiscordSmoke({
|
||||
repoRoot,
|
||||
|
||||
@@ -192,9 +192,6 @@ class QaChannelTransport extends QaStateBackedTransportAdapter {
|
||||
createReportNotes = createQaChannelReportNotes;
|
||||
}
|
||||
|
||||
export function createQaChannelTransport(
|
||||
state: QaBusState,
|
||||
transportPolicy?: QaTransportPolicy,
|
||||
) {
|
||||
export function createQaChannelTransport(state: QaBusState, transportPolicy?: QaTransportPolicy) {
|
||||
return new QaChannelTransport(state, transportPolicy);
|
||||
}
|
||||
|
||||
@@ -33,7 +33,9 @@ describe("matrix scenario runtime shared", () => {
|
||||
};
|
||||
const prefix = "a".repeat(199);
|
||||
|
||||
expect(buildMatrixReplyArtifact({ ...event, body: `${prefix}😀tail` }).bodyPreview).toBe(prefix);
|
||||
expect(buildMatrixReplyArtifact({ ...event, body: `${prefix}😀tail` }).bodyPreview).toBe(
|
||||
prefix,
|
||||
);
|
||||
expect(buildMatrixReplyArtifact({ ...event, body: " " }).bodyPreview).toBe("");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
// Qa Matrix plugin module implements scenario runtime behavior.
|
||||
import { MATRIX_QA_SECONDARY_ROOM_KEY, type MatrixQaScenarioDefinition } from "./scenario-catalog.js";
|
||||
import {
|
||||
MATRIX_QA_SECONDARY_ROOM_KEY,
|
||||
type MatrixQaScenarioDefinition,
|
||||
} from "./scenario-catalog.js";
|
||||
import {
|
||||
runAllowBotsDefaultBlockScenario,
|
||||
runAllowBotsMentionsDmUnmentionedScenario,
|
||||
|
||||
@@ -56,9 +56,7 @@ describe("buildExecApprovalText", () => {
|
||||
|
||||
it("wraps ASCII and double-width text after 24 graphemes", () => {
|
||||
const ascii = readCommandBlock(buildExecApprovalText(createExecView("x".repeat(25))));
|
||||
const wide = readCommandBlock(
|
||||
buildExecApprovalText(createExecView(`${"表".repeat(24)}😀`)),
|
||||
);
|
||||
const wide = readCommandBlock(buildExecApprovalText(createExecView(`${"表".repeat(24)}😀`)));
|
||||
|
||||
expect(ascii.body).toBe(`${"x".repeat(24)}↩\nx`);
|
||||
expect(wide.body).toBe(`${"表".repeat(24)}↩\n😀`);
|
||||
@@ -78,9 +76,7 @@ describe("buildExecApprovalText", () => {
|
||||
buildExecApprovalText(createExecView(`${oversizedGrapheme}; echo hidden`)),
|
||||
);
|
||||
|
||||
expect(body.replace(/[↩\n]/g, "")).toBe(
|
||||
`${oversizedGrapheme.slice(0, 300)}…[truncated]`,
|
||||
);
|
||||
expect(body.replace(/[↩\n]/g, "")).toBe(`${oversizedGrapheme.slice(0, 300)}…[truncated]`);
|
||||
});
|
||||
|
||||
it("marks a display wrap before a shell comment boundary", () => {
|
||||
|
||||
@@ -119,10 +119,7 @@ function formatApprovalMetadata(value: string): string {
|
||||
return formatCommandPreview(sanitized);
|
||||
}
|
||||
|
||||
export function buildExecApprovalText(
|
||||
view: ExecApprovalPendingView,
|
||||
nowMs = Date.now(),
|
||||
): string {
|
||||
export function buildExecApprovalText(view: ExecApprovalPendingView, nowMs = Date.now()): string {
|
||||
const expiresIn = Math.max(0, Math.round((view.expiresAtMs - nowMs) / 1000));
|
||||
const lines: string[] = ["\u{1f510} \u547d\u4ee4\u6267\u884c\u5ba1\u6279", ""];
|
||||
if (view.commandText) {
|
||||
|
||||
@@ -44,9 +44,7 @@ export function resolveRaftAccount(params: {
|
||||
cfg: OpenClawConfig;
|
||||
accountId?: string | null;
|
||||
}): ResolvedRaftAccount {
|
||||
const accountId = normalizeAccountId(
|
||||
params.accountId ?? resolveDefaultRaftAccountId(params.cfg),
|
||||
);
|
||||
const accountId = normalizeAccountId(params.accountId ?? resolveDefaultRaftAccountId(params.cfg));
|
||||
const channel = resolveRaftConfig(params.cfg);
|
||||
const merged = resolveMergedAccountConfig<RaftAccountConfig>({
|
||||
channelConfig: channel,
|
||||
@@ -57,7 +55,9 @@ export function resolveRaftAccount(params: {
|
||||
});
|
||||
const configuredProfile = normalizeOptionalString(merged.profile);
|
||||
const envProfile =
|
||||
accountId === DEFAULT_ACCOUNT_ID ? normalizeOptionalString(process.env.RAFT_PROFILE) : undefined;
|
||||
accountId === DEFAULT_ACCOUNT_ID
|
||||
? normalizeOptionalString(process.env.RAFT_PROFILE)
|
||||
: undefined;
|
||||
const profile = configuredProfile ?? envProfile ?? null;
|
||||
|
||||
return {
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
import { describeAccountSnapshot } from "openclaw/plugin-sdk/account-helpers";
|
||||
import { createChatChannelPlugin, type ChannelPlugin } from "openclaw/plugin-sdk/channel-core";
|
||||
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
|
||||
import { detectBinary } from "openclaw/plugin-sdk/setup-tools";
|
||||
import {
|
||||
buildBaseChannelStatusSummary,
|
||||
createComputedAccountStatusAdapter,
|
||||
createDefaultChannelRuntimeState,
|
||||
} from "openclaw/plugin-sdk/status-helpers";
|
||||
import { detectBinary } from "openclaw/plugin-sdk/setup-tools";
|
||||
import {
|
||||
listRaftAccountIds,
|
||||
RAFT_CHANNEL_ID,
|
||||
|
||||
@@ -2,18 +2,22 @@
|
||||
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";
|
||||
import { z } from "zod";
|
||||
|
||||
const RaftAccountSchema = z.object({
|
||||
name: z.string().optional(),
|
||||
enabled: z.boolean().optional(),
|
||||
profile: z.string().min(1).optional(),
|
||||
}).strict();
|
||||
const RaftAccountSchema = z
|
||||
.object({
|
||||
name: z.string().optional(),
|
||||
enabled: z.boolean().optional(),
|
||||
profile: z.string().min(1).optional(),
|
||||
})
|
||||
.strict();
|
||||
|
||||
export const RaftConfigSchema = z.object({
|
||||
name: z.string().optional(),
|
||||
enabled: z.boolean().optional(),
|
||||
profile: z.string().min(1).optional(),
|
||||
defaultAccount: z.string().optional(),
|
||||
accounts: z.record(z.string(), RaftAccountSchema).optional(),
|
||||
}).strict();
|
||||
export const RaftConfigSchema = z
|
||||
.object({
|
||||
name: z.string().optional(),
|
||||
enabled: z.boolean().optional(),
|
||||
profile: z.string().min(1).optional(),
|
||||
defaultAccount: z.string().optional(),
|
||||
accounts: z.record(z.string(), RaftAccountSchema).optional(),
|
||||
})
|
||||
.strict();
|
||||
|
||||
export const raftChannelConfigSchema = buildChannelConfigSchema(RaftConfigSchema);
|
||||
|
||||
@@ -30,33 +30,35 @@ function createContext(accountId = "default") {
|
||||
lastStopAt: null,
|
||||
lastError: null,
|
||||
};
|
||||
const run = vi.fn(async (params: {
|
||||
raw: unknown;
|
||||
adapter: {
|
||||
ingest: (raw: unknown) => {
|
||||
id: string;
|
||||
timestamp: number;
|
||||
rawText: string;
|
||||
textForAgent: string;
|
||||
textForCommands: string;
|
||||
};
|
||||
resolveTurn: (input: {
|
||||
id: string;
|
||||
timestamp: number;
|
||||
rawText: string;
|
||||
textForAgent: string;
|
||||
textForCommands: string;
|
||||
}) => Promise<{
|
||||
delivery: {
|
||||
deliver: () => Promise<{ visibleReplySent: false }>;
|
||||
const run = vi.fn(
|
||||
async (params: {
|
||||
raw: unknown;
|
||||
adapter: {
|
||||
ingest: (raw: unknown) => {
|
||||
id: string;
|
||||
timestamp: number;
|
||||
rawText: string;
|
||||
textForAgent: string;
|
||||
textForCommands: string;
|
||||
};
|
||||
}>;
|
||||
};
|
||||
}) => {
|
||||
const input = params.adapter.ingest(params.raw);
|
||||
const turn = await params.adapter.resolveTurn(input);
|
||||
await turn.delivery.deliver();
|
||||
});
|
||||
resolveTurn: (input: {
|
||||
id: string;
|
||||
timestamp: number;
|
||||
rawText: string;
|
||||
textForAgent: string;
|
||||
textForCommands: string;
|
||||
}) => Promise<{
|
||||
delivery: {
|
||||
deliver: () => Promise<{ visibleReplySent: false }>;
|
||||
};
|
||||
}>;
|
||||
};
|
||||
}) => {
|
||||
const input = params.adapter.ingest(params.raw);
|
||||
const turn = await params.adapter.resolveTurn(input);
|
||||
await turn.delivery.deliver();
|
||||
},
|
||||
);
|
||||
const ctx = {
|
||||
cfg: {},
|
||||
accountId,
|
||||
@@ -485,5 +487,4 @@ describe("Raft wake gateway", () => {
|
||||
resetPluginStateStoreForTests();
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import type { ChannelPlugin } from "openclaw/plugin-sdk/core";
|
||||
// Raft plugin setup owns only the Raft CLI profile, never Raft credentials.
|
||||
import { createPatchedAccountSetupAdapter } from "openclaw/plugin-sdk/setup";
|
||||
import type { ChannelPlugin } from "openclaw/plugin-sdk/core";
|
||||
import {
|
||||
createDetectedBinaryStatus,
|
||||
formatDocsLink,
|
||||
@@ -68,7 +68,8 @@ export const raftSetupPlugin: ChannelPlugin<ResolvedRaftAccount> = {
|
||||
accountId
|
||||
? resolveRaftAccount({ cfg, accountId }).configured
|
||||
: listRaftAccountIds(cfg).some(
|
||||
(resolvedAccountId) => resolveRaftAccount({ cfg, accountId: resolvedAccountId }).configured,
|
||||
(resolvedAccountId) =>
|
||||
resolveRaftAccount({ cfg, accountId: resolvedAccountId }).configured,
|
||||
),
|
||||
resolveBinaryPath: () => "raft",
|
||||
detectBinary,
|
||||
|
||||
@@ -110,7 +110,7 @@ type SlackCodeMarker = "`" | "```";
|
||||
|
||||
function tokenizeSlackMrkdwn(text: string): string[] {
|
||||
const tokens: string[] = [];
|
||||
for (let index = 0; index < text.length; ) {
|
||||
for (let index = 0; index < text.length;) {
|
||||
if (text.startsWith("```", index)) {
|
||||
tokens.push("```");
|
||||
index += 3;
|
||||
|
||||
@@ -87,7 +87,8 @@ function resolveSlackMessageText(message: {
|
||||
attachments?: SlackAttachment[];
|
||||
}): string | undefined {
|
||||
const messageText =
|
||||
normalizeOptionalString(message.text) ?? resolveSlackAttachmentFallbackText(message.attachments);
|
||||
normalizeOptionalString(message.text) ??
|
||||
resolveSlackAttachmentFallbackText(message.attachments);
|
||||
return chooseSlackPrimaryText({
|
||||
messageText,
|
||||
blocksText: resolveSlackBlocksText(message.blocks),
|
||||
|
||||
@@ -535,9 +535,9 @@ describe("sendMessageSlack blocks", () => {
|
||||
);
|
||||
expect(posts.length).toBeGreaterThan(1);
|
||||
expect(posts.every((post) => post.blocks === undefined)).toBe(true);
|
||||
expect(
|
||||
posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT),
|
||||
).toBe(true);
|
||||
expect(posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT)).toBe(
|
||||
true,
|
||||
);
|
||||
expect(posts.map(postedText).join("\n")).toContain("Series-11");
|
||||
});
|
||||
|
||||
@@ -578,9 +578,9 @@ describe("sendMessageSlack blocks", () => {
|
||||
blocks,
|
||||
});
|
||||
expect(posts.slice(1).every((post) => post.blocks === undefined)).toBe(true);
|
||||
expect(
|
||||
posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT),
|
||||
).toBe(true);
|
||||
expect(posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT)).toBe(
|
||||
true,
|
||||
);
|
||||
const fallbackText = posts.slice(1).map(postedText).join("\n");
|
||||
expect(fallbackText).toContain("*Summary*");
|
||||
expect(fallbackText.match(/Series-11/g)).toHaveLength(1);
|
||||
@@ -736,9 +736,9 @@ describe("sendMessageSlack blocks", () => {
|
||||
expect(posts[0]?.text).toBe("Large pipeline (table)\n\n- Refresh");
|
||||
expect(posts[1]).toMatchObject({ text: "- Refresh", blocks: [blocks[3]] });
|
||||
expect(posts.slice(2).every((post) => post.blocks === undefined)).toBe(true);
|
||||
expect(
|
||||
posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT),
|
||||
).toBe(true);
|
||||
expect(posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT)).toBe(
|
||||
true,
|
||||
);
|
||||
expect(posts[0]?.reply_broadcast).toBeUndefined();
|
||||
expect(posts[2]?.reply_broadcast).toBe(true);
|
||||
expect(posts.every((post) => post.thread_ts === "171234.100")).toBe(true);
|
||||
@@ -850,9 +850,9 @@ describe("sendMessageSlack blocks", () => {
|
||||
expect(posts[1]).toMatchObject({ text: compactFallback });
|
||||
expect(posts[1]?.blocks).toBeUndefined();
|
||||
expect(posts.slice(2).every((post) => post.blocks === undefined)).toBe(true);
|
||||
expect(
|
||||
posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT),
|
||||
).toBe(true);
|
||||
expect(posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT)).toBe(
|
||||
true,
|
||||
);
|
||||
const fallbackText = posts
|
||||
.slice(2)
|
||||
.map((post) => post.text)
|
||||
@@ -948,9 +948,9 @@ describe("sendMessageSlack blocks", () => {
|
||||
expect(posts.length).toBeGreaterThan(1);
|
||||
expect(posts[0]).toMatchObject({ text: "Revenue (pie chart)", blocks: [blocks[1]] });
|
||||
expect(posts.slice(1).every((post) => post.blocks === undefined)).toBe(true);
|
||||
expect(
|
||||
posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT),
|
||||
).toBe(true);
|
||||
expect(posts.every((post) => Array.from(postedText(post)).length <= SLACK_TEXT_LIMIT)).toBe(
|
||||
true,
|
||||
);
|
||||
const fallbackText = posts
|
||||
.slice(1)
|
||||
.map((post) => post.text)
|
||||
|
||||
@@ -47,7 +47,7 @@ const cappedTelegramMenuCache = new Map<
|
||||
|
||||
function countTelegramCommandText(value: string): number {
|
||||
let count = 0;
|
||||
for (let index = 0; index < value.length; ) {
|
||||
for (let index = 0; index < value.length;) {
|
||||
const codePoint = value.codePointAt(index);
|
||||
index += codePoint && codePoint > 0xffff ? 2 : 1;
|
||||
count += 1;
|
||||
|
||||
@@ -4,6 +4,7 @@ import type { ChannelAccountSnapshot } from "openclaw/plugin-sdk/channel-contrac
|
||||
import type { ChannelOutboundAdapter } from "openclaw/plugin-sdk/channel-send-result";
|
||||
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
|
||||
import type { ChannelPlugin } from "openclaw/plugin-sdk/core";
|
||||
import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
|
||||
import { monitorTlonProvider } from "./monitor/index.js";
|
||||
import { tlonSetupWizard } from "./setup-surface.js";
|
||||
import {
|
||||
@@ -25,7 +26,6 @@ import {
|
||||
sendGroupMessageWithStory,
|
||||
} from "./urbit/send.js";
|
||||
import { uploadImageFromUrl } from "./urbit/upload.js";
|
||||
import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
|
||||
|
||||
type ResolvedTlonAccount = ReturnType<typeof resolveTlonAccount>;
|
||||
type ConfiguredTlonAccount = ResolvedTlonAccount & {
|
||||
|
||||
@@ -31,9 +31,7 @@ describe("Urbit channel operations", () => {
|
||||
},
|
||||
{ path: "/chat/inbox.json", auditContext: "test" },
|
||||
),
|
||||
).rejects.toThrow(
|
||||
"Tlon scry response for path /chat/inbox.json: malformed JSON response",
|
||||
);
|
||||
).rejects.toThrow("Tlon scry response for path /chat/inbox.json: malformed JSON response");
|
||||
expect(release).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
import { randomUUID } from "node:crypto";
|
||||
import { Readable } from "node:stream";
|
||||
import { resolveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime";
|
||||
import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
|
||||
import type { LookupFn, SsrFPolicy } from "openclaw/plugin-sdk/ssrf-runtime";
|
||||
import { ensureUrbitChannelOpen, pokeUrbitChannel, scryUrbitPath } from "./channel-ops.js";
|
||||
import { getUrbitContext, normalizeUrbitCookie } from "./context.js";
|
||||
import { readResponseTextLimited } from "openclaw/plugin-sdk/provider-http";
|
||||
import { urbitFetch } from "./fetch.js";
|
||||
|
||||
type UrbitSseLogger = {
|
||||
|
||||
@@ -63,7 +63,9 @@ describe("Venice usage", () => {
|
||||
const snapshot = await fetchVeniceUsage({
|
||||
token: "venice-key",
|
||||
timeoutMs: 5000,
|
||||
fetchFn: vi.fn(async () => new Response("private", { status: 403 })) as unknown as typeof fetch,
|
||||
fetchFn: vi.fn(
|
||||
async () => new Response("private", { status: 403 }),
|
||||
) as unknown as typeof fetch,
|
||||
});
|
||||
|
||||
expect(snapshot.error).toBe("HTTP 403");
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
||||
import { tmpdir } from "node:os";
|
||||
import path from "node:path";
|
||||
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import type { VoiceCallConfig } from "./config.js";
|
||||
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
|
||||
import type { CoreAgentDeps } from "./core-bridge.js";
|
||||
import { buildRealtimeVoiceInstructions } from "./realtime-agent-context.js";
|
||||
import { createVoiceCallBaseConfig } from "./test-fixtures.js";
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
// Voice Call tests cover voice mapping plugin behavior.
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
DEFAULT_POLLY_VOICE,
|
||||
escapeXml,
|
||||
mapVoiceToPolly,
|
||||
} from "./voice-mapping.js";
|
||||
import { DEFAULT_POLLY_VOICE, escapeXml, mapVoiceToPolly } from "./voice-mapping.js";
|
||||
|
||||
describe("voice mapping", () => {
|
||||
it("escapes xml-special characters", () => {
|
||||
|
||||
@@ -21,10 +21,7 @@ export async function probeZalouser(
|
||||
user = await Promise.race([
|
||||
getZaloUserInfo(profile),
|
||||
new Promise<null>((resolve) => {
|
||||
timeout = setTimeout(
|
||||
() => resolve(null),
|
||||
resolveTimerTimeoutMs(timeoutMs, 1000, 1000),
|
||||
);
|
||||
timeout = setTimeout(() => resolve(null), resolveTimerTimeoutMs(timeoutMs, 1000, 1000));
|
||||
}),
|
||||
]);
|
||||
} finally {
|
||||
|
||||
+3
-3
@@ -2059,14 +2059,14 @@
|
||||
"@types/node": "26.1.0",
|
||||
"@types/proper-lockfile": "4.1.4",
|
||||
"@types/ws": "8.18.1",
|
||||
"@typescript/native-preview": "7.0.0-dev.20260704.1",
|
||||
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
||||
"@vitest/coverage-v8": "4.1.9",
|
||||
"esbuild": "0.28.1",
|
||||
"jscpd": "4.2.4",
|
||||
"jsdom": "29.1.1",
|
||||
"lit": "3.3.3",
|
||||
"oxfmt": "0.57.0",
|
||||
"oxlint": "1.72.0",
|
||||
"oxfmt": "0.58.0",
|
||||
"oxlint": "1.73.0",
|
||||
"oxlint-tsgolint": "0.24.0",
|
||||
"shiki": "4.3.0",
|
||||
"signal-utils": "0.21.1",
|
||||
|
||||
+10
-13
@@ -96,20 +96,17 @@ describe("NodeExecutionEnv file metadata", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it.runIf(process.platform !== "win32")(
|
||||
"preserves backslashes in POSIX filenames",
|
||||
async () => {
|
||||
const fileName = "notes\\todo.txt";
|
||||
const written = await env.writeFile(fileName, "hello");
|
||||
expect(written.ok).toBe(true);
|
||||
it.runIf(process.platform !== "win32")("preserves backslashes in POSIX filenames", async () => {
|
||||
const fileName = "notes\\todo.txt";
|
||||
const written = await env.writeFile(fileName, "hello");
|
||||
expect(written.ok).toBe(true);
|
||||
|
||||
const info = await env.fileInfo(fileName);
|
||||
expect(info.ok).toBe(true);
|
||||
if (info.ok) {
|
||||
expect(info.value.name).toBe(fileName);
|
||||
}
|
||||
},
|
||||
);
|
||||
const info = await env.fileInfo(fileName);
|
||||
expect(info.ok).toBe(true);
|
||||
if (info.ok) {
|
||||
expect(info.value.name).toBe(fileName);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("NodeExecutionEnv timeout handling", () => {
|
||||
|
||||
@@ -324,7 +324,7 @@ function truncateStringToBytesFromEnd(str: string, maxBytes: number): string {
|
||||
let outputBytes = 0;
|
||||
let start = str.length;
|
||||
let needsReplacement = false;
|
||||
for (let i = str.length; i > 0; ) {
|
||||
for (let i = str.length; i > 0;) {
|
||||
let characterStart = i - 1;
|
||||
const code = str.charCodeAt(characterStart);
|
||||
let characterBytes: number;
|
||||
|
||||
@@ -166,7 +166,7 @@ function getApiKeyEnvVars(provider: string): readonly string[] | undefined {
|
||||
|
||||
const envMap: Record<string, string> = {
|
||||
openai: "OPENAI_API_KEY",
|
||||
"meta": "MODEL_API_KEY",
|
||||
meta: "MODEL_API_KEY",
|
||||
"azure-openai-responses": "AZURE_OPENAI_API_KEY",
|
||||
deepseek: "DEEPSEEK_API_KEY",
|
||||
google: "GEMINI_API_KEY",
|
||||
|
||||
@@ -60,13 +60,13 @@ import {
|
||||
import { createSseByteGuard } from "../utils/streaming-byte-guard.js";
|
||||
import { stripSystemPromptCacheBoundary } from "../utils/system-prompt-cache-boundary.js";
|
||||
import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
|
||||
import { supportsOpenAITemperature } from "./openai-reasoning-effort.js";
|
||||
import {
|
||||
convertResponsesMessages,
|
||||
convertResponsesToolPayload,
|
||||
processResponsesStream,
|
||||
resolveResponsesReasoningEffort,
|
||||
} from "./openai-responses-shared.js";
|
||||
import { supportsOpenAITemperature } from "./openai-reasoning-effort.js";
|
||||
import { buildBaseOptions } from "./simple-options.js";
|
||||
|
||||
// ============================================================================
|
||||
|
||||
@@ -18,6 +18,7 @@ import { resolveCacheRetention } from "./cache-retention.js";
|
||||
import { isCloudflareProvider, resolveCloudflareBaseUrl } from "./cloudflare.js";
|
||||
import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./github-copilot-headers.js";
|
||||
import { clampOpenAIPromptCacheKey } from "./openai-prompt-cache.js";
|
||||
import { supportsOpenAITemperature } from "./openai-reasoning-effort.js";
|
||||
import {
|
||||
applyCommonResponsesParams,
|
||||
convertResponsesMessages,
|
||||
@@ -25,7 +26,6 @@ import {
|
||||
resolveResponsesReasoningEffort,
|
||||
runResponsesStreamLifecycle,
|
||||
} from "./openai-responses-shared.js";
|
||||
import { supportsOpenAITemperature } from "./openai-reasoning-effort.js";
|
||||
import { buildBaseOptions } from "./simple-options.js";
|
||||
|
||||
const OPENAI_TOOL_CALL_PROVIDERS = new Set(["openai", "opencode"]);
|
||||
|
||||
@@ -251,7 +251,7 @@ function reasoningTagPrefixSuffixIndex(
|
||||
text: string,
|
||||
isIndexInsideCode: (index: number) => boolean,
|
||||
): number {
|
||||
for (let index = text.lastIndexOf("<"); index >= 0; ) {
|
||||
for (let index = text.lastIndexOf("<"); index >= 0;) {
|
||||
if (!isIndexInsideCode(index) && isReasoningTagPrefix(text.slice(index))) {
|
||||
return index;
|
||||
}
|
||||
|
||||
@@ -137,9 +137,7 @@ describe("lazy protocol validators", () => {
|
||||
});
|
||||
|
||||
it("accepts an IANA time zone for session usage while retaining UTC offsets", () => {
|
||||
expect(validateSessionsUsageParams({ mode: "specific", timeZone: "Europe/Vienna" })).toBe(
|
||||
true,
|
||||
);
|
||||
expect(validateSessionsUsageParams({ mode: "specific", timeZone: "Europe/Vienna" })).toBe(true);
|
||||
expect(validateSessionsUsageParams({ mode: "specific", utcOffset: "UTC+2" })).toBe(true);
|
||||
expect(validateSessionsUsageParams({ mode: "specific", timeZone: "" })).toBe(false);
|
||||
expect(validateSessionsUsageParams({ mode: "specific", timeZone: 2 })).toBe(false);
|
||||
|
||||
@@ -455,11 +455,11 @@ export function chunkMarkdown(
|
||||
// Second pass: if a segment's *weighted* size still exceeds the budget
|
||||
// (happens for CJK-heavy text where 1 char ≈ 1 token), re-split it at
|
||||
// chunking.tokens so the chunk stays within the token budget.
|
||||
for (let start = 0; start < line.length; ) {
|
||||
for (let start = 0; start < line.length;) {
|
||||
const coarse = truncateUtf16Safe(line.slice(start), maxChars);
|
||||
if (estimateStringChars(coarse) > maxChars) {
|
||||
const fineStep = Math.max(1, chunking.tokens);
|
||||
for (let j = 0; j < coarse.length; ) {
|
||||
for (let j = 0; j < coarse.length;) {
|
||||
let end = Math.min(j + fineStep, coarse.length);
|
||||
const lastCodeUnit = coarse.charCodeAt(end - 1);
|
||||
if (lastCodeUnit >= 0xd800 && lastCodeUnit <= 0xdbff && end < coarse.length) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { normalizeStringifiedEntries } from "@openclaw/normalization-core/string-coerce";
|
||||
// Normalization Core tests cover string coerce behavior.
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { normalizeStringifiedEntries } from "@openclaw/normalization-core/string-coerce";
|
||||
|
||||
describe("normalization-core/string-coerce", () => {
|
||||
it("normalizes primitive stringified entries", () => {
|
||||
|
||||
@@ -82,7 +82,7 @@ function wrapLine(text: string, width: number): string[] {
|
||||
|
||||
type Token = { kind: "ansi" | "char"; value: string };
|
||||
const tokens: Token[] = [];
|
||||
for (let i = 0; i < text.length; ) {
|
||||
for (let i = 0; i < text.length;) {
|
||||
if (text[i] === ESC) {
|
||||
// SGR: ESC [ ... m
|
||||
if (text[i + 1] === "[") {
|
||||
|
||||
@@ -184,7 +184,7 @@ function consumeRemovedLineEnd(text: string, end: number): number {
|
||||
|
||||
function findUtf8OverCapOffset(text: string, start: number): number | null {
|
||||
let bytes = 0;
|
||||
for (let index = start; index < text.length; ) {
|
||||
for (let index = start; index < text.length;) {
|
||||
const code = text.codePointAt(index) ?? 0;
|
||||
index += code > 0xffff ? 2 : 1;
|
||||
bytes += code <= 0x7f ? 1 : code <= 0x7ff ? 2 : code <= 0xffff ? 3 : 4;
|
||||
@@ -427,7 +427,7 @@ function findPotentialCallStart(
|
||||
atLineStart: boolean,
|
||||
matcher: PlainTextToolCallNameMatcher,
|
||||
): number | null {
|
||||
for (let index = 0; index < text.length; ) {
|
||||
for (let index = 0; index < text.length;) {
|
||||
const lineStart =
|
||||
(index === 0 && atLineStart) || text[index - 1] === "\n" || text[index - 1] === "\r";
|
||||
if (!lineStart) {
|
||||
|
||||
Generated
+201
-201
@@ -258,8 +258,8 @@ importers:
|
||||
specifier: 8.18.1
|
||||
version: 8.18.1
|
||||
'@typescript/native-preview':
|
||||
specifier: 7.0.0-dev.20260704.1
|
||||
version: 7.0.0-dev.20260704.1
|
||||
specifier: 7.0.0-dev.20260707.2
|
||||
version: 7.0.0-dev.20260707.2
|
||||
'@vitest/coverage-v8':
|
||||
specifier: 4.1.9
|
||||
version: 4.1.9(@vitest/browser@4.1.9)(vitest@4.1.9)
|
||||
@@ -276,11 +276,11 @@ importers:
|
||||
specifier: 3.3.3
|
||||
version: 3.3.3
|
||||
oxfmt:
|
||||
specifier: 0.57.0
|
||||
version: 0.57.0
|
||||
specifier: 0.58.0
|
||||
version: 0.58.0
|
||||
oxlint:
|
||||
specifier: 1.72.0
|
||||
version: 1.72.0(oxlint-tsgolint@0.24.0)
|
||||
specifier: 1.73.0
|
||||
version: 1.73.0(oxlint-tsgolint@0.24.0)
|
||||
oxlint-tsgolint:
|
||||
specifier: 0.24.0
|
||||
version: 0.24.0
|
||||
@@ -295,7 +295,7 @@ importers:
|
||||
version: 4.1.1
|
||||
tsdown:
|
||||
specifier: 0.22.1
|
||||
version: 0.22.1(@typescript/native-preview@7.0.0-dev.20260704.1)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1)
|
||||
version: 0.22.1(@typescript/native-preview@7.0.0-dev.20260707.2)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1)
|
||||
tsx:
|
||||
specifier: 4.22.4
|
||||
version: 4.22.4
|
||||
@@ -3397,124 +3397,124 @@ packages:
|
||||
'@oxc-project/types@0.138.0':
|
||||
resolution: {integrity: sha512-1a7ZKmrRTCoN1XMZ4L0PyyqrMnrNlLyPuOkdSX2MZg7IiIGRUyurNhAm73ptDOraoBcIordsIGKNPKUzy3ZmfA==}
|
||||
|
||||
'@oxfmt/binding-android-arm-eabi@0.57.0':
|
||||
resolution: {integrity: sha512-qVBsEO+KugOsCmUHcO8iqNnqc65p7PCKpCs8M66mPZ+Ri+CWbcpoQOEJBg2OTu03+0qu++NK1jj6IzvQVs0Sig==}
|
||||
'@oxfmt/binding-android-arm-eabi@0.58.0':
|
||||
resolution: {integrity: sha512-Uz62sHduGGPftXtILGyxdSW4PX82rUg+rfdNqhsgxe881g4rIoXlIqmZQ6HVKcF4f+F8qMhdD03Bx5u7gmeTdg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [android]
|
||||
|
||||
'@oxfmt/binding-android-arm64@0.57.0':
|
||||
resolution: {integrity: sha512-mp6PibWbao3aizijcheOeHQaYEhcUAt8pwLniYbtLfHxL/psFF0BykAwCj+s3c6qIpa8yN8keZICWrqtZ70w8g==}
|
||||
'@oxfmt/binding-android-arm64@0.58.0':
|
||||
resolution: {integrity: sha512-rD0lRaJp1b+9vw6X4A2dJWKukd6X8yxiicN4JxXcXayolmUypRZxk+lKR+fVOu5q/iYc0fh5fR4bgmfOfVlbaA==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@oxfmt/binding-darwin-arm64@0.57.0':
|
||||
resolution: {integrity: sha512-T+0stuCBqmUVY+aMIvrgXhzGhHO3sD5tNiiEcYqgSdPsnukskQqn2u5qOVD0sv1l7RLdFS5Z/f5Wi9Ktyjr3Eg==}
|
||||
'@oxfmt/binding-darwin-arm64@0.58.0':
|
||||
resolution: {integrity: sha512-uzbPPk7O6M+w2K65vcQ1woga3wgP8zghjL1KOG5b6qJ8dvYHZJ1VShaslg2KOK6yQIwCQtcMCXqLBM6sqXUNTg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@oxfmt/binding-darwin-x64@0.57.0':
|
||||
resolution: {integrity: sha512-O+3JbqWs/mCI2oi4xfhRO2IVPFJNDDEBV8Odo+ZpmsUOeKJfjXoNH7nDmBEQcDgK7NfjDIyE7kRgYSZcTLDO0A==}
|
||||
'@oxfmt/binding-darwin-x64@0.58.0':
|
||||
resolution: {integrity: sha512-L0nKYDxU32oxeQqJj21W9SlIMnf81VZEhyah6iDvFhf5q0oynq498Fopth7blErUJVBpVtxQ98RMCfMPqpJX6w==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@oxfmt/binding-freebsd-x64@0.57.0':
|
||||
resolution: {integrity: sha512-pxwhxVC+JkLX9twOQ/8C/vbuOQcMZyKIDmiRDZfO7yITuVcIdZCiLRqqf4QOxb2+8FWrRXzQpm+1DBKcMpHSSQ==}
|
||||
'@oxfmt/binding-freebsd-x64@0.58.0':
|
||||
resolution: {integrity: sha512-woNwfD58dC5PGS9LSLSD5JYfo/EFK5iG9vhDWkcCg3q78ag7KC8bpDqgvPHrMoXpx83OLXxoSOhu6z8FsVTHlg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@oxfmt/binding-linux-arm-gnueabihf@0.57.0':
|
||||
resolution: {integrity: sha512-pxBU4zH2imB/MDBfth2rOMeVxXUMjRQLCazagwLARIFH3hVlxZJBlM4nSnHXaIHJK4/qezoFCIORN6AY8Mra4A==}
|
||||
'@oxfmt/binding-linux-arm-gnueabihf@0.58.0':
|
||||
resolution: {integrity: sha512-Sqs8nMLxuQpY21NKJ1u4stPDmO5hskBCNNh2E3AdCfI1QqWtf4m+Qn4mGEIUO4KGmuq3SWc/SZ80uy5IiwTCDw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@oxfmt/binding-linux-arm-musleabihf@0.57.0':
|
||||
resolution: {integrity: sha512-JAprOzt8tycYou36ZgEw14DlRHTiN8qdtKANdV3VZIRIvTI/lh/cX13c9pJ/EnDk2GT3FASH7KvCgQ2AufAifQ==}
|
||||
'@oxfmt/binding-linux-arm-musleabihf@0.58.0':
|
||||
resolution: {integrity: sha512-Vd4exzBI5B5hB9m22JiTQzIL23WvHo/Pe+sNXPNeBLXSP9swCBPKCEBRwKpmpQzYhlgYaCgfPcGXPKAJBRIiZQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@oxfmt/binding-linux-arm64-gnu@0.57.0':
|
||||
resolution: {integrity: sha512-ajtjaxSaj9xl4BW7REt+Cef/ttzbAq00Bq4z7JUDZEfgFXdwSjH8K9bF+IcIJzZB9lKqMfQ4eHuSFOvvlvtqOg==}
|
||||
'@oxfmt/binding-linux-arm64-gnu@0.58.0':
|
||||
resolution: {integrity: sha512-bUWi5mHV+4Vi56RLHE1h6q/HHfwAIT3XoB9vJAVeRzfu5NriXM8y6eeJu0vlKa0C9kq2rq1sOWRClhdLHPocrg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxfmt/binding-linux-arm64-musl@0.57.0':
|
||||
resolution: {integrity: sha512-p4Y/+RYk9Bk5WO+zHSUXAClRmZ2fbJCejMuCAsU2HhyME4jqf6Ftt/mJYEwIah1wGCBDYOB7wEGV1x5bCEZ6hA==}
|
||||
'@oxfmt/binding-linux-arm64-musl@0.58.0':
|
||||
resolution: {integrity: sha512-2ZHxemzgHcjtktAuVUwSoyXmGo/t+aF5tS1ciPpPei4rhSyrz3JOqDosXXrmhN/yLUSzJjtuW7ToTWqfQpCj2w==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@oxfmt/binding-linux-ppc64-gnu@0.57.0':
|
||||
resolution: {integrity: sha512-By6tRALAZsno0F4zedmtG+wdMvJiJmJoXM4d3+A9zHE4HRXLqXITwRH8mgrlcXc5yJM2g2W3riRPwTYdgemZLQ==}
|
||||
'@oxfmt/binding-linux-ppc64-gnu@0.58.0':
|
||||
resolution: {integrity: sha512-AwKkVwjVmFQ3bcO7j0McGYAqCKH2a326fswfofng/E8VewCT/raeeGQr4huVhY704deK8AWASSTlxzMj0eZc6Q==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [ppc64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxfmt/binding-linux-riscv64-gnu@0.57.0':
|
||||
resolution: {integrity: sha512-skYeG+RgvyzspqVEBsEprL90OYYZfoVNqB3HcCNR6QDJyXKOzfDRT3zncnHmUaFluIlBHuY23mU1b5WGgR98hA==}
|
||||
'@oxfmt/binding-linux-riscv64-gnu@0.58.0':
|
||||
resolution: {integrity: sha512-xsRpTxfUnJF8D3AUKko/qyWdjw4GZVHlCVFuGlzSCTeewLmykKINW8em1+wx+axsDVtJJcMtvsiaXggXxrlHgw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxfmt/binding-linux-riscv64-musl@0.57.0':
|
||||
resolution: {integrity: sha512-FFgACrZOXAXUh5KQh2mt1CDOVOZmn+QzHP71wM9QobNwyQvoFfyAeefVUltW83g3sm7LTiH3yfFqLLVUpA5ZFQ==}
|
||||
'@oxfmt/binding-linux-riscv64-musl@0.58.0':
|
||||
resolution: {integrity: sha512-Z4AYOTcy7nYEIiXwD62PlerimyYRcfJOgUbQAEBjXz098kxKuERBlRntofGy69HHhe9E0TLVNMl1yspVNu+efw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@oxfmt/binding-linux-s390x-gnu@0.57.0':
|
||||
resolution: {integrity: sha512-Nm/BAOfQeFiiKd502mZn/GAVKJwtd0RdCg17G3Wz/WSOIQmDi3+7/SZH4BHn1Ye5KvTVH3ua8WvfwLLycNIuvA==}
|
||||
'@oxfmt/binding-linux-s390x-gnu@0.58.0':
|
||||
resolution: {integrity: sha512-A3nhhtZPC/TKVWOPj9q/H3p2znJDCcHWYlJBhWL8hGq/bFmBaNBHC8Np6E581yVq1w9Mi3rMDNzDalWvtUfJtQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [s390x]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxfmt/binding-linux-x64-gnu@0.57.0':
|
||||
resolution: {integrity: sha512-BiSy5Ku3mQqyxS6YIqAJgd403wEUWvI7kerfzPxc2l/txZVmZM0pSj7oDM+4bGBExowxOi7o73jEam1W0EDTZg==}
|
||||
'@oxfmt/binding-linux-x64-gnu@0.58.0':
|
||||
resolution: {integrity: sha512-2g+tVkgwqphw8R4hgo+kF4oz8+P5RwVOtr9+irsC7uwEp0e9j7Crw8kDGKL20uYlLPD7g02DqA61mC/UNYx98A==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxfmt/binding-linux-x64-musl@0.57.0':
|
||||
resolution: {integrity: sha512-BCRkJiotz5s9afLYD2LuMvzAoDYx9H17E/YbDyu4xK7l4zHDPeny9ErSXL//i/nJyaOwRk08x4b8cgJC00+JDg==}
|
||||
'@oxfmt/binding-linux-x64-musl@0.58.0':
|
||||
resolution: {integrity: sha512-rc15P6AbyyB7426aN8AakLd02Trb3a6ML/mmfAQeVHJEfVofWLcWIrBdy6zDEY+DIaL/s8E4GGPboVw+oP3+EA==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@oxfmt/binding-openharmony-arm64@0.57.0':
|
||||
resolution: {integrity: sha512-4Oaxe1qrGgXfpCJ1C/ERJ2iCtV2rN1R79ga9fsfyVHfSQRu/hVW780u2KDqZWFZ/iGTHODJji0JemxqFZ63eIQ==}
|
||||
'@oxfmt/binding-openharmony-arm64@0.58.0':
|
||||
resolution: {integrity: sha512-ZWoTM27/HYPOh9iq86DAbhPu9nXb8qKvvGU/h8OfliyVUFAMMNTLDkGsWDKKnDqIkqvZ9+dXlgUOsH1LYO3O7g==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [openharmony]
|
||||
|
||||
'@oxfmt/binding-win32-arm64-msvc@0.57.0':
|
||||
resolution: {integrity: sha512-MYLAsDnhdNsSGheLYhWgbk0vfIrlS84iQYun/y21fX6u0jj8iBtYtbpZMdiqYeuf8U12eVPUjVY2xE2NrCfJ0g==}
|
||||
'@oxfmt/binding-win32-arm64-msvc@0.58.0':
|
||||
resolution: {integrity: sha512-LHZnqFXe2dEfkRI4XdZS/57nEOT/I4UCRX5IyM9v4GYW9XwQCjGe1IUK59SuKw3POwvcgWQ4pme2cYXmNqTNPg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@oxfmt/binding-win32-ia32-msvc@0.57.0':
|
||||
resolution: {integrity: sha512-PBwdzZALJY/jcCx2E6is0yu+cuVXeySTDmwuseD+9j0mHqlRNxwlKgsyRTBed/woPeqfVfuXfWjoq4Cx2Zt3Eg==}
|
||||
'@oxfmt/binding-win32-ia32-msvc@0.58.0':
|
||||
resolution: {integrity: sha512-mZKpg20TpheCJym1rarcZCUJeW1sSruw8zAAaCYWvuVfwIUDN1CXdrPU/JgCWReXTCTrEfCB8Wyo3hh9jSZ2EA==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
|
||||
'@oxfmt/binding-win32-x64-msvc@0.57.0':
|
||||
resolution: {integrity: sha512-bQJdH9i4RRfw55jm7+8/xS7GzHLLTbHx4huhrrDxQJaJtbSDbsyOnODvP1ftT7EG0KFKAYO2S+q6AcioXODx8w==}
|
||||
'@oxfmt/binding-win32-x64-msvc@0.58.0':
|
||||
resolution: {integrity: sha512-N/wUU4N5PZ2orBtI+Ko7MnMfYLfE7K91UrGMY/c/pYyHR3lA9kwst1XugkZx+92YcRh/Eo+iv2eTESSWXfiZPA==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
@@ -3549,124 +3549,124 @@ packages:
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@oxlint/binding-android-arm-eabi@1.72.0':
|
||||
resolution: {integrity: sha512-zhCmvn+1Mj3UchAc/90i99S0t7jJUsHmFVSPg4UWrjO8b8eaSGwscgO6QAUtvHBstkjQwBttQNswEnAF1mIQdA==}
|
||||
'@oxlint/binding-android-arm-eabi@1.73.0':
|
||||
resolution: {integrity: sha512-HZQRN/UMBu+Ut+/9MiAChkbP4qZqrNOWBcNI45vOT40GVhbGR0JgHB87L48D4iAqFQIdVmeQYtV9RF89AjTKkg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [android]
|
||||
|
||||
'@oxlint/binding-android-arm64@1.72.0':
|
||||
resolution: {integrity: sha512-mtH+aY/ozv1eZoCUC2owjFAtyNBKHpJHygKeEu9zXXnQGW1Q2/qOpvx+I+Lf23+TvTz66F4iiXUbl2cGvoLPCQ==}
|
||||
'@oxlint/binding-android-arm64@1.73.0':
|
||||
resolution: {integrity: sha512-Gp+KJRylv2aW7thRpG5p1KTxZq4ZJFbWowrKzufNq9d3ssl3r3JviYV45/+p+7CN1Nv0zDd1e8Ex0b/HUDq4TQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [android]
|
||||
|
||||
'@oxlint/binding-darwin-arm64@1.72.0':
|
||||
resolution: {integrity: sha512-EvnajNPDtfknB3ZieeOOyDTwJn9QXDiwfnF4ZDQqART6RG6hjY4WigQcZdGoK2dkB3e1vrmEzN9aYbQCUkh/gQ==}
|
||||
'@oxlint/binding-darwin-arm64@1.73.0':
|
||||
resolution: {integrity: sha512-3de96NdtXhxERMjIz7wsp2HYMY6pMQycGxFWac2mFecAx6VeARF/IqFb1QIaqiCRIdfzBwzTed+pCTCoiS+CYA==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@oxlint/binding-darwin-x64@1.72.0':
|
||||
resolution: {integrity: sha512-ZkCdEa/G80A7vEHfeCDz/+L3m33DE73v32mDKhgOIgz8Uwf0DFcK7+uu6qC+7LEhmz5fpOe1osWKyjSNMydFIQ==}
|
||||
'@oxlint/binding-darwin-x64@1.73.0':
|
||||
resolution: {integrity: sha512-5zx/uPW32TiaOeVY1dQ/H5iOf0K1HOdFKOJhLqGl4o63+i1fpzoqqu/mKtd7OFgFjNCdhlyTGgjVkQTZm1ELcg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@oxlint/binding-freebsd-x64@1.72.0':
|
||||
resolution: {integrity: sha512-NroXv2vh+sxVY1uya/rM5pjhx1hm8BzlYpx9q67QP0Xhw5MH2bf5GJylpvLEC+781p1Xli/317EoV9AlGwViag==}
|
||||
'@oxlint/binding-freebsd-x64@1.73.0':
|
||||
resolution: {integrity: sha512-qNe4gKHaGnLuZJ8toUg90JAa0S2vTVvDw+0bRi3q1avXZXDT4u5mMeECf3nD4HYrbdn1O7dXqWut4onY/yx/Xg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [freebsd]
|
||||
|
||||
'@oxlint/binding-linux-arm-gnueabihf@1.72.0':
|
||||
resolution: {integrity: sha512-0NDywYgfj279Ou/BcQuCYSj7NJwBfmWn5qc5uGO/Ny7fUWmXyIpvawqX/8acQlWG6IXelJsJhj+JAy6sjsKj0A==}
|
||||
'@oxlint/binding-linux-arm-gnueabihf@1.73.0':
|
||||
resolution: {integrity: sha512-cCehYh5hTbfShm/fxTD6wwrGUWIpvX+N5OxmAMhFhDeTGXvw+BeNj889tpxsFQ9ZLatQ6wImuY8tsKLZ+FMz7w==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@oxlint/binding-linux-arm-musleabihf@1.72.0':
|
||||
resolution: {integrity: sha512-4vpXB06h65Ezsy4hRyrGjGrfa1SkVPii09yaajiYhmVpgsFiLD+KNxIx/BNAY+XiO+i1yqp9HHdwqM8VTqa5XQ==}
|
||||
'@oxlint/binding-linux-arm-musleabihf@1.73.0':
|
||||
resolution: {integrity: sha512-d5j5GDU/2dMgjVhw7TQT9ITrsIr1Y02KEXKyVGIXUkD+KiaxE9TP65FS2ZdgTBemQvoRL+gSBdbrIm3cQIeacg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@oxlint/binding-linux-arm64-gnu@1.72.0':
|
||||
resolution: {integrity: sha512-immaN4g2ZGFiOkKrvRX9LvzZdd2GkQM5wR+UyzYyUuyhUTXGQ4HKUJH18xp4G8OfhCVaVAJfKZxwE1r8+4hhaQ==}
|
||||
'@oxlint/binding-linux-arm64-gnu@1.73.0':
|
||||
resolution: {integrity: sha512-Eyf1SrP3+yR1DI3OJgOY2Pvrr9dWP9TK37xPaDYycwTtlGlI45erJAVIfH5/m/xosDt6BupJYEFi47bvbTuuyw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxlint/binding-linux-arm64-musl@1.72.0':
|
||||
resolution: {integrity: sha512-JGHS9Mnr7iWyyLDxgCv1MhzVpAckgptg00F2gnxt/GD7lQ2SW1BRcxHqhSTaSdDpjWRrBkBxMMh4+Hn3aVtExg==}
|
||||
'@oxlint/binding-linux-arm64-musl@1.73.0':
|
||||
resolution: {integrity: sha512-IlT/OJApEDKaMmCooHuncgJZbbCe7T5QIWmTZBEtYscWvzPQuuEinVcid6kwQRVQOUdb7PUCz4jQHnaYXdfJXw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@oxlint/binding-linux-ppc64-gnu@1.72.0':
|
||||
resolution: {integrity: sha512-AOYgBZqxNshrg83P9v0RYv+m8s10Cqkj4/PxXFDhcS3k7FqsIG5+CxErshZCIN7G8iy4Y+VGfAsuEdar8AcbBg==}
|
||||
'@oxlint/binding-linux-ppc64-gnu@1.73.0':
|
||||
resolution: {integrity: sha512-L+JYcb/vdg5fmcH08V6o0YYLU28cTH1SPNulwJdvK9NK49aXSkYy6oNpKBmddArVOXYqNepriDGiZ04G54kh1Q==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [ppc64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxlint/binding-linux-riscv64-gnu@1.72.0':
|
||||
resolution: {integrity: sha512-QMybPS5ij3/vrKG67mqzHwW++91sYxK/PPUVi6SBtNCEzW4niS52fVBdXbQ6nou0wWbUPEpx8Sl/ZjtgE3clXA==}
|
||||
'@oxlint/binding-linux-riscv64-gnu@1.73.0':
|
||||
resolution: {integrity: sha512-Qtk0g3bKV6OwWjIm7R8kQN1uOZRKQt/MODK2a8QfkwhTpXBD53ozx5XLVWLGDQAVyp2otLW4D2wB98XfAfMPGA==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxlint/binding-linux-riscv64-musl@1.72.0':
|
||||
resolution: {integrity: sha512-gOc3W7JV0PXRpIL7stUlLe3Wa9Gp0Kdlup87IT3gHDvPKck2xNgMIl/Gs2lldYY2lyXZDC4rWi3hmoLUobkgbQ==}
|
||||
'@oxlint/binding-linux-riscv64-musl@1.73.0':
|
||||
resolution: {integrity: sha512-wX0NQKZVxltkAOVmzFcpOaMpdaUvsq1Eqpx9tkAfl71UdkTlSo1R4AdAnGccR1Fm2+TzFgZ22CyyGuZ41RDr/A==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [riscv64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@oxlint/binding-linux-s390x-gnu@1.72.0':
|
||||
resolution: {integrity: sha512-rpGxph+FjjHcYI5q6uxB3Az+tnfmEnDbSA8+PK9ZE/VzyUAkvBOMeuY7ZQMhu5mpZH7YQDsTdW6Cx4kV/msc6w==}
|
||||
'@oxlint/binding-linux-s390x-gnu@1.73.0':
|
||||
resolution: {integrity: sha512-vPe7UGBMWyiLTtnqS4xxgMQFSFGmtQwhwCxuiw6lXygaO6bVt0D8dFVg8Xv05eaiN3ybC0HXXHUAohFMFvqoCQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [s390x]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxlint/binding-linux-x64-gnu@1.72.0':
|
||||
resolution: {integrity: sha512-WND+uhf/Ko13SLqQMWQUgsZuLvYYEvL0ZKgg0tgGYfLqxG7l8Ju123fHDMJyYSDl5E3bUbpFUuii/OvMreFQzw==}
|
||||
'@oxlint/binding-linux-x64-gnu@1.73.0':
|
||||
resolution: {integrity: sha512-2CwIWr9cemFC/CbRBWZvuk5mffz6ObmfFkfcC/9rTQ7f+icNhYr2kOjf9Rt8lLvugvkdGDOmkoVoFFHh6ClCTw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [glibc]
|
||||
|
||||
'@oxlint/binding-linux-x64-musl@1.72.0':
|
||||
resolution: {integrity: sha512-SrpbrUL70nG9vh6zP4/oKHWgLuHquwsr7MW9XOn0olBVgh10Uqr8qscKhQoBGEn6olK/IUpn5GSKcdQ5AjUhGA==}
|
||||
'@oxlint/binding-linux-x64-musl@1.73.0':
|
||||
resolution: {integrity: sha512-nDadfJgg7NBBxG0N560wOe7LLX5QiYp6qBaI7viuk5EUORFBktU/NfV0MbTqU3gTqQDCh4VyxKdo5VADxk9w8Q==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
libc: [musl]
|
||||
|
||||
'@oxlint/binding-openharmony-arm64@1.72.0':
|
||||
resolution: {integrity: sha512-qkrsEn6NmgFKr7U/QnezQMb+q/vzAy0Dd9Y95gQGQTyjzDLN+HRZMuM5u70iyH4nBLCfKBzhjMsYCehKay2jyg==}
|
||||
'@oxlint/binding-openharmony-arm64@1.73.0':
|
||||
resolution: {integrity: sha512-wGjJC+NLH9xP+IKGn9RDW94ojJR/wPbg5WCnQjj/oReaOtCQthr8ws1zICe77JFmo4ouUdeTHHZL/ESGiF6Pmw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [openharmony]
|
||||
|
||||
'@oxlint/binding-win32-arm64-msvc@1.72.0':
|
||||
resolution: {integrity: sha512-LWR6ZlFZph+KPjXv8opgZsXRDCdrdQe8VL8Cg9zxCoBS73h6znzZpydVgmdnwj8mB9AuSM5jxEgDJDpQkjboeg==}
|
||||
'@oxlint/binding-win32-arm64-msvc@1.73.0':
|
||||
resolution: {integrity: sha512-I7X47GPGljw225YUQ5SbC/rb1Kkdrd0yQf0x+hYxeKS6DpfjMbo9ccQPQ6LNY6BoJQ1sHhgDUGuMn5Vg5gHT6w==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@oxlint/binding-win32-ia32-msvc@1.72.0':
|
||||
resolution: {integrity: sha512-yt6HEh7IsHvtjRWtmeZRX134eaXKHq5Gnqlf1xBJdJl1JtdoRUEJw3nAxpZoUDS860cX/foKbztO441anVBtVQ==}
|
||||
'@oxlint/binding-win32-ia32-msvc@1.73.0':
|
||||
resolution: {integrity: sha512-5lWj+3h+74Fm1jYOO9qkJA4xkAlZA099DkXppuXsk7UpnpZLttsefrZU469vChGaG6hcSqrkKXQOvMTZtbjeNg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
|
||||
'@oxlint/binding-win32-x64-msvc@1.72.0':
|
||||
resolution: {integrity: sha512-b2eKFD2hX7tIwmo/cyH6TDq8vzWRZ2qNHrzoGntUTmq0h3zQh/uX3eTSHCwI8OB/ADQfJCRelLItK8BsxuucDA==}
|
||||
'@oxlint/binding-win32-x64-msvc@1.73.0':
|
||||
resolution: {integrity: sha512-WaNRvh4f6zY9CvUQk2YoA1O90ieWrIklI84+HXFr9Isjz9CSESrdqo/RtIYt4Dll/cAchqGDMehfaZd0vqEFZw==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
@@ -4343,50 +4343,50 @@ packages:
|
||||
'@types/ws@8.18.1':
|
||||
resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
|
||||
|
||||
'@typescript/native-preview-darwin-arm64@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-WHNMx8HTka+2w9ZifYbfkHHyQBzO+MCbOLQzNJE3K7A7mYJ1aq6ZEvBhRcNqixjKAIIO4U34KQvaQ6PXlwezkQ==}
|
||||
'@typescript/native-preview-darwin-arm64@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-wny2pgKjGbiZtnOIHVa3tXC1UfDqxNEFzyPGmiqybedG8hipG2Nfp0l5UxbaKCjkLacUpH/W5bP2hBOMVhCOzg==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
|
||||
'@typescript/native-preview-darwin-x64@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-IZJib4da/+3gRVSQFoQU1uFzsiSXnI02xBZljipDoPwahRcOdjH9gJ7DMBFbZ53pUtN5lvqbpES4oXiJZTneDA==}
|
||||
'@typescript/native-preview-darwin-x64@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-Afc7M5zOwo+GpfcYwz5Z8HMB2tPVsui7nNIqEuuFB73MPdVqNn/Wmpe4tP4MRri0AtJnJknoHBaTJ/VDAp/Jhw==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
|
||||
'@typescript/native-preview-linux-arm64@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-rjyHYAmDQ68NZIpU5i46D50hgQ63UJGGN/LJv3DAPWC8KraNonS5j4fN2bH/V+acQV9l/sS3+US1daV8VkQaFQ==}
|
||||
'@typescript/native-preview-linux-arm64@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-iITBa2WjjTI5N9t5l7Z4KoOSI+2zBlhbvFzsD/f8qX8QoKjz/Y4DPyBDgezYi8nkqjjksbgSOJ3/ykzhwrB9cg==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/native-preview-linux-arm@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-Dkz8oqvg4nEIu2Acz/d+iBDhIIOqjaAJ6mo6a2diRrDI+K5NAHljTzvkclCxgz6WIa5JnUY3kWzy8jE5AtaCQg==}
|
||||
'@typescript/native-preview-linux-arm@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-hJm/UOqZTr9FHmR7uNm8VGX4oKtfWk0Jem0zPeJFNC8ckGUfSBueyiEYMZB+XmRc1aG4x1E46y3CplP4CLHvGQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/native-preview-linux-x64@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-y2L2eNwCgrTgXKMol9n/bSPeyNHwJbrUDAv6/J7/087yhPNCt61l3KbpiGAYs0KYcCt3V2lNSDtS3geHQfSWJQ==}
|
||||
'@typescript/native-preview-linux-x64@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-du0dzi6y97Po5vDNdPJTyyijHCpaS22JLRnKZEJXBDaO9gCIymOv/5QQokFRuOlQm0bWl3i9PF4OVdGP6uAOQA==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
|
||||
'@typescript/native-preview-win32-arm64@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-PzBVRs8UNSAqtoCp9BtT1jsG4SSOfuDT1yo8Z3gGevmNtKEFZjb92BTSnBZaMPPQkM22fq83zgrAEVOEENIicw==}
|
||||
'@typescript/native-preview-win32-arm64@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-SsAwfhyHJ1akgBc+99z4+hwdbHsdWaKB8EwCNIMA6JfSLMeUjffrYvxu+vfMyxVtOVOz7RrRXRoiDiu4a2sCtg==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
|
||||
'@typescript/native-preview-win32-x64@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-wb/C+fqWpXAoJZd8KQZdpjOq67v/cmLsApjL9oHjC1X6zqz7AzyOQ486uxWT6LvYzKkar4A+iq8h5h+PNgN38w==}
|
||||
'@typescript/native-preview-win32-x64@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-DL4u27stv0fo71sVhOzHSwE+YMZsbBijVI+kg5dLDLilSH79WFTJ8RSQ46vJrCMt+Gjlv/JOZP1PuLJDfioYeQ==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
|
||||
'@typescript/native-preview@7.0.0-dev.20260704.1':
|
||||
resolution: {integrity: sha512-B8CxdI0CumQVV9/9COcanWCWJmu8Jm1kMuYvse3iGm5ay9QrKTD+qyb11x8SPKUMtiUqnhNxt0n4ESNt+LQMuQ==}
|
||||
'@typescript/native-preview@7.0.0-dev.20260707.2':
|
||||
resolution: {integrity: sha512-oUGp+Rep/hqMhPunyinsALUwSlzHINSxitifPiSaeqoKOKD2OlR9NE3TaPqwsl4NlGslsOSUXI1JotWQzpYCPg==}
|
||||
engines: {node: '>=16.20.0'}
|
||||
hasBin: true
|
||||
|
||||
@@ -6430,8 +6430,8 @@ packages:
|
||||
resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==}
|
||||
engines: {node: '>=20'}
|
||||
|
||||
oxfmt@0.57.0:
|
||||
resolution: {integrity: sha512-ZB7Bi+rGDSqmVIo9jwcLyFgjxXvQhDdU+jx+ZrVy6VRiVXK2+CHc4hO3J4dUQjHe7V0ymHB+MDuv5z+NhK07HA==}
|
||||
oxfmt@0.58.0:
|
||||
resolution: {integrity: sha512-8feG/7NVEHDVwc1OUpP6Pks+TnaDFUw2jLLFIMi5bcmmwxAX2wBQvjSzj62RRTYBf2Op1Wt8xbkmagmPTR5ETg==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
@@ -6447,12 +6447,12 @@ packages:
|
||||
resolution: {integrity: sha512-giCk5sEvG02d5tzPmFMX3hem8ndzEEu1xvGYS5OwNfO2WGl6ZVxt5LjE0yiMDoz94INI7XkXwgFAQiydPvVHDw==}
|
||||
hasBin: true
|
||||
|
||||
oxlint@1.72.0:
|
||||
resolution: {integrity: sha512-1rhdZIP/EvoI91ABIwNU5Q8+bWf8mjrS5UzIOZld4d4bXxJvtlUhlQvaoTogIGin/qdErMOrwaIJvCSIAKTLhA==}
|
||||
oxlint@1.73.0:
|
||||
resolution: {integrity: sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==}
|
||||
engines: {node: ^20.19.0 || >=22.12.0}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
oxlint-tsgolint: '>=0.22.1'
|
||||
oxlint-tsgolint: '>=0.24.0'
|
||||
vite-plus: '*'
|
||||
peerDependenciesMeta:
|
||||
oxlint-tsgolint:
|
||||
@@ -9243,61 +9243,61 @@ snapshots:
|
||||
|
||||
'@oxc-project/types@0.138.0': {}
|
||||
|
||||
'@oxfmt/binding-android-arm-eabi@0.57.0':
|
||||
'@oxfmt/binding-android-arm-eabi@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-android-arm64@0.57.0':
|
||||
'@oxfmt/binding-android-arm64@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-darwin-arm64@0.57.0':
|
||||
'@oxfmt/binding-darwin-arm64@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-darwin-x64@0.57.0':
|
||||
'@oxfmt/binding-darwin-x64@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-freebsd-x64@0.57.0':
|
||||
'@oxfmt/binding-freebsd-x64@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-arm-gnueabihf@0.57.0':
|
||||
'@oxfmt/binding-linux-arm-gnueabihf@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-arm-musleabihf@0.57.0':
|
||||
'@oxfmt/binding-linux-arm-musleabihf@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-arm64-gnu@0.57.0':
|
||||
'@oxfmt/binding-linux-arm64-gnu@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-arm64-musl@0.57.0':
|
||||
'@oxfmt/binding-linux-arm64-musl@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-ppc64-gnu@0.57.0':
|
||||
'@oxfmt/binding-linux-ppc64-gnu@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-riscv64-gnu@0.57.0':
|
||||
'@oxfmt/binding-linux-riscv64-gnu@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-riscv64-musl@0.57.0':
|
||||
'@oxfmt/binding-linux-riscv64-musl@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-s390x-gnu@0.57.0':
|
||||
'@oxfmt/binding-linux-s390x-gnu@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-x64-gnu@0.57.0':
|
||||
'@oxfmt/binding-linux-x64-gnu@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-linux-x64-musl@0.57.0':
|
||||
'@oxfmt/binding-linux-x64-musl@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-openharmony-arm64@0.57.0':
|
||||
'@oxfmt/binding-openharmony-arm64@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-win32-arm64-msvc@0.57.0':
|
||||
'@oxfmt/binding-win32-arm64-msvc@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-win32-ia32-msvc@0.57.0':
|
||||
'@oxfmt/binding-win32-ia32-msvc@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxfmt/binding-win32-x64-msvc@0.57.0':
|
||||
'@oxfmt/binding-win32-x64-msvc@0.58.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint-tsgolint/darwin-arm64@0.24.0':
|
||||
@@ -9318,61 +9318,61 @@ snapshots:
|
||||
'@oxlint-tsgolint/win32-x64@0.24.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-android-arm-eabi@1.72.0':
|
||||
'@oxlint/binding-android-arm-eabi@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-android-arm64@1.72.0':
|
||||
'@oxlint/binding-android-arm64@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-darwin-arm64@1.72.0':
|
||||
'@oxlint/binding-darwin-arm64@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-darwin-x64@1.72.0':
|
||||
'@oxlint/binding-darwin-x64@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-freebsd-x64@1.72.0':
|
||||
'@oxlint/binding-freebsd-x64@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-arm-gnueabihf@1.72.0':
|
||||
'@oxlint/binding-linux-arm-gnueabihf@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-arm-musleabihf@1.72.0':
|
||||
'@oxlint/binding-linux-arm-musleabihf@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-arm64-gnu@1.72.0':
|
||||
'@oxlint/binding-linux-arm64-gnu@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-arm64-musl@1.72.0':
|
||||
'@oxlint/binding-linux-arm64-musl@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-ppc64-gnu@1.72.0':
|
||||
'@oxlint/binding-linux-ppc64-gnu@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-riscv64-gnu@1.72.0':
|
||||
'@oxlint/binding-linux-riscv64-gnu@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-riscv64-musl@1.72.0':
|
||||
'@oxlint/binding-linux-riscv64-musl@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-s390x-gnu@1.72.0':
|
||||
'@oxlint/binding-linux-s390x-gnu@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-x64-gnu@1.72.0':
|
||||
'@oxlint/binding-linux-x64-gnu@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-linux-x64-musl@1.72.0':
|
||||
'@oxlint/binding-linux-x64-musl@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-openharmony-arm64@1.72.0':
|
||||
'@oxlint/binding-openharmony-arm64@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-win32-arm64-msvc@1.72.0':
|
||||
'@oxlint/binding-win32-arm64-msvc@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-win32-ia32-msvc@1.72.0':
|
||||
'@oxlint/binding-win32-ia32-msvc@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@oxlint/binding-win32-x64-msvc@1.72.0':
|
||||
'@oxlint/binding-win32-x64-msvc@1.73.0':
|
||||
optional: true
|
||||
|
||||
'@pierre/diffs@1.2.12(@shikijs/themes@4.3.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)':
|
||||
@@ -10047,36 +10047,36 @@ snapshots:
|
||||
dependencies:
|
||||
'@types/node': 26.1.0
|
||||
|
||||
'@typescript/native-preview-darwin-arm64@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview-darwin-arm64@7.0.0-dev.20260707.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/native-preview-darwin-x64@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview-darwin-x64@7.0.0-dev.20260707.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/native-preview-linux-arm64@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview-linux-arm64@7.0.0-dev.20260707.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/native-preview-linux-arm@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview-linux-arm@7.0.0-dev.20260707.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/native-preview-linux-x64@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview-linux-x64@7.0.0-dev.20260707.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/native-preview-win32-arm64@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview-win32-arm64@7.0.0-dev.20260707.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/native-preview-win32-x64@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview-win32-x64@7.0.0-dev.20260707.2':
|
||||
optional: true
|
||||
|
||||
'@typescript/native-preview@7.0.0-dev.20260704.1':
|
||||
'@typescript/native-preview@7.0.0-dev.20260707.2':
|
||||
optionalDependencies:
|
||||
'@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview-darwin-x64': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview-linux-arm': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview-linux-arm64': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview-linux-x64': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview-win32-arm64': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview-win32-x64': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260707.2
|
||||
'@typescript/native-preview-darwin-x64': 7.0.0-dev.20260707.2
|
||||
'@typescript/native-preview-linux-arm': 7.0.0-dev.20260707.2
|
||||
'@typescript/native-preview-linux-arm64': 7.0.0-dev.20260707.2
|
||||
'@typescript/native-preview-linux-x64': 7.0.0-dev.20260707.2
|
||||
'@typescript/native-preview-win32-arm64': 7.0.0-dev.20260707.2
|
||||
'@typescript/native-preview-win32-x64': 7.0.0-dev.20260707.2
|
||||
|
||||
'@typespec/ts-http-runtime@0.3.6':
|
||||
dependencies:
|
||||
@@ -12477,29 +12477,29 @@ snapshots:
|
||||
string-width: 8.2.1
|
||||
optional: true
|
||||
|
||||
oxfmt@0.57.0:
|
||||
oxfmt@0.58.0:
|
||||
dependencies:
|
||||
tinypool: 2.1.0
|
||||
optionalDependencies:
|
||||
'@oxfmt/binding-android-arm-eabi': 0.57.0
|
||||
'@oxfmt/binding-android-arm64': 0.57.0
|
||||
'@oxfmt/binding-darwin-arm64': 0.57.0
|
||||
'@oxfmt/binding-darwin-x64': 0.57.0
|
||||
'@oxfmt/binding-freebsd-x64': 0.57.0
|
||||
'@oxfmt/binding-linux-arm-gnueabihf': 0.57.0
|
||||
'@oxfmt/binding-linux-arm-musleabihf': 0.57.0
|
||||
'@oxfmt/binding-linux-arm64-gnu': 0.57.0
|
||||
'@oxfmt/binding-linux-arm64-musl': 0.57.0
|
||||
'@oxfmt/binding-linux-ppc64-gnu': 0.57.0
|
||||
'@oxfmt/binding-linux-riscv64-gnu': 0.57.0
|
||||
'@oxfmt/binding-linux-riscv64-musl': 0.57.0
|
||||
'@oxfmt/binding-linux-s390x-gnu': 0.57.0
|
||||
'@oxfmt/binding-linux-x64-gnu': 0.57.0
|
||||
'@oxfmt/binding-linux-x64-musl': 0.57.0
|
||||
'@oxfmt/binding-openharmony-arm64': 0.57.0
|
||||
'@oxfmt/binding-win32-arm64-msvc': 0.57.0
|
||||
'@oxfmt/binding-win32-ia32-msvc': 0.57.0
|
||||
'@oxfmt/binding-win32-x64-msvc': 0.57.0
|
||||
'@oxfmt/binding-android-arm-eabi': 0.58.0
|
||||
'@oxfmt/binding-android-arm64': 0.58.0
|
||||
'@oxfmt/binding-darwin-arm64': 0.58.0
|
||||
'@oxfmt/binding-darwin-x64': 0.58.0
|
||||
'@oxfmt/binding-freebsd-x64': 0.58.0
|
||||
'@oxfmt/binding-linux-arm-gnueabihf': 0.58.0
|
||||
'@oxfmt/binding-linux-arm-musleabihf': 0.58.0
|
||||
'@oxfmt/binding-linux-arm64-gnu': 0.58.0
|
||||
'@oxfmt/binding-linux-arm64-musl': 0.58.0
|
||||
'@oxfmt/binding-linux-ppc64-gnu': 0.58.0
|
||||
'@oxfmt/binding-linux-riscv64-gnu': 0.58.0
|
||||
'@oxfmt/binding-linux-riscv64-musl': 0.58.0
|
||||
'@oxfmt/binding-linux-s390x-gnu': 0.58.0
|
||||
'@oxfmt/binding-linux-x64-gnu': 0.58.0
|
||||
'@oxfmt/binding-linux-x64-musl': 0.58.0
|
||||
'@oxfmt/binding-openharmony-arm64': 0.58.0
|
||||
'@oxfmt/binding-win32-arm64-msvc': 0.58.0
|
||||
'@oxfmt/binding-win32-ia32-msvc': 0.58.0
|
||||
'@oxfmt/binding-win32-x64-msvc': 0.58.0
|
||||
|
||||
oxlint-tsgolint@0.24.0:
|
||||
optionalDependencies:
|
||||
@@ -12510,27 +12510,27 @@ snapshots:
|
||||
'@oxlint-tsgolint/win32-arm64': 0.24.0
|
||||
'@oxlint-tsgolint/win32-x64': 0.24.0
|
||||
|
||||
oxlint@1.72.0(oxlint-tsgolint@0.24.0):
|
||||
oxlint@1.73.0(oxlint-tsgolint@0.24.0):
|
||||
optionalDependencies:
|
||||
'@oxlint/binding-android-arm-eabi': 1.72.0
|
||||
'@oxlint/binding-android-arm64': 1.72.0
|
||||
'@oxlint/binding-darwin-arm64': 1.72.0
|
||||
'@oxlint/binding-darwin-x64': 1.72.0
|
||||
'@oxlint/binding-freebsd-x64': 1.72.0
|
||||
'@oxlint/binding-linux-arm-gnueabihf': 1.72.0
|
||||
'@oxlint/binding-linux-arm-musleabihf': 1.72.0
|
||||
'@oxlint/binding-linux-arm64-gnu': 1.72.0
|
||||
'@oxlint/binding-linux-arm64-musl': 1.72.0
|
||||
'@oxlint/binding-linux-ppc64-gnu': 1.72.0
|
||||
'@oxlint/binding-linux-riscv64-gnu': 1.72.0
|
||||
'@oxlint/binding-linux-riscv64-musl': 1.72.0
|
||||
'@oxlint/binding-linux-s390x-gnu': 1.72.0
|
||||
'@oxlint/binding-linux-x64-gnu': 1.72.0
|
||||
'@oxlint/binding-linux-x64-musl': 1.72.0
|
||||
'@oxlint/binding-openharmony-arm64': 1.72.0
|
||||
'@oxlint/binding-win32-arm64-msvc': 1.72.0
|
||||
'@oxlint/binding-win32-ia32-msvc': 1.72.0
|
||||
'@oxlint/binding-win32-x64-msvc': 1.72.0
|
||||
'@oxlint/binding-android-arm-eabi': 1.73.0
|
||||
'@oxlint/binding-android-arm64': 1.73.0
|
||||
'@oxlint/binding-darwin-arm64': 1.73.0
|
||||
'@oxlint/binding-darwin-x64': 1.73.0
|
||||
'@oxlint/binding-freebsd-x64': 1.73.0
|
||||
'@oxlint/binding-linux-arm-gnueabihf': 1.73.0
|
||||
'@oxlint/binding-linux-arm-musleabihf': 1.73.0
|
||||
'@oxlint/binding-linux-arm64-gnu': 1.73.0
|
||||
'@oxlint/binding-linux-arm64-musl': 1.73.0
|
||||
'@oxlint/binding-linux-ppc64-gnu': 1.73.0
|
||||
'@oxlint/binding-linux-riscv64-gnu': 1.73.0
|
||||
'@oxlint/binding-linux-riscv64-musl': 1.73.0
|
||||
'@oxlint/binding-linux-s390x-gnu': 1.73.0
|
||||
'@oxlint/binding-linux-x64-gnu': 1.73.0
|
||||
'@oxlint/binding-linux-x64-musl': 1.73.0
|
||||
'@oxlint/binding-openharmony-arm64': 1.73.0
|
||||
'@oxlint/binding-win32-arm64-msvc': 1.73.0
|
||||
'@oxlint/binding-win32-ia32-msvc': 1.73.0
|
||||
'@oxlint/binding-win32-x64-msvc': 1.73.0
|
||||
oxlint-tsgolint: 0.24.0
|
||||
|
||||
p-finally@1.0.0: {}
|
||||
@@ -12979,7 +12979,7 @@ snapshots:
|
||||
|
||||
reusify@1.1.0: {}
|
||||
|
||||
rolldown-plugin-dts@0.25.2(@typescript/native-preview@7.0.0-dev.20260704.1)(rolldown@1.1.4)(typescript@6.0.3):
|
||||
rolldown-plugin-dts@0.25.2(@typescript/native-preview@7.0.0-dev.20260707.2)(rolldown@1.1.4)(typescript@6.0.3):
|
||||
dependencies:
|
||||
'@babel/generator': 8.0.0-rc.6
|
||||
'@babel/helper-validator-identifier': 8.0.0-rc.6
|
||||
@@ -12991,7 +12991,7 @@ snapshots:
|
||||
obug: 2.1.3
|
||||
rolldown: 1.1.4
|
||||
optionalDependencies:
|
||||
'@typescript/native-preview': 7.0.0-dev.20260704.1
|
||||
'@typescript/native-preview': 7.0.0-dev.20260707.2
|
||||
typescript: 6.0.3
|
||||
transitivePeerDependencies:
|
||||
- oxc-resolver
|
||||
@@ -13456,7 +13456,7 @@ snapshots:
|
||||
|
||||
ts-algebra@2.0.0: {}
|
||||
|
||||
tsdown@0.22.1(@typescript/native-preview@7.0.0-dev.20260704.1)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1):
|
||||
tsdown@0.22.1(@typescript/native-preview@7.0.0-dev.20260707.2)(tsx@4.22.4)(typescript@6.0.3)(unrun@0.3.1):
|
||||
dependencies:
|
||||
ansis: 4.3.1
|
||||
cac: 7.0.0
|
||||
@@ -13467,7 +13467,7 @@ snapshots:
|
||||
obug: 2.1.3
|
||||
picomatch: 4.0.4
|
||||
rolldown: 1.1.4
|
||||
rolldown-plugin-dts: 0.25.2(@typescript/native-preview@7.0.0-dev.20260704.1)(rolldown@1.1.4)(typescript@6.0.3)
|
||||
rolldown-plugin-dts: 0.25.2(@typescript/native-preview@7.0.0-dev.20260707.2)(rolldown@1.1.4)(typescript@6.0.3)
|
||||
semver: 7.8.5
|
||||
tinyexec: 1.2.4
|
||||
tinyglobby: 0.2.17
|
||||
|
||||
@@ -946,7 +946,7 @@ surfaces:
|
||||
reason: human_override
|
||||
human_override: true
|
||||
- id: automation-cron-hooks-tasks-polling
|
||||
name: 'Automation: cron, hooks, tasks, polling'
|
||||
name: "Automation: cron, hooks, tasks, polling"
|
||||
family: core
|
||||
level:
|
||||
id: beta
|
||||
@@ -4016,7 +4016,7 @@ surfaces:
|
||||
reason: none
|
||||
human_override: false
|
||||
- id: local-model-providers-ollama-vllm-sglang-lm-studio
|
||||
name: 'Local model providers: Ollama, vLLM, SGLang, LM Studio'
|
||||
name: "Local model providers: Ollama, vLLM, SGLang, LM Studio"
|
||||
family: provider-tool
|
||||
level:
|
||||
id: alpha
|
||||
|
||||
+1
-1
@@ -41,7 +41,7 @@ new directory taxonomy.
|
||||
| Release checks | `pnpm release:check`, `pnpm release:beta`, `pnpm release:candidate` | Release scripts are maintainer workflows; read release docs before use. |
|
||||
| GitHub reads | `scripts/gh-read` | Uses a GitHub App read token when configured, leaving normal `gh` login for writes. |
|
||||
| Commits | `scripts/committer "<message>" <files...>` | Preferred scoped commit helper for OpenClaw changes. |
|
||||
| Remote proof | `node scripts/crabbox-wrapper.mjs ...` | Agent default for tests and heavy work; pre-warm by source trust, sync each run, reuse the lease. |
|
||||
| Remote proof | `node scripts/crabbox-wrapper.mjs ...` | Agent default for tests and heavy work; pre-warm by source trust, sync each run, reuse the lease. |
|
||||
|
||||
## Script Families
|
||||
|
||||
|
||||
@@ -241,7 +241,10 @@ export function parseArgs(argv) {
|
||||
"OPENCLAW_MEMORY_FD_REPRO_MAX_WORKSPACE_REG_FDS",
|
||||
DEFAULT_MAX_WORKSPACE_REG_FDS,
|
||||
);
|
||||
options.invokeTimeoutMs ??= readTimerTimeoutNumberEnv("OPENCLAW_MEMORY_FD_REPRO_TIMEOUT_MS", 30_000);
|
||||
options.invokeTimeoutMs ??= readTimerTimeoutNumberEnv(
|
||||
"OPENCLAW_MEMORY_FD_REPRO_TIMEOUT_MS",
|
||||
30_000,
|
||||
);
|
||||
options.sampleDelayMs ??= readTimerTimeoutNumberEnv(
|
||||
"OPENCLAW_MEMORY_FD_REPRO_SAMPLE_DELAY_MS",
|
||||
1_000,
|
||||
|
||||
+4
-1
@@ -124,7 +124,10 @@ export async function main(argv = process.argv.slice(2)) {
|
||||
{
|
||||
name: "lint",
|
||||
parallel: false,
|
||||
commands: [{ name: "lint", args: ["lint"] }],
|
||||
commands: [
|
||||
{ name: "lint", args: ["lint"] },
|
||||
{ name: "format", args: ["format:check"] },
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "policy guards",
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
export function resolveWindowsTaskkillPath(env?: NodeJS.ProcessEnv): string;
|
||||
export function resolveWindowsSystem32Path(
|
||||
executableName: string,
|
||||
env?: NodeJS.ProcessEnv,
|
||||
): string;
|
||||
export function resolveWindowsSystem32Path(executableName: string, env?: NodeJS.ProcessEnv): string;
|
||||
export function resolveWindowsPowerShellPath(env?: NodeJS.ProcessEnv): string;
|
||||
|
||||
@@ -362,7 +362,7 @@ function parsePnpmLockfileSections(lockfileText) {
|
||||
let hasImportersSection = false;
|
||||
let hasSnapshotsSection = false;
|
||||
|
||||
for (let index = 0; index < lines.length; ) {
|
||||
for (let index = 0; index < lines.length;) {
|
||||
const line = lines[index];
|
||||
const trimmed = line.trim();
|
||||
const indentation = countIndentation(line);
|
||||
|
||||
@@ -267,10 +267,7 @@ const SLACK_DTS_INPUTS = [
|
||||
];
|
||||
const SLACK_DTS_STAMP = "dist/plugin-sdk/extensions/slack/.boundary-dts.stamp";
|
||||
const SLACK_DTS_REQUIRED_OUTPUTS = ["dist/plugin-sdk/extensions/slack/api.d.ts"];
|
||||
const TELEGRAM_DTS_INPUTS = [
|
||||
"extensions/telegram/api.ts",
|
||||
"extensions/telegram/tsconfig.json",
|
||||
];
|
||||
const TELEGRAM_DTS_INPUTS = ["extensions/telegram/api.ts", "extensions/telegram/tsconfig.json"];
|
||||
const TELEGRAM_DTS_STAMP = "dist/plugin-sdk/extensions/telegram/.boundary-dts.stamp";
|
||||
const TELEGRAM_DTS_REQUIRED_OUTPUTS = ["dist/plugin-sdk/extensions/telegram/api.d.ts"];
|
||||
const WHATSAPP_DTS_INPUTS = [
|
||||
|
||||
@@ -1216,7 +1216,7 @@ async function runLanePool(poolLanes, baseEnv, logDir, parallelism, options) {
|
||||
while (pending.length > 0 || running.size > 0) {
|
||||
let started = false;
|
||||
if (!options.failFast || failures.length === 0) {
|
||||
for (let index = 0; index < pending.length; ) {
|
||||
for (let index = 0; index < pending.length;) {
|
||||
const candidate = pending[index];
|
||||
if (!canStartLane(candidate)) {
|
||||
index += 1;
|
||||
|
||||
@@ -70,11 +70,15 @@ console.log();
|
||||
console.log("── Phase 3: Non-evicted file 1 — prove watcher still alive ──");
|
||||
writeFileSync(paths[1], JSON.stringify({ segments: [{ text: "CHANGED-VIA-WATCHER" }] }));
|
||||
// fs.watch uses a polling fallback on Linux; give the watcher time to fire.
|
||||
await new Promise((r) => { setTimeout(r, 500); });
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, 500);
|
||||
});
|
||||
const tpl1 = loadUsageBarTemplate(paths[1]);
|
||||
const alive = tpl1?.segments?.[0]?.text === "CHANGED-VIA-WATCHER";
|
||||
console.log(` File 1 reloaded: "${tpl1?.segments?.[0]?.text}"`);
|
||||
console.log(` Result: ${alive ? "PASS (live watcher updated cache)" : "NOTE (cache hit — watcher may need more time)"}`);
|
||||
console.log(
|
||||
` Result: ${alive ? "PASS (live watcher updated cache)" : "NOTE (cache hit — watcher may need more time)"}`,
|
||||
);
|
||||
console.log();
|
||||
|
||||
// Phase 4: Cache integrity (MUST run before reloading the evicted path.)
|
||||
@@ -98,13 +102,17 @@ writeFileSync(paths[0], JSON.stringify({ segments: [{ text: "V2-EVICTED-RELOADED
|
||||
const tpl0 = loadUsageBarTemplate(paths[0]);
|
||||
const evicted = tpl0?.segments?.[0]?.text === "V2-EVICTED-RELOADED";
|
||||
console.log(` File 0 reloaded: "${tpl0?.segments?.[0]?.text}"`);
|
||||
console.log(` Result: ${evicted ? "PASS (disk re-read — evicted watcher was closed)" : "FAIL"}`);
|
||||
console.log(
|
||||
` Result: ${evicted ? "PASS (disk re-read — evicted watcher was closed)" : "FAIL"}`,
|
||||
);
|
||||
console.log();
|
||||
|
||||
// Phase 6: Cleanup
|
||||
console.log("── Phase 6: Cleanup ──");
|
||||
clearUsageBarTemplateCacheForTest();
|
||||
await new Promise((r) => { setTimeout(r, 100); });
|
||||
await new Promise((r) => {
|
||||
setTimeout(r, 100);
|
||||
});
|
||||
console.log(` Result: clearUsageBarTemplateCacheForTest called`);
|
||||
console.log();
|
||||
|
||||
@@ -114,9 +122,15 @@ console.log("=".repeat(72));
|
||||
console.log("VERDICT");
|
||||
console.log("=".repeat(72));
|
||||
console.log(` ${CAP} files loaded → all cached PASS`);
|
||||
console.log(` 65th file → eviction + watcher close ${evicted ? "PASS" : "FAIL"}`);
|
||||
console.log(` Non-evicted watcher still alive ${alive ? "PASS" : "WARN"}`);
|
||||
console.log(` ${CAP - 2} files remain cached ${cachedOk === CAP - 2 ? "PASS" : "FAIL"}`);
|
||||
console.log(
|
||||
` 65th file → eviction + watcher close ${evicted ? "PASS" : "FAIL"}`,
|
||||
);
|
||||
console.log(
|
||||
` Non-evicted watcher still alive ${alive ? "PASS" : "WARN"}`,
|
||||
);
|
||||
console.log(
|
||||
` ${CAP - 2} files remain cached ${cachedOk === CAP - 2 ? "PASS" : "FAIL"}`,
|
||||
);
|
||||
console.log(` cleanup → all watchers closed PASS`);
|
||||
console.log();
|
||||
console.log(` End time: ${new Date().toISOString()}`);
|
||||
|
||||
@@ -112,10 +112,7 @@ function mockCallArgs(mock: ReturnType<typeof vi.fn>): Array<Record<string, unkn
|
||||
return mock.mock.calls.map((call) => call[0] as Record<string, unknown>);
|
||||
}
|
||||
|
||||
function findMockCallFields(
|
||||
mock: ReturnType<typeof vi.fn>,
|
||||
expected: Record<string, unknown>,
|
||||
) {
|
||||
function findMockCallFields(mock: ReturnType<typeof vi.fn>, expected: Record<string, unknown>) {
|
||||
return mockCallArgs(mock).find((actual) =>
|
||||
Object.entries(expected).every(([key, value]) => Object.is(actual[key], value)),
|
||||
);
|
||||
|
||||
@@ -427,5 +427,4 @@ describe("ACP event ledger", () => {
|
||||
ledger.readReplay({ sessionId: "session-1", sessionKey: "agent:main:work" }),
|
||||
).resolves.toEqual({ complete: false, events: [] });
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { createAbortError, mergeAbortSignals } from "../infra/abort-signal.js";
|
||||
/**
|
||||
* Abort-signal wrapping for agent tools.
|
||||
* Combines per-call cancellation with run-level aborts while preserving plugin,
|
||||
* channel, and before_tool_call metadata on wrapped tools.
|
||||
*/
|
||||
import { copyPluginToolMeta } from "../plugins/tools.js";
|
||||
import { createAbortError, mergeAbortSignals } from "../infra/abort-signal.js";
|
||||
import type { AnyAgentTool } from "./agent-tools.types.js";
|
||||
import { copyBeforeToolCallHookMarker } from "./before-tool-call-metadata.js";
|
||||
import { copyChannelAgentToolMeta } from "./channel-tools.js";
|
||||
|
||||
@@ -4,9 +4,7 @@
|
||||
* timing, and logging used by auth profile runtime modules.
|
||||
*/
|
||||
import { createSubsystemLogger } from "../../logging/subsystem.js";
|
||||
export {
|
||||
AUTH_PROFILE_FILENAME,
|
||||
} from "./path-constants.js";
|
||||
export { AUTH_PROFILE_FILENAME } from "./path-constants.js";
|
||||
|
||||
/** Current persisted auth profile store schema version. */
|
||||
export const AUTH_STORE_VERSION = 1;
|
||||
|
||||
@@ -233,9 +233,7 @@ export function analyzeBootstrapBudget(params: {
|
||||
}
|
||||
|
||||
/** Builds a stable signature for once-per-truncation warning suppression. */
|
||||
function buildBootstrapTruncationSignature(
|
||||
analysis: BootstrapBudgetAnalysis,
|
||||
): string | undefined {
|
||||
function buildBootstrapTruncationSignature(analysis: BootstrapBudgetAnalysis): string | undefined {
|
||||
if (!analysis.hasTruncation) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user