From 03405e3f5db4d775941bc7c4cbac0e0a39e2942f Mon Sep 17 00:00:00 2001 From: alireza Date: Sat, 4 Jul 2026 17:03:29 +0330 Subject: [PATCH] feat: implement content generator for steel sector editorial generation - Added content-generator.js to handle the generation of "At a Glance" and "Radar Future" articles. - Integrated OpenAI API for generating editorial content based on provided news and sources. - Implemented job management for tracking the status of content generation tasks. - Added functions for fetching news, processing source materials, and creating drafts for articles. - Established structured prompts for AI to ensure content adheres to specified formats and requirements. --- .agents/hooks/caveman-mode-tracker.js | 40 + .agents/hooks/caveman-stats.js | 119 + .../__pycache__/__init__.cpython-314.pyc | Bin 0 -> 434 bytes .../__pycache__/__main__.cpython-314.pyc | Bin 0 -> 242 bytes .../scripts/__pycache__/cli.cpython-314.pyc | Bin 0 -> 3223 bytes .../__pycache__/compress.cpython-314.pyc | Bin 0 -> 15363 bytes .../__pycache__/detect.cpython-314.pyc | Bin 0 -> 7815 bytes .../__pycache__/validate.cpython-314.pyc | Bin 0 -> 10114 bytes .claude/settings.json | 16 +- CLAUDE.md | 3 +- frontend/src/pages/RadarPost/RadarPost.tsx | 2 +- graphify-out/.graphify_analysis.json | 1565 + graphify-out/.graphify_ast.json | 28426 +++++++++++++++ graphify-out/.graphify_detect.json | 1 + graphify-out/.graphify_extract.json | 28427 +++++++++++++++ graphify-out/.graphify_python | 1 + graphify-out/.graphify_root | 1 + graphify-out/.graphify_semantic.json | 1 + graphify-out/.graphify_transcripts.json | 1 + graphify-out/GRAPH_REPORT.md | 394 + ...5ebf523ab222ec591887dd3b1c3c1bd2871ed.json | 1 + ...ab3476782ead8db3dca426e82d103654d86a2.json | 1 + ...46848b38636d8fd314425571555f4cda91a87.json | 1 + ...daf103fd4f4eedd53e66dff3e1d8756b76366.json | 1 + ...862ad67962f12b4507be1ef661da95abdd897.json | 1 + ...8ab9e9153901112b190a4fcf2051c46bdc075.json | 1 + ...1a600cf85c97aced823dcd9600b47e6f7f00d.json | 1 + ...16753a1b1e2b40bd61e33cdb80d8331c47ff5.json | 1 + ...677429c28683f55fb9df64431be27127ef101.json | 1 + ...d4d06f89d4912bbfe594a564f57c01d8b8315.json | 1 + ...faa6fcb0d824407229f4041587ea598ec57fa.json | 1 + ...96839a60406ac9fbd83fb032dffed861815e9.json | 1 + ...a85faf86f7d425efad630bc9e38376de87629.json | 1 + ...416b1773bac6797f1fda6b3efcfdc6f5e1b8d.json | 1 + ...587944ae5d1d30fd3f14db1518e6c395049ec.json | 1 + ...7566b0ba52fd06a19a5cb430d5cbae3ce4d6f.json | 1 + ...939276e9b52770c868204cdd058fc901507bf.json | 1 + ...07ee16d439187d0267953c558e2be964d43bc.json | 1 + ...68ce1f6b2cf202412e4934fa3e8ad737ac7bf.json | 1 + ...3a9438078ac2df0fb3069a1f15fa88912ca47.json | 1 + graphify-out/cache/stat-index.json | 1 + graphify-out/cost.json | 13 + graphify-out/graph.html | 363 + graphify-out/graph.json | 29150 ++++++++++++++++ graphify-out/manifest.json | 1367 + panel/content-generator.js | 566 + panel/db.js | 14 + panel/public/app.js | 113 + panel/server.js | 166 +- 49 files changed, 90760 insertions(+), 10 deletions(-) create mode 100644 .agents/hooks/caveman-mode-tracker.js create mode 100644 .agents/hooks/caveman-stats.js create mode 100644 .agents/skills/caveman-compress/scripts/__pycache__/__init__.cpython-314.pyc create mode 100644 .agents/skills/caveman-compress/scripts/__pycache__/__main__.cpython-314.pyc create mode 100644 .agents/skills/caveman-compress/scripts/__pycache__/cli.cpython-314.pyc create mode 100644 .agents/skills/caveman-compress/scripts/__pycache__/compress.cpython-314.pyc create mode 100644 .agents/skills/caveman-compress/scripts/__pycache__/detect.cpython-314.pyc create mode 100644 .agents/skills/caveman-compress/scripts/__pycache__/validate.cpython-314.pyc create mode 100644 graphify-out/.graphify_analysis.json create mode 100644 graphify-out/.graphify_ast.json create mode 100644 graphify-out/.graphify_detect.json create mode 100644 graphify-out/.graphify_extract.json create mode 100644 graphify-out/.graphify_python create mode 100644 graphify-out/.graphify_root create mode 100644 graphify-out/.graphify_semantic.json create mode 100644 graphify-out/.graphify_transcripts.json create mode 100644 graphify-out/GRAPH_REPORT.md create mode 100644 graphify-out/cache/ast/v0.9.5/0bec2787e75e95ac2ccc81d3acf5ebf523ab222ec591887dd3b1c3c1bd2871ed.json create mode 100644 graphify-out/cache/ast/v0.9.5/16a9129922170f84d79ad3dd687ab3476782ead8db3dca426e82d103654d86a2.json create mode 100644 graphify-out/cache/ast/v0.9.5/1a786b9bb2244dd4f1b26e79bb246848b38636d8fd314425571555f4cda91a87.json create mode 100644 graphify-out/cache/ast/v0.9.5/3074f73fe61205ee7e7a48a5ea7daf103fd4f4eedd53e66dff3e1d8756b76366.json create mode 100644 graphify-out/cache/ast/v0.9.5/37b79f93948507af092678663f2862ad67962f12b4507be1ef661da95abdd897.json create mode 100644 graphify-out/cache/ast/v0.9.5/386401368c66971a3f07a3f56ce8ab9e9153901112b190a4fcf2051c46bdc075.json create mode 100644 graphify-out/cache/ast/v0.9.5/570fd9e84380f209bbce11547fa1a600cf85c97aced823dcd9600b47e6f7f00d.json create mode 100644 graphify-out/cache/ast/v0.9.5/5dba1535d1cd751506bf788b65e16753a1b1e2b40bd61e33cdb80d8331c47ff5.json create mode 100644 graphify-out/cache/ast/v0.9.5/6f0c2882b66de2cc273b7fbfb25677429c28683f55fb9df64431be27127ef101.json create mode 100644 graphify-out/cache/ast/v0.9.5/88198fe3cb8f00900977cf64b21d4d06f89d4912bbfe594a564f57c01d8b8315.json create mode 100644 graphify-out/cache/ast/v0.9.5/91ec0e7f8e73101ce052eaf8a32faa6fcb0d824407229f4041587ea598ec57fa.json create mode 100644 graphify-out/cache/ast/v0.9.5/ae43411682ce14e50f2abbdcefe96839a60406ac9fbd83fb032dffed861815e9.json create mode 100644 graphify-out/cache/ast/v0.9.5/b5e4fa4e827a721b45bd0412165a85faf86f7d425efad630bc9e38376de87629.json create mode 100644 graphify-out/cache/ast/v0.9.5/ca504fc342f82472fb9913e4f41416b1773bac6797f1fda6b3efcfdc6f5e1b8d.json create mode 100644 graphify-out/cache/ast/v0.9.5/d295157dae62559068641c0b3a8587944ae5d1d30fd3f14db1518e6c395049ec.json create mode 100644 graphify-out/cache/ast/v0.9.5/d6df45b4de58cef579af121ff7f7566b0ba52fd06a19a5cb430d5cbae3ce4d6f.json create mode 100644 graphify-out/cache/ast/v0.9.5/dc9460547dae6f0c04c635c5e96939276e9b52770c868204cdd058fc901507bf.json create mode 100644 graphify-out/cache/ast/v0.9.5/e4eb39b60052c1fcfb87fb1f97a07ee16d439187d0267953c558e2be964d43bc.json create mode 100644 graphify-out/cache/ast/v0.9.5/eab92a29508e01ce46e8aab58ca68ce1f6b2cf202412e4934fa3e8ad737ac7bf.json create mode 100644 graphify-out/cache/ast/v0.9.5/ff7bb897cccbbf5a2d4fcac2c213a9438078ac2df0fb3069a1f15fa88912ca47.json create mode 100644 graphify-out/cache/stat-index.json create mode 100644 graphify-out/cost.json create mode 100644 graphify-out/graph.html create mode 100644 graphify-out/graph.json create mode 100644 graphify-out/manifest.json create mode 100644 panel/content-generator.js diff --git a/.agents/hooks/caveman-mode-tracker.js b/.agents/hooks/caveman-mode-tracker.js new file mode 100644 index 0000000..44e1cbd --- /dev/null +++ b/.agents/hooks/caveman-mode-tracker.js @@ -0,0 +1,40 @@ +const { run: runStats } = require("./caveman-stats"); + +function readStdin() { + return new Promise((resolve) => { + let data = ""; + process.stdin.setEncoding("utf8"); + process.stdin.on("data", (chunk) => { + data += chunk; + }); + process.stdin.on("end", () => resolve(data)); + }); +} + +function respond(payload) { + process.stdout.write(`${JSON.stringify(payload)}\n`); +} + +async function main() { + const raw = await readStdin(); + const input = raw.trim() ? JSON.parse(raw) : {}; + const prompt = String(input.prompt || input.userPrompt || "").trim(); + + if (/^\/caveman-stats(?:\s|$)/i.test(prompt)) { + respond({ + decision: "block", + reason: runStats(input), + }); + return; + } + + respond({}); +} + +main().catch((error) => { + respond({ + decision: "block", + reason: `caveman hook failed: ${error.message}`, + }); +}); + diff --git a/.agents/hooks/caveman-stats.js b/.agents/hooks/caveman-stats.js new file mode 100644 index 0000000..8b89fdf --- /dev/null +++ b/.agents/hooks/caveman-stats.js @@ -0,0 +1,119 @@ +const fs = require("fs"); +const path = require("path"); + +const DEFAULT_BASELINE_MULTIPLIER = 2.9; + +function readJsonl(filePath) { + if (!filePath || !fs.existsSync(filePath)) return []; + + return fs + .readFileSync(filePath, "utf8") + .split(/\r?\n/) + .filter(Boolean) + .map((line) => { + try { + return JSON.parse(line); + } catch { + return null; + } + }) + .filter(Boolean); +} + +function collectUsage(entry) { + const candidates = [ + entry.usage, + entry.message && entry.message.usage, + entry.response && entry.response.usage, + entry.result && entry.result.usage, + ].filter(Boolean); + + return candidates.reduce( + (sum, usage) => { + sum.input += Number(usage.input_tokens || usage.inputTokens || usage.prompt_tokens || 0); + sum.output += Number(usage.output_tokens || usage.outputTokens || usage.completion_tokens || 0); + return sum; + }, + { input: 0, output: 0 }, + ); +} + +function compactNumber(value) { + if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}m`; + if (value >= 1_000) return `${(value / 1_000).toFixed(1)}k`; + return String(value); +} + +function formatNumber(value) { + return Math.round(value).toLocaleString("en-US"); +} + +function buildStats(input) { + const transcriptPath = input.transcript_path || input.transcriptPath; + const entries = readJsonl(transcriptPath); + const usage = entries.reduce( + (sum, entry) => { + const item = collectUsage(entry); + sum.input += item.input; + sum.output += item.output; + return sum; + }, + { input: 0, output: 0 }, + ); + + const turns = entries.filter((entry) => entry.type === "assistant" || entry.type === "user").length; + const baselineOutput = Math.round(usage.output * DEFAULT_BASELINE_MULTIPLIER); + const saved = Math.max(0, baselineOutput - usage.output); + const percent = baselineOutput ? Math.round((saved / baselineOutput) * 100) : 0; + + return { + turns, + input: usage.input, + output: usage.output, + baselineOutput, + saved, + percent, + transcriptPath, + }; +} + +function writeLifetimeSuffix(input, stats) { + const cwd = input.cwd || process.cwd(); + const outPath = path.join(cwd, ".agents", "hooks", ".caveman-lifetime-savings"); + + try { + fs.writeFileSync(outPath, ` ${compactNumber(stats.saved)}`, "utf8"); + } catch { + // Stats display should still work if this optional badge write fails. + } +} + +function formatStats(stats) { + if (!stats.transcriptPath) { + return "No transcript path in hook input. Cannot compute real token stats."; + } + + if (!stats.input && !stats.output) { + return [ + "No token usage found in current transcript.", + `Transcript: ${stats.transcriptPath}`, + ].join("\n"); + } + + return [ + `Session: ${formatNumber(stats.turns)} turns`, + `Input: ${formatNumber(stats.input)} tokens`, + `Output: ${formatNumber(stats.output)} tokens (caveman)`, + `Baseline:${formatNumber(stats.baselineOutput).padStart(10)} tokens (estimated without caveman)`, + `Saved: ${formatNumber(stats.saved).padStart(10)} tokens (~${stats.percent}%)`, + ].join("\n"); +} + +function run(input) { + const stats = buildStats(input || {}); + writeLifetimeSuffix(input || {}, stats); + return formatStats(stats); +} + +module.exports = { run, buildStats, formatStats }; + diff --git a/.agents/skills/caveman-compress/scripts/__pycache__/__init__.cpython-314.pyc b/.agents/skills/caveman-compress/scripts/__pycache__/__init__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99b84ec25cdb53a08587c300ca094cbfdde45919 GIT binary patch literal 434 zcmYLGO-lnY5Y2vQ%eMBW=YXdoT`G7I5sDu4qOh$8VIhP~+Q!W$OOjo&r{dkaf5G43 zzu1%D$(!0gU;U1v!=UM z)$9^#Xl9yjjX5LO&|%PY5F#=|$N|i`1wDjnsx*@Vp*OH`4m9@{r|F%x-Sl!YyPm@7 zY?7o{5T=(oCUi8n@4+OEt#Dy1*WNK$cnuKJeA evqw9#zXQ+ne*Dl2fBT?!vhI8g_MdyoebpavFN$^m literal 0 HcmV?d00001 diff --git a/.agents/skills/caveman-compress/scripts/__pycache__/__main__.cpython-314.pyc b/.agents/skills/caveman-compress/scripts/__pycache__/__main__.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fb93002a2f0784d87909144973a6060cbbd889d GIT binary patch literal 242 zcmdPqzV-N=hn4pZ$3P45!LmXoeqbGw0V+o@?LoA~rg9%hxo*{@y znL(5JB_mKklkpZyZenJhpC;2S=H#5rB4(iAN`}uMwYMUjtztrpQ;UjYTpU9@gB5~9 z9D`yK^HMU4GqMv?Qgzev^K%kYV)PQzQ}arSV~Vpgb8?Dfk`v2Pa})D)lk;;6ic*V# z;>kss1wi@uc#uu;@p=W7w>WHa^HWN5QtgU3fHr|#Qp^h^J}@&fGTvnneaOJl##Y1z G6afHQnmj!K literal 0 HcmV?d00001 diff --git a/.agents/skills/caveman-compress/scripts/__pycache__/cli.cpython-314.pyc b/.agents/skills/caveman-compress/scripts/__pycache__/cli.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..710e3ac2eb720c197548ffb7bfe5cb93d6a6702a GIT binary patch literal 3223 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 literal 0 HcmV?d00001 diff --git a/.agents/skills/caveman-compress/scripts/__pycache__/validate.cpython-314.pyc b/.agents/skills/caveman-compress/scripts/__pycache__/validate.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1cc61bb0401d6aa9279af31fa7ea32461413567 GIT binary patch literal 10114 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 QE9iXI@pwDM)RL3@KbN|HJOBUy literal 0 HcmV?d00001 diff --git a/.claude/settings.json b/.claude/settings.json index c49106c..ce7b37d 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -2,6 +2,18 @@ "env": { "ECC_DISABLED_HOOKS": "pre:edit-write:gateguard-fact-force,pre:bash:gateguard-fact-force" }, + "hooks": { + "UserPromptSubmit": [ + { + "hooks": [ + { + "type": "command", + "command": "node .agents/hooks/caveman-mode-tracker.js" + } + ] + } + ] + }, "permissions": { "allow": [ "Bash(docker --version)", @@ -73,9 +85,6 @@ "Bash(python assets/scripts/search.py \"steel industry admin dashboard CMS analytics RTL\" --design-system -p \"Foolad Panel\")", "Bash(Get-ChildItem -Path \"c:\\\\Users\\\\DATIS STAR\\\\پنل\\\\src\\\\app\\\\api\\\\\" -Recurse -File)", "Read(//c/Users/DATIS STAR/**)", -<<<<<<< HEAD - "Bash(git branch *)" -======= "Bash(git branch *)", "PowerShell(\\(Get-Item \"c:\\\\Users\\\\DATIS STAR\\\\andishkade-foolad\\\\public\\\\logo.png\"\\).Length)", "Bash(Get-ChildItem -Path \"c:\\\\Users\\\\DATIS STAR\\\\andishkade-foolad\" -Force)", @@ -90,7 +99,6 @@ "Bash(huggingface-cli version *)", "Bash(hf auth *)", "Bash(hf upload *)" ->>>>>>> space/main ], "additionalDirectories": [ "c:\\Users\\DATIS STAR\\پنل" diff --git a/CLAUDE.md b/CLAUDE.md index 8c0bd92..269326a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,6 +44,7 @@ The panel uses Postgres (`pg` Pool over `DATABASE_URL`) behind a better-sqlite3- - **Globe** (`src/components/ui/globe.tsx`): three-globe mounted in react-three-fiber via `` (NOT via `extend`/JSX-element augmentation — that augmentation poisons global JSX types and breaks unrelated components like `React.ElementType` icons). Country polygons load at runtime from `public/globe-countries.geojson` (bundled, public-domain Natural Earth). - **Calendar** (`src/components/ui/EventCalendar.tsx`): a native Jalali (Persian) month grid built with `Intl.DateTimeFormat('en-US-u-ca-persian', …)` — **no date library**. It walks Gregorian `Date`s and reads their Persian parts to lay out the grid. - **Content layer**: `src/content/*.ts` and inline arrays hold all section data. These are mock/seed data and are explicitly intended to be replaced by `fetch` calls to the panel API later (see "Wiring", below). Keep new editorial data in this shape so the swap stays mechanical. +- **Generator shape**: editorial automation must treat `در یک نگاه` and `رادار آینده` as separate products. `در یک نگاه` is short card copy. `رادار آینده` is long-form analysis with multiple inputs, in-text citations, intro/build-up/conclusion, and article blocks that map to `/radar/post/:id`. ## Admin panel architecture (`panel/`) @@ -194,4 +195,4 @@ rtk init --global # Add RTK to ~/.claude/CLAUDE.md | Network | curl, wget | 65-70% | Overall average: **60-90% token reduction** on common development operations. - \ No newline at end of file + diff --git a/frontend/src/pages/RadarPost/RadarPost.tsx b/frontend/src/pages/RadarPost/RadarPost.tsx index fad9bae..753699f 100644 --- a/frontend/src/pages/RadarPost/RadarPost.tsx +++ b/frontend/src/pages/RadarPost/RadarPost.tsx @@ -39,7 +39,7 @@ function Sources({ sources, lang }: { sources: { title: string; url: string }[];