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:
Peter Steinberger
2026-07-11 01:09:51 -07:00
committed by GitHub
parent 81ce206ee8
commit 7bf80dc2c6
217 changed files with 1464 additions and 1244 deletions
+32 -32
View File
@@ -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.
+1 -1
View File
@@ -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
+4
View File
@@ -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
+8 -1
View File
@@ -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
+1
View File
@@ -26,6 +26,7 @@
"useTabs": false,
"ignorePatterns": [
"apps/",
"CHANGELOG.md",
"CLAUDE.md",
"docker-compose.yml",
"dist/",
+1 -3
View File
@@ -181,9 +181,7 @@ messages.
},
flexMessage: {
altText: "Status card",
contents: {
/* Flex payload */
},
contents: {/* Flex payload */},
},
templateMessage: {
type: "confirm",
+3 -9
View File
@@ -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 */],
},
},
}
+3 -9
View File
@@ -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 */},
},
},
}
+1 -2
View File
@@ -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;
+2 -6
View File
@@ -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", () => {
+22 -8
View File
@@ -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":
+5 -3
View File
@@ -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 -5
View File
@@ -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", () => {
});
});
});
});
+11 -8
View File
@@ -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,
);
}
+6 -6
View File
@@ -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),
+1 -3
View File
@@ -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 {
+1 -4
View File
@@ -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);
}
},
{
+1 -1
View File
@@ -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(
+4 -1
View File
@@ -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 } }),
+1 -4
View File
@@ -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` }),
},
},
});
+3 -1
View File
@@ -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,
+2 -3
View File
@@ -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 &&
+1 -5
View File
@@ -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 -5
View File
@@ -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", () => {
+1 -4
View File
@@ -14,10 +14,7 @@ afterAll(() => {
vi.resetModules();
});
import {
resolveLineOutboundMedia,
validateLineMediaUrl,
} from "./outbound-media.js";
import { resolveLineOutboundMedia, validateLineMediaUrl } from "./outbound-media.js";
describe("validateLineMediaUrl", () => {
beforeEach(() => {
+1 -1
View File
@@ -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;
+2 -2
View File
@@ -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) {
+1 -5
View File
@@ -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";
+1 -3
View File
@@ -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;
}
+1 -3
View File
@@ -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;
}
+1 -7
View File
@@ -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;
+10 -9
View File
@@ -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
+1 -3
View File
@@ -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);
});
+1 -4
View File
@@ -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")
+8 -6
View File
@@ -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) {
+4 -4
View File
@@ -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 {
+1 -1
View File
@@ -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,
+16 -12
View File
@@ -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);
+28 -27
View File
@@ -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();
}
});
});
+3 -2
View File
@@ -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,
+1 -1
View File
@@ -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;
+2 -1
View File
@@ -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),
+15 -15
View File
@@ -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;
+1 -1
View File
@@ -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);
});
});
+1 -1
View File
@@ -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 = {
+3 -1
View File
@@ -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", () => {
+1 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+1 -1
View File
@@ -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;
}
+1 -3
View File
@@ -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", () => {
+1 -1
View File
@@ -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) {
+201 -201
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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
+4 -1
View File
@@ -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
View File
@@ -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 -4
View File
@@ -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;
+1 -1
View File
@@ -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 = [
+1 -1
View File
@@ -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;
+21 -7
View File
@@ -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)),
);
-1
View File
@@ -427,5 +427,4 @@ describe("ACP event ledger", () => {
ledger.readReplay({ sessionId: "session-1", sessionKey: "agent:main:work" }),
).resolves.toEqual({ complete: false, events: [] });
});
});
+1 -1
View File
@@ -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";
+1 -3
View File
@@ -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;
+1 -3
View File
@@ -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