mirror of
https://github.com/KeygraphHQ/shannon.git
synced 2026-07-01 02:55:37 +02:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 00c517c7b9 | |||
| 8b956c9972 | |||
| 3d1a3c75f8 | |||
| ac6db3b52e |
+4
-4
@@ -4,7 +4,7 @@
|
|||||||
# Recommended output token configuration for larger tool outputs
|
# Recommended output token configuration for larger tool outputs
|
||||||
CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000
|
CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000
|
||||||
|
|
||||||
# Adaptive thinking is enabled automatically on Opus 4.6/4.7. Set to false to disable.
|
# Adaptive thinking is enabled automatically on Opus 4.6/4.7/4.8. Set to false to disable.
|
||||||
# CLAUDE_ADAPTIVE_THINKING=false
|
# CLAUDE_ADAPTIVE_THINKING=false
|
||||||
|
|
||||||
# Shannon forwards your machine's /etc/hosts entries into the worker container. Set to false to disable.
|
# Shannon forwards your machine's /etc/hosts entries into the worker container. Set to false to disable.
|
||||||
@@ -32,7 +32,7 @@ ANTHROPIC_API_KEY=your-api-key-here
|
|||||||
# Optional for direct Anthropic and custom base URL modes. Required for Bedrock/Vertex.
|
# Optional for direct Anthropic and custom base URL modes. Required for Bedrock/Vertex.
|
||||||
# ANTHROPIC_SMALL_MODEL=... # Small tier (default: claude-haiku-4-5-20251001)
|
# ANTHROPIC_SMALL_MODEL=... # Small tier (default: claude-haiku-4-5-20251001)
|
||||||
# ANTHROPIC_MEDIUM_MODEL=... # Medium tier (default: claude-sonnet-4-6)
|
# ANTHROPIC_MEDIUM_MODEL=... # Medium tier (default: claude-sonnet-4-6)
|
||||||
# ANTHROPIC_LARGE_MODEL=... # Large tier (default: claude-opus-4-7)
|
# ANTHROPIC_LARGE_MODEL=... # Large tier (default: claude-opus-4-8)
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# OPTION 3: AWS Bedrock
|
# OPTION 3: AWS Bedrock
|
||||||
@@ -42,7 +42,7 @@ ANTHROPIC_API_KEY=your-api-key-here
|
|||||||
# Example Bedrock model IDs for us-east-1:
|
# Example Bedrock model IDs for us-east-1:
|
||||||
# ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
# ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
||||||
# ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
# ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
||||||
# ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-7
|
# ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-8
|
||||||
|
|
||||||
# CLAUDE_CODE_USE_BEDROCK=1
|
# CLAUDE_CODE_USE_BEDROCK=1
|
||||||
# AWS_REGION=us-east-1
|
# AWS_REGION=us-east-1
|
||||||
@@ -58,7 +58,7 @@ ANTHROPIC_API_KEY=your-api-key-here
|
|||||||
# Example Vertex AI model IDs:
|
# Example Vertex AI model IDs:
|
||||||
# ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
# ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
||||||
# ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
# ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
# ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
# ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
|
|
||||||
# CLAUDE_CODE_USE_VERTEX=1
|
# CLAUDE_CODE_USE_VERTEX=1
|
||||||
# CLOUD_ML_REGION=us-east5
|
# CLOUD_ML_REGION=us-east5
|
||||||
|
|||||||
@@ -30,15 +30,17 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
|
BASE="2.0.0"
|
||||||
LATEST=$(npm view "@keygraph/shannon" dist-tags.beta 2>/dev/null || echo "")
|
LATEST=$(npm view "@keygraph/shannon" dist-tags.beta 2>/dev/null || echo "")
|
||||||
|
|
||||||
if [[ -z "$LATEST" ]]; then
|
if [[ "$LATEST" == "$BASE-beta."* ]]; then
|
||||||
echo "version=1.0.0-beta.1" >> "$GITHUB_OUTPUT"
|
# Same base version — increment the beta counter (e.g. 2.0.0-beta.2 -> 2.0.0-beta.3)
|
||||||
else
|
|
||||||
# Extract N from 1.0.0-beta.N and increment
|
|
||||||
N=$(echo "$LATEST" | grep -oE 'beta\.([0-9]+)' | grep -oE '[0-9]+')
|
N=$(echo "$LATEST" | grep -oE 'beta\.([0-9]+)' | grep -oE '[0-9]+')
|
||||||
NEXT=$((N + 1))
|
NEXT=$((N + 1))
|
||||||
echo "version=1.0.0-beta.$NEXT" >> "$GITHUB_OUTPUT"
|
echo "version=$BASE-beta.$NEXT" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
# No prior beta, or a different base (e.g. last beta was 1.0.0-beta.N) — start over.
|
||||||
|
echo "version=$BASE-beta.1" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Print version
|
- name: Print version
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
description: "Beta version to roll back to (example: 1.0.0-beta.2)"
|
description: "Beta version to roll back to (example: 2.0.0-beta.2)"
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ jobs:
|
|||||||
VERSION="${RAW_VERSION#v}"
|
VERSION="${RAW_VERSION#v}"
|
||||||
|
|
||||||
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+-beta\.[0-9]+$ ]]; then
|
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+-beta\.[0-9]+$ ]]; then
|
||||||
echo "Version must be in format X.Y.Z-beta.N (e.g. 1.0.0-beta.2)"
|
echo "Version must be in format X.Y.Z-beta.N (e.g. 2.0.0-beta.2)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ Durable workflow orchestration with crash recovery, queryable progress, intellig
|
|||||||
### Supporting Systems
|
### Supporting Systems
|
||||||
- **Configuration** — YAML configs in `apps/worker/configs/` with JSON Schema validation (`config-schema.json`). Supports auth settings (MFA/TOTP), URL/code rule scoping (`rules.avoid`/`rules.focus`), run-scope steering (`vuln_classes`, `exploit`), free-form `rules_of_engagement`, and post-hoc `report` filters (`min_severity`, `min_confidence`, `guidance`). `code_path` avoid rules are written into `~/.claude/settings.json` `permissions.deny` (`Read`/`Edit`) once per workflow by `apps/worker/src/temporal/activities.ts:syncCodePathDenyRules` so the SDK enforces them at the tool layer even in `bypassPermissions` mode. `vuln_classes`/`exploit` scope is locked into `session.json` on first run; resumes with a different scope fail fast (`persistOrValidateRunScope`). Credential resolution — local mode: env vars → `./.env`; npx mode: env vars → `~/.shannon/config.toml` (via `shn setup`)
|
- **Configuration** — YAML configs in `apps/worker/configs/` with JSON Schema validation (`config-schema.json`). Supports auth settings (MFA/TOTP), URL/code rule scoping (`rules.avoid`/`rules.focus`), run-scope steering (`vuln_classes`, `exploit`), free-form `rules_of_engagement`, and post-hoc `report` filters (`min_severity`, `min_confidence`, `guidance`). `code_path` avoid rules are written into `~/.claude/settings.json` `permissions.deny` (`Read`/`Edit`) once per workflow by `apps/worker/src/temporal/activities.ts:syncCodePathDenyRules` so the SDK enforces them at the tool layer even in `bypassPermissions` mode. `vuln_classes`/`exploit` scope is locked into `session.json` on first run; resumes with a different scope fail fast (`persistOrValidateRunScope`). Credential resolution — local mode: env vars → `./.env`; npx mode: env vars → `~/.shannon/config.toml` (via `shn setup`)
|
||||||
- **Prompts** — Per-phase templates in `apps/worker/prompts/` with variable substitution (`{{TARGET_URL}}`, `{{CONFIG_CONTEXT}}`). Shared partials in `apps/worker/prompts/shared/` via `apps/worker/src/services/prompt-manager.ts`, including `_code-path-rules.txt` (focus/avoid `[FILE]`/`[GLOB]` routing) and `_rules-of-engagement.txt` (free-text engagement rules). When `exploit: false`, `apps/worker/src/services/findings-renderer.ts` deterministically converts each `*_exploitation_queue.json` into a `*_findings.md` for report assembly — no LLM in the loop
|
- **Prompts** — Per-phase templates in `apps/worker/prompts/` with variable substitution (`{{TARGET_URL}}`, `{{CONFIG_CONTEXT}}`). Shared partials in `apps/worker/prompts/shared/` via `apps/worker/src/services/prompt-manager.ts`, including `_code-path-rules.txt` (focus/avoid `[FILE]`/`[GLOB]` routing) and `_rules-of-engagement.txt` (free-text engagement rules). When `exploit: false`, `apps/worker/src/services/findings-renderer.ts` deterministically converts each `*_exploitation_queue.json` into a `*_findings.md` for report assembly — no LLM in the loop
|
||||||
- **SDK Integration** — Uses `@anthropic-ai/claude-agent-sdk` with `maxTurns: 10_000` and `bypassPermissions` mode. Adaptive thinking is enabled by default on Opus 4.6/4.7 (`supportsAdaptiveThinking` in `apps/worker/src/ai/models.ts`); disable per-scan via `CLAUDE_ADAPTIVE_THINKING=false` (env) or `core.adaptive_thinking = false` (npx TOML). Browser automation via `playwright-cli` with session isolation (`-s=<session>`). TOTP generation via `generate-totp` CLI tool. Login flow template at `apps/worker/prompts/shared/login-instructions.txt` supports form, SSO, API, and basic auth. On authenticated whitebox scans, the `validate-authentication` preflight performs the single real login and saves the browser session to `auth-state.json` in the per-session audit directory (path from `authStateFile()` in `apps/worker/src/audit/utils.ts`, derived from `generateAuditPath()`). The validation activity (`apps/worker/src/services/validate-authentication.ts`) removes any stale file from a prior run before the agent runs and verifies the file parses and contains cookies or storage before the preflight is marked complete; `logWorkflowComplete` deletes it when the workflow ends so authenticated cookies don't sit on disk between scans. Agent prompts opt in to session reuse by `@include(shared/_shared-session.txt)` before their `<login_instructions>` block — the partial restores the session and falls through to the full login flow if verification fails. `vuln-auth`/`exploit-auth` omit the include and own their own login
|
- **SDK Integration** — Uses `@anthropic-ai/claude-agent-sdk` with `maxTurns: 10_000` and `bypassPermissions` mode. Adaptive thinking is enabled by default on Opus 4.6/4.7/4.8 (`supportsAdaptiveThinking` in `apps/worker/src/ai/models.ts`); disable per-scan via `CLAUDE_ADAPTIVE_THINKING=false` (env) or `core.adaptive_thinking = false` (npx TOML). Browser automation via `playwright-cli` with session isolation (`-s=<session>`). TOTP generation via `generate-totp` CLI tool. Login flow template at `apps/worker/prompts/shared/login-instructions.txt` supports form, SSO, API, and basic auth. On authenticated whitebox scans, the `validate-authentication` preflight performs the single real login and saves the browser session to `auth-state.json` in the per-session audit directory (path from `authStateFile()` in `apps/worker/src/audit/utils.ts`, derived from `generateAuditPath()`). The validation activity (`apps/worker/src/services/validate-authentication.ts`) removes any stale file from a prior run before the agent runs and verifies the file parses and contains cookies or storage before the preflight is marked complete; `logWorkflowComplete` deletes it when the workflow ends so authenticated cookies don't sit on disk between scans. Agent prompts opt in to session reuse by `@include(shared/_shared-session.txt)` before their `<login_instructions>` block — the partial restores the session and falls through to the full login flow if verification fails. `vuln-auth`/`exploit-auth` omit the include and own their own login
|
||||||
- **Audit System** — Crash-safe append-only logging in `workspaces/{hostname}_{sessionId}/`. Tracks session metrics, per-agent logs, prompts, and deliverables. WorkflowLogger (`apps/worker/src/audit/workflow-logger.ts`) provides unified human-readable per-workflow logs, backed by LogStream (`apps/worker/src/audit/log-stream.ts`) shared stream primitive
|
- **Audit System** — Crash-safe append-only logging in `workspaces/{hostname}_{sessionId}/`. Tracks session metrics, per-agent logs, prompts, and deliverables. WorkflowLogger (`apps/worker/src/audit/workflow-logger.ts`) provides unified human-readable per-workflow logs, backed by LogStream (`apps/worker/src/audit/log-stream.ts`) shared stream primitive
|
||||||
- **Deliverables** — Saved to `deliverables/` in the target repo via the `save-deliverable` CLI script (`apps/worker/src/scripts/save-deliverable.ts`)
|
- **Deliverables** — Saved to `deliverables/` in the target repo via the `save-deliverable` CLI script (`apps/worker/src/scripts/save-deliverable.ts`)
|
||||||
- **Workspaces & Resume** — Named workspaces via `-w <name>` or auto-named from URL+timestamp. Resume detects completed agents via `session.json`. `loadResumeState()` in `apps/worker/src/temporal/activities.ts` validates deliverable existence, restores git checkpoints, and cleans up incomplete deliverables. Workspace listing via `apps/worker/src/temporal/workspaces.ts`
|
- **Workspaces & Resume** — Named workspaces via `-w <name>` or auto-named from URL+timestamp. Resume detects completed agents via `session.json`. `loadResumeState()` in `apps/worker/src/temporal/activities.ts` validates deliverable existence, restores git checkpoints, and cleans up incomplete deliverables. Workspace listing via `apps/worker/src/temporal/workspaces.ts`
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ async function setupAnthropic(): Promise<ShannonConfig> {
|
|||||||
'Do you want to change the default models?\n' +
|
'Do you want to change the default models?\n' +
|
||||||
' Small - claude-haiku-4-5-20251001\n' +
|
' Small - claude-haiku-4-5-20251001\n' +
|
||||||
' Medium - claude-sonnet-4-6\n' +
|
' Medium - claude-sonnet-4-6\n' +
|
||||||
' Large - claude-opus-4-7',
|
' Large - claude-opus-4-8',
|
||||||
initialValue: false,
|
initialValue: false,
|
||||||
});
|
});
|
||||||
if (p.isCancel(customizeModels)) return cancelAndExit();
|
if (p.isCancel(customizeModels)) return cancelAndExit();
|
||||||
@@ -105,7 +105,7 @@ async function setupAnthropic(): Promise<ShannonConfig> {
|
|||||||
|
|
||||||
const large = await p.text({
|
const large = await p.text({
|
||||||
message: 'Large model ID',
|
message: 'Large model ID',
|
||||||
initialValue: 'claude-opus-4-7',
|
initialValue: 'claude-opus-4-8',
|
||||||
validate: required('Large model ID is required'),
|
validate: required('Large model ID is required'),
|
||||||
});
|
});
|
||||||
if (p.isCancel(large)) return cancelAndExit();
|
if (p.isCancel(large)) return cancelAndExit();
|
||||||
@@ -143,7 +143,7 @@ async function setupCustomBaseUrl(): Promise<ShannonConfig> {
|
|||||||
'Do you want to change the default models?\n' +
|
'Do you want to change the default models?\n' +
|
||||||
' Small - claude-haiku-4-5-20251001\n' +
|
' Small - claude-haiku-4-5-20251001\n' +
|
||||||
' Medium - claude-sonnet-4-6\n' +
|
' Medium - claude-sonnet-4-6\n' +
|
||||||
' Large - claude-opus-4-7',
|
' Large - claude-opus-4-8',
|
||||||
initialValue: false,
|
initialValue: false,
|
||||||
});
|
});
|
||||||
if (p.isCancel(customizeModels)) return cancelAndExit();
|
if (p.isCancel(customizeModels)) return cancelAndExit();
|
||||||
@@ -165,7 +165,7 @@ async function setupCustomBaseUrl(): Promise<ShannonConfig> {
|
|||||||
|
|
||||||
const large = await p.text({
|
const large = await p.text({
|
||||||
message: 'Large model ID',
|
message: 'Large model ID',
|
||||||
initialValue: 'claude-opus-4-7',
|
initialValue: 'claude-opus-4-8',
|
||||||
validate: required('Large model ID is required'),
|
validate: required('Large model ID is required'),
|
||||||
});
|
});
|
||||||
if (p.isCancel(large)) return cancelAndExit();
|
if (p.isCancel(large)) return cancelAndExit();
|
||||||
@@ -202,7 +202,7 @@ async function setupBedrock(): Promise<ShannonConfig> {
|
|||||||
|
|
||||||
const large = await p.text({
|
const large = await p.text({
|
||||||
message: 'Large model ID',
|
message: 'Large model ID',
|
||||||
placeholder: 'us.anthropic.claude-opus-4-7',
|
placeholder: 'us.anthropic.claude-opus-4-8',
|
||||||
validate: required('Large model ID is required'),
|
validate: required('Large model ID is required'),
|
||||||
});
|
});
|
||||||
if (p.isCancel(large)) return cancelAndExit();
|
if (p.isCancel(large)) return cancelAndExit();
|
||||||
@@ -265,7 +265,7 @@ async function setupVertex(): Promise<ShannonConfig> {
|
|||||||
large: () =>
|
large: () =>
|
||||||
p.text({
|
p.text({
|
||||||
message: 'Large model ID',
|
message: 'Large model ID',
|
||||||
placeholder: 'claude-opus-4-7',
|
placeholder: 'claude-opus-4-8',
|
||||||
validate: required('Large model ID is required'),
|
validate: required('Large model ID is required'),
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
@@ -286,11 +286,11 @@ async function setupVertex(): Promise<ShannonConfig> {
|
|||||||
|
|
||||||
async function maybePromptAdaptiveThinking(config: ShannonConfig): Promise<void> {
|
async function maybePromptAdaptiveThinking(config: ShannonConfig): Promise<void> {
|
||||||
const m = config.models;
|
const m = config.models;
|
||||||
const hasOpus47 = !m || [m.small, m.medium, m.large].some((v) => v && /opus-4-[67]/.test(v));
|
const hasAdaptiveModel = !m || [m.small, m.medium, m.large].some((v) => v && /opus-4-[678]/.test(v));
|
||||||
if (!hasOpus47) return;
|
if (!hasAdaptiveModel) return;
|
||||||
|
|
||||||
const enable = await p.confirm({
|
const enable = await p.confirm({
|
||||||
message: 'Enable adaptive thinking on Opus 4.6/4.7? Claude decides when and how deeply to reason.',
|
message: 'Enable adaptive thinking on Opus 4.6/4.7/4.8? Claude decides when and how deeply to reason.',
|
||||||
initialValue: true,
|
initialValue: true,
|
||||||
});
|
});
|
||||||
if (p.isCancel(enable)) return cancelAndExit();
|
if (p.isCancel(enable)) return cancelAndExit();
|
||||||
|
|||||||
@@ -235,6 +235,22 @@ function printInfo(
|
|||||||
if (args.pipelineTesting) {
|
if (args.pipelineTesting) {
|
||||||
console.log(' Mode: Pipeline Testing');
|
console.log(' Mode: Pipeline Testing');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Surface Fable usage: its safety classifiers route cybersecurity tasks to
|
||||||
|
// Opus 4.8, so those phases run on Opus 4.8 regardless of the tier setting.
|
||||||
|
const fableTiers = (
|
||||||
|
[
|
||||||
|
['small', process.env.ANTHROPIC_SMALL_MODEL],
|
||||||
|
['medium', process.env.ANTHROPIC_MEDIUM_MODEL],
|
||||||
|
['large', process.env.ANTHROPIC_LARGE_MODEL],
|
||||||
|
] as const
|
||||||
|
).filter(([, model]) => model && /fable/i.test(model));
|
||||||
|
if (fableTiers.length > 0) {
|
||||||
|
const tierList = fableTiers.map(([tier, model]) => `${tier} (${model})`).join(', ');
|
||||||
|
console.log(` Note: ${tierList} set to a Fable model. Fable's safety classifiers`);
|
||||||
|
console.log(' route cybersecurity tasks to Opus 4.8, so those phases run on Opus 4.8.');
|
||||||
|
}
|
||||||
|
|
||||||
console.log('');
|
console.log('');
|
||||||
console.log(' Monitor:');
|
console.log(' Monitor:');
|
||||||
if (workflowId) {
|
if (workflowId) {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export interface AuditLogger {
|
|||||||
logToolStart(toolName: string, parameters: unknown): Promise<void>;
|
logToolStart(toolName: string, parameters: unknown): Promise<void>;
|
||||||
logToolEnd(result: unknown): Promise<void>;
|
logToolEnd(result: unknown): Promise<void>;
|
||||||
logError(error: Error, duration: number, turns: number): Promise<void>;
|
logError(error: Error, duration: number, turns: number): Promise<void>;
|
||||||
|
logNote(category: string, message: string): Promise<void>;
|
||||||
}
|
}
|
||||||
|
|
||||||
class RealAuditLogger implements AuditLogger {
|
class RealAuditLogger implements AuditLogger {
|
||||||
@@ -56,6 +57,10 @@ class RealAuditLogger implements AuditLogger {
|
|||||||
timestamp: formatTimestamp(),
|
timestamp: formatTimestamp(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async logNote(category: string, message: string): Promise<void> {
|
||||||
|
await this.auditSession.logWorkflowNote(category, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Null Object implementation - all methods are safe no-ops */
|
/** Null Object implementation - all methods are safe no-ops */
|
||||||
@@ -67,6 +72,8 @@ class NullAuditLogger implements AuditLogger {
|
|||||||
async logToolEnd(_result: unknown): Promise<void> {}
|
async logToolEnd(_result: unknown): Promise<void> {}
|
||||||
|
|
||||||
async logError(_error: Error, _duration: number, _turns: number): Promise<void> {}
|
async logError(_error: Error, _duration: number, _turns: number): Promise<void> {}
|
||||||
|
|
||||||
|
async logNote(_category: string, _message: string): Promise<void> {}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns no-op when auditSession is null
|
// Returns no-op when auditSession is null
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import type {
|
|||||||
AssistantResult,
|
AssistantResult,
|
||||||
ContentBlock,
|
ContentBlock,
|
||||||
ExecutionContext,
|
ExecutionContext,
|
||||||
|
ModelRefusalFallbackMessage,
|
||||||
ResultData,
|
ResultData,
|
||||||
ResultMessage,
|
ResultMessage,
|
||||||
SystemInitMessage,
|
SystemInitMessage,
|
||||||
@@ -164,6 +165,33 @@ function handleStructuredError(errorType: SDKAssistantMessageError, content: str
|
|||||||
true, // Retryable - may succeed with different content
|
true, // Retryable - may succeed with different content
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
|
case 'overloaded':
|
||||||
|
return {
|
||||||
|
detected: true,
|
||||||
|
shouldThrow: new PentestError(
|
||||||
|
`Anthropic API overloaded (structured): ${content.slice(0, 100)}`,
|
||||||
|
'network',
|
||||||
|
true, // Retryable with backoff
|
||||||
|
),
|
||||||
|
};
|
||||||
|
case 'model_not_found':
|
||||||
|
return {
|
||||||
|
detected: true,
|
||||||
|
shouldThrow: new PentestError(
|
||||||
|
`Model not found: ${content.slice(0, 100)}`,
|
||||||
|
'config',
|
||||||
|
false, // Not retryable - model ID is misconfigured
|
||||||
|
),
|
||||||
|
};
|
||||||
|
case 'oauth_org_not_allowed':
|
||||||
|
return {
|
||||||
|
detected: true,
|
||||||
|
shouldThrow: new PentestError(
|
||||||
|
`Organization not allowed for this credential: ${content.slice(0, 100)}`,
|
||||||
|
'config',
|
||||||
|
false, // Not retryable - needs credential/org fix
|
||||||
|
),
|
||||||
|
};
|
||||||
default:
|
default:
|
||||||
return { detected: true };
|
return { detected: true };
|
||||||
}
|
}
|
||||||
@@ -316,6 +344,15 @@ export async function dispatchMessage(
|
|||||||
}
|
}
|
||||||
return { type: 'continue', model: initMsg.model };
|
return { type: 'continue', model: initMsg.model };
|
||||||
}
|
}
|
||||||
|
if (message.subtype === 'model_refusal_fallback') {
|
||||||
|
const fallback = message as ModelRefusalFallbackMessage;
|
||||||
|
const category = fallback.api_refusal_category ?? 'policy';
|
||||||
|
await auditLogger.logNote(
|
||||||
|
'model-fallback',
|
||||||
|
`Model refused (${category}); fell back ${fallback.original_model} → ${fallback.fallback_model}`,
|
||||||
|
);
|
||||||
|
return { type: 'continue' };
|
||||||
|
}
|
||||||
return { type: 'continue' };
|
return { type: 'continue' };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export type ModelTier = 'small' | 'medium' | 'large';
|
|||||||
const DEFAULT_MODELS: Readonly<Record<ModelTier, string>> = {
|
const DEFAULT_MODELS: Readonly<Record<ModelTier, string>> = {
|
||||||
small: 'claude-haiku-4-5-20251001',
|
small: 'claude-haiku-4-5-20251001',
|
||||||
medium: 'claude-sonnet-4-6',
|
medium: 'claude-sonnet-4-6',
|
||||||
large: 'claude-opus-4-7',
|
large: 'claude-opus-4-8',
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Resolve a model tier to a concrete model ID. */
|
/** Resolve a model tier to a concrete model ID. */
|
||||||
@@ -36,7 +36,16 @@ export function resolveModel(tier: ModelTier = 'medium'): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Whether a model supports adaptive thinking. Opus 4.6 and 4.7 only. */
|
/** Whether a model supports adaptive thinking. Opus 4.6, 4.7, and 4.8 only. */
|
||||||
export function supportsAdaptiveThinking(model: string): boolean {
|
export function supportsAdaptiveThinking(model: string): boolean {
|
||||||
return /opus-4-[67]/.test(model);
|
return /opus-4-[678]/.test(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether a model is in the Fable family. Fable's safety classifiers flag
|
||||||
|
* cybersecurity tasks and route them to Opus 4.8, so a security scan on Fable
|
||||||
|
* largely runs on Opus 4.8 anyway.
|
||||||
|
*/
|
||||||
|
export function isFableModel(model: string): boolean {
|
||||||
|
return /fable/i.test(model);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,6 +98,15 @@ export interface SystemInitMessage {
|
|||||||
permissionMode?: string;
|
permissionMode?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Emitted when a model refuses a request and the SDK falls back to another model (e.g. Fable 5 routing cybersecurity tasks to Opus 4.8). */
|
||||||
|
export interface ModelRefusalFallbackMessage {
|
||||||
|
type: 'system';
|
||||||
|
subtype: 'model_refusal_fallback';
|
||||||
|
original_model: string;
|
||||||
|
fallback_model: string;
|
||||||
|
api_refusal_category?: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
export interface UserMessage {
|
export interface UserMessage {
|
||||||
type: 'user';
|
type: 'user';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,6 +158,14 @@ export class AuditSession {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a human-readable note to the unified workflow log (e.g. a model
|
||||||
|
* refusal fallback). Independent of agent event logging.
|
||||||
|
*/
|
||||||
|
async logWorkflowNote(category: string, message: string): Promise<void> {
|
||||||
|
await this.workflowLogger.logEvent(category, message);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* End agent execution (mutex-protected)
|
* End agent execution (mutex-protected)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import fs from 'node:fs/promises';
|
import fs from 'node:fs/promises';
|
||||||
|
import { isFableModel, resolveModel } from '../ai/models.js';
|
||||||
import { formatDuration, formatTimestamp } from '../utils/formatting.js';
|
import { formatDuration, formatTimestamp } from '../utils/formatting.js';
|
||||||
import { LogStream } from './log-stream.js';
|
import { LogStream } from './log-stream.js';
|
||||||
import { generateWorkflowLogPath, type SessionMetadata } from './utils.js';
|
import { generateWorkflowLogPath, type SessionMetadata } from './utils.js';
|
||||||
@@ -77,18 +78,31 @@ export class WorkflowLogger {
|
|||||||
* Write header to log file
|
* Write header to log file
|
||||||
*/
|
*/
|
||||||
private async writeHeader(): Promise<void> {
|
private async writeHeader(): Promise<void> {
|
||||||
const header = [
|
const lines = [
|
||||||
`================================================================================`,
|
`================================================================================`,
|
||||||
`Shannon Pentest - Workflow Log`,
|
`Shannon Pentest - Workflow Log`,
|
||||||
`================================================================================`,
|
`================================================================================`,
|
||||||
`Workflow ID: ${this.workflowId ?? this.sessionMetadata.id}`,
|
`Workflow ID: ${this.workflowId ?? this.sessionMetadata.id}`,
|
||||||
`Target URL: ${this.sessionMetadata.webUrl}`,
|
`Target URL: ${this.sessionMetadata.webUrl}`,
|
||||||
`Started: ${formatTimestamp()}`,
|
`Started: ${formatTimestamp()}`,
|
||||||
`================================================================================`,
|
];
|
||||||
``,
|
|
||||||
].join('\n');
|
|
||||||
|
|
||||||
return this.logStream.write(header);
|
// Surface Fable usage: its safety classifiers route cybersecurity tasks to
|
||||||
|
// Opus 4.8, so those phases run on Opus 4.8 regardless of the tier setting.
|
||||||
|
const fableTiers = (['small', 'medium', 'large'] as const)
|
||||||
|
.map((tier) => ({ tier, model: resolveModel(tier) }))
|
||||||
|
.filter(({ model }) => isFableModel(model));
|
||||||
|
if (fableTiers.length > 0) {
|
||||||
|
const tierList = fableTiers.map(({ tier, model }) => `${tier} (${model})`).join(', ');
|
||||||
|
lines.push(
|
||||||
|
`Note: ${tierList} set to a Fable model. Fable's safety classifiers`,
|
||||||
|
` route cybersecurity tasks to Opus 4.8, so those phases run on Opus 4.8.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
lines.push(`================================================================================`, ``);
|
||||||
|
|
||||||
|
return this.logStream.write(lines.join('\n'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -280,6 +280,32 @@ function classifySdkError(sdkError: SDKAssistantMessageError, authType: string):
|
|||||||
sdkError,
|
sdkError,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
case 'overloaded':
|
||||||
|
return err(
|
||||||
|
new PentestError(`Anthropic API is overloaded. Wait a few moments and try again.`, 'network', true, {
|
||||||
|
authType,
|
||||||
|
sdkError,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
case 'model_not_found':
|
||||||
|
return err(
|
||||||
|
new PentestError(
|
||||||
|
`Configured model is not available for this account. Check ANTHROPIC_*_MODEL in .env.`,
|
||||||
|
'config',
|
||||||
|
false,
|
||||||
|
{ authType, sdkError },
|
||||||
|
),
|
||||||
|
);
|
||||||
|
case 'oauth_org_not_allowed':
|
||||||
|
return err(
|
||||||
|
new PentestError(
|
||||||
|
`This credential's organization is not allowed. Check your ${authType} in .env.`,
|
||||||
|
'config',
|
||||||
|
false,
|
||||||
|
{ authType, sdkError },
|
||||||
|
ErrorCode.AUTH_FAILED,
|
||||||
|
),
|
||||||
|
);
|
||||||
default:
|
default:
|
||||||
return err(
|
return err(
|
||||||
new PentestError(
|
new PentestError(
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 61 KiB |
@@ -23,6 +23,8 @@ ANTHROPIC_API_KEY=your-api-key
|
|||||||
CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000
|
CLAUDE_CODE_MAX_OUTPUT_TOKENS=64000
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Each tier can be pointed at any Claude model via `ANTHROPIC_SMALL_MODEL` / `ANTHROPIC_MEDIUM_MODEL` / `ANTHROPIC_LARGE_MODEL` (or the setup wizard). If you set a tier to `claude-fable-5`, note that Fable's safety classifiers route cybersecurity tasks to Opus 4.8, so those phases run on Opus 4.8 regardless.
|
||||||
|
|
||||||
## AWS Bedrock
|
## AWS Bedrock
|
||||||
|
|
||||||
Run `npx @keygraph/shannon setup` and select **AWS Bedrock**. The wizard prompts for region, bearer token, and model IDs.
|
Run `npx @keygraph/shannon setup` and select **AWS Bedrock**. The wizard prompts for region, bearer token, and model IDs.
|
||||||
@@ -35,7 +37,7 @@ export AWS_REGION=us-east-1
|
|||||||
export AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
export AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
||||||
export ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
export ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
||||||
export ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
export ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
||||||
export ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-7
|
export ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Source-build `.env` equivalent:
|
Source-build `.env` equivalent:
|
||||||
@@ -46,7 +48,7 @@ AWS_REGION=us-east-1
|
|||||||
AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
||||||
ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
||||||
ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
||||||
ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-7
|
ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Shannon Lite uses three model tiers:
|
Shannon Lite uses three model tiers:
|
||||||
@@ -72,7 +74,7 @@ export ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id
|
|||||||
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your-sa-key.json
|
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your-sa-key.json
|
||||||
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
||||||
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
export ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
export ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Source-build `.env` equivalent:
|
Source-build `.env` equivalent:
|
||||||
@@ -84,7 +86,7 @@ ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id
|
|||||||
GOOGLE_APPLICATION_CREDENTIALS=./credentials/google-sa-key.json
|
GOOGLE_APPLICATION_CREDENTIALS=./credentials/google-sa-key.json
|
||||||
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
||||||
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Set `CLOUD_ML_REGION=global` for global endpoints, or use a specific region like `us-east5`. Some models may not be available on global endpoints.
|
Set `CLOUD_ML_REGION=global` for global endpoints, or use a specific region like `us-east5`. Some models may not be available on global endpoints.
|
||||||
@@ -105,7 +107,7 @@ export ANTHROPIC_BASE_URL=https://your-proxy.example.com
|
|||||||
export ANTHROPIC_AUTH_TOKEN=your-auth-token
|
export ANTHROPIC_AUTH_TOKEN=your-auth-token
|
||||||
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
||||||
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
export ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
export ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Source-build `.env` equivalent:
|
Source-build `.env` equivalent:
|
||||||
@@ -115,5 +117,5 @@ ANTHROPIC_BASE_URL=https://your-proxy.example.com
|
|||||||
ANTHROPIC_AUTH_TOKEN=your-auth-token
|
ANTHROPIC_AUTH_TOKEN=your-auth-token
|
||||||
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
||||||
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ login_flow:
|
|||||||
|
|
||||||
## Adaptive Thinking
|
## Adaptive Thinking
|
||||||
|
|
||||||
Claude decides when and how deeply to reason on Opus 4.6 and 4.7. This is enabled by default whenever a tier resolves to one of these models.
|
Claude decides when and how deeply to reason on Opus 4.6, 4.7, and 4.8. This is enabled by default whenever a tier resolves to one of these models.
|
||||||
|
|
||||||
- `npx` mode: `npx @keygraph/shannon setup` prompts you during the wizard.
|
- `npx` mode: `npx @keygraph/shannon setup` prompts you during the wizard.
|
||||||
- Source-build mode: set `CLAUDE_ADAPTIVE_THINKING=false` in `.env` or export it in your shell.
|
- Source-build mode: set `CLAUDE_ADAPTIVE_THINKING=false` in `.env` or export it in your shell.
|
||||||
|
|||||||
+7
-7
@@ -548,7 +548,7 @@ login_flow:
|
|||||||
|
|
||||||
## Adaptive Thinking
|
## Adaptive Thinking
|
||||||
|
|
||||||
Claude decides when and how deeply to reason on Opus 4.6 and 4.7. This is enabled by default whenever a tier resolves to one of these models.
|
Claude decides when and how deeply to reason on Opus 4.6, 4.7, and 4.8. This is enabled by default whenever a tier resolves to one of these models.
|
||||||
|
|
||||||
- `npx` mode: `npx @keygraph/shannon setup` prompts you during the wizard.
|
- `npx` mode: `npx @keygraph/shannon setup` prompts you during the wizard.
|
||||||
- Source-build mode: set `CLAUDE_ADAPTIVE_THINKING=false` in `.env` or export it in your shell.
|
- Source-build mode: set `CLAUDE_ADAPTIVE_THINKING=false` in `.env` or export it in your shell.
|
||||||
@@ -606,7 +606,7 @@ export AWS_REGION=us-east-1
|
|||||||
export AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
export AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
||||||
export ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
export ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
||||||
export ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
export ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
||||||
export ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-7
|
export ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Source-build `.env` equivalent:
|
Source-build `.env` equivalent:
|
||||||
@@ -617,7 +617,7 @@ AWS_REGION=us-east-1
|
|||||||
AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
AWS_BEARER_TOKEN_BEDROCK=your-bearer-token
|
||||||
ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
ANTHROPIC_SMALL_MODEL=us.anthropic.claude-haiku-4-5-20251001-v1:0
|
||||||
ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
ANTHROPIC_MEDIUM_MODEL=us.anthropic.claude-sonnet-4-6
|
||||||
ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-7
|
ANTHROPIC_LARGE_MODEL=us.anthropic.claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Shannon Lite uses three model tiers:
|
Shannon Lite uses three model tiers:
|
||||||
@@ -643,7 +643,7 @@ export ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id
|
|||||||
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your-sa-key.json
|
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your-sa-key.json
|
||||||
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
||||||
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
export ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
export ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Source-build `.env` equivalent:
|
Source-build `.env` equivalent:
|
||||||
@@ -655,7 +655,7 @@ ANTHROPIC_VERTEX_PROJECT_ID=your-gcp-project-id
|
|||||||
GOOGLE_APPLICATION_CREDENTIALS=./credentials/google-sa-key.json
|
GOOGLE_APPLICATION_CREDENTIALS=./credentials/google-sa-key.json
|
||||||
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5@20251001
|
||||||
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Set `CLOUD_ML_REGION=global` for global endpoints, or use a specific region like `us-east5`. Some models may not be available on global endpoints.
|
Set `CLOUD_ML_REGION=global` for global endpoints, or use a specific region like `us-east5`. Some models may not be available on global endpoints.
|
||||||
@@ -676,7 +676,7 @@ export ANTHROPIC_BASE_URL=https://your-proxy.example.com
|
|||||||
export ANTHROPIC_AUTH_TOKEN=your-auth-token
|
export ANTHROPIC_AUTH_TOKEN=your-auth-token
|
||||||
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
export ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
||||||
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
export ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
export ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
export ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
Source-build `.env` equivalent:
|
Source-build `.env` equivalent:
|
||||||
@@ -686,7 +686,7 @@ ANTHROPIC_BASE_URL=https://your-proxy.example.com
|
|||||||
ANTHROPIC_AUTH_TOKEN=your-auth-token
|
ANTHROPIC_AUTH_TOKEN=your-auth-token
|
||||||
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
ANTHROPIC_SMALL_MODEL=claude-haiku-4-5-20251001
|
||||||
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
ANTHROPIC_MEDIUM_MODEL=claude-sonnet-4-6
|
||||||
ANTHROPIC_LARGE_MODEL=claude-opus-4-7
|
ANTHROPIC_LARGE_MODEL=claude-opus-4-8
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
Generated
+44
-45
@@ -7,8 +7,8 @@ settings:
|
|||||||
catalogs:
|
catalogs:
|
||||||
default:
|
default:
|
||||||
'@anthropic-ai/claude-agent-sdk':
|
'@anthropic-ai/claude-agent-sdk':
|
||||||
specifier: ^0.2.114
|
specifier: ^0.3.173
|
||||||
version: 0.2.114
|
version: 0.3.173
|
||||||
|
|
||||||
importers:
|
importers:
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ importers:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@anthropic-ai/claude-agent-sdk':
|
'@anthropic-ai/claude-agent-sdk':
|
||||||
specifier: 'catalog:'
|
specifier: 'catalog:'
|
||||||
version: 0.2.114(zod@4.3.6)
|
version: 0.3.173(@anthropic-ai/sdk@0.93.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6)
|
||||||
'@temporalio/activity':
|
'@temporalio/activity':
|
||||||
specifier: ^1.11.0
|
specifier: ^1.11.0
|
||||||
version: 1.15.0
|
version: 1.15.0
|
||||||
@@ -88,58 +88,60 @@ importers:
|
|||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-darwin-arm64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.173':
|
||||||
resolution: {integrity: sha512-0/6LWrNilWpmiX6Xrj5plsBmCrCdKGERgAlKUZQEJZplnfuweFAJu7WXZB4KBaUpGlPO91zB/yqDh6kp5aZFbA==}
|
resolution: {integrity: sha512-McW1toJ4Qdo/i7bHnsiFMm2AtyCiK/5V90WgL7M9ZO9llrJr3riGRdBlRGHvWnS7rKuv5ttj4/SuBkLoL9o75A==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-darwin-x64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.173':
|
||||||
resolution: {integrity: sha512-sOHxq1rEO/KZg2iEZILTPn62lMRRMPqtxKx41uGLi3xjVDrAej6Ury9dDZjYBKkK9n4kBylXV0Oom2CZ14dDYw==}
|
resolution: {integrity: sha512-m2Oh1pQ69IUg6DSH6n1nAAAtRq+G7J2B/CKTbTfDAEmg5t0lzakZV9l28GZrlP21xl+PIg71dkiJ5u94KYgpRw==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.173':
|
||||||
resolution: {integrity: sha512-Mhd7bumTwWvkgjSJnYvCgyt8DfmLiUoK92mfvAKxHX7i5YSw+h5Kprqh2Cap+2SBbpwZvnwIoEYGCxhGwE5ddg==}
|
resolution: {integrity: sha512-uu8MnPwFBc9ayFg5c94aHaqJVLS51oHNVxHwud4nK27GliP5WoME3F7pmm1N/Jyy2ry2E2CLNnsAm5l3zemfYA==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-arm64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.173':
|
||||||
resolution: {integrity: sha512-j/SfEoN6+fyEsp8EuPe+xKcGfsZtaBmdUUH+YSRk5H/lYgy38yNsDhdt+AJMQcdMKfHsiwZ3Y9Ajoe9G9wNwHQ==}
|
resolution: {integrity: sha512-Vb64WJOD2D9tKn/i0ErmLbO6I1187xTwL/kxEANjg4L1FGQnvdYBnZ6J6jU6+x8UgcuIi82imHROQp80gbPW2w==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.173':
|
||||||
resolution: {integrity: sha512-c1URsameGHAcghen+mY6jvr2oypiAPHXJIdP4huxR25zPdXWv2x+BCy+vcRVeajsq4VmFzAyQJwaM+BXkmXjAw==}
|
resolution: {integrity: sha512-ofKxyp/N8+LLSrClt+dJo0laCHDzmBgmN8+Q+zabJ54Jqc1KXee68UsziE7kLCqGbOSY7rsIK9d22T1uQyZkUw==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-x64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-x64@0.3.173':
|
||||||
resolution: {integrity: sha512-wbaExKDleLlm2zHEhb74GKMLVhtO0IUmFhdimQcdL6CdTkmDE8ZJi53tYWE9+jq+XWNRXoM2yEmKPzXoUmsJng==}
|
resolution: {integrity: sha512-0l9L5O+Uiw8gq9mu2NqGSYcSmX8RJMAh9GkGacTJqJbkfHCiFxqZmWBWODOt6HP7PTFCV+yMzQK/xJQjnag/jw==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-win32-arm64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.173':
|
||||||
resolution: {integrity: sha512-qeWdUpQymcKCA92osPmffG4QogrOSvuffPvm6c2OlMDjCPYs8vKG7bSe1Vq5tP9tfBszKPVJWBDh+2ANkNissQ==}
|
resolution: {integrity: sha512-aulIrBYjFDm+S5kl4CxC8A3KUiTDKLHoKV46Mat64E+skGEyBkC7WzZAGbpGKB2y8KZo1WbrwJTGefgyHMpDhw==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-win32-x64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-win32-x64@0.3.173':
|
||||||
resolution: {integrity: sha512-nVr43WwsKvWA6rojw15qBS/f31srukdLxy1KwKzpftlpmkzQ9Lh8uhIafOmoIPzz67f8VJ8JqHE0caA5YrhX9A==}
|
resolution: {integrity: sha512-HjGkfDlNLI3Kh9NIUfevJ3SZY8Xv3td4zx5Cz3YE0VPrrjIkRvdEv9K6WTjT94tlS0TUXQS/kFT+NCmoGXuvZQ==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk@0.2.114':
|
'@anthropic-ai/claude-agent-sdk@0.3.173':
|
||||||
resolution: {integrity: sha512-plJ+j17jew9tDMHir/90hXrwoB8cZ9GrIyG19zIJcFyQ8pVhRXjZRJCtF2ElfPoiwkxMmNu1Klqyui4xP4shPg==}
|
resolution: {integrity: sha512-BsdL223y7vCUJA9uBW9osSrhufvwIT+J94IBkh83v+wjyjoBIwLXREdacFabair70bGNdtkw6cWCaYNThSQg7A==}
|
||||||
engines: {node: '>=18.0.0'}
|
engines: {node: '>=18.0.0'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
'@anthropic-ai/sdk': '>=0.93.0'
|
||||||
|
'@modelcontextprotocol/sdk': ^1.29.0
|
||||||
zod: ^4.0.0
|
zod: ^4.0.0
|
||||||
|
|
||||||
'@anthropic-ai/sdk@0.81.0':
|
'@anthropic-ai/sdk@0.93.0':
|
||||||
resolution: {integrity: sha512-D4K5PvEV6wPiRtVlVsJHIUhHAmOZ6IT/I9rKlTf84gR7GyyAurPJK7z9BOf/AZqC5d1DhYQGJNKRmV+q8dGhgw==}
|
resolution: {integrity: sha512-q9vaSZQVFx6B/gPxetGYfLXSJD5v0sOmh0OpZDq7yCrTSA+Rscvrtyol7JJTW40wEpQB4U1B4JXzxQitbQ3CAA==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
zod: ^3.25.0 || ^4.0.0
|
zod: ^3.25.0 || ^4.0.0
|
||||||
@@ -1668,49 +1670,46 @@ packages:
|
|||||||
|
|
||||||
snapshots:
|
snapshots:
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-darwin-arm64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-darwin-x64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-darwin-x64@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-arm64-musl@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-arm64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-arm64@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-x64-musl@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-x64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-linux-x64@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-win32-arm64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-win32-arm64@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk-win32-x64@0.2.114':
|
'@anthropic-ai/claude-agent-sdk-win32-x64@0.3.173':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@anthropic-ai/claude-agent-sdk@0.2.114(zod@4.3.6)':
|
'@anthropic-ai/claude-agent-sdk@0.3.173(@anthropic-ai/sdk@0.93.0(zod@4.3.6))(@modelcontextprotocol/sdk@1.29.0(zod@4.3.6))(zod@4.3.6)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@anthropic-ai/sdk': 0.81.0(zod@4.3.6)
|
'@anthropic-ai/sdk': 0.93.0(zod@4.3.6)
|
||||||
'@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6)
|
'@modelcontextprotocol/sdk': 1.29.0(zod@4.3.6)
|
||||||
zod: 4.3.6
|
zod: 4.3.6
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-darwin-arm64': 0.3.173
|
||||||
'@anthropic-ai/claude-agent-sdk-darwin-x64': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-darwin-x64': 0.3.173
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-arm64': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-linux-arm64': 0.3.173
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-linux-arm64-musl': 0.3.173
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-x64': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-linux-x64': 0.3.173
|
||||||
'@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-linux-x64-musl': 0.3.173
|
||||||
'@anthropic-ai/claude-agent-sdk-win32-arm64': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-win32-arm64': 0.3.173
|
||||||
'@anthropic-ai/claude-agent-sdk-win32-x64': 0.2.114
|
'@anthropic-ai/claude-agent-sdk-win32-x64': 0.3.173
|
||||||
transitivePeerDependencies:
|
|
||||||
- '@cfworker/json-schema'
|
|
||||||
- supports-color
|
|
||||||
|
|
||||||
'@anthropic-ai/sdk@0.81.0(zod@4.3.6)':
|
'@anthropic-ai/sdk@0.93.0(zod@4.3.6)':
|
||||||
dependencies:
|
dependencies:
|
||||||
json-schema-to-ts: 3.1.1
|
json-schema-to-ts: 3.1.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
|
|||||||
+1
-1
@@ -2,4 +2,4 @@ packages:
|
|||||||
- "apps/*"
|
- "apps/*"
|
||||||
|
|
||||||
catalog:
|
catalog:
|
||||||
"@anthropic-ai/claude-agent-sdk": ^0.2.114
|
"@anthropic-ai/claude-agent-sdk": ^0.3.173
|
||||||
|
|||||||
Reference in New Issue
Block a user