@ouro.bot/cli 0.1.0-alpha.126 → 0.1.0-alpha.128

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/changelog.json CHANGED
@@ -1,6 +1,18 @@
1
1
  {
2
2
  "_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
3
3
  "versions": [
4
+ {
5
+ "version": "0.1.0-alpha.128",
6
+ "changes": [
7
+ "Error message sanitizer now strips HTML responses (Cloudflare challenge pages, error pages) in addition to JSON."
8
+ ]
9
+ },
10
+ {
11
+ "version": "0.1.0-alpha.127",
12
+ "changes": [
13
+ "Anthropic OAuth tokens now work with Opus and Sonnet 4.6. Added Claude Code identification in system prompt and headers that the API requires to grant model access to setup tokens."
14
+ ]
15
+ },
4
16
  {
5
17
  "version": "0.1.0-alpha.126",
6
18
  "changes": [
@@ -12,25 +12,33 @@ const auth_flow_1 = require("./daemon/auth-flow");
12
12
  const runtime_1 = require("../nerves/runtime");
13
13
  const PING_TIMEOUT_MS = 10_000;
14
14
  /**
15
- * Strip raw JSON API response bodies from error messages.
16
- * SDK errors often include the full response body: "400 {"type":"error","error":...}".
17
- * Extract just the HTTP status prefix or a short summary.
15
+ * Strip raw JSON/HTML API response bodies from error messages.
16
+ * SDK errors often include the full response: "400 {"type":"error",...}" or "403 <html>...".
17
+ * Extract just the HTTP status and a short human-readable summary.
18
18
  */
19
19
  function sanitizeErrorMessage(message) {
20
- // Match "NNN {json...}" pattern — keep the status code, drop the JSON
21
- const match = message.match(/^(\d{3})\s*\{/);
22
- if (match) {
23
- // Try to extract the inner message from the JSON
20
+ const statusMatch = message.match(/^(\d{3})\s/);
21
+ if (!statusMatch)
22
+ return message;
23
+ const status = statusMatch[1];
24
+ const body = message.slice(status.length).trim();
25
+ // HTML response (Cloudflare challenge, error pages, etc.)
26
+ if (body.startsWith("<") || body.includes("<!DOCTYPE") || body.includes("<html")) {
27
+ return `HTTP ${status}`;
28
+ }
29
+ // JSON response
30
+ if (body.startsWith("{")) {
24
31
  try {
25
- const json = JSON.parse(message.slice(match[1].length).trim());
32
+ const json = JSON.parse(body);
26
33
  const inner = json?.error?.message;
27
34
  if (typeof inner === "string" && inner && inner !== "Error") {
28
- return `${match[1]} ${inner}`;
35
+ return `${status} ${inner}`;
29
36
  }
30
37
  }
31
- catch { /* not valid JSON, fall through */ }
32
- return `HTTP ${match[1]}`;
38
+ catch { /* not valid JSON */ }
39
+ return `HTTP ${status}`;
33
40
  }
41
+ // Already clean (e.g., "401 Provided authentication token is expired.")
34
42
  return message;
35
43
  }
36
44
  function hasEmptyCredentials(provider, config) {
@@ -270,8 +270,17 @@ async function streamAnthropicMessages(client, model, request) {
270
270
  thinking: { type: "adaptive" },
271
271
  output_config: { effort: request.reasoningEffort ?? "medium" },
272
272
  };
273
- if (system)
274
- params.system = system;
273
+ // The Anthropic API requires a Claude Code identification block in the system
274
+ // prompt when using OAuth setup tokens (sk-ant-oat01). Without it, Opus/Sonnet
275
+ // 4.6 requests are rejected with 400. This is the API's validation that the
276
+ // token is being used by a Claude Code client.
277
+ const claudeCodePreamble = { type: "text", text: "You are Claude Code, Anthropic's official CLI for Claude." };
278
+ if (system) {
279
+ params.system = [claudeCodePreamble, { type: "text", text: system }];
280
+ }
281
+ else {
282
+ params.system = [claudeCodePreamble];
283
+ }
275
284
  if (anthropicTools.length > 0)
276
285
  params.tools = anthropicTools;
277
286
  if (request.toolChoiceRequired && anthropicTools.length > 0) {
@@ -434,6 +443,9 @@ function createAnthropicProviderRuntime(config) {
434
443
  maxRetries: 0,
435
444
  defaultHeaders: {
436
445
  "anthropic-beta": ANTHROPIC_OAUTH_BETA_HEADER,
446
+ "anthropic-dangerous-direct-browser-access": "true",
447
+ "user-agent": "claude-cli/2.1.2 (external, cli)",
448
+ "x-app": "cli",
437
449
  },
438
450
  });
439
451
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.126",
3
+ "version": "0.1.0-alpha.128",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",