File: //proc/self/root/tmp/creator_direct_audit_helpers.patch
*** Begin Patch
*** Update File: /home/kiwerkzeuge.de/public_html/creator-studio/_lib/bootstrap.php
@@
return $summary;
}
+function cs_direct_publish_audit_pack_clean_status(mixed $value): string
+{
+ $status = strtolower(trim((string) $value));
+ $status = preg_replace('/[^a-z0-9_]+/', '_', $status) ?? '';
+ $status = trim($status, '_');
+ $aliases = ['ok' => 'ready', 'pending' => 'action_needed', 'todo' => 'action_needed'];
+ $status = $aliases[$status] ?? $status;
+ return in_array($status, ['ready', 'action_needed', 'blocked'], true) ? $status : 'action_needed';
+}
+
+function cs_direct_publish_audit_pack_normalize(array $pack): array
+{
+ $packId = preg_replace('/[^a-zA-Z0-9_.-]+/', '_', trim((string) ($pack['pack_id'] ?? ''))) ?? '';
+ if ($packId === '') {
+ $packId = 'dpaud_' . bin2hex(random_bytes(6));
+ }
+ $metrics = is_array($pack['metrics'] ?? null) ? $pack['metrics'] : [];
+ $evidence = is_array($pack['evidence'] ?? null) ? $pack['evidence'] : [];
+ $readyEvidence = max(0, (int) ($pack['ready_evidence'] ?? $pack['ready_checks'] ?? 0));
+ $totalEvidence = max($readyEvidence, (int) ($pack['total_evidence'] ?? $pack['total_checks'] ?? count($evidence)));
+ $blockedEvidence = max(0, (int) ($pack['blocked_evidence'] ?? $pack['blocked_checks'] ?? 0));
+ $privateHash = cs_clean_lead_text((string) ($pack['private_pack_hash'] ?? $pack['pack_hash'] ?? ''), 64);
+ return [
+ 'pack_id' => $packId,
+ 'generated_at' => (string) ($pack['generated_at'] ?? cs_now_iso()),
+ 'updated_at' => (string) ($pack['updated_at'] ?? cs_now_iso()),
+ 'status' => cs_direct_publish_audit_pack_clean_status($pack['status'] ?? 'action_needed'),
+ 'metric' => cs_clean_lead_text((string) ($pack['metric'] ?? ($readyEvidence . '/' . max(1, $totalEvidence) . ' evidence')), 120),
+ 'next_action' => cs_clean_lead_text((string) ($pack['next_action'] ?? 'Prepare and submit the sanitized Direct Publish evidence pack for TikTok Advanced Access review.'), 240, true),
+ 'source' => cs_clean_lead_text((string) ($pack['source'] ?? 'direct_publish_audit_pack_cli'), 80),
+ 'is_test' => !empty($pack['is_test']),
+ 'ready_evidence' => $readyEvidence,
+ 'total_evidence' => $totalEvidence,
+ 'blocked_evidence' => $blockedEvidence,
+ 'evidence_status' => cs_direct_publish_audit_pack_clean_status($pack['evidence_status'] ?? ($pack['status'] ?? 'action_needed')),
+ 'public_direct_blocker' => cs_clean_lead_text((string) ($pack['public_direct_blocker'] ?? ''), 160, true),
+ 'advanced_access_next_step' => cs_clean_lead_text((string) ($pack['advanced_access_next_step'] ?? ''), 240, true),
+ 'private_pack_present' => !empty($pack['private_pack_present']),
+ 'private_pack_hash' => $privateHash,
+ 'metrics' => $metrics,
+ 'evidence' => $evidence,
+ ];
+}
+
+function cs_direct_publish_audit_pack_load_store(): array
+{
+ $store = cs_load_json(CREATOR_STUDIO_DIRECT_PUBLISH_AUDIT_STORE_PATH, ['packs' => []]);
+ if (!isset($store['packs']) || !is_array($store['packs'])) {
+ $store['packs'] = [];
+ }
+ return $store;
+}
+
+function cs_direct_publish_audit_pack_list(bool $includeTests = false): array
+{
+ $store = cs_direct_publish_audit_pack_load_store();
+ $packs = [];
+ foreach ($store['packs'] as $pack) {
+ if (!is_array($pack)) {
+ continue;
+ }
+ $normalized = cs_direct_publish_audit_pack_normalize($pack);
+ if (!$includeTests && !empty($normalized['is_test'])) {
+ continue;
+ }
+ $packs[] = $normalized;
+ }
+ usort($packs, static fn (array $a, array $b): int => strcmp((string) ($b['generated_at'] ?? ''), (string) ($a['generated_at'] ?? '')));
+ return $packs;
+}
+
+function cs_direct_publish_audit_pack_save(array $pack): array
+{
+ $normalized = cs_direct_publish_audit_pack_normalize($pack);
+ $store = cs_direct_publish_audit_pack_load_store();
+ $store['packs'][$normalized['pack_id']] = $normalized;
+ $store['updated_at'] = cs_now_iso();
+ cs_save_json(CREATOR_STUDIO_DIRECT_PUBLISH_AUDIT_STORE_PATH, $store, 0600);
+ cs_append_jsonl(CREATOR_STUDIO_DIRECT_PUBLISH_AUDIT_LOG_PATH, array_merge(['action' => 'saved'], cs_direct_publish_audit_pack_agent_payload($normalized)));
+ return $normalized;
+}
+
+function cs_direct_publish_audit_pack_summary(?array $packs = null): array
+{
+ $allPacks = $packs ?? cs_direct_publish_audit_pack_list(true);
+ $realPacks = array_values(array_filter($allPacks, static fn (array $pack): bool => empty($pack['is_test'])));
+ $latest = $realPacks[0] ?? ($allPacks[0] ?? null);
+ if (!is_array($latest)) {
+ return [
+ 'status' => 'action_needed',
+ 'metric' => '0 packs',
+ 'next_action' => 'Prepare a sanitized Direct Publish evidence pack before requesting TikTok public-account Advanced Access.',
+ 'ready_checks' => 0,
+ 'total_checks' => 0,
+ 'blocked_checks' => 0,
+ 'total' => 0,
+ 'test_total' => 0,
+ 'latest_generated_at' => '',
+ 'direct_audit_pack_hash' => '',
+ 'private_pack_present' => false,
+ ];
+ }
+ $metrics = is_array($latest['metrics'] ?? null) ? $latest['metrics'] : [];
+ return [
+ 'status' => (string) ($latest['status'] ?? 'action_needed'),
+ 'metric' => (string) ($latest['metric'] ?? ''),
+ 'next_action' => (string) ($latest['next_action'] ?? ''),
+ 'ready_checks' => (int) ($latest['ready_evidence'] ?? 0),
+ 'total_checks' => (int) ($latest['total_evidence'] ?? 0),
+ 'blocked_checks' => (int) ($latest['blocked_evidence'] ?? 0),
+ 'ready_evidence' => (int) ($latest['ready_evidence'] ?? 0),
+ 'total_evidence' => (int) ($latest['total_evidence'] ?? 0),
+ 'blocked_evidence' => (int) ($latest['blocked_evidence'] ?? 0),
+ 'evidence_status' => (string) ($latest['evidence_status'] ?? ($latest['status'] ?? 'action_needed')),
+ 'total' => count($realPacks),
+ 'test_total' => count($allPacks) - count($realPacks),
+ 'latest_generated_at' => (string) ($latest['generated_at'] ?? ''),
+ 'direct_audit_pack_hash' => (string) ($latest['private_pack_hash'] ?? ''),
+ 'pack_hash' => (string) ($latest['private_pack_hash'] ?? ''),
+ 'private_pack_present' => !empty($latest['private_pack_present']),
+ 'public_direct_blocker' => (string) ($latest['public_direct_blocker'] ?? ''),
+ 'advanced_access_next_step' => (string) ($latest['advanced_access_next_step'] ?? ''),
+ 'creator_info_ready_accounts' => (int) ($metrics['creator_info_ready_accounts'] ?? 0),
+ 'draft_uploads' => (int) ($metrics['draft_uploads'] ?? 0),
+ 'direct_publishes' => (int) ($metrics['direct_publishes'] ?? 0),
+ 'self_only_direct_publishes' => (int) ($metrics['self_only_direct_publishes'] ?? ($metrics['direct_publishes'] ?? 0)),
+ 'pull_from_url_publishes' => (int) ($metrics['pull_from_url_publishes'] ?? 0),
+ 'photo_publishes' => (int) ($metrics['photo_publishes'] ?? 0),
+ 'creator_publish_receipts' => (int) ($metrics['creator_publish_receipts'] ?? 0),
+ 'ai_disclosure_supported' => !empty($metrics['ai_disclosure_supported']),
+ 'compliance_controls_visible' => !empty($metrics['compliance_controls_visible']),
+ 'source' => (string) ($latest['source'] ?? 'direct_publish_audit_pack_cli'),
+ 'is_test' => !empty($latest['is_test']),
+ ];
+}
+
+function cs_direct_publish_audit_pack_agent_payload(array $summary): array
+{
+ $summary = isset($summary['ready_evidence']) ? $summary : cs_direct_publish_audit_pack_summary([$summary]);
+ return [
+ 'status' => (string) ($summary['status'] ?? 'action_needed'),
+ 'metric' => (string) ($summary['metric'] ?? ''),
+ 'next_action' => (string) ($summary['next_action'] ?? ''),
+ 'evidence_status' => (string) ($summary['evidence_status'] ?? ($summary['status'] ?? 'action_needed')),
+ 'ready_evidence' => (int) ($summary['ready_evidence'] ?? $summary['ready_checks'] ?? 0),
+ 'total_evidence' => (int) ($summary['total_evidence'] ?? $summary['total_checks'] ?? 0),
+ 'blocked_evidence' => (int) ($summary['blocked_evidence'] ?? $summary['blocked_checks'] ?? 0),
+ 'ready_checks' => (int) ($summary['ready_evidence'] ?? $summary['ready_checks'] ?? 0),
+ 'total_checks' => (int) ($summary['total_evidence'] ?? $summary['total_checks'] ?? 0),
+ 'blocked_checks' => (int) ($summary['blocked_evidence'] ?? $summary['blocked_checks'] ?? 0),
+ 'direct_audit_pack_hash' => (string) ($summary['direct_audit_pack_hash'] ?? $summary['pack_hash'] ?? $summary['private_pack_hash'] ?? ''),
+ 'pack_hash' => (string) ($summary['pack_hash'] ?? $summary['direct_audit_pack_hash'] ?? $summary['private_pack_hash'] ?? ''),
+ 'private_pack_present' => !empty($summary['private_pack_present']),
+ 'public_direct_blocker' => (string) ($summary['public_direct_blocker'] ?? ''),
+ 'advanced_access_next_step' => (string) ($summary['advanced_access_next_step'] ?? ''),
+ 'creator_info_ready_accounts' => (int) ($summary['creator_info_ready_accounts'] ?? 0),
+ 'draft_uploads' => (int) ($summary['draft_uploads'] ?? 0),
+ 'direct_publishes' => (int) ($summary['direct_publishes'] ?? 0),
+ 'self_only_direct_publishes' => (int) ($summary['self_only_direct_publishes'] ?? $summary['direct_publishes'] ?? 0),
+ 'pull_from_url_publishes' => (int) ($summary['pull_from_url_publishes'] ?? 0),
+ 'photo_publishes' => (int) ($summary['photo_publishes'] ?? 0),
+ 'creator_publish_receipts' => (int) ($summary['creator_publish_receipts'] ?? 0),
+ 'ai_disclosure_supported' => !empty($summary['ai_disclosure_supported']),
+ 'compliance_controls_visible' => !empty($summary['compliance_controls_visible']),
+ 'source' => (string) ($summary['source'] ?? 'direct_publish_audit_pack_cli'),
+ 'is_test' => !empty($summary['is_test']),
+ ];
+}
+
+function cs_direct_publish_audit_pack_record_event(array $summary, array $options = []): array
+{
+ $payload = cs_direct_publish_audit_pack_agent_payload($summary);
+ if (array_key_exists('source', $options)) {
+ $payload['source'] = cs_clean_lead_text($options['source'], 80);
+ }
+ if (array_key_exists('is_test', $options)) {
+ $payload['is_test'] = !empty($options['is_test']);
+ }
+ cs_record_openclaw_event('creator_studio.direct_publish_audit_pack.prepared', $payload);
+ cs_record_notification('creator_studio.direct_publish_audit_pack.prepared', $payload, ['is_test' => !empty($payload['is_test'])]);
+ return ['recorded' => true, 'event_type' => 'creator_studio.direct_publish_audit_pack.prepared', 'payload' => $payload];
+}
function cs_billing_invoice_handoff_load_store(): array
{
*** End Patch