@cnwenf/occ 2.1.311 → 2.1.313

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.
Files changed (2) hide show
  1. package/dist/cli.js +175 -38
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bun
2
- globalThis.MACRO={"VERSION":"2.1.311","BINARY_NAME":"occ","BUILD_TIME":"2026-08-24T17:45:33.806Z","FEEDBACK_CHANNEL":"","ISSUES_EXPLAINER":"","NATIVE_PACKAGE_URL":"","PACKAGE_URL":"@cnwenf/occ","VERSION_CHANGELOG":""};
2
+ globalThis.MACRO={"VERSION":"2.1.313","BINARY_NAME":"occ","BUILD_TIME":"2026-08-26T18:15:46.386Z","FEEDBACK_CHANNEL":"","ISSUES_EXPLAINER":"","NATIVE_PACKAGE_URL":"","PACKAGE_URL":"@cnwenf/occ","VERSION_CHANGELOG":""};
3
3
  // @bun
4
4
  var __create = Object.create;
5
5
  var __getProtoOf = Object.getPrototypeOf;
@@ -2010,7 +2010,6 @@ __export(exports_state, {
2010
2010
  setScheduledTasksEnabled: () => setScheduledTasksEnabled,
2011
2011
  setQuestionPreviewFormat: () => setQuestionPreviewFormat,
2012
2012
  setPromptId: () => setPromptId,
2013
- setPromptCache1hEligible: () => setPromptCache1hEligible,
2014
2013
  setPromptCache1hAllowlist: () => setPromptCache1hAllowlist,
2015
2014
  setProjectRoot: () => setProjectRoot,
2016
2015
  setOriginalCwd: () => setOriginalCwd,
@@ -2131,7 +2130,6 @@ __export(exports_state, {
2131
2130
  getRegisteredHooks: () => getRegisteredHooks,
2132
2131
  getQuestionPreviewFormat: () => getQuestionPreviewFormat,
2133
2132
  getPromptId: () => getPromptId,
2134
- getPromptCache1hEligible: () => getPromptCache1hEligible,
2135
2133
  getPromptCache1hAllowlist: () => getPromptCache1hAllowlist,
2136
2134
  getProjectRoot: () => getProjectRoot,
2137
2135
  getPrCounter: () => getPrCounter,
@@ -2320,7 +2318,6 @@ function getInitialState() {
2320
2318
  hasDevChannels: false,
2321
2319
  sessionProjectDir: null,
2322
2320
  promptCache1hAllowlist: null,
2323
- promptCache1hEligible: null,
2324
2321
  afkModeHeaderLatched: null,
2325
2322
  fastModeHeaderLatched: null,
2326
2323
  cacheEditingHeaderLatched: null,
@@ -3143,12 +3140,6 @@ function getPromptCache1hAllowlist() {
3143
3140
  function setPromptCache1hAllowlist(allowlist) {
3144
3141
  STATE.promptCache1hAllowlist = allowlist;
3145
3142
  }
3146
- function getPromptCache1hEligible() {
3147
- return STATE.promptCache1hEligible;
3148
- }
3149
- function setPromptCache1hEligible(eligible) {
3150
- STATE.promptCache1hEligible = eligible;
3151
- }
3152
3143
  function getAfkModeHeaderLatched() {
3153
3144
  return STATE.afkModeHeaderLatched;
3154
3145
  }
@@ -59322,7 +59313,39 @@ function hasUnescapedEmptyParens(str) {
59322
59313
  }
59323
59314
  return false;
59324
59315
  }
59325
- function validatePermissionRule(rule) {
59316
+ function isOperatorToken(token) {
59317
+ return OPERATOR_TOKEN_RE.test(token);
59318
+ }
59319
+ function hasUnescapedStar(str) {
59320
+ for (let i2 = 0;i2 < str.length; i2++) {
59321
+ if (str[i2] === "*" && !isEscaped(str, i2))
59322
+ return true;
59323
+ }
59324
+ return false;
59325
+ }
59326
+ function wildcardBeforeSubcommand(content) {
59327
+ if (content.endsWith(":*"))
59328
+ return;
59329
+ const tokens = content.trim().split(/\s+/).filter(Boolean);
59330
+ const first = tokens[0];
59331
+ if (tokens.length < 3 || first === undefined || hasUnescapedStar(first)) {
59332
+ return;
59333
+ }
59334
+ let sawWildcard = false;
59335
+ for (const token of tokens.slice(1)) {
59336
+ if (isOperatorToken(token))
59337
+ return;
59338
+ if (hasUnescapedStar(token)) {
59339
+ sawWildcard = true;
59340
+ continue;
59341
+ }
59342
+ if (token.startsWith("-"))
59343
+ continue;
59344
+ return sawWildcard ? first : undefined;
59345
+ }
59346
+ return;
59347
+ }
59348
+ function validatePermissionRule(rule, behavior) {
59326
59349
  if (!rule || rule.trim() === "") {
59327
59350
  return { valid: false, error: "Permission rule cannot be empty" };
59328
59351
  }
@@ -59406,6 +59429,18 @@ function validatePermissionRule(rule) {
59406
59429
  examples: ["Bash(npm:*)", "Bash(git:*)"]
59407
59430
  };
59408
59431
  }
59432
+ if (behavior === "allow") {
59433
+ const flaggedCommand = wildcardBeforeSubcommand(content);
59434
+ if (flaggedCommand !== undefined) {
59435
+ const isGit = flaggedCommand === "git";
59436
+ const gitNote = isGit ? " For git, options such as -c and --exec-path can run arbitrary commands." : "";
59437
+ const gitExample = isGit ? " (for example Bash(git status *))" : "";
59438
+ return {
59439
+ valid: true,
59440
+ warning: `${permissionRuleValueToString(parsed)} has a wildcard before the rest of the command, so it also matches any options inserted at that position and approves them without a prompt.${gitNote} Replace that * with the exact value you mean, or only use * after the subcommand${gitExample}.`
59441
+ };
59442
+ }
59443
+ }
59409
59444
  }
59410
59445
  if (isFilePatternTool(parsed.toolName) && parsed.ruleContent !== undefined) {
59411
59446
  const content = parsed.ruleContent;
@@ -59445,13 +59480,14 @@ function validatePermissionRule(rule) {
59445
59480
  }
59446
59481
  return { valid: true };
59447
59482
  }
59448
- var PermissionRuleSchema;
59483
+ var OPERATOR_TOKEN_RE, PermissionRuleSchema;
59449
59484
  var init_permissionValidation = __esm(() => {
59450
59485
  init_v4();
59451
59486
  init_mcpStringUtils();
59452
59487
  init_permissionRuleParser();
59453
59488
  init_stringUtils();
59454
59489
  init_toolValidationConfig();
59490
+ OPERATOR_TOKEN_RE = /^(?:[|&;<>]|\d+[<>])/;
59455
59491
  PermissionRuleSchema = lazySchema(() => exports_external.string().superRefine((val, ctx) => {
59456
59492
  const result = validatePermissionRule(val);
59457
59493
  if (!result.valid) {
@@ -59647,6 +59683,8 @@ var init_types2 = __esm(() => {
59647
59683
  }).optional().describe("Override spinner tips. tips: array of tip strings. excludeDefault: if true, only show custom tips (default: false)."),
59648
59684
  syntaxHighlightingDisabled: exports_external.boolean().optional().describe("Whether to disable syntax highlighting in diffs"),
59649
59685
  terminalTitleFromRename: exports_external.boolean().optional().describe("Whether /rename updates the terminal tab title (defaults to true). Set to false to keep auto-generated topic titles."),
59686
+ promptCacheTtl: exports_external.enum(["5m", "1h"]).optional().catch(undefined).describe('Prompt cache TTL for the main conversation (interactive, -p and SDK turns, plus the helpers that run inline with it): "5m" or "1h". Unset = automatic: 1 hour on a Claude subscription within its usage limits, 5 minutes on an API key, Bedrock, Vertex or Foundry. 1-hour cache writes are billed at a higher rate; the cache stays warm across longer breaks. The CLAUDE_CODE_PROMPT_CACHE_TTL environment variable takes precedence.'),
59687
+ subagentPromptCacheTtl: exports_external.enum(["5m", "1h"]).optional().catch(undefined).describe('Prompt cache TTL for everything outside the main conversation \u2014 subagents, workflows, background and helper requests: "5m" or "1h". Unset = automatic (5 minutes unless ENABLE_PROMPT_CACHING_1H=1). The CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL environment variable takes precedence.'),
59650
59688
  autoScrollEnabled: exports_external.boolean().optional().describe("Whether the conversation auto-scrolls to the bottom on new output in fullscreen mode (defaults to true). Set to false to keep the scroll position stable."),
59651
59689
  tui: exports_external.enum(["default", "fullscreen"]).optional().describe('Terminal UI renderer. "fullscreen" uses the flicker-free alt-screen renderer with virtualized scrollback (equivalent to CLAUDE_CODE_NO_FLICKER=1). "default" uses the classic main-screen renderer.'),
59652
59690
  axScreenReader: exports_external.boolean().optional().describe("Render screen-reader friendly output (flat text, no decorative borders or animations). Overridden by the CLAUDE_AX_SCREEN_READER env var and the --ax-screen-reader CLI flag."),
@@ -100362,6 +100400,7 @@ __export(exports_betas, {
100362
100400
  PROMPT_CACHING_SCOPE_BETA_HEADER: () => PROMPT_CACHING_SCOPE_BETA_HEADER,
100363
100401
  INTERLEAVED_THINKING_BETA_HEADER: () => INTERLEAVED_THINKING_BETA_HEADER,
100364
100402
  FAST_MODE_BETA_HEADER: () => FAST_MODE_BETA_HEADER,
100403
+ EXTENDED_CACHE_TTL_BETA_HEADER: () => EXTENDED_CACHE_TTL_BETA_HEADER,
100365
100404
  EFFORT_BETA_HEADER: () => EFFORT_BETA_HEADER,
100366
100405
  CONTEXT_MANAGEMENT_BETA_HEADER: () => CONTEXT_MANAGEMENT_BETA_HEADER,
100367
100406
  CONTEXT_1M_BETA_HEADER: () => CONTEXT_1M_BETA_HEADER,
@@ -100372,7 +100411,7 @@ __export(exports_betas, {
100372
100411
  AFK_MODE_BETA_HEADER: () => AFK_MODE_BETA_HEADER,
100373
100412
  ADVISOR_BETA_HEADER: () => ADVISOR_BETA_HEADER
100374
100413
  });
100375
- var CLAUDE_CODE_20250219_BETA_HEADER = "claude-code-20250219", INTERLEAVED_THINKING_BETA_HEADER = "interleaved-thinking-2025-05-14", CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07", CONTEXT_MANAGEMENT_BETA_HEADER = "context-management-2025-06-27", STRUCTURED_OUTPUTS_BETA_HEADER = "structured-outputs-2025-12-15", WEB_SEARCH_BETA_HEADER = "web-search-2025-03-05", TOOL_SEARCH_BETA_HEADER_1P = "advanced-tool-use-2025-11-20", TOOL_SEARCH_BETA_HEADER_3P = "tool-search-tool-2025-10-19", EFFORT_BETA_HEADER = "effort-2025-11-24", TASK_BUDGETS_BETA_HEADER = "task-budgets-2026-03-13", PROMPT_CACHING_SCOPE_BETA_HEADER = "prompt-caching-scope-2026-01-05", FAST_MODE_BETA_HEADER = "fast-mode-2026-02-01", REDACT_THINKING_BETA_HEADER = "redact-thinking-2026-02-12", TOKEN_EFFICIENT_TOOLS_BETA_HEADER = "token-efficient-tools-2026-03-28", SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER, AFK_MODE_BETA_HEADER, CLI_INTERNAL_BETA_HEADER, ADVISOR_BETA_HEADER = "advisor-tool-2026-03-01", BEDROCK_EXTRA_PARAMS_HEADERS, VERTEX_COUNT_TOKENS_ALLOWED_BETAS, CACHE_EDITING_BETA_HEADER = "";
100414
+ var CLAUDE_CODE_20250219_BETA_HEADER = "claude-code-20250219", INTERLEAVED_THINKING_BETA_HEADER = "interleaved-thinking-2025-05-14", CONTEXT_1M_BETA_HEADER = "context-1m-2025-08-07", CONTEXT_MANAGEMENT_BETA_HEADER = "context-management-2025-06-27", STRUCTURED_OUTPUTS_BETA_HEADER = "structured-outputs-2025-12-15", WEB_SEARCH_BETA_HEADER = "web-search-2025-03-05", TOOL_SEARCH_BETA_HEADER_1P = "advanced-tool-use-2025-11-20", TOOL_SEARCH_BETA_HEADER_3P = "tool-search-tool-2025-10-19", EFFORT_BETA_HEADER = "effort-2025-11-24", TASK_BUDGETS_BETA_HEADER = "task-budgets-2026-03-13", PROMPT_CACHING_SCOPE_BETA_HEADER = "prompt-caching-scope-2026-01-05", EXTENDED_CACHE_TTL_BETA_HEADER = "extended-cache-ttl-2025-04-11", FAST_MODE_BETA_HEADER = "fast-mode-2026-02-01", REDACT_THINKING_BETA_HEADER = "redact-thinking-2026-02-12", TOKEN_EFFICIENT_TOOLS_BETA_HEADER = "token-efficient-tools-2026-03-28", SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER, AFK_MODE_BETA_HEADER, CLI_INTERNAL_BETA_HEADER, ADVISOR_BETA_HEADER = "advisor-tool-2026-03-01", BEDROCK_EXTRA_PARAMS_HEADERS, VERTEX_COUNT_TOKENS_ALLOWED_BETAS, CACHE_EDITING_BETA_HEADER = "";
100376
100415
  var init_betas = __esm(() => {
100377
100416
  init_featureFlags();
100378
100417
  SUMMARIZE_CONNECTOR_TEXT_BETA_HEADER = feature("CONNECTOR_TEXT") ? "summarize-connector-text-2026-03-13" : "";
@@ -100850,13 +100889,28 @@ function formatPrice(price) {
100850
100889
  function formatModelPricing(costs) {
100851
100890
  return `${formatPrice(costs.inputTokens)}/${formatPrice(costs.outputTokens)} per Mtok`;
100852
100891
  }
100853
- var COST_TIER_3_15, COST_TIER_15_75, COST_TIER_5_25, COST_TIER_30_150, COST_TIER_10_50, COST_HAIKU_35, COST_HAIKU_45, DEFAULT_UNKNOWN_MODEL_COST, MODEL_COSTS;
100892
+ function getModelPricingString(model) {
100893
+ const shortName = getCanonicalName(model);
100894
+ const costs = MODEL_COSTS[shortName];
100895
+ if (!costs)
100896
+ return;
100897
+ return formatModelPricing(costs);
100898
+ }
100899
+ var COST_TIER_2_10, COST_TIER_3_15, COST_TIER_15_75, COST_TIER_5_25, COST_TIER_30_150, COST_TIER_10_50, COST_HAIKU_35, COST_HAIKU_45, DEFAULT_UNKNOWN_MODEL_COST, MODEL_COSTS;
100854
100900
  var init_modelCost = __esm(() => {
100855
100901
  init_analytics();
100856
100902
  init_state();
100857
100903
  init_fastMode();
100858
100904
  init_configs();
100859
100905
  init_model();
100906
+ COST_TIER_2_10 = {
100907
+ inputTokens: 2,
100908
+ outputTokens: 10,
100909
+ promptCacheWriteTokens: 2.5,
100910
+ promptCacheWrite1hTokens: 4,
100911
+ promptCacheReadTokens: 0.2,
100912
+ webSearchRequests: 0.01
100913
+ };
100860
100914
  COST_TIER_3_15 = {
100861
100915
  inputTokens: 3,
100862
100916
  outputTokens: 15,
@@ -100922,6 +100976,7 @@ var init_modelCost = __esm(() => {
100922
100976
  [firstPartyNameToCanonical(CLAUDE_SONNET_4_CONFIG.firstParty)]: COST_TIER_3_15,
100923
100977
  [firstPartyNameToCanonical(CLAUDE_SONNET_4_5_CONFIG.firstParty)]: COST_TIER_3_15,
100924
100978
  [firstPartyNameToCanonical(CLAUDE_SONNET_4_6_CONFIG.firstParty)]: COST_TIER_3_15,
100979
+ [firstPartyNameToCanonical(CLAUDE_SONNET_5_CONFIG.firstParty)]: COST_TIER_2_10,
100925
100980
  [firstPartyNameToCanonical(CLAUDE_OPUS_4_CONFIG.firstParty)]: COST_TIER_15_75,
100926
100981
  [firstPartyNameToCanonical(CLAUDE_OPUS_4_1_CONFIG.firstParty)]: COST_TIER_15_75,
100927
100982
  [firstPartyNameToCanonical(CLAUDE_OPUS_4_5_CONFIG.firstParty)]: COST_TIER_5_25,
@@ -140249,6 +140304,10 @@ function shouldIncludeFirstPartyOnlyBetas() {
140249
140304
  function shouldUseGlobalCacheScope() {
140250
140305
  return getAPIProvider() === "firstParty" && !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS);
140251
140306
  }
140307
+ function shouldSendExtendedCacheTtlBeta() {
140308
+ const provider5 = getAPIProvider();
140309
+ return (provider5 === "firstParty" || provider5 === "bedrock" || provider5 === "vertex" || provider5 === "foundry") && !isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS);
140310
+ }
140252
140311
  function getMergedBetas(model, options) {
140253
140312
  const baseBetas = [...getModelBetas(model)];
140254
140313
  if (options?.isAgenticQuery) {
@@ -385275,6 +385334,35 @@ function hasQuotedBracketCloserInConditional(command4) {
385275
385334
  }
385276
385335
  return false;
385277
385336
  }
385337
+ function hasDanglingBooleanOperator(command4) {
385338
+ if (!command4.includes("&&") && !command4.includes("||"))
385339
+ return false;
385340
+ let inSingle = false;
385341
+ let inDouble = false;
385342
+ let lastBoolOpEnd = -1;
385343
+ for (let i6 = 0;i6 < command4.length; i6++) {
385344
+ const ch2 = command4[i6];
385345
+ if (ch2 === "\\" && !inSingle) {
385346
+ i6++;
385347
+ continue;
385348
+ }
385349
+ if (ch2 === "'" && !inDouble) {
385350
+ inSingle = !inSingle;
385351
+ continue;
385352
+ }
385353
+ if (ch2 === '"' && !inSingle) {
385354
+ inDouble = !inDouble;
385355
+ continue;
385356
+ }
385357
+ if (inSingle || inDouble)
385358
+ continue;
385359
+ if (ch2 === "&" && command4[i6 + 1] === "&" || ch2 === "|" && command4[i6 + 1] === "|") {
385360
+ lastBoolOpEnd = i6 + 2;
385361
+ i6++;
385362
+ }
385363
+ }
385364
+ return lastBoolOpEnd !== -1 && command4.slice(lastBoolOpEnd).trim() === "";
385365
+ }
385278
385366
  async function bashToolHasPermission(input, context4, getCommandSubcommandPrefixFn = getCommandSubcommandPrefix) {
385279
385367
  let appState = context4.getAppState();
385280
385368
  {
@@ -385374,6 +385462,15 @@ async function bashToolHasPermission(input, context4, getCommandSubcommandPrefix
385374
385462
  };
385375
385463
  }
385376
385464
  }
385465
+ {
385466
+ const mode = appState.toolPermissionContext.mode;
385467
+ if (mode !== "bypassPermissions" && hasDanglingBooleanOperator(input.command)) {
385468
+ return {
385469
+ behavior: "ask",
385470
+ message: "Malformed command with a dangling && or || operator requires confirmation."
385471
+ };
385472
+ }
385473
+ }
385377
385474
  const injectionCheckDisabled = isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_COMMAND_INJECTION_CHECK);
385378
385475
  const shadowEnabled = feature("TREE_SITTER_BASH_SHADOW") ? getFeatureValue_CACHED_MAY_BE_STALE("tengu_birch_trellis", true) : false;
385379
385476
  let astRoot = injectionCheckDisabled ? null : feature("TREE_SITTER_BASH_SHADOW") && !shadowEnabled ? null : await parseCommandRaw(input.command);
@@ -579646,13 +579743,22 @@ function getDefaultOptionForUser(fastMode = false) {
579646
579743
  description: getClaudeAiUserDefaultModelDescription(fastMode)
579647
579744
  };
579648
579745
  }
579649
- const is3P = getAPIProvider() !== "firstParty";
579746
+ const defaultSetting = getDefaultMainLoopModelSetting();
579650
579747
  return {
579651
579748
  value: null,
579652
579749
  label: "Default (recommended)",
579653
- description: `Use the default model (currently ${renderDefaultModelSetting(getDefaultMainLoopModelSetting())})${is3P ? "" : ` \xB7 ${formatModelPricing(COST_TIER_3_15)}`}`
579750
+ description: `Use the default model (currently ${renderDefaultModelSetting(defaultSetting)})${getDefaultOptionSuffix(defaultSetting)}`
579654
579751
  };
579655
579752
  }
579753
+ function getDefaultOptionSuffix(setting) {
579754
+ if (resolveAnthropicDefaultModel() !== undefined) {
579755
+ return " \xB7 Set by ANTHROPIC_DEFAULT_MODEL";
579756
+ }
579757
+ if (getAPIProvider() !== "firstParty")
579758
+ return "";
579759
+ const pricing = getModelPricingString(parseUserSpecifiedModel(setting));
579760
+ return pricing === undefined ? "" : ` \xB7 ${pricing}`;
579761
+ }
579656
579762
  function getOpus5PricingSuffix(fastMode) {
579657
579763
  if (getAPIProvider() !== "firstParty")
579658
579764
  return "";
@@ -579665,7 +579771,7 @@ function getSonnet5Option() {
579665
579771
  return {
579666
579772
  value: is3P ? getModelStrings2().sonnet5 : "sonnet",
579667
579773
  label: "Sonnet",
579668
- description: `Sonnet 5 \xB7 Efficient for routine tasks${is3P ? "" : ` \xB7 ${formatModelPricing(COST_TIER_3_15)}`}`,
579774
+ description: `Sonnet 5 \xB7 Efficient for routine tasks${is3P ? "" : ` \xB7 ${formatModelPricing(COST_TIER_2_10)}`}`,
579669
579775
  descriptionForModel: "Sonnet 5 - efficient for routine tasks. Generally recommended for most coding tasks"
579670
579776
  };
579671
579777
  }
@@ -579763,7 +579869,7 @@ function getSonnet5_1MOption() {
579763
579869
  return {
579764
579870
  value: is3P ? getModelStrings2().sonnet5 + "[1m]" : "sonnet[1m]",
579765
579871
  label: "Sonnet (1M context)",
579766
- description: `Sonnet 5 for long sessions${is3P ? "" : ` \xB7 ${formatModelPricing(COST_TIER_3_15)}`}`,
579872
+ description: `Sonnet 5 for long sessions${is3P ? "" : ` \xB7 ${formatModelPricing(COST_TIER_2_10)}`}`,
579767
579873
  descriptionForModel: "Sonnet 5 with 1M context window - for long sessions with large codebases"
579768
579874
  };
579769
579875
  }
@@ -579840,7 +579946,7 @@ function getMaxSonnet5_1MOption() {
579840
579946
  return {
579841
579947
  value: "sonnet[1m]",
579842
579948
  label: "Sonnet (1M context)",
579843
- description: `Sonnet 5 with 1M context${billingInfo}${is3P ? "" : ` \xB7 ${formatModelPricing(COST_TIER_3_15)}`}`
579949
+ description: `Sonnet 5 with 1M context${billingInfo}${is3P ? "" : ` \xB7 ${formatModelPricing(COST_TIER_2_10)}`}`
579844
579950
  };
579845
579951
  }
579846
579952
  function getMaxOpus5_1MOption(fastMode = false) {
@@ -631206,30 +631312,51 @@ function getCacheControl({
631206
631312
  ...scope === "global" && { scope }
631207
631313
  };
631208
631314
  }
631209
- function should1hCacheTTL(querySource) {
631315
+ function querySourceMatchesPatterns(querySource, patterns) {
631316
+ return querySource !== undefined && patterns.some((pattern) => pattern.endsWith("*") ? querySource.startsWith(pattern.slice(0, -1)) : querySource === pattern);
631317
+ }
631318
+ function isMainThreadQuerySource(querySource) {
631319
+ return querySourceMatchesPatterns(querySource, MAIN_THREAD_QUERY_SOURCES);
631320
+ }
631321
+ function parsePromptCacheTtlEnv(value) {
631322
+ return value === "5m" || value === "1h" ? value : undefined;
631323
+ }
631324
+ function resolvePromptCacheTtlOverride(querySource) {
631210
631325
  if (isEnvTruthy(process.env.FORCE_PROMPT_CACHING_5M)) {
631211
- return false;
631326
+ return { ttl: "5m", reason: "force_5m_env" };
631212
631327
  }
631213
- if (isEnvTruthy(process.env.ENABLE_PROMPT_CACHING_1H)) {
631214
- return true;
631215
- }
631216
- if (getAPIProvider() === "bedrock" && isEnvTruthy(process.env.ENABLE_PROMPT_CACHING_1H_BEDROCK)) {
631217
- return true;
631328
+ const isMainThread = isMainThreadQuerySource(querySource);
631329
+ const envTtl = parsePromptCacheTtlEnv(isMainThread ? process.env.CLAUDE_CODE_PROMPT_CACHE_TTL : process.env.CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL);
631330
+ if (envTtl !== undefined)
631331
+ return { ttl: envTtl, reason: "env" };
631332
+ const settings = getInitialSettings();
631333
+ const settingTtl = isMainThread ? settings.promptCacheTtl : settings.subagentPromptCacheTtl;
631334
+ if (settingTtl !== undefined)
631335
+ return { ttl: settingTtl, reason: "setting" };
631336
+ if (isEnvTruthy(process.env.ENABLE_PROMPT_CACHING_1H) || getAPIProvider() === "bedrock" && isEnvTruthy(process.env.ENABLE_PROMPT_CACHING_1H_BEDROCK)) {
631337
+ return { ttl: "1h", reason: "enable_1h_env" };
631218
631338
  }
631219
- let userEligible = getPromptCache1hEligible();
631220
- if (userEligible === null) {
631221
- userEligible = process.env.USER_TYPE === "ant" || isClaudeAISubscriber() && !currentLimits.isUsingOverage;
631222
- setPromptCache1hEligible(userEligible);
631339
+ return;
631340
+ }
631341
+ function resolvePromptCacheTtl(querySource) {
631342
+ const override = resolvePromptCacheTtlOverride(querySource);
631343
+ if (override !== undefined)
631344
+ return override;
631345
+ if (!isClaudeAISubscriber() || currentLimits.isUsingOverage) {
631346
+ return { ttl: "5m", reason: "default" };
631223
631347
  }
631224
- if (!userEligible)
631225
- return false;
631226
631348
  let allowlist = getPromptCache1hAllowlist();
631227
631349
  if (allowlist === null) {
631228
- const config7 = getFeatureValue_CACHED_MAY_BE_STALE("tengu_prompt_cache_1h_config", {});
631350
+ const config7 = getFeatureValue_CACHED_MAY_BE_STALE("tengu_prompt_cache_1h_config", {
631351
+ allowlist: [...MAIN_THREAD_QUERY_SOURCES]
631352
+ });
631229
631353
  allowlist = config7.allowlist ?? [];
631230
631354
  setPromptCache1hAllowlist(allowlist);
631231
631355
  }
631232
- return querySource !== undefined && allowlist.some((pattern) => pattern.endsWith("*") ? querySource.startsWith(pattern.slice(0, -1)) : querySource === pattern);
631356
+ return querySourceMatchesPatterns(querySource, allowlist) ? { ttl: "1h", reason: "subscriber" } : { ttl: "5m", reason: "default" };
631357
+ }
631358
+ function should1hCacheTTL(querySource) {
631359
+ return resolvePromptCacheTtl(querySource).ttl === "1h";
631233
631360
  }
631234
631361
  function configureEffortParams(effortValue, outputConfig, extraBodyParams, betas, model) {
631235
631362
  if (!modelSupportsEffort(model) || "effort" in outputConfig) {
@@ -631592,6 +631719,9 @@ async function* queryModel(messages, systemPrompt, thinkingConfig, tools, signal
631592
631719
  queryCheckpoint("query_tool_schema_build_start");
631593
631720
  const isAgenticQuery = options.querySource.startsWith("repl_main_thread") || options.querySource.startsWith("agent:") || options.querySource === "sdk" || options.querySource === "hook_agent" || options.querySource === "verification_agent";
631594
631721
  const betas = getMergedBetas(options.model, { isAgenticQuery });
631722
+ if (should1hCacheTTL(options.querySource) && shouldSendExtendedCacheTtlBeta() && !betas.includes(EXTENDED_CACHE_TTL_BETA_HEADER)) {
631723
+ betas.push(EXTENDED_CACHE_TTL_BETA_HEADER);
631724
+ }
631595
631725
  if (isAdvisorEnabled()) {
631596
631726
  betas.push(ADVISOR_BETA_HEADER);
631597
631727
  }
@@ -632961,7 +633091,7 @@ function getMaxOutputTokensForModel(model) {
632961
633091
  const result = validateBoundedIntEnvVar("CLAUDE_CODE_MAX_OUTPUT_TOKENS", process.env.CLAUDE_CODE_MAX_OUTPUT_TOKENS, defaultTokens, maxOutputTokens.upperLimit);
632962
633092
  return result.effective;
632963
633093
  }
632964
- var autoModeStateModule3, MAX_NON_STREAMING_TOKENS = 64000;
633094
+ var autoModeStateModule3, MAIN_THREAD_QUERY_SOURCES, MAX_NON_STREAMING_TOKENS = 64000;
632965
633095
  var init_claude = __esm(() => {
632966
633096
  init_providers();
632967
633097
  init_system();
@@ -633004,6 +633134,7 @@ var init_claude = __esm(() => {
633004
633134
  init_mcpInstructionsDelta();
633005
633135
  init_modelCost();
633006
633136
  init_queryProfiler();
633137
+ init_settings2();
633007
633138
  init_thinking();
633008
633139
  init_toolSearch();
633009
633140
  init_apiLimits();
@@ -633030,6 +633161,12 @@ var init_claude = __esm(() => {
633030
633161
  init_promptCacheBreakDetection();
633031
633162
  init_withRetry();
633032
633163
  autoModeStateModule3 = feature("TRANSCRIPT_CLASSIFIER") ? __toCommonJS(exports_autoModeState) : null;
633164
+ MAIN_THREAD_QUERY_SOURCES = [
633165
+ "repl_main_thread*",
633166
+ "sdk",
633167
+ "auto_mode",
633168
+ "memdir_relevance"
633169
+ ];
633033
633170
  });
633034
633171
 
633035
633172
  // src/utils/shell/prefix.ts
@@ -635493,19 +635630,19 @@ async function initializeToolPermissionContext({
635493
635630
  }
635494
635631
  for (const rule of rulesFromDisk) {
635495
635632
  const ruleStr = permissionRuleValueToString(rule.ruleValue);
635496
- const result = validatePermissionRule(ruleStr);
635633
+ const result = validatePermissionRule(ruleStr, rule.ruleBehavior);
635497
635634
  if (result.valid && result.warning) {
635498
635635
  warnings.push(`Permission ${rule.ruleBehavior} rule (${formatPermissionSource(rule.source)}): ${result.warning}`);
635499
635636
  }
635500
635637
  }
635501
635638
  for (const ruleStr of parsedAllowedToolsCli) {
635502
- const result = validatePermissionRule(ruleStr);
635639
+ const result = validatePermissionRule(ruleStr, "allow");
635503
635640
  if (result.valid && result.warning) {
635504
635641
  warnings.push(`Permission allow rule (--allowed-tools): ${result.warning}`);
635505
635642
  }
635506
635643
  }
635507
635644
  for (const ruleStr of parsedDisallowedToolsCli) {
635508
- const result = validatePermissionRule(ruleStr);
635645
+ const result = validatePermissionRule(ruleStr, "deny");
635509
635646
  if (result.valid && result.warning) {
635510
635647
  warnings.push(`Permission deny rule (--disallowed-tools): ${result.warning}`);
635511
635648
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cnwenf/occ",
3
- "version": "2.1.311",
3
+ "version": "2.1.313",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "bin": {