chenbhao commited on
Commit
c748366
·
1 Parent(s): 124e6b2

chore: fix prompt identity

Browse files
src/commands/insights.ts CHANGED
@@ -427,7 +427,7 @@ function getSessionMetaDir(): string {
427
  return join(getDataDir(), 'session-meta')
428
  }
429
 
430
- const FACET_EXTRACTION_PROMPT = `Analyze this Claude Code session and extract structured facets.
431
 
432
  CRITICAL GUIDELINES:
433
 
@@ -867,7 +867,7 @@ function formatTranscriptForFacets(log: LogOption): string {
867
  return lines.join('\n')
868
  }
869
 
870
- const SUMMARIZE_CHUNK_PROMPT = `Summarize this portion of a Claude Code session transcript. Focus on:
871
  1. What the user asked for
872
  2. What Claude did (tools used, files modified)
873
  3. Any friction or issues
@@ -1336,12 +1336,12 @@ type InsightSection = {
1336
  const INSIGHT_SECTIONS: InsightSection[] = [
1337
  {
1338
  name: 'project_areas',
1339
- prompt: `Analyze this Claude Code usage data and identify project areas.
1340
 
1341
  RESPOND WITH ONLY A VALID JSON OBJECT:
1342
  {
1343
  "areas": [
1344
- {"name": "Area name", "session_count": N, "description": "2-3 sentences about what was worked on and how Claude Code was used."}
1345
  ]
1346
  }
1347
 
@@ -1350,18 +1350,18 @@ Include 4-5 areas. Skip internal CC operations.`,
1350
  },
1351
  {
1352
  name: 'interaction_style',
1353
- prompt: `Analyze this Claude Code usage data and describe the user's interaction style.
1354
 
1355
  RESPOND WITH ONLY A VALID JSON OBJECT:
1356
  {
1357
- "narrative": "2-3 paragraphs analyzing HOW the user interacts with Claude Code. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let Claude run? Include specific examples. Use **bold** for key insights.",
1358
  "key_pattern": "One sentence summary of most distinctive interaction style"
1359
  }`,
1360
  maxTokens: 8192,
1361
  },
1362
  {
1363
  name: 'what_works',
1364
- prompt: `Analyze this Claude Code usage data and identify what's working well for this user. Use second person ("you").
1365
 
1366
  RESPOND WITH ONLY A VALID JSON OBJECT:
1367
  {
@@ -1376,7 +1376,7 @@ Include 3 impressive workflows.`,
1376
  },
1377
  {
1378
  name: 'friction_analysis',
1379
- prompt: `Analyze this Claude Code usage data and identify friction points for this user. Use second person ("you").
1380
 
1381
  RESPOND WITH ONLY A VALID JSON OBJECT:
1382
  {
@@ -1391,7 +1391,7 @@ Include 3 friction categories with 2 examples each.`,
1391
  },
1392
  {
1393
  name: 'suggestions',
1394
- prompt: `Analyze this Claude Code usage data and suggest improvements.
1395
 
1396
  ## CC FEATURES REFERENCE (pick from these for features_to_try):
1397
  1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.
@@ -1434,7 +1434,7 @@ IMPORTANT for features_to_try: Pick 2-3 from the CC FEATURES REFERENCE above. In
1434
  },
1435
  {
1436
  name: 'on_the_horizon',
1437
- prompt: `Analyze this Claude Code usage data and identify future opportunities.
1438
 
1439
  RESPOND WITH ONLY A VALID JSON OBJECT:
1440
  {
@@ -1451,7 +1451,7 @@ Include 3 opportunities. Think BIG - autonomous workflows, parallel agents, iter
1451
  ? [
1452
  {
1453
  name: 'cc_team_improvements',
1454
- prompt: `Analyze this Claude Code usage data and suggest product improvements for the CC team.
1455
 
1456
  RESPOND WITH ONLY A VALID JSON OBJECT:
1457
  {
@@ -1465,7 +1465,7 @@ Include 2-3 improvements based on friction patterns observed.`,
1465
  },
1466
  {
1467
  name: 'model_behavior_improvements',
1468
- prompt: `Analyze this Claude Code usage data and suggest model behavior improvements.
1469
 
1470
  RESPOND WITH ONLY A VALID JSON OBJECT:
1471
  {
@@ -1481,7 +1481,7 @@ Include 2-3 improvements based on friction patterns observed.`,
1481
  : []),
1482
  {
1483
  name: 'fun_ending',
1484
- prompt: `Analyze this Claude Code usage data and find a memorable moment.
1485
 
1486
  RESPOND WITH ONLY A VALID JSON OBJECT:
1487
  {
@@ -1735,7 +1735,7 @@ async function generateParallelInsights(
1735
  .join('\n') || ''
1736
 
1737
  // Now generate "At a Glance" with access to other sections' outputs
1738
- const atAGlancePrompt = `You're writing an "At a Glance" summary for a Claude Code usage insights report for Claude Code users. The goal is to help them understand their usage and improve how they can use Claude better, especially as models improve.
1739
 
1740
  Use this 4-part structure:
1741
 
@@ -1743,7 +1743,7 @@ Use this 4-part structure:
1743
 
1744
  2. **What's hindering you** - Split into (a) Claude's fault (misunderstandings, wrong approaches, bugs) and (b) user-side friction (not providing enough context, environment issues -- ideally more general than just one project). Be honest but constructive.
1745
 
1746
- 3. **Quick wins to try** - Specific Claude Code features they could try from the examples below, or a workflow technique if you think it's really compelling. (Avoid stuff like "Ask Claude to confirm before taking actions" or "Type out more context up front" which are less compelling.)
1747
 
1748
  4. **Ambitious workflows for better models** - As we move to much more capable models over the next 3-6 months, what should they prepare for? What workflows that seem impossible now will become possible? Draw from the appropriate section below.
1749
 
@@ -2006,7 +2006,7 @@ function generateHtmlReport(
2006
  const interactionStyle = insights.interaction_style
2007
  const interactionHtml = interactionStyle?.narrative
2008
  ? `
2009
- <h2 id="section-usage">How You Use Claude Code</h2>
2010
  <div class="narrative">
2011
  ${markdownToHtml(interactionStyle.narrative)}
2012
  ${interactionStyle.key_pattern ? `<div class="key-insight"><strong>Key pattern:</strong> ${escapeHtml(interactionStyle.key_pattern)}</div>` : ''}
@@ -2070,7 +2070,7 @@ function generateHtmlReport(
2070
  <h2 id="section-features">Existing CC Features to Try</h2>
2071
  <div class="claude-md-section">
2072
  <h3>Suggested CLAUDE.md Additions</h3>
2073
- <p style="font-size: 12px; color: #64748b; margin-bottom: 12px;">Just copy this into Claude Code to add it to your CLAUDE.md.</p>
2074
  <div class="claude-md-actions">
2075
  <button class="copy-all-btn" onclick="copyAllCheckedClaudeMd()">Copy All Checked</button>
2076
  </div>
@@ -2095,7 +2095,7 @@ function generateHtmlReport(
2095
  ${
2096
  suggestions.features_to_try && suggestions.features_to_try.length > 0
2097
  ? `
2098
- <p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into Claude Code and it'll set it up for you.</p>
2099
  <div class="features-section">
2100
  ${suggestions.features_to_try
2101
  .map(
@@ -2129,8 +2129,8 @@ function generateHtmlReport(
2129
  ${
2130
  suggestions.usage_patterns && suggestions.usage_patterns.length > 0
2131
  ? `
2132
- <h2 id="section-patterns">New Ways to Use Claude Code</h2>
2133
- <p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into Claude Code and it'll walk you through it.</p>
2134
  <div class="patterns-section">
2135
  ${suggestions.usage_patterns
2136
  .map(
@@ -2143,7 +2143,7 @@ function generateHtmlReport(
2143
  pat.copyable_prompt
2144
  ? `
2145
  <div class="copyable-prompt-section">
2146
- <div class="prompt-label">Paste into Claude Code:</div>
2147
  <div class="copyable-prompt-row">
2148
  <code class="copyable-prompt">${escapeHtml(pat.copyable_prompt)}</code>
2149
  <button class="copy-btn" onclick="copyText(this)">Copy</button>
@@ -2178,7 +2178,7 @@ function generateHtmlReport(
2178
  <div class="horizon-title">${escapeHtml(opp.title || '')}</div>
2179
  <div class="horizon-possible">${escapeHtml(opp.whats_possible || '')}</div>
2180
  ${opp.how_to_try ? `<div class="horizon-tip"><strong>Getting started:</strong> ${escapeHtml(opp.how_to_try)}</div>` : ''}
2181
- ${opp.copyable_prompt ? `<div class="pattern-prompt"><div class="prompt-label">Paste into Claude Code:</div><code>${escapeHtml(opp.copyable_prompt)}</code><button class="copy-btn" onclick="copyText(this)">Copy</button></div>` : ''}
2182
  </div>
2183
  `,
2184
  )
@@ -2485,13 +2485,13 @@ function generateHtmlReport(
2485
  <html>
2486
  <head>
2487
  <meta charset="utf-8">
2488
- <title>Claude Code Insights</title>
2489
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
2490
  <style>${css}</style>
2491
  </head>
2492
  <body>
2493
  <div class="container">
2494
- <h1>Claude Code Insights</h1>
2495
  <p class="subtitle">${data.total_messages.toLocaleString()} messages across ${data.total_sessions} sessions${data.total_sessions_scanned && data.total_sessions_scanned > data.total_sessions ? ` (${data.total_sessions_scanned.toLocaleString()} total)` : ''} | ${data.date_range.start} to ${data.date_range.end}</p>
2496
 
2497
  ${atAGlanceHtml}
@@ -2557,7 +2557,7 @@ function generateHtmlReport(
2557
  data.multi_clauding.overlap_events === 0
2558
  ? `
2559
  <p style="font-size: 14px; color: #64748b; padding: 8px 0;">
2560
- No parallel session usage detected. You typically work with one Claude Code session at a time.
2561
  </p>
2562
  `
2563
  : `
@@ -2576,7 +2576,7 @@ function generateHtmlReport(
2576
  </div>
2577
  </div>
2578
  <p style="font-size: 13px; color: #475569; margin-top: 12px;">
2579
- You run multiple Claude Code sessions simultaneously. Multi-clauding is detected when sessions
2580
  overlap in time, suggesting parallel workflows.
2581
  </p>
2582
  `
@@ -3039,7 +3039,7 @@ function safeKeys(obj: Record<string, unknown> | undefined | null): string[] {
3039
  const usageReport: Command = {
3040
  type: 'prompt',
3041
  name: 'insights',
3042
- description: 'Generate a report analyzing your Claude Code sessions',
3043
  contentLength: 0, // Dynamic content
3044
  progressMessage: 'analyzing your sessions',
3045
  source: 'builtin',
@@ -3141,7 +3141,7 @@ ${atAGlance.quick_wins ? `**Quick wins to try:** ${atAGlance.quick_wins} See _Fe
3141
  ${atAGlance.ambitious_workflows ? `**Ambitious workflows:** ${atAGlance.ambitious_workflows} See _On the Horizon_.` : ''}`
3142
  : '_No insights generated_'
3143
 
3144
- const header = `# Claude Code Insights
3145
 
3146
  ${stats}
3147
  ${data.date_range.start} to ${data.date_range.end}
@@ -3156,7 +3156,7 @@ Your full shareable insights report is ready: ${reportUrl}${uploadHint}`
3156
  return [
3157
  {
3158
  type: 'text',
3159
- text: `The user just ran /insights to generate a usage report analyzing their Claude Code sessions.
3160
 
3161
  Here is the full insights data:
3162
  ${jsonStringify(insights, null, 2)}
 
427
  return join(getDataDir(), 'session-meta')
428
  }
429
 
430
+ const FACET_EXTRACTION_PROMPT = `Analyze this VersperClaw session and extract structured facets.
431
 
432
  CRITICAL GUIDELINES:
433
 
 
867
  return lines.join('\n')
868
  }
869
 
870
+ const SUMMARIZE_CHUNK_PROMPT = `Summarize this portion of a VersperClaw session transcript. Focus on:
871
  1. What the user asked for
872
  2. What Claude did (tools used, files modified)
873
  3. Any friction or issues
 
1336
  const INSIGHT_SECTIONS: InsightSection[] = [
1337
  {
1338
  name: 'project_areas',
1339
+ prompt: `Analyze this VersperClaw usage data and identify project areas.
1340
 
1341
  RESPOND WITH ONLY A VALID JSON OBJECT:
1342
  {
1343
  "areas": [
1344
+ {"name": "Area name", "session_count": N, "description": "2-3 sentences about what was worked on and how VersperClaw was used."}
1345
  ]
1346
  }
1347
 
 
1350
  },
1351
  {
1352
  name: 'interaction_style',
1353
+ prompt: `Analyze this VersperClaw usage data and describe the user's interaction style.
1354
 
1355
  RESPOND WITH ONLY A VALID JSON OBJECT:
1356
  {
1357
+ "narrative": "2-3 paragraphs analyzing HOW the user interacts with VersperClaw. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let Claude run? Include specific examples. Use **bold** for key insights.",
1358
  "key_pattern": "One sentence summary of most distinctive interaction style"
1359
  }`,
1360
  maxTokens: 8192,
1361
  },
1362
  {
1363
  name: 'what_works',
1364
+ prompt: `Analyze this VersperClaw usage data and identify what's working well for this user. Use second person ("you").
1365
 
1366
  RESPOND WITH ONLY A VALID JSON OBJECT:
1367
  {
 
1376
  },
1377
  {
1378
  name: 'friction_analysis',
1379
+ prompt: `Analyze this VersperClaw usage data and identify friction points for this user. Use second person ("you").
1380
 
1381
  RESPOND WITH ONLY A VALID JSON OBJECT:
1382
  {
 
1391
  },
1392
  {
1393
  name: 'suggestions',
1394
+ prompt: `Analyze this VersperClaw usage data and suggest improvements.
1395
 
1396
  ## CC FEATURES REFERENCE (pick from these for features_to_try):
1397
  1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.
 
1434
  },
1435
  {
1436
  name: 'on_the_horizon',
1437
+ prompt: `Analyze this VersperClaw usage data and identify future opportunities.
1438
 
1439
  RESPOND WITH ONLY A VALID JSON OBJECT:
1440
  {
 
1451
  ? [
1452
  {
1453
  name: 'cc_team_improvements',
1454
+ prompt: `Analyze this VersperClaw usage data and suggest product improvements for the CC team.
1455
 
1456
  RESPOND WITH ONLY A VALID JSON OBJECT:
1457
  {
 
1465
  },
1466
  {
1467
  name: 'model_behavior_improvements',
1468
+ prompt: `Analyze this VersperClaw usage data and suggest model behavior improvements.
1469
 
1470
  RESPOND WITH ONLY A VALID JSON OBJECT:
1471
  {
 
1481
  : []),
1482
  {
1483
  name: 'fun_ending',
1484
+ prompt: `Analyze this VersperClaw usage data and find a memorable moment.
1485
 
1486
  RESPOND WITH ONLY A VALID JSON OBJECT:
1487
  {
 
1735
  .join('\n') || ''
1736
 
1737
  // Now generate "At a Glance" with access to other sections' outputs
1738
+ const atAGlancePrompt = `You're writing an "At a Glance" summary for a VersperClaw usage insights report for VersperClaw users. The goal is to help them understand their usage and improve how they can use Claude better, especially as models improve.
1739
 
1740
  Use this 4-part structure:
1741
 
 
1743
 
1744
  2. **What's hindering you** - Split into (a) Claude's fault (misunderstandings, wrong approaches, bugs) and (b) user-side friction (not providing enough context, environment issues -- ideally more general than just one project). Be honest but constructive.
1745
 
1746
+ 3. **Quick wins to try** - Specific VersperClaw features they could try from the examples below, or a workflow technique if you think it's really compelling. (Avoid stuff like "Ask Claude to confirm before taking actions" or "Type out more context up front" which are less compelling.)
1747
 
1748
  4. **Ambitious workflows for better models** - As we move to much more capable models over the next 3-6 months, what should they prepare for? What workflows that seem impossible now will become possible? Draw from the appropriate section below.
1749
 
 
2006
  const interactionStyle = insights.interaction_style
2007
  const interactionHtml = interactionStyle?.narrative
2008
  ? `
2009
+ <h2 id="section-usage">How You Use VersperClaw</h2>
2010
  <div class="narrative">
2011
  ${markdownToHtml(interactionStyle.narrative)}
2012
  ${interactionStyle.key_pattern ? `<div class="key-insight"><strong>Key pattern:</strong> ${escapeHtml(interactionStyle.key_pattern)}</div>` : ''}
 
2070
  <h2 id="section-features">Existing CC Features to Try</h2>
2071
  <div class="claude-md-section">
2072
  <h3>Suggested CLAUDE.md Additions</h3>
2073
+ <p style="font-size: 12px; color: #64748b; margin-bottom: 12px;">Just copy this into VersperClaw to add it to your CLAUDE.md.</p>
2074
  <div class="claude-md-actions">
2075
  <button class="copy-all-btn" onclick="copyAllCheckedClaudeMd()">Copy All Checked</button>
2076
  </div>
 
2095
  ${
2096
  suggestions.features_to_try && suggestions.features_to_try.length > 0
2097
  ? `
2098
+ <p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into VersperClaw and it'll set it up for you.</p>
2099
  <div class="features-section">
2100
  ${suggestions.features_to_try
2101
  .map(
 
2129
  ${
2130
  suggestions.usage_patterns && suggestions.usage_patterns.length > 0
2131
  ? `
2132
+ <h2 id="section-patterns">New Ways to Use VersperClaw</h2>
2133
+ <p style="font-size: 13px; color: #64748b; margin-bottom: 12px;">Just copy this into VersperClaw and it'll walk you through it.</p>
2134
  <div class="patterns-section">
2135
  ${suggestions.usage_patterns
2136
  .map(
 
2143
  pat.copyable_prompt
2144
  ? `
2145
  <div class="copyable-prompt-section">
2146
+ <div class="prompt-label">Paste into VersperClaw:</div>
2147
  <div class="copyable-prompt-row">
2148
  <code class="copyable-prompt">${escapeHtml(pat.copyable_prompt)}</code>
2149
  <button class="copy-btn" onclick="copyText(this)">Copy</button>
 
2178
  <div class="horizon-title">${escapeHtml(opp.title || '')}</div>
2179
  <div class="horizon-possible">${escapeHtml(opp.whats_possible || '')}</div>
2180
  ${opp.how_to_try ? `<div class="horizon-tip"><strong>Getting started:</strong> ${escapeHtml(opp.how_to_try)}</div>` : ''}
2181
+ ${opp.copyable_prompt ? `<div class="pattern-prompt"><div class="prompt-label">Paste into VersperClaw:</div><code>${escapeHtml(opp.copyable_prompt)}</code><button class="copy-btn" onclick="copyText(this)">Copy</button></div>` : ''}
2182
  </div>
2183
  `,
2184
  )
 
2485
  <html>
2486
  <head>
2487
  <meta charset="utf-8">
2488
+ <title>VersperClaw Insights</title>
2489
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
2490
  <style>${css}</style>
2491
  </head>
2492
  <body>
2493
  <div class="container">
2494
+ <h1>VersperClaw Insights</h1>
2495
  <p class="subtitle">${data.total_messages.toLocaleString()} messages across ${data.total_sessions} sessions${data.total_sessions_scanned && data.total_sessions_scanned > data.total_sessions ? ` (${data.total_sessions_scanned.toLocaleString()} total)` : ''} | ${data.date_range.start} to ${data.date_range.end}</p>
2496
 
2497
  ${atAGlanceHtml}
 
2557
  data.multi_clauding.overlap_events === 0
2558
  ? `
2559
  <p style="font-size: 14px; color: #64748b; padding: 8px 0;">
2560
+ No parallel session usage detected. You typically work with one VersperClaw session at a time.
2561
  </p>
2562
  `
2563
  : `
 
2576
  </div>
2577
  </div>
2578
  <p style="font-size: 13px; color: #475569; margin-top: 12px;">
2579
+ You run multiple VersperClaw sessions simultaneously. Multi-clauding is detected when sessions
2580
  overlap in time, suggesting parallel workflows.
2581
  </p>
2582
  `
 
3039
  const usageReport: Command = {
3040
  type: 'prompt',
3041
  name: 'insights',
3042
+ description: 'Generate a report analyzing your VersperClaw sessions',
3043
  contentLength: 0, // Dynamic content
3044
  progressMessage: 'analyzing your sessions',
3045
  source: 'builtin',
 
3141
  ${atAGlance.ambitious_workflows ? `**Ambitious workflows:** ${atAGlance.ambitious_workflows} See _On the Horizon_.` : ''}`
3142
  : '_No insights generated_'
3143
 
3144
+ const header = `# VersperClaw Insights
3145
 
3146
  ${stats}
3147
  ${data.date_range.start} to ${data.date_range.end}
 
3156
  return [
3157
  {
3158
  type: 'text',
3159
+ text: `The user just ran /insights to generate a usage report analyzing their VersperClaw sessions.
3160
 
3161
  Here is the full insights data:
3162
  ${jsonStringify(insights, null, 2)}
src/components/HelpV2/General.tsx CHANGED
@@ -6,7 +6,7 @@ export function General() {
6
  const $ = _c(2);
7
  let t0;
8
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
9
- t0 = <Box><Text>Claude understands your codebase, makes edits with your permission, and executes commands — right from your terminal.</Text></Box>;
10
  $[0] = t0;
11
  } else {
12
  t0 = $[0];
 
6
  const $ = _c(2);
7
  let t0;
8
  if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
9
+ t0 = <Box><Text>VersperClaw understands your codebase, makes edits with your permission, and executes commands — right from your terminal.</Text></Box>;
10
  $[0] = t0;
11
  } else {
12
  t0 = $[0];
src/components/HelpV2/HelpV2.tsx CHANGED
@@ -138,7 +138,7 @@ export function HelpV2(t0) {
138
  const t5 = insideModal ? undefined : maxHeight;
139
  let t6;
140
  if ($[31] !== tabs) {
141
- t6 = <Tabs title={false ? "/help" : `Claude Code v${MACRO.VERSION}`} color="professionalBlue" defaultTab="general">{tabs}</Tabs>;
142
  $[31] = tabs;
143
  $[32] = t6;
144
  } else {
@@ -146,7 +146,7 @@ export function HelpV2(t0) {
146
  }
147
  let t7;
148
  if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
149
- t7 = <Box marginTop={1}><Text>For more help:{" "}<Link url="https://code.claude.com/docs/en/overview" /></Text></Box>;
150
  $[33] = t7;
151
  } else {
152
  t7 = $[33];
@@ -181,4 +181,4 @@ export function HelpV2(t0) {
181
  }
182
  return t10;
183
  }
184
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsInVzZVNob3J0Y3V0RGlzcGxheSIsImJ1aWx0SW5Db21tYW5kTmFtZXMiLCJDb21tYW5kIiwiQ29tbWFuZFJlc3VsdERpc3BsYXkiLCJJTlRFUk5BTF9PTkxZX0NPTU1BTkRTIiwidXNlSXNJbnNpZGVNb2RhbCIsInVzZVRlcm1pbmFsU2l6ZSIsIkJveCIsIkxpbmsiLCJUZXh0IiwidXNlS2V5YmluZGluZyIsIlBhbmUiLCJUYWIiLCJUYWJzIiwiQ29tbWFuZHMiLCJHZW5lcmFsIiwiUHJvcHMiLCJvbkNsb3NlIiwicmVzdWx0Iiwib3B0aW9ucyIsImRpc3BsYXkiLCJjb21tYW5kcyIsIkhlbHBWMiIsInQwIiwiJCIsIl9jIiwicm93cyIsImNvbHVtbnMiLCJtYXhIZWlnaHQiLCJNYXRoIiwiZmxvb3IiLCJpbnNpZGVNb2RhbCIsInQxIiwiY2xvc2UiLCJ0MiIsIlN5bWJvbCIsImZvciIsImNvbnRleHQiLCJleGl0U3RhdGUiLCJkaXNtaXNzU2hvcnRjdXQiLCJhbnRPbmx5Q29tbWFuZHMiLCJidWlsdGluQ29tbWFuZHMiLCJ0MyIsImJ1aWx0aW5OYW1lcyIsImZpbHRlciIsImNtZCIsImhhcyIsIm5hbWUiLCJpc0hpZGRlbiIsInQ0IiwiY21kXzIiLCJjdXN0b21Db21tYW5kcyIsInRhYnMiLCJ0NSIsInB1c2giLCJ0NiIsImxlbmd0aCIsInQ3IiwidW5kZWZpbmVkIiwiTUFDUk8iLCJWRVJTSU9OIiwidDgiLCJrZXlOYW1lIiwicGVuZGluZyIsInQ5IiwidDEwIl0sInNvdXJjZXMiOlsiSGVscFYyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyB9IGZyb20gJ3NyYy9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyB1c2VTaG9ydGN1dERpc3BsYXkgfSBmcm9tICdzcmMva2V5YmluZGluZ3MvdXNlU2hvcnRjdXREaXNwbGF5LmpzJ1xuaW1wb3J0IHtcbiAgYnVpbHRJbkNvbW1hbmROYW1lcyxcbiAgdHlwZSBDb21tYW5kLFxuICB0eXBlIENvbW1hbmRSZXN1bHREaXNwbGF5LFxuICBJTlRFUk5BTF9PTkxZX0NPTU1BTkRTLFxufSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IHVzZUlzSW5zaWRlTW9kYWwgfSBmcm9tICcuLi8uLi9jb250ZXh0L21vZGFsQ29udGV4dC5qcydcbmltcG9ydCB7IHVzZVRlcm1pbmFsU2l6ZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRlcm1pbmFsU2l6ZS5qcydcbmltcG9ydCB7IEJveCwgTGluaywgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgUGFuZSB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vUGFuZS5qcydcbmltcG9ydCB7IFRhYiwgVGFicyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vVGFicy5qcydcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi9Db21tYW5kcy5qcydcbmltcG9ydCB7IEdlbmVyYWwgfSBmcm9tICcuL0dlbmVyYWwuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIG9uQ2xvc2U6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICBjb21tYW5kczogQ29tbWFuZFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWxwVjIoeyBvbkNsb3NlLCBjb21tYW5kcyB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcm93cywgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcihyb3dzIC8gMilcbiAgLy8gSW5zaWRlIHRoZSBtb2RhbCBzbG90LCBGdWxsc2NyZWVuTGF5b3V0IGFscmVhZHkgY2FwcyBoZWlnaHQgYW5kIFBhbmUvVGFic1xuICAvLyB1c2UgZmxleFNocmluaz0wIChzZWUgIzIzNTkyKSDigJQgb3VyIG93biBoZWlnaHQ9IGNvbnN0cmFpbnQgd291bGQgY2xpcCB0aGVcbiAgLy8gZm9vdGVyIHNpbmNlIFRhYnMgd29uJ3Qgc2hyaW5rIHRvIGZpdC4gTGV0IHRoZSBtb2RhbCBzbG90IGhhbmRsZSBzaXppbmcuXG4gIGNvbnN0IGluc2lkZU1vZGFsID0gdXNlSXNJbnNpZGVNb2RhbCgpXG5cbiAgY29uc3QgY2xvc2UgPSAoKSA9PiBvbkNsb3NlKCdIZWxwIGRpYWxvZyBkaXNtaXNzZWQnLCB7IGRpc3BsYXk6ICdzeXN0ZW0nIH0pXG4gIHVzZUtleWJpbmRpbmcoJ2hlbHA6ZGlzbWlzcycsIGNsb3NlLCB7IGNvbnRleHQ6ICdIZWxwJyB9KVxuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoY2xvc2UpXG4gIGNvbnN0IGRpc21pc3NTaG9ydGN1dCA9IHVzZVNob3J0Y3V0RGlzcGxheSgnaGVscDpkaXNtaXNzJywgJ0hlbHAnLCAnZXNjJylcblxuICBjb25zdCBidWlsdGluTmFtZXMgPSBidWlsdEluQ29tbWFuZE5hbWVzKClcbiAgbGV0IGJ1aWx0aW5Db21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICBjbWQgPT4gYnVpbHRpbk5hbWVzLmhhcyhjbWQubmFtZSkgJiYgIWNtZC5pc0hpZGRlbixcbiAgKVxuICBsZXQgYW50T25seUNvbW1hbmRzOiBDb21tYW5kW10gPSBbXVxuXG4gIC8vIFdlIGhhdmUgdG8gZG8gdGhpcyBpbiBhbiBgaWZgIHRvIGhlbHAgdHJlZXNoYWtpbmdcbiAgaWYgKFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcpIHtcbiAgICBjb25zdCBpbnRlcm5hbE9ubHlOYW1lcyA9IG5ldyBTZXQoSU5URVJOQUxfT05MWV9DT01NQU5EUy5tYXAoXyA9PiBfLm5hbWUpKVxuICAgIGJ1aWx0aW5Db21tYW5kcyA9IGJ1aWx0aW5Db21tYW5kcy5maWx0ZXIoXG4gICAgICBjbWQgPT4gIWludGVybmFsT25seU5hbWVzLmhhcyhjbWQubmFtZSksXG4gICAgKVxuICAgIGFudE9ubHlDb21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICAgIGNtZCA9PiBpbnRlcm5hbE9ubHlOYW1lcy5oYXMoY21kLm5hbWUpICYmICFjbWQuaXNIaWRkZW4sXG4gICAgKVxuICB9XG5cbiAgY29uc3QgY3VzdG9tQ29tbWFuZHMgPSBjb21tYW5kcy5maWx0ZXIoXG4gICAgY21kID0+ICFidWlsdGluTmFtZXMuaGFzKGNtZC5uYW1lKSAmJiAhY21kLmlzSGlkZGVuLFxuICApXG5cbiAgY29uc3QgdGFicyA9IFtcbiAgICA8VGFiIGtleT1cImdlbmVyYWxcIiB0aXRsZT1cImdlbmVyYWxcIj5cbiAgICAgIDxHZW5lcmFsIC8+XG4gICAgPC9UYWI+LFxuICBdXG5cbiAgdGFicy5wdXNoKFxuICAgIDxUYWIga2V5PVwiY29tbWFuZHNcIiB0aXRsZT1cImNvbW1hbmRzXCI+XG4gICAgICA8Q29tbWFuZHNcbiAgICAgICAgY29tbWFuZHM9e2J1aWx0aW5Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGRlZmF1bHQgY29tbWFuZHM6XCJcbiAgICAgICAgb25DYW5jZWw9e2Nsb3NlfVxuICAgICAgLz5cbiAgICA8L1RhYj4sXG4gIClcblxuICB0YWJzLnB1c2goXG4gICAgPFRhYiBrZXk9XCJjdXN0b21cIiB0aXRsZT1cImN1c3RvbS1jb21tYW5kc1wiPlxuICAgICAgPENvbW1hbmRzXG4gICAgICAgIGNvbW1hbmRzPXtjdXN0b21Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGN1c3RvbSBjb21tYW5kczpcIlxuICAgICAgICBlbXB0eU1lc3NhZ2U9XCJObyBjdXN0b20gY29tbWFuZHMgZm91bmRcIlxuICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAvPlxuICAgIDwvVGFiPixcbiAgKVxuXG4gIGlmIChcImV4dGVybmFsXCIgPT09ICdhbnQnICYmIGFudE9ubHlDb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgdGFicy5wdXNoKFxuICAgICAgPFRhYiBrZXk9XCJhbnQtb25seVwiIHRpdGxlPVwiW2FudC1vbmx5XVwiPlxuICAgICAgICA8Q29tbWFuZHNcbiAgICAgICAgICBjb21tYW5kcz17YW50T25seUNvbW1hbmRzfVxuICAgICAgICAgIG1heEhlaWdodD17bWF4SGVpZ2h0fVxuICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgICAgdGl0bGU9XCJCcm93c2UgYW50LW9ubHkgY29tbWFuZHM6XCJcbiAgICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAgIC8+XG4gICAgICA8L1RhYj4sXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBoZWlnaHQ9e2luc2lkZU1vZGFsID8gdW5kZWZpbmVkIDogbWF4SGVpZ2h0fT5cbiAgICAgIDxQYW5lIGNvbG9yPVwicHJvZmVzc2lvbmFsQmx1ZVwiPlxuICAgICAgICA8VGFic1xuICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCdcbiAgICAgICAgICAgICAgPyAnL2hlbHAnXG4gICAgICAgICAgICAgIDogYENsYXVkZSBDb2RlIHYke01BQ1JPLlZFUlNJT059YFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb2xvcj1cInByb2Zlc3Npb25hbEJsdWVcIlxuICAgICAgICAgIGRlZmF1bHRUYWI9XCJnZW5lcmFsXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0YWJzfVxuICAgICAgICA8L1RhYnM+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIEZvciBtb3JlIGhlbHA6eycgJ31cbiAgICAgICAgICAgIDxMaW5rIHVybD1cImh0dHBzOi8vY29kZS5jbGF1ZGUuY29tL2RvY3MvZW4vb3ZlcnZpZXdcIiAvPlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIHtleGl0U3RhdGUucGVuZGluZyA/IChcbiAgICAgICAgICAgICAgPD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8Lz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxUZXh0IGl0YWxpYz57ZGlzbWlzc1Nob3J0Y3V0fSB0byBjYW5jZWw8L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L1BhbmU+XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsOEJBQThCLFFBQVEsNkNBQTZDO0FBQzVGLFNBQVNDLGtCQUFrQixRQUFRLHVDQUF1QztBQUMxRSxTQUNFQyxtQkFBbUIsRUFDbkIsS0FBS0MsT0FBTyxFQUNaLEtBQUtDLG9CQUFvQixFQUN6QkMsc0JBQXNCLFFBQ2pCLG1CQUFtQjtBQUMxQixTQUFTQyxnQkFBZ0IsUUFBUSwrQkFBK0I7QUFDaEUsU0FBU0MsZUFBZSxRQUFRLGdDQUFnQztBQUNoRSxTQUFTQyxHQUFHLEVBQUVDLElBQUksRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDOUMsU0FBU0MsYUFBYSxRQUFRLG9DQUFv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
 
138
  const t5 = insideModal ? undefined : maxHeight;
139
  let t6;
140
  if ($[31] !== tabs) {
141
+ t6 = <Tabs title={false ? "/help" : `Versper Claw v${MACRO.VERSION}`} color="professionalBlue" defaultTab="general">{tabs}</Tabs>;
142
  $[31] = tabs;
143
  $[32] = t6;
144
  } else {
 
146
  }
147
  let t7;
148
  if ($[33] === Symbol.for("react.memo_cache_sentinel")) {
149
+ t7 = <Box marginTop={1}><Text>For more help:{" "}<Link url="https://github.com/versperai/VersperClaw" /></Text></Box>;
150
  $[33] = t7;
151
  } else {
152
  t7 = $[33];
 
181
  }
182
  return t10;
183
  }
184
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyIsInVzZVNob3J0Y3V0RGlzcGxheSIsImJ1aWx0SW5Db21tYW5kTmFtZXMiLCJDb21tYW5kIiwiQ29tbWFuZFJlc3VsdERpc3BsYXkiLCJJTlRFUk5BTF9PTkxZX0NPTU1BTkRTIiwidXNlSXNJbnNpZGVNb2RhbCIsInVzZVRlcm1pbmFsU2l6ZSIsIkJveCIsIkxpbmsiLCJUZXh0IiwidXNlS2V5YmluZGluZyIsIlBhbmUiLCJUYWIiLCJUYWJzIiwiQ29tbWFuZHMiLCJHZW5lcmFsIiwiUHJvcHMiLCJvbkNsb3NlIiwicmVzdWx0Iiwib3B0aW9ucyIsImRpc3BsYXkiLCJjb21tYW5kcyIsIkhlbHBWMiIsInQwIiwiJCIsIl9jIiwicm93cyIsImNvbHVtbnMiLCJtYXhIZWlnaHQiLCJNYXRoIiwiZmxvb3IiLCJpbnNpZGVNb2RhbCIsInQxIiwiY2xvc2UiLCJ0MiIsIlN5bWJvbCIsImZvciIsImNvbnRleHQiLCJleGl0U3RhdGUiLCJkaXNtaXNzU2hvcnRjdXQiLCJhbnRPbmx5Q29tbWFuZHMiLCJidWlsdGluQ29tbWFuZHMiLCJ0MyIsImJ1aWx0aW5OYW1lcyIsImZpbHRlciIsImNtZCIsImhhcyIsIm5hbWUiLCJpc0hpZGRlbiIsInQ0IiwiY21kXzIiLCJjdXN0b21Db21tYW5kcyIsInRhYnMiLCJ0NSIsInB1c2giLCJ0NiIsImxlbmd0aCIsInQ3IiwidW5kZWZpbmVkIiwiTUFDUk8iLCJWRVJTSU9OIiwidDgiLCJrZXlOYW1lIiwicGVuZGluZyIsInQ5IiwidDEwIl0sInNvdXJjZXMiOlsiSGVscFYyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUV4aXRPbkN0cmxDRFdpdGhLZXliaW5kaW5ncyB9IGZyb20gJ3NyYy9ob29rcy91c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MuanMnXG5pbXBvcnQgeyB1c2VTaG9ydGN1dERpc3BsYXkgfSBmcm9tICdzcmMva2V5YmluZGluZ3MvdXNlU2hvcnRjdXREaXNwbGF5LmpzJ1xuaW1wb3J0IHtcbiAgYnVpbHRJbkNvbW1hbmROYW1lcyxcbiAgdHlwZSBDb21tYW5kLFxuICB0eXBlIENvbW1hbmRSZXN1bHREaXNwbGF5LFxuICBJTlRFUk5BTF9PTkxZX0NPTU1BTkRTLFxufSBmcm9tICcuLi8uLi9jb21tYW5kcy5qcydcbmltcG9ydCB7IHVzZUlzSW5zaWRlTW9kYWwgfSBmcm9tICcuLi8uLi9jb250ZXh0L21vZGFsQ29udGV4dC5qcydcbmltcG9ydCB7IHVzZVRlcm1pbmFsU2l6ZSB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZVRlcm1pbmFsU2l6ZS5qcydcbmltcG9ydCB7IEJveCwgTGluaywgVGV4dCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB7IHVzZUtleWJpbmRpbmcgfSBmcm9tICcuLi8uLi9rZXliaW5kaW5ncy91c2VLZXliaW5kaW5nLmpzJ1xuaW1wb3J0IHsgUGFuZSB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vUGFuZS5qcydcbmltcG9ydCB7IFRhYiwgVGFicyB9IGZyb20gJy4uL2Rlc2lnbi1zeXN0ZW0vVGFicy5qcydcbmltcG9ydCB7IENvbW1hbmRzIH0gZnJvbSAnLi9Db21tYW5kcy5qcydcbmltcG9ydCB7IEdlbmVyYWwgfSBmcm9tICcuL0dlbmVyYWwuanMnXG5cbnR5cGUgUHJvcHMgPSB7XG4gIG9uQ2xvc2U6IChcbiAgICByZXN1bHQ/OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZGlzcGxheT86IENvbW1hbmRSZXN1bHREaXNwbGF5IH0sXG4gICkgPT4gdm9pZFxuICBjb21tYW5kczogQ29tbWFuZFtdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIZWxwVjIoeyBvbkNsb3NlLCBjb21tYW5kcyB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgcm93cywgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcbiAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5mbG9vcihyb3dzIC8gMilcbiAgLy8gSW5zaWRlIHRoZSBtb2RhbCBzbG90LCBGdWxsc2NyZWVuTGF5b3V0IGFscmVhZHkgY2FwcyBoZWlnaHQgYW5kIFBhbmUvVGFic1xuICAvLyB1c2UgZmxleFNocmluaz0wIChzZWUgIzIzNTkyKSDigJQgb3VyIG93biBoZWlnaHQ9IGNvbnN0cmFpbnQgd291bGQgY2xpcCB0aGVcbiAgLy8gZm9vdGVyIHNpbmNlIFRhYnMgd29uJ3Qgc2hyaW5rIHRvIGZpdC4gTGV0IHRoZSBtb2RhbCBzbG90IGhhbmRsZSBzaXppbmcuXG4gIGNvbnN0IGluc2lkZU1vZGFsID0gdXNlSXNJbnNpZGVNb2RhbCgpXG5cbiAgY29uc3QgY2xvc2UgPSAoKSA9PiBvbkNsb3NlKCdIZWxwIGRpYWxvZyBkaXNtaXNzZWQnLCB7IGRpc3BsYXk6ICdzeXN0ZW0nIH0pXG4gIHVzZUtleWJpbmRpbmcoJ2hlbHA6ZGlzbWlzcycsIGNsb3NlLCB7IGNvbnRleHQ6ICdIZWxwJyB9KVxuICBjb25zdCBleGl0U3RhdGUgPSB1c2VFeGl0T25DdHJsQ0RXaXRoS2V5YmluZGluZ3MoY2xvc2UpXG4gIGNvbnN0IGRpc21pc3NTaG9ydGN1dCA9IHVzZVNob3J0Y3V0RGlzcGxheSgnaGVscDpkaXNtaXNzJywgJ0hlbHAnLCAnZXNjJylcblxuICBjb25zdCBidWlsdGluTmFtZXMgPSBidWlsdEluQ29tbWFuZE5hbWVzKClcbiAgbGV0IGJ1aWx0aW5Db21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICBjbWQgPT4gYnVpbHRpbk5hbWVzLmhhcyhjbWQubmFtZSkgJiYgIWNtZC5pc0hpZGRlbixcbiAgKVxuICBsZXQgYW50T25seUNvbW1hbmRzOiBDb21tYW5kW10gPSBbXVxuXG4gIC8vIFdlIGhhdmUgdG8gZG8gdGhpcyBpbiBhbiBgaWZgIHRvIGhlbHAgdHJlZXNoYWtpbmdcbiAgaWYgKFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCcpIHtcbiAgICBjb25zdCBpbnRlcm5hbE9ubHlOYW1lcyA9IG5ldyBTZXQoSU5URVJOQUxfT05MWV9DT01NQU5EUy5tYXAoXyA9PiBfLm5hbWUpKVxuICAgIGJ1aWx0aW5Db21tYW5kcyA9IGJ1aWx0aW5Db21tYW5kcy5maWx0ZXIoXG4gICAgICBjbWQgPT4gIWludGVybmFsT25seU5hbWVzLmhhcyhjbWQubmFtZSksXG4gICAgKVxuICAgIGFudE9ubHlDb21tYW5kcyA9IGNvbW1hbmRzLmZpbHRlcihcbiAgICAgIGNtZCA9PiBpbnRlcm5hbE9ubHlOYW1lcy5oYXMoY21kLm5hbWUpICYmICFjbWQuaXNIaWRkZW4sXG4gICAgKVxuICB9XG5cbiAgY29uc3QgY3VzdG9tQ29tbWFuZHMgPSBjb21tYW5kcy5maWx0ZXIoXG4gICAgY21kID0+ICFidWlsdGluTmFtZXMuaGFzKGNtZC5uYW1lKSAmJiAhY21kLmlzSGlkZGVuLFxuICApXG5cbiAgY29uc3QgdGFicyA9IFtcbiAgICA8VGFiIGtleT1cImdlbmVyYWxcIiB0aXRsZT1cImdlbmVyYWxcIj5cbiAgICAgIDxHZW5lcmFsIC8+XG4gICAgPC9UYWI+LFxuICBdXG5cbiAgdGFicy5wdXNoKFxuICAgIDxUYWIga2V5PVwiY29tbWFuZHNcIiB0aXRsZT1cImNvbW1hbmRzXCI+XG4gICAgICA8Q29tbWFuZHNcbiAgICAgICAgY29tbWFuZHM9e2J1aWx0aW5Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGRlZmF1bHQgY29tbWFuZHM6XCJcbiAgICAgICAgb25DYW5jZWw9e2Nsb3NlfVxuICAgICAgLz5cbiAgICA8L1RhYj4sXG4gIClcblxuICB0YWJzLnB1c2goXG4gICAgPFRhYiBrZXk9XCJjdXN0b21cIiB0aXRsZT1cImN1c3RvbS1jb21tYW5kc1wiPlxuICAgICAgPENvbW1hbmRzXG4gICAgICAgIGNvbW1hbmRzPXtjdXN0b21Db21tYW5kc31cbiAgICAgICAgbWF4SGVpZ2h0PXttYXhIZWlnaHR9XG4gICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgIHRpdGxlPVwiQnJvd3NlIGN1c3RvbSBjb21tYW5kczpcIlxuICAgICAgICBlbXB0eU1lc3NhZ2U9XCJObyBjdXN0b20gY29tbWFuZHMgZm91bmRcIlxuICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAvPlxuICAgIDwvVGFiPixcbiAgKVxuXG4gIGlmIChcImV4dGVybmFsXCIgPT09ICdhbnQnICYmIGFudE9ubHlDb21tYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgdGFicy5wdXNoKFxuICAgICAgPFRhYiBrZXk9XCJhbnQtb25seVwiIHRpdGxlPVwiW2FudC1vbmx5XVwiPlxuICAgICAgICA8Q29tbWFuZHNcbiAgICAgICAgICBjb21tYW5kcz17YW50T25seUNvbW1hbmRzfVxuICAgICAgICAgIG1heEhlaWdodD17bWF4SGVpZ2h0fVxuICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgICAgdGl0bGU9XCJCcm93c2UgYW50LW9ubHkgY29tbWFuZHM6XCJcbiAgICAgICAgICBvbkNhbmNlbD17Y2xvc2V9XG4gICAgICAgIC8+XG4gICAgICA8L1RhYj4sXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBoZWlnaHQ9e2luc2lkZU1vZGFsID8gdW5kZWZpbmVkIDogbWF4SGVpZ2h0fT5cbiAgICAgIDxQYW5lIGNvbG9yPVwicHJvZmVzc2lvbmFsQmx1ZVwiPlxuICAgICAgICA8VGFic1xuICAgICAgICAgIHRpdGxlPXtcbiAgICAgICAgICAgIFwiZXh0ZXJuYWxcIiA9PT0gJ2FudCdcbiAgICAgICAgICAgICAgPyAnL2hlbHAnXG4gICAgICAgICAgICAgIDogYENsYXVkZSBDb2RlIHYke01BQ1JPLlZFUlNJT059YFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb2xvcj1cInByb2Zlc3Npb25hbEJsdWVcIlxuICAgICAgICAgIGRlZmF1bHRUYWI9XCJnZW5lcmFsXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt0YWJzfVxuICAgICAgICA8L1RhYnM+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIEZvciBtb3JlIGhlbHA6eycgJ31cbiAgICAgICAgICAgIDxMaW5rIHVybD1cImh0dHBzOi8vY29kZS5jbGF1ZGUuY29tL2RvY3MvZW4vb3ZlcnZpZXdcIiAvPlxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICAgIDxCb3ggbWFyZ2luVG9wPXsxfT5cbiAgICAgICAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgICAgICAgIHtleGl0U3RhdGUucGVuZGluZyA/IChcbiAgICAgICAgICAgICAgPD5QcmVzcyB7ZXhpdFN0YXRlLmtleU5hbWV9IGFnYWluIHRvIGV4aXQ8Lz5cbiAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgIDxUZXh0IGl0YWxpYz57ZGlzbWlzc1Nob3J0Y3V0fSB0byBjYW5jZWw8L1RleHQ+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgPC9Cb3g+XG4gICAgICA8L1BhbmU+XG4gICAgPC9Cb3g+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsOEJBQThCLFFBQVEsNkNBQTZDO0FBQzVGLFNBQVNDLGtCQUFrQixRQUFRLHVDQUF1QztBQUMxRSxTQUNFQyxtQkFBbUIsRUFDbkIsS0FBS0MsT0FBTyxFQUNaLEtBQUtDLG9CQUFvQixFQUN6QkMsc0JBQXNCLFFBQ2pCLG1CQUFtQjtBQUMxQixTQUFTQyxnQkFBZ0IsUUFBUSwrQkFBK0I7QUFDaEUsU0FBU0MsZUFBZSxRQUFRLGdDQUFnQztBQUNoRSxTQUFTQyxHQUFHLEVBQUVDLElBQUksRUFBRUMsSUFBSSxRQUFRLGNBQWM7QUFDOUMsU0FBU0MsYUFBYSxRQUFRLG9DQUFv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
src/constants/product.ts CHANGED
@@ -1,6 +1,6 @@
1
  export const PRODUCT_URL = 'https://claude.com/claude-code'
2
 
3
- // Claude Code Remote session URLs
4
  export const CLAUDE_AI_BASE_URL = 'https://claude.ai'
5
  export const CLAUDE_AI_STAGING_BASE_URL = 'https://claude-ai.staging.ant.dev'
6
  export const CLAUDE_AI_LOCAL_BASE_URL = 'http://localhost:4000'
 
1
  export const PRODUCT_URL = 'https://claude.com/claude-code'
2
 
3
+ // VersperClaw Remote session URLs
4
  export const CLAUDE_AI_BASE_URL = 'https://claude.ai'
5
  export const CLAUDE_AI_STAGING_BASE_URL = 'https://claude-ai.staging.ant.dev'
6
  export const CLAUDE_AI_LOCAL_BASE_URL = 'http://localhost:4000'
src/constants/prompts.ts CHANGED
@@ -99,7 +99,7 @@ const skillSearchFeatureCheck = feature('EXPERIMENTAL_SKILL_SEARCH')
99
  import type { OutputStyleConfig } from './outputStyles.js'
100
  import { CYBER_RISK_INSTRUCTION } from './cyberRiskInstruction.js'
101
 
102
- export const CLAUDE_CODE_DOCS_MAP_URL =
103
  'https://code.claude.com/docs/en/claude_code_docs_map.md'
104
 
105
  /**
@@ -115,7 +115,7 @@ export const SYSTEM_PROMPT_DYNAMIC_BOUNDARY =
115
  '__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'
116
 
117
  // @[MODEL LAUNCH]: Update the latest frontier model.
118
- const FRONTIER_MODEL_NAME = 'Claude Opus 4.6'
119
 
120
  // @[MODEL LAUNCH]: Update the model family IDs below to the latest in each tier.
121
  const CLAUDE_4_5_OR_4_6_MODEL_IDS = {
@@ -214,7 +214,7 @@ function getSimpleDoingTasksSection(): string {
214
  ]
215
 
216
  const userHelpSubitems = [
217
- `/help: Get help with using Claude Code`,
218
  `To give feedback, users should ${MACRO.ISSUES_EXPLAINER}`,
219
  ]
220
 
@@ -242,7 +242,7 @@ function getSimpleDoingTasksSection(): string {
242
  : []),
243
  ...(process.env.USER_TYPE === 'ant'
244
  ? [
245
- `If the user reports a bug, slowness, or unexpected behavior with Claude Code itself (as opposed to asking you to fix their own code), recommend the appropriate slash command: /issue for model-related problems (odd outputs, wrong tool choices, hallucinations, refusals), or /share to upload the full session transcript for product bugs, crashes, slowness, or general issues. Only recommend these when the user is describing a problem with Claude Code. After /share produces a ccshare link, if you have a Slack MCP tool available, offer to post the link to #claude-code-feedback (channel ID C07VBSHV7EV) for the user.`,
246
  ]
247
  : []),
248
  `If the user asks for help or wants to give feedback inform them of the following:`,
@@ -434,7 +434,7 @@ function getSimpleToneAndStyleSection(): string {
434
  ? null
435
  : `Your responses should be short and concise.`,
436
  `When referencing specific functions or pieces of code include the pattern file_path:line_number to allow the user to easily navigate to the source code location.`,
437
- `When referencing GitHub issues or pull requests, use the owner/repo#123 format (e.g. anthropics/claude-code#100) so they render as clickable links.`,
438
  `Do not use a colon before tool calls. Your tool calls may not be shown directly in the output, so text like "Let me read the file:" followed by a read tool call should just be "Let me read the file." with a period.`,
439
  ].filter(item => item !== null)
440
 
@@ -449,7 +449,7 @@ export async function getSystemPrompt(
449
  ): Promise<string[]> {
450
  if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {
451
  return [
452
- `You are Claude Code, Anthropic's official CLI for Claude.\n\nCWD: ${getCwd()}\nDate: ${getSessionStartDate()}`,
453
  ]
454
  }
455
 
@@ -618,14 +618,6 @@ export async function computeEnvInfo(
618
  // inlined at each callsite (not hoisted to a const) so the bundler can
619
  // constant-fold it to `false` in external builds and eliminate the branch.
620
  let modelDescription = ''
621
- if (process.env.USER_TYPE === 'ant' && isUndercover()) {
622
- // suppress
623
- } else {
624
- const marketingName = getMarketingNameForModel(modelId)
625
- modelDescription = marketingName
626
- ? `You are powered by the model named ${marketingName}. The exact model ID is ${modelId}.`
627
- : `You are powered by the model ${modelId}.`
628
- }
629
 
630
  const additionalDirsInfo =
631
  additionalWorkingDirectories && additionalWorkingDirectories.length > 0
@@ -659,12 +651,10 @@ export async function computeSimpleEnvInfo(
659
  let modelDescription: string | null = null
660
  if (process.env.USER_TYPE === 'ant' && isUndercover()) {
661
  // suppress
662
- } else {
663
- const marketingName = getMarketingNameForModel(modelId)
664
- modelDescription = marketingName
665
- ? `You are powered by the model named ${marketingName}. The exact model ID is ${modelId}.`
666
- : `You are powered by the model ${modelId}.`
667
  }
 
 
 
668
 
669
  const cutoff = getKnowledgeCutoff(modelId)
670
  const knowledgeCutoffMessage = cutoff
@@ -691,15 +681,11 @@ export async function computeSimpleEnvInfo(
691
  `OS Version: ${unameSR}`,
692
  modelDescription,
693
  knowledgeCutoffMessage,
 
694
  process.env.USER_TYPE === 'ant' && isUndercover()
695
  ? null
696
- : `The most recent Claude model family is Claude 4.5/4.6. Model IDs Opus 4.6: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.opus}', Sonnet 4.6: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.sonnet}', Haiku 4.5: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.haiku}'. When building AI applications, default to the latest and most capable Claude models.`,
697
- process.env.USER_TYPE === 'ant' && isUndercover()
698
- ? null
699
- : `Claude Code is available as a CLI in the terminal, desktop app (Mac/Windows), web app (claude.ai/code), and IDE extensions (VS Code, JetBrains).`,
700
- process.env.USER_TYPE === 'ant' && isUndercover()
701
- ? null
702
- : `Fast mode for Claude Code uses the same ${FRONTIER_MODEL_NAME} model with faster output. It does NOT switch to a different model. It can be toggled with /fast.`,
703
  ].filter(item => item !== null)
704
 
705
  return [
@@ -755,7 +741,7 @@ export function getUnameSR(): string {
755
  return `${osType()} ${osRelease()}`
756
  }
757
 
758
- export const DEFAULT_AGENT_PROMPT = `You are an agent for Claude Code, Anthropic's official CLI for Claude. Given the user's message, you should use the tools available to complete the task. Complete the task fully—don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings — the caller will relay this to the user, so it only needs the essentials.`
759
 
760
  export async function enhanceSystemPromptWithEnvDetails(
761
  existingSystemPrompt: string[],
 
99
  import type { OutputStyleConfig } from './outputStyles.js'
100
  import { CYBER_RISK_INSTRUCTION } from './cyberRiskInstruction.js'
101
 
102
+ export const VERSPER_CLAW_DOCS_MAP_URL =
103
  'https://code.claude.com/docs/en/claude_code_docs_map.md'
104
 
105
  /**
 
115
  '__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__'
116
 
117
  // @[MODEL LAUNCH]: Update the latest frontier model.
118
+ const FRONTIER_MODEL_NAME = 'VersperOmni'
119
 
120
  // @[MODEL LAUNCH]: Update the model family IDs below to the latest in each tier.
121
  const CLAUDE_4_5_OR_4_6_MODEL_IDS = {
 
214
  ]
215
 
216
  const userHelpSubitems = [
217
+ `/help: Get help with using VersperClaw`,
218
  `To give feedback, users should ${MACRO.ISSUES_EXPLAINER}`,
219
  ]
220
 
 
242
  : []),
243
  ...(process.env.USER_TYPE === 'ant'
244
  ? [
245
+ `If the user reports a bug, slowness, or unexpected behavior with VersperClaw itself (as opposed to asking you to fix their own code), recommend the appropriate slash command: /issue for model-related problems (odd outputs, wrong tool choices, hallucinations, refusals), or /share to upload the full session transcript for product bugs, crashes, slowness, or general issues. Only recommend these when the user is describing a problem with VersperClaw. After /share produces a ccshare link, if you have a Slack MCP tool available, offer to post the link to #versperclaw-feedback (channel ID C07VBSHV7EV) for the user.`,
246
  ]
247
  : []),
248
  `If the user asks for help or wants to give feedback inform them of the following:`,
 
434
  ? null
435
  : `Your responses should be short and concise.`,
436
  `When referencing specific functions or pieces of code include the pattern file_path:line_number to allow the user to easily navigate to the source code location.`,
437
+ `When referencing GitHub issues or pull requests, use the owner/repo#123 format (e.g. versperai/versperclaw#100) so they render as clickable links.`,
438
  `Do not use a colon before tool calls. Your tool calls may not be shown directly in the output, so text like "Let me read the file:" followed by a read tool call should just be "Let me read the file." with a period.`,
439
  ].filter(item => item !== null)
440
 
 
449
  ): Promise<string[]> {
450
  if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {
451
  return [
452
+ `You are VersperClaw, versperai's CLI.\n\nCWD: ${getCwd()}\nDate: ${getSessionStartDate()}`,
453
  ]
454
  }
455
 
 
618
  // inlined at each callsite (not hoisted to a const) so the bundler can
619
  // constant-fold it to `false` in external builds and eliminate the branch.
620
  let modelDescription = ''
 
 
 
 
 
 
 
 
621
 
622
  const additionalDirsInfo =
623
  additionalWorkingDirectories && additionalWorkingDirectories.length > 0
 
651
  let modelDescription: string | null = null
652
  if (process.env.USER_TYPE === 'ant' && isUndercover()) {
653
  // suppress
 
 
 
 
 
654
  }
655
+ // modelDescription intentionally suppressed — telling the model it is
656
+ // "powered by Claude" or giving it model IDs containing "claude-" leaks
657
+ // its identity and causes it to answer "I am Claude" when asked.
658
 
659
  const cutoff = getKnowledgeCutoff(modelId)
660
  const knowledgeCutoffMessage = cutoff
 
681
  `OS Version: ${unameSR}`,
682
  modelDescription,
683
  knowledgeCutoffMessage,
684
+ null,
685
  process.env.USER_TYPE === 'ant' && isUndercover()
686
  ? null
687
+ : `VersperClaw is available as a CLI in the terminal, desktop app (Mac/Windows), web app (claude.ai/code), and IDE extensions (VS Code, JetBrains).`,
688
+ null,
 
 
 
 
 
689
  ].filter(item => item !== null)
690
 
691
  return [
 
741
  return `${osType()} ${osRelease()}`
742
  }
743
 
744
+ export const DEFAULT_AGENT_PROMPT = `You are an agent for VersperClaw, versperai's CLI. Given the user's message, you should use the tools available to complete the task. Complete the task fully—don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings — the caller will relay this to the user, so it only needs the essentials.`
745
 
746
  export async function enhanceSystemPromptWithEnvDetails(
747
  existingSystemPrompt: string[],
src/constants/system.ts CHANGED
@@ -7,9 +7,9 @@ import { isEnvDefinedFalsy } from '../utils/envUtils.js'
7
  import { getAPIProvider } from '../utils/model/providers.js'
8
  import { getWorkload } from '../utils/workloadContext.js'
9
 
10
- const DEFAULT_PREFIX = `You are Claude Code, Anthropic's official CLI for Claude.`
11
- const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are Claude Code, Anthropic's official CLI for Claude, running within the Claude Agent SDK.`
12
- const AGENT_SDK_PREFIX = `You are a Claude agent, built on Anthropic's Claude Agent SDK.`
13
 
14
  const CLI_SYSPROMPT_PREFIX_VALUES = [
15
  DEFAULT_PREFIX,
 
7
  import { getAPIProvider } from '../utils/model/providers.js'
8
  import { getWorkload } from '../utils/workloadContext.js'
9
 
10
+ const DEFAULT_PREFIX = `You are VersperClaw, versperai's CLI.`
11
+ const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are VersperClaw, versperai's CLI, running within the Agent SDK.`
12
+ const AGENT_SDK_PREFIX = `You are a VersperClaw agent, built on versperai's Agent SDK.`
13
 
14
  const CLI_SYSPROMPT_PREFIX_VALUES = [
15
  DEFAULT_PREFIX,
src/services/PromptSuggestion/promptSuggestion.ts CHANGED
@@ -255,7 +255,7 @@ export function getParentCacheSuppressReason(
255
  : null
256
  }
257
 
258
- const SUGGESTION_PROMPT = `[SUGGESTION MODE: Suggest what the user might naturally type next into Claude Code.]
259
 
260
  FIRST: Look at the user's recent messages and original request.
261
 
 
255
  : null
256
  }
257
 
258
+ const SUGGESTION_PROMPT = `[SUGGESTION MODE: Suggest what the user might naturally type next into VersperClaw.]
259
 
260
  FIRST: Look at the user's recent messages and original request.
261
 
src/skills/bundled/debug.ts CHANGED
@@ -1,5 +1,5 @@
1
  import { open, stat } from 'fs/promises'
2
- import { CLAUDE_CODE_GUIDE_AGENT_TYPE } from 'src/tools/AgentTool/built-in/claudeCodeGuideAgent.js'
3
  import { getSettingsFilePathForSource } from 'src/utils/settings/settings.js'
4
  import { enableDebugLogging, getDebugLogPath } from '../../utils/debug.js'
5
  import { errorMessage, isENOENT } from '../../utils/errors.js'
@@ -14,7 +14,7 @@ export function registerDebugSkill(): void {
14
  name: 'debug',
15
  description:
16
  process.env.USER_TYPE === 'ant'
17
- ? 'Debug your current Claude Code session by reading the session debug log. Includes all event logging'
18
  : 'Enable debug logging for this session and help diagnose issues',
19
  allowedTools: ['Read', 'Grep', 'Glob'],
20
  argumentHint: '[issue description]',
@@ -68,7 +68,7 @@ Tell the user that debug logging is now active at \`${debugLogPath}\`, ask them
68
 
69
  const prompt = `# Debug Skill
70
 
71
- Help the user debug an issue they're encountering in this current Claude Code session.
72
  ${justEnabledSection}
73
  ## Session Debug Log
74
 
@@ -93,7 +93,7 @@ Remember that settings are in:
93
 
94
  1. Review the user's issue description
95
  2. The last ${DEFAULT_DEBUG_LINES_READ} lines show the debug file format. Look for [ERROR] and [WARN] entries, stack traces, and failure patterns across the file
96
- 3. Consider launching the ${CLAUDE_CODE_GUIDE_AGENT_TYPE} subagent to understand the relevant Claude Code features
97
  4. Explain what you found in plain language
98
  5. Suggest concrete fixes or next steps
99
  `
 
1
  import { open, stat } from 'fs/promises'
2
+ import { VERSPER_CLAW_GUIDE_AGENT_TYPE } from 'src/tools/AgentTool/built-in/versperClawGuideAgent.js'
3
  import { getSettingsFilePathForSource } from 'src/utils/settings/settings.js'
4
  import { enableDebugLogging, getDebugLogPath } from '../../utils/debug.js'
5
  import { errorMessage, isENOENT } from '../../utils/errors.js'
 
14
  name: 'debug',
15
  description:
16
  process.env.USER_TYPE === 'ant'
17
+ ? 'Debug your current VersperClaw session by reading the session debug log. Includes all event logging'
18
  : 'Enable debug logging for this session and help diagnose issues',
19
  allowedTools: ['Read', 'Grep', 'Glob'],
20
  argumentHint: '[issue description]',
 
68
 
69
  const prompt = `# Debug Skill
70
 
71
+ Help the user debug an issue they're encountering in this current VersperClaw session.
72
  ${justEnabledSection}
73
  ## Session Debug Log
74
 
 
93
 
94
  1. Review the user's issue description
95
  2. The last ${DEFAULT_DEBUG_LINES_READ} lines show the debug file format. Look for [ERROR] and [WARN] entries, stack traces, and failure patterns across the file
96
+ 3. Consider launching the ${VERSPER_CLAW_GUIDE_AGENT_TYPE} subagent to understand the relevant Claude Code features
97
  4. Explain what you found in plain language
98
  5. Suggest concrete fixes or next steps
99
  `
src/skills/bundled/stuck.ts CHANGED
@@ -3,13 +3,13 @@ import { registerBundledSkill } from '../bundledSkills.js'
3
  // Prompt text contains `ps` commands as instructions for Claude to run,
4
  // not commands this file executes.
5
  // eslint-disable-next-line custom-rules/no-direct-ps-commands
6
- const STUCK_PROMPT = `# /stuck — diagnose frozen/slow Claude Code sessions
7
 
8
- The user thinks another Claude Code session on this machine is frozen, stuck, or very slow. Investigate and post a report to #claude-code-feedback.
9
 
10
  ## What to look for
11
 
12
- Scan for other Claude Code processes (excluding the current one — PID is in \`process.pid\` but for shell commands just exclude the PID you see running this prompt). Process names are typically \`claude\` (installed) or \`cli\` (native dev build).
13
 
14
  Signs of a stuck session:
15
  - **High CPU (≥90%) sustained** — likely an infinite loop. Sample twice, 1-2s apart, to confirm it's not a transient spike.
@@ -21,7 +21,7 @@ Signs of a stuck session:
21
 
22
  ## Investigation steps
23
 
24
- 1. **List all Claude Code processes** (macOS/Linux):
25
  \`\`\`
26
  ps -axo pid=,pcpu=,rss=,etime=,state=,comm=,command= | grep -E '(claude|cli)' | grep -v grep
27
  \`\`\`
@@ -41,17 +41,17 @@ Signs of a stuck session:
41
 
42
  **Only post to Slack if you actually found something stuck.** If every session looks healthy, tell the user that directly — do not post an all-clear to the channel.
43
 
44
- If you did find a stuck/slow session, post to **#claude-code-feedback** (channel ID: \`C07VBSHV7EV\`) using the Slack MCP tool. Use ToolSearch to find \`slack_send_message\` if it's not already loaded.
45
 
46
  **Use a two-message structure** to keep the channel scannable:
47
 
48
- 1. **Top-level message** — one short line: hostname, Claude Code version, and a terse symptom (e.g. "session PID 12345 pegged at 100% CPU for 10min" or "git subprocess hung in D state"). No code blocks, no details.
49
  2. **Thread reply** — the full diagnostic dump. Pass the top-level message's \`ts\` as \`thread_ts\`. Include:
50
  - PID, CPU%, RSS, state, uptime, command line, child processes
51
  - Your diagnosis of what's likely wrong
52
  - Relevant debug log tail or \`sample\` output if you captured it
53
 
54
- If Slack MCP isn't available, format the report as a message the user can copy-paste into #claude-code-feedback (and let them know to thread the details themselves).
55
 
56
  ## Notes
57
  - Don't kill or signal any processes — this is diagnostic only.
@@ -66,7 +66,7 @@ export function registerStuckSkill(): void {
66
  registerBundledSkill({
67
  name: 'stuck',
68
  description:
69
- '[ANT-ONLY] Investigate frozen/stuck/slow Claude Code sessions on this machine and post a diagnostic report to #claude-code-feedback.',
70
  userInvocable: true,
71
  async getPromptForCommand(args) {
72
  let prompt = STUCK_PROMPT
 
3
  // Prompt text contains `ps` commands as instructions for Claude to run,
4
  // not commands this file executes.
5
  // eslint-disable-next-line custom-rules/no-direct-ps-commands
6
+ const STUCK_PROMPT = `# /stuck — diagnose frozen/slow VersperClaw sessions
7
 
8
+ The user thinks another VersperClaw session on this machine is frozen, stuck, or very slow. Investigate and post a report to #versperclaw-feedback.
9
 
10
  ## What to look for
11
 
12
+ Scan for other VersperClaw processes (excluding the current one — PID is in \`process.pid\` but for shell commands just exclude the PID you see running this prompt). Process names are typically \`claude\` (installed) or \`cli\` (native dev build).
13
 
14
  Signs of a stuck session:
15
  - **High CPU (≥90%) sustained** — likely an infinite loop. Sample twice, 1-2s apart, to confirm it's not a transient spike.
 
21
 
22
  ## Investigation steps
23
 
24
+ 1. **List all VersperClaw processes** (macOS/Linux):
25
  \`\`\`
26
  ps -axo pid=,pcpu=,rss=,etime=,state=,comm=,command= | grep -E '(claude|cli)' | grep -v grep
27
  \`\`\`
 
41
 
42
  **Only post to Slack if you actually found something stuck.** If every session looks healthy, tell the user that directly — do not post an all-clear to the channel.
43
 
44
+ If you did find a stuck/slow session, post to **#versperclaw-feedback** (channel ID: \`C07VBSHV7EV\`) using the Slack MCP tool. Use ToolSearch to find \`slack_send_message\` if it's not already loaded.
45
 
46
  **Use a two-message structure** to keep the channel scannable:
47
 
48
+ 1. **Top-level message** — one short line: hostname, VersperClaw version, and a terse symptom (e.g. "session PID 12345 pegged at 100% CPU for 10min" or "git subprocess hung in D state"). No code blocks, no details.
49
  2. **Thread reply** — the full diagnostic dump. Pass the top-level message's \`ts\` as \`thread_ts\`. Include:
50
  - PID, CPU%, RSS, state, uptime, command line, child processes
51
  - Your diagnosis of what's likely wrong
52
  - Relevant debug log tail or \`sample\` output if you captured it
53
 
54
+ If Slack MCP isn't available, format the report as a message the user can copy-paste into #versperclaw-feedback (and let them know to thread the details themselves).
55
 
56
  ## Notes
57
  - Don't kill or signal any processes — this is diagnostic only.
 
66
  registerBundledSkill({
67
  name: 'stuck',
68
  description:
69
+ '[ANT-ONLY] Investigate frozen/stuck/slow Claude Code sessions on this machine and post a diagnostic report to #versperclaw-feedback.',
70
  userInvocable: true,
71
  async getPromptForCommand(args) {
72
  let prompt = STUCK_PROMPT
src/skills/bundled/updateConfig.ts CHANGED
@@ -91,7 +91,7 @@ Set \`commit\` or \`pr\` to empty string \`""\` to hide that attribution.
91
  }
92
  }
93
  \`\`\`
94
- Plugin syntax: \`plugin-name@source\` where source is \`claude-code-marketplace\`, \`claude-plugins-official\`, or \`builtin\`.
95
 
96
  ### Other Settings
97
  - \`language\`: Preferred response language (e.g., "japanese")
@@ -109,7 +109,7 @@ Plugin syntax: \`plugin-name@source\` where source is \`claude-code-marketplace\
109
 
110
  const HOOKS_DOCS = `## Hooks Configuration
111
 
112
- Hooks run commands at specific points in Claude Code's lifecycle.
113
 
114
  ### Hook Structure
115
  \`\`\`json
@@ -306,7 +306,7 @@ Given an event, matcher, target file, and desired behavior, follow this flow. Ea
306
 
307
  const UPDATE_CONFIG_PROMPT = `# Update Config Skill
308
 
309
- Modify Claude Code configuration by updating settings.json files.
310
 
311
  ## When Hooks Are Required (Not Memory)
312
 
@@ -446,7 +446,7 @@ export function registerUpdateConfigSkill(): void {
446
  registerBundledSkill({
447
  name: 'update-config',
448
  description:
449
- 'Use this skill to configure the Claude Code harness via settings.json. Automated behaviors ("from now on when X", "each time X", "whenever X", "before/after X") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions ("allow X", "add permission", "move permission to"), env vars ("set X=Y"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: "allow npm commands", "add bq permission to global settings", "move permission to user settings", "set DEBUG=true", "when claude stops show X". For simple settings like theme/model, use Config tool.',
450
  allowedTools: ['Read'],
451
  userInvocable: true,
452
  async getPromptForCommand(args) {
 
91
  }
92
  }
93
  \`\`\`
94
+ Plugin syntax: \`plugin-name@source\` where source is \`versperclaw-marketplace\`, \`claude-plugins-official\`, or \`builtin\`.
95
 
96
  ### Other Settings
97
  - \`language\`: Preferred response language (e.g., "japanese")
 
109
 
110
  const HOOKS_DOCS = `## Hooks Configuration
111
 
112
+ Hooks run commands at specific points in VersperClaw's lifecycle.
113
 
114
  ### Hook Structure
115
  \`\`\`json
 
306
 
307
  const UPDATE_CONFIG_PROMPT = `# Update Config Skill
308
 
309
+ Modify VersperClaw configuration by updating settings.json files.
310
 
311
  ## When Hooks Are Required (Not Memory)
312
 
 
446
  registerBundledSkill({
447
  name: 'update-config',
448
  description:
449
+ 'Use this skill to configure the VersperClaw harness via settings.json. Automated behaviors ("from now on when X", "each time X", "whenever X", "before/after X") require hooks configured in settings.json - the harness executes these, not Claude, so memory/preferences cannot fulfill them. Also use for: permissions ("allow X", "add permission", "move permission to"), env vars ("set X=Y"), hook troubleshooting, or any changes to settings.json/settings.local.json files. Examples: "allow npm commands", "add bq permission to global settings", "move permission to user settings", "set DEBUG=true", "when claude stops show X". For simple settings like theme/model, use Config tool.',
450
  allowedTools: ['Read'],
451
  userInvocable: true,
452
  async getPromptForCommand(args) {
src/tools/AgentTool/built-in/{claudeCodeGuideAgent.ts → versperClawGuideAgent.ts} RENAMED
@@ -14,32 +14,32 @@ import type {
14
  BuiltInAgentDefinition,
15
  } from '../loadAgentsDir.js'
16
 
17
- const CLAUDE_CODE_DOCS_MAP_URL =
18
  'https://code.claude.com/docs/en/claude_code_docs_map.md'
19
  const CDP_DOCS_MAP_URL = 'https://platform.claude.com/llms.txt'
20
 
21
- export const CLAUDE_CODE_GUIDE_AGENT_TYPE = 'claude-code-guide'
22
 
23
- function getClaudeCodeGuideBasePrompt(): string {
24
  // Ant-native builds alias find/grep to embedded bfs/ugrep and remove the
25
  // dedicated Glob/Grep tools, so point at find/grep instead.
26
  const localSearchHint = hasEmbeddedSearchTools()
27
  ? `${FILE_READ_TOOL_NAME}, \`find\`, and \`grep\``
28
  : `${FILE_READ_TOOL_NAME}, ${GLOB_TOOL_NAME}, and ${GREP_TOOL_NAME}`
29
 
30
- return `You are the Claude guide agent. Your primary responsibility is helping users understand and use Claude Code, the Claude Agent SDK, and the Claude API (formerly the Anthropic API) effectively.
31
 
32
  **Your expertise spans three domains:**
33
 
34
- 1. **Claude Code** (the CLI tool): Installation, configuration, hooks, skills, MCP servers, keyboard shortcuts, IDE integrations, settings, and workflows.
35
 
36
- 2. **Claude Agent SDK**: A framework for building custom AI agents based on Claude Code technology. Available for Node.js/TypeScript and Python.
37
 
38
  3. **Claude API**: The Claude API (formerly known as the Anthropic API) for direct model interaction, tool use, and integrations.
39
 
40
  **Documentation sources:**
41
 
42
- - **Claude Code docs** (${CLAUDE_CODE_DOCS_MAP_URL}): Fetch this for questions about the Claude Code CLI tool, including:
43
  - Installation, setup, and getting started
44
  - Hooks (pre/post command execution)
45
  - Custom skills
@@ -95,9 +95,9 @@ function getFeedbackGuideline(): string {
95
  return "- When you cannot find an answer or the feature doesn't exist, direct the user to use /feedback to report a feature request or bug"
96
  }
97
 
98
- export const CLAUDE_CODE_GUIDE_AGENT: BuiltInAgentDefinition = {
99
- agentType: CLAUDE_CODE_GUIDE_AGENT_TYPE,
100
- whenToUse: `Use this agent when the user asks questions ("Can Claude...", "Does Claude...", "How do I...") about: (1) Claude Code (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - API usage, tool use, Anthropic SDK usage. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via ${SEND_MESSAGE_TOOL_NAME}.`,
101
  // Ant-native builds: Glob/Grep tools are removed; use Bash (with embedded
102
  // bfs/ugrep via find/grep aliases) for local file search instead.
103
  tools: hasEmbeddedSearchTools()
@@ -181,7 +181,7 @@ export const CLAUDE_CODE_GUIDE_AGENT: BuiltInAgentDefinition = {
181
 
182
  // Add the feedback guideline (conditional based on whether user is using 3P services)
183
  const feedbackGuideline = getFeedbackGuideline()
184
- const basePromptWithFeedback = `${getClaudeCodeGuideBasePrompt()}
185
  ${feedbackGuideline}`
186
 
187
  // If we have any context to add, append it to the base system prompt
 
14
  BuiltInAgentDefinition,
15
  } from '../loadAgentsDir.js'
16
 
17
+ const VERSPER_CLAW_DOCS_MAP_URL =
18
  'https://code.claude.com/docs/en/claude_code_docs_map.md'
19
  const CDP_DOCS_MAP_URL = 'https://platform.claude.com/llms.txt'
20
 
21
+ export const VERSPER_CLAW_GUIDE_AGENT_TYPE = 'claude-code-guide'
22
 
23
+ function getVersperClawGuideBasePrompt(): string {
24
  // Ant-native builds alias find/grep to embedded bfs/ugrep and remove the
25
  // dedicated Glob/Grep tools, so point at find/grep instead.
26
  const localSearchHint = hasEmbeddedSearchTools()
27
  ? `${FILE_READ_TOOL_NAME}, \`find\`, and \`grep\``
28
  : `${FILE_READ_TOOL_NAME}, ${GLOB_TOOL_NAME}, and ${GREP_TOOL_NAME}`
29
 
30
+ return `You are the VersperClaw guide agent. Your primary responsibility is helping users understand and use VersperClaw, the Claude Agent SDK, and the Claude API (formerly the Anthropic API) effectively.
31
 
32
  **Your expertise spans three domains:**
33
 
34
+ 1. **VersperClaw** (the CLI tool): Installation, configuration, hooks, skills, MCP servers, keyboard shortcuts, IDE integrations, settings, and workflows.
35
 
36
+ 2. **Claude Agent SDK**: A framework for building custom AI agents based on VersperClaw technology. Available for Node.js/TypeScript and Python.
37
 
38
  3. **Claude API**: The Claude API (formerly known as the Anthropic API) for direct model interaction, tool use, and integrations.
39
 
40
  **Documentation sources:**
41
 
42
+ - **VersperClaw docs** (${VERSPER_CLAW_DOCS_MAP_URL}): Fetch this for questions about the VersperClaw CLI tool, including:
43
  - Installation, setup, and getting started
44
  - Hooks (pre/post command execution)
45
  - Custom skills
 
95
  return "- When you cannot find an answer or the feature doesn't exist, direct the user to use /feedback to report a feature request or bug"
96
  }
97
 
98
+ export const VERSPER_CLAW_GUIDE_AGENT: BuiltInAgentDefinition = {
99
+ agentType: VERSPER_CLAW_GUIDE_AGENT_TYPE,
100
+ whenToUse: `Use this agent when the user asks questions ("Can Claude...", "Does Claude...", "How do I...") about: (1) VersperClaw (the CLI tool) - features, hooks, slash commands, MCP servers, settings, IDE integrations, keyboard shortcuts; (2) Claude Agent SDK - building custom agents; (3) Claude API (formerly Anthropic API) - API usage, tool use, Anthropic SDK usage. **IMPORTANT:** Before spawning a new agent, check if there is already a running or recently completed claude-code-guide agent that you can continue via ${SEND_MESSAGE_TOOL_NAME}.`,
101
  // Ant-native builds: Glob/Grep tools are removed; use Bash (with embedded
102
  // bfs/ugrep via find/grep aliases) for local file search instead.
103
  tools: hasEmbeddedSearchTools()
 
181
 
182
  // Add the feedback guideline (conditional based on whether user is using 3P services)
183
  const feedbackGuideline = getFeedbackGuideline()
184
+ const basePromptWithFeedback = `${getVersperClawGuideBasePrompt()}
185
  ${feedbackGuideline}`
186
 
187
  // If we have any context to add, append it to the base system prompt
src/tools/AgentTool/builtInAgents.ts CHANGED
@@ -2,7 +2,7 @@ import { feature } from 'bun:bundle'
2
  import { getIsNonInteractiveSession } from '../../bootstrap/state.js'
3
  import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
4
  import { isEnvTruthy } from '../../utils/envUtils.js'
5
- import { CLAUDE_CODE_GUIDE_AGENT } from './built-in/claudeCodeGuideAgent.js'
6
  import { EXPLORE_AGENT } from './built-in/exploreAgent.js'
7
  import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
8
  import { PLAN_AGENT } from './built-in/planAgent.js'
@@ -58,7 +58,7 @@ export function getBuiltInAgents(): AgentDefinition[] {
58
  process.env.CLAUDE_CODE_ENTRYPOINT !== 'sdk-cli'
59
 
60
  if (isNonSdkEntrypoint) {
61
- agents.push(CLAUDE_CODE_GUIDE_AGENT)
62
  }
63
 
64
  if (
 
2
  import { getIsNonInteractiveSession } from '../../bootstrap/state.js'
3
  import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js'
4
  import { isEnvTruthy } from '../../utils/envUtils.js'
5
+ import { VERSPER_CLAW_GUIDE_AGENT } from './built-in/versperClawGuideAgent.js'
6
  import { EXPLORE_AGENT } from './built-in/exploreAgent.js'
7
  import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js'
8
  import { PLAN_AGENT } from './built-in/planAgent.js'
 
58
  process.env.CLAUDE_CODE_ENTRYPOINT !== 'sdk-cli'
59
 
60
  if (isNonSdkEntrypoint) {
61
+ agents.push(VERSPER_CLAW_GUIDE_AGENT)
62
  }
63
 
64
  if (
src/utils/permissions/yolo-classifier-prompts/auto_mode_system_prompt.txt CHANGED
@@ -1,4 +1,4 @@
1
- You are an automated security classifier for Claude Code, an AI coding assistant that runs in users' terminals. Your job is to decide whether each tool call the agent wants to make should be ALLOWED (auto-approved) or BLOCKED (requires explicit human confirmation).
2
 
3
  You receive a transcript of the conversation so far (user messages and previous tool calls) followed by the new action the agent wants to take. You must classify that single new action.
4
 
 
1
+ You are an automated security classifier for VersperClaw, an AI coding assistant that runs in users' terminals. Your job is to decide whether each tool call the agent wants to make should be ALLOWED (auto-approved) or BLOCKED (requires explicit human confirmation).
2
 
3
  You receive a transcript of the conversation so far (user messages and previous tool calls) followed by the new action the agent wants to take. You must classify that single new action.
4