Disable feedback, transcript share, and insights uploads
This commit is contained in:
@@ -1,4 +1,3 @@
|
|||||||
import { execFileSync } from 'child_process'
|
|
||||||
import { diffLines } from 'diff'
|
import { diffLines } from 'diff'
|
||||||
import { constants as fsConstants } from 'fs'
|
import { constants as fsConstants } from 'fs'
|
||||||
import {
|
import {
|
||||||
@@ -2674,7 +2673,7 @@ export type InsightsExport = {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Build export data from already-computed values.
|
* Build export data from already-computed values.
|
||||||
* Used by background upload to S3.
|
* Used by the local report writer.
|
||||||
*/
|
*/
|
||||||
export function buildExportData(
|
export function buildExportData(
|
||||||
data: AggregatedData,
|
data: AggregatedData,
|
||||||
@@ -3069,35 +3068,8 @@ const usageReport: Command = {
|
|||||||
{ collectRemote },
|
{ collectRemote },
|
||||||
)
|
)
|
||||||
|
|
||||||
let reportUrl = `file://${htmlPath}`
|
const reportUrl = `file://${htmlPath}`
|
||||||
let uploadHint = ''
|
const uploadHint = ''
|
||||||
|
|
||||||
if (process.env.USER_TYPE === 'ant') {
|
|
||||||
// Try to upload to S3
|
|
||||||
const timestamp = new Date()
|
|
||||||
.toISOString()
|
|
||||||
.replace(/[-:]/g, '')
|
|
||||||
.replace('T', '_')
|
|
||||||
.slice(0, 15)
|
|
||||||
const username = process.env.SAFEUSER || process.env.USER || 'unknown'
|
|
||||||
const filename = `${username}_insights_${timestamp}.html`
|
|
||||||
const s3Path = `s3://anthropic-serve/atamkin/cc-user-reports/${filename}`
|
|
||||||
const s3Url = `https://s3-frontend.infra.ant.dev/anthropic-serve/atamkin/cc-user-reports/${filename}`
|
|
||||||
|
|
||||||
reportUrl = s3Url
|
|
||||||
try {
|
|
||||||
execFileSync('ff', ['cp', htmlPath, s3Path], {
|
|
||||||
timeout: 60000,
|
|
||||||
stdio: 'pipe', // Suppress output
|
|
||||||
})
|
|
||||||
} catch {
|
|
||||||
// Upload failed - fall back to local file and show upload command
|
|
||||||
reportUrl = `file://${htmlPath}`
|
|
||||||
uploadHint = `\nAutomatic upload failed. Are you on the boron namespace? Try \`use-bo\` and ensure you've run \`sso\`.
|
|
||||||
To share, run: ff cp ${htmlPath} ${s3Path}
|
|
||||||
Then access at: ${s3Url}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build header with stats
|
// Build header with stats
|
||||||
const sessionLabel =
|
const sessionLabel =
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,23 +1,9 @@
|
|||||||
import axios from 'axios'
|
|
||||||
import { readFile, stat } from 'fs/promises'
|
|
||||||
import type { Message } from '../../types/message.js'
|
import type { Message } from '../../types/message.js'
|
||||||
import { checkAndRefreshOAuthTokenIfNeeded } from '../../utils/auth.js'
|
|
||||||
import { logForDebugging } from '../../utils/debug.js'
|
|
||||||
import { errorMessage } from '../../utils/errors.js'
|
|
||||||
import { getAuthHeaders, getUserAgent } from '../../utils/http.js'
|
|
||||||
import { normalizeMessagesForAPI } from '../../utils/messages.js'
|
|
||||||
import {
|
|
||||||
extractAgentIdsFromMessages,
|
|
||||||
getTranscriptPath,
|
|
||||||
loadSubagentTranscripts,
|
|
||||||
MAX_TRANSCRIPT_READ_BYTES,
|
|
||||||
} from '../../utils/sessionStorage.js'
|
|
||||||
import { jsonStringify } from '../../utils/slowOperations.js'
|
|
||||||
import { redactSensitiveInfo } from '../Feedback.js'
|
|
||||||
|
|
||||||
type TranscriptShareResult = {
|
type TranscriptShareResult = {
|
||||||
success: boolean
|
success: boolean
|
||||||
transcriptId?: string
|
transcriptId?: string
|
||||||
|
disabled?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export type TranscriptShareTrigger =
|
export type TranscriptShareTrigger =
|
||||||
@@ -27,86 +13,12 @@ export type TranscriptShareTrigger =
|
|||||||
| 'memory_survey'
|
| 'memory_survey'
|
||||||
|
|
||||||
export async function submitTranscriptShare(
|
export async function submitTranscriptShare(
|
||||||
messages: Message[],
|
_messages: Message[],
|
||||||
trigger: TranscriptShareTrigger,
|
_trigger: TranscriptShareTrigger,
|
||||||
appearanceId: string,
|
_appearanceId: string,
|
||||||
): Promise<TranscriptShareResult> {
|
): Promise<TranscriptShareResult> {
|
||||||
try {
|
return {
|
||||||
logForDebugging('Collecting transcript for sharing', { level: 'info' })
|
success: false,
|
||||||
|
disabled: true,
|
||||||
const transcript = normalizeMessagesForAPI(messages)
|
|
||||||
|
|
||||||
// Collect subagent transcripts
|
|
||||||
const agentIds = extractAgentIdsFromMessages(messages)
|
|
||||||
const subagentTranscripts = await loadSubagentTranscripts(agentIds)
|
|
||||||
|
|
||||||
// Read raw JSONL transcript (with size guard to prevent OOM)
|
|
||||||
let rawTranscriptJsonl: string | undefined
|
|
||||||
try {
|
|
||||||
const transcriptPath = getTranscriptPath()
|
|
||||||
const { size } = await stat(transcriptPath)
|
|
||||||
if (size <= MAX_TRANSCRIPT_READ_BYTES) {
|
|
||||||
rawTranscriptJsonl = await readFile(transcriptPath, 'utf-8')
|
|
||||||
} else {
|
|
||||||
logForDebugging(
|
|
||||||
`Skipping raw transcript read: file too large (${size} bytes)`,
|
|
||||||
{ level: 'warn' },
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
// File may not exist
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = {
|
|
||||||
trigger,
|
|
||||||
version: MACRO.VERSION,
|
|
||||||
platform: process.platform,
|
|
||||||
transcript,
|
|
||||||
subagentTranscripts:
|
|
||||||
Object.keys(subagentTranscripts).length > 0
|
|
||||||
? subagentTranscripts
|
|
||||||
: undefined,
|
|
||||||
rawTranscriptJsonl,
|
|
||||||
}
|
|
||||||
|
|
||||||
const content = redactSensitiveInfo(jsonStringify(data))
|
|
||||||
|
|
||||||
await checkAndRefreshOAuthTokenIfNeeded()
|
|
||||||
|
|
||||||
const authResult = getAuthHeaders()
|
|
||||||
if (authResult.error) {
|
|
||||||
return { success: false }
|
|
||||||
}
|
|
||||||
|
|
||||||
const headers: Record<string, string> = {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'User-Agent': getUserAgent(),
|
|
||||||
...authResult.headers,
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await axios.post(
|
|
||||||
'https://api.anthropic.com/api/claude_code_shared_session_transcripts',
|
|
||||||
{ content, appearance_id: appearanceId },
|
|
||||||
{
|
|
||||||
headers,
|
|
||||||
timeout: 30000,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
if (response.status === 200 || response.status === 201) {
|
|
||||||
const result = response.data
|
|
||||||
logForDebugging('Transcript shared successfully', { level: 'info' })
|
|
||||||
return {
|
|
||||||
success: true,
|
|
||||||
transcriptId: result?.transcript_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return { success: false }
|
|
||||||
} catch (err) {
|
|
||||||
logForDebugging(errorMessage(err), {
|
|
||||||
level: 'error',
|
|
||||||
})
|
|
||||||
return { success: false }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user