@ai-studio-3d/vyasa 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/README.md +69 -0
  2. package/data/common-kit.json +34 -0
  3. package/data/pricing.json +119 -0
  4. package/data/schema/AnalyticsData.json +214 -0
  5. package/data/schema/FoundationData.json +42 -0
  6. package/data/schema/KitData.json +321 -0
  7. package/data/schema/SearchData.json +173 -0
  8. package/data/schema/SessionDetailData.json +231 -0
  9. package/data/schema/SessionsListData.json +115 -0
  10. package/data/schema/WasteData.json +95 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +343 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/core/billing/index.d.ts +4 -0
  16. package/dist/core/billing/index.d.ts.map +1 -0
  17. package/dist/core/billing/index.js +43 -0
  18. package/dist/core/billing/index.js.map +1 -0
  19. package/dist/core/budget/index.d.ts +30 -0
  20. package/dist/core/budget/index.d.ts.map +1 -0
  21. package/dist/core/budget/index.js +61 -0
  22. package/dist/core/budget/index.js.map +1 -0
  23. package/dist/core/codex/index.d.ts +3 -0
  24. package/dist/core/codex/index.d.ts.map +1 -0
  25. package/dist/core/codex/index.js +212 -0
  26. package/dist/core/codex/index.js.map +1 -0
  27. package/dist/core/cursor/index.d.ts +3 -0
  28. package/dist/core/cursor/index.d.ts.map +1 -0
  29. package/dist/core/cursor/index.js +304 -0
  30. package/dist/core/cursor/index.js.map +1 -0
  31. package/dist/core/cursor/scan.d.ts +28 -0
  32. package/dist/core/cursor/scan.d.ts.map +1 -0
  33. package/dist/core/cursor/scan.js +79 -0
  34. package/dist/core/cursor/scan.js.map +1 -0
  35. package/dist/core/decisions/index.d.ts +21 -0
  36. package/dist/core/decisions/index.d.ts.map +1 -0
  37. package/dist/core/decisions/index.js +133 -0
  38. package/dist/core/decisions/index.js.map +1 -0
  39. package/dist/core/dlp/index.d.ts +7 -0
  40. package/dist/core/dlp/index.d.ts.map +1 -0
  41. package/dist/core/dlp/index.js +115 -0
  42. package/dist/core/dlp/index.js.map +1 -0
  43. package/dist/core/health/index.d.ts +10 -0
  44. package/dist/core/health/index.d.ts.map +1 -0
  45. package/dist/core/health/index.js +21 -0
  46. package/dist/core/health/index.js.map +1 -0
  47. package/dist/core/index/index.d.ts +9 -0
  48. package/dist/core/index/index.d.ts.map +1 -0
  49. package/dist/core/index/index.js +103 -0
  50. package/dist/core/index/index.js.map +1 -0
  51. package/dist/core/index/ingest.d.ts +16 -0
  52. package/dist/core/index/ingest.d.ts.map +1 -0
  53. package/dist/core/index/ingest.js +184 -0
  54. package/dist/core/index/ingest.js.map +1 -0
  55. package/dist/core/index/platforms.d.ts +21 -0
  56. package/dist/core/index/platforms.d.ts.map +1 -0
  57. package/dist/core/index/platforms.js +44 -0
  58. package/dist/core/index/platforms.js.map +1 -0
  59. package/dist/core/index/pricing-map.d.ts +10 -0
  60. package/dist/core/index/pricing-map.d.ts.map +1 -0
  61. package/dist/core/index/pricing-map.js +16 -0
  62. package/dist/core/index/pricing-map.js.map +1 -0
  63. package/dist/core/index/progress.d.ts +26 -0
  64. package/dist/core/index/progress.d.ts.map +1 -0
  65. package/dist/core/index/progress.js +59 -0
  66. package/dist/core/index/progress.js.map +1 -0
  67. package/dist/core/index/scan.d.ts +9 -0
  68. package/dist/core/index/scan.d.ts.map +1 -0
  69. package/dist/core/index/scan.js +42 -0
  70. package/dist/core/index/scan.js.map +1 -0
  71. package/dist/core/index/statements.d.ts +18 -0
  72. package/dist/core/index/statements.d.ts.map +1 -0
  73. package/dist/core/index/statements.js +82 -0
  74. package/dist/core/index/statements.js.map +1 -0
  75. package/dist/core/index/tail.d.ts +42 -0
  76. package/dist/core/index/tail.d.ts.map +1 -0
  77. package/dist/core/index/tail.js +123 -0
  78. package/dist/core/index/tail.js.map +1 -0
  79. package/dist/core/jsonl/index.d.ts +3 -0
  80. package/dist/core/jsonl/index.d.ts.map +1 -0
  81. package/dist/core/jsonl/index.js +106 -0
  82. package/dist/core/jsonl/index.js.map +1 -0
  83. package/dist/core/jsonl-validate/index.d.ts +10 -0
  84. package/dist/core/jsonl-validate/index.d.ts.map +1 -0
  85. package/dist/core/jsonl-validate/index.js +40 -0
  86. package/dist/core/jsonl-validate/index.js.map +1 -0
  87. package/dist/core/kit/detection.d.ts +94 -0
  88. package/dist/core/kit/detection.d.ts.map +1 -0
  89. package/dist/core/kit/detection.js +312 -0
  90. package/dist/core/kit/detection.js.map +1 -0
  91. package/dist/core/kit/index.d.ts +12 -0
  92. package/dist/core/kit/index.d.ts.map +1 -0
  93. package/dist/core/kit/index.js +131 -0
  94. package/dist/core/kit/index.js.map +1 -0
  95. package/dist/core/kit/scan.d.ts +28 -0
  96. package/dist/core/kit/scan.d.ts.map +1 -0
  97. package/dist/core/kit/scan.js +432 -0
  98. package/dist/core/kit/scan.js.map +1 -0
  99. package/dist/core/recap/index.d.ts +18 -0
  100. package/dist/core/recap/index.d.ts.map +1 -0
  101. package/dist/core/recap/index.js +88 -0
  102. package/dist/core/recap/index.js.map +1 -0
  103. package/dist/core/repetition/index.d.ts +5 -0
  104. package/dist/core/repetition/index.d.ts.map +1 -0
  105. package/dist/core/repetition/index.js +0 -0
  106. package/dist/core/repetition/index.js.map +1 -0
  107. package/dist/core/schema/index.d.ts +514 -0
  108. package/dist/core/schema/index.d.ts.map +1 -0
  109. package/dist/core/schema/index.js +2 -0
  110. package/dist/core/schema/index.js.map +1 -0
  111. package/dist/core/schema-watch/index.d.ts +34 -0
  112. package/dist/core/schema-watch/index.d.ts.map +1 -0
  113. package/dist/core/schema-watch/index.js +87 -0
  114. package/dist/core/schema-watch/index.js.map +1 -0
  115. package/dist/core/search/index.d.ts +44 -0
  116. package/dist/core/search/index.d.ts.map +1 -0
  117. package/dist/core/search/index.js +641 -0
  118. package/dist/core/search/index.js.map +1 -0
  119. package/dist/core/settings/index.d.ts +24 -0
  120. package/dist/core/settings/index.d.ts.map +1 -0
  121. package/dist/core/settings/index.js +76 -0
  122. package/dist/core/settings/index.js.map +1 -0
  123. package/dist/core/share/bundle.d.ts +40 -0
  124. package/dist/core/share/bundle.d.ts.map +1 -0
  125. package/dist/core/share/bundle.js +158 -0
  126. package/dist/core/share/bundle.js.map +1 -0
  127. package/dist/core/share/canonical/from-claude.d.ts +13 -0
  128. package/dist/core/share/canonical/from-claude.d.ts.map +1 -0
  129. package/dist/core/share/canonical/from-claude.js +129 -0
  130. package/dist/core/share/canonical/from-claude.js.map +1 -0
  131. package/dist/core/share/canonical/from-codex.d.ts +18 -0
  132. package/dist/core/share/canonical/from-codex.d.ts.map +1 -0
  133. package/dist/core/share/canonical/from-codex.js +183 -0
  134. package/dist/core/share/canonical/from-codex.js.map +1 -0
  135. package/dist/core/share/canonical/to-claude.d.ts +15 -0
  136. package/dist/core/share/canonical/to-claude.d.ts.map +1 -0
  137. package/dist/core/share/canonical/to-claude.js +146 -0
  138. package/dist/core/share/canonical/to-claude.js.map +1 -0
  139. package/dist/core/share/canonical/to-codex.d.ts +21 -0
  140. package/dist/core/share/canonical/to-codex.d.ts.map +1 -0
  141. package/dist/core/share/canonical/to-codex.js +124 -0
  142. package/dist/core/share/canonical/to-codex.js.map +1 -0
  143. package/dist/core/share/canonical/tool-map.d.ts +61 -0
  144. package/dist/core/share/canonical/tool-map.d.ts.map +1 -0
  145. package/dist/core/share/canonical/tool-map.js +299 -0
  146. package/dist/core/share/canonical/tool-map.js.map +1 -0
  147. package/dist/core/share/canonical/types.d.ts +57 -0
  148. package/dist/core/share/canonical/types.d.ts.map +1 -0
  149. package/dist/core/share/canonical/types.js +9 -0
  150. package/dist/core/share/canonical/types.js.map +1 -0
  151. package/dist/core/share/import.d.ts +28 -0
  152. package/dist/core/share/import.d.ts.map +1 -0
  153. package/dist/core/share/import.js +174 -0
  154. package/dist/core/share/import.js.map +1 -0
  155. package/dist/core/share/manifest.d.ts +37 -0
  156. package/dist/core/share/manifest.d.ts.map +1 -0
  157. package/dist/core/share/manifest.js +31 -0
  158. package/dist/core/share/manifest.js.map +1 -0
  159. package/dist/core/share/preview.d.ts +4 -0
  160. package/dist/core/share/preview.d.ts.map +1 -0
  161. package/dist/core/share/preview.js +153 -0
  162. package/dist/core/share/preview.js.map +1 -0
  163. package/dist/core/share/primer.d.ts +19 -0
  164. package/dist/core/share/primer.d.ts.map +1 -0
  165. package/dist/core/share/primer.js +196 -0
  166. package/dist/core/share/primer.js.map +1 -0
  167. package/dist/core/share/resume.d.ts +10 -0
  168. package/dist/core/share/resume.d.ts.map +1 -0
  169. package/dist/core/share/resume.js +58 -0
  170. package/dist/core/share/resume.js.map +1 -0
  171. package/dist/core/share/scrub.d.ts +10 -0
  172. package/dist/core/share/scrub.d.ts.map +1 -0
  173. package/dist/core/share/scrub.js +198 -0
  174. package/dist/core/share/scrub.js.map +1 -0
  175. package/dist/core/share/tar.d.ts +12 -0
  176. package/dist/core/share/tar.d.ts.map +1 -0
  177. package/dist/core/share/tar.js +78 -0
  178. package/dist/core/share/tar.js.map +1 -0
  179. package/dist/core/tags/index.d.ts +48 -0
  180. package/dist/core/tags/index.d.ts.map +1 -0
  181. package/dist/core/tags/index.js +113 -0
  182. package/dist/core/tags/index.js.map +1 -0
  183. package/dist/core/today/index.d.ts +25 -0
  184. package/dist/core/today/index.d.ts.map +1 -0
  185. package/dist/core/today/index.js +42 -0
  186. package/dist/core/today/index.js.map +1 -0
  187. package/dist/core/waste/abandoned.d.ts +12 -0
  188. package/dist/core/waste/abandoned.d.ts.map +1 -0
  189. package/dist/core/waste/abandoned.js +127 -0
  190. package/dist/core/waste/abandoned.js.map +1 -0
  191. package/dist/core/waste/cache-miss.d.ts +9 -0
  192. package/dist/core/waste/cache-miss.d.ts.map +1 -0
  193. package/dist/core/waste/cache-miss.js +84 -0
  194. package/dist/core/waste/cache-miss.js.map +1 -0
  195. package/dist/core/waste/index.d.ts +12 -0
  196. package/dist/core/waste/index.d.ts.map +1 -0
  197. package/dist/core/waste/index.js +45 -0
  198. package/dist/core/waste/index.js.map +1 -0
  199. package/dist/core/waste/wrong-model.d.ts +11 -0
  200. package/dist/core/waste/wrong-model.d.ts.map +1 -0
  201. package/dist/core/waste/wrong-model.js +104 -0
  202. package/dist/core/waste/wrong-model.js.map +1 -0
  203. package/dist/db/index.d.ts +10 -0
  204. package/dist/db/index.d.ts.map +1 -0
  205. package/dist/db/index.js +29 -0
  206. package/dist/db/index.js.map +1 -0
  207. package/dist/db/migrate.d.ts +8 -0
  208. package/dist/db/migrate.d.ts.map +1 -0
  209. package/dist/db/migrate.js +282 -0
  210. package/dist/db/migrate.js.map +1 -0
  211. package/dist/server/events.d.ts +4 -0
  212. package/dist/server/events.d.ts.map +1 -0
  213. package/dist/server/events.js +54 -0
  214. package/dist/server/events.js.map +1 -0
  215. package/dist/server/index.d.ts +7 -0
  216. package/dist/server/index.d.ts.map +1 -0
  217. package/dist/server/index.js +238 -0
  218. package/dist/server/index.js.map +1 -0
  219. package/dist/server/routes/foundation.d.ts +2 -0
  220. package/dist/server/routes/foundation.d.ts.map +1 -0
  221. package/dist/server/routes/foundation.js +2 -0
  222. package/dist/server/routes/foundation.js.map +1 -0
  223. package/dist/server/routes/search.d.ts +2 -0
  224. package/dist/server/routes/search.d.ts.map +1 -0
  225. package/dist/server/routes/search.js +2 -0
  226. package/dist/server/routes/search.js.map +1 -0
  227. package/dist/server/routes/sessions.d.ts +2 -0
  228. package/dist/server/routes/sessions.d.ts.map +1 -0
  229. package/dist/server/routes/sessions.js +2 -0
  230. package/dist/server/routes/sessions.js.map +1 -0
  231. package/dist/server/routes/waste.d.ts +2 -0
  232. package/dist/server/routes/waste.d.ts.map +1 -0
  233. package/dist/server/routes/waste.js +2 -0
  234. package/dist/server/routes/waste.js.map +1 -0
  235. package/dist/web/assets/index-Ba1VvTj0.js +37 -0
  236. package/dist/web/index.html +12 -0
  237. package/package.json +76 -0
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # vyasa
2
+
3
+ Local analytics dashboard for AI coding agent sessions — waste detection, full-text search, session replay, and cross-machine session transport. Supports Claude Code and Codex.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npx vyasa
9
+ ```
10
+
11
+ Or install globally:
12
+
13
+ ```bash
14
+ npm install -g vyasa
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```bash
20
+ vyasa # Index ~/.claude/projects + ~/.codex/sessions, open dashboard
21
+ vyasa --rebuild # Force full re-index before starting
22
+ vyasa import <file> # Import a .vyasa bundle from another machine
23
+ ```
24
+
25
+ ### Importing a session bundle
26
+
27
+ If a teammate sent you a `.vyasa` file (or you exported one from another machine):
28
+
29
+ ```bash
30
+ npx vyasa import session.vyasa # same-platform resume
31
+ npx vyasa import session.vyasa --to=codex # translate Claude → Codex
32
+ npx vyasa import session.vyasa --to=claude-code # translate Codex → Claude
33
+ ```
34
+
35
+ This places the JSONL in your local agent's storage (`~/.claude/projects/...` or `~/.codex/sessions/...`) and offers to resume it natively. Flags:
36
+
37
+ - `--to=<platform>` — translate the session into the target platform's JSONL format before placement. Accepts `claude-code` or `codex`. Tool calls are translated where they map cleanly (Bash↔exec_command exact, Write/Edit↔apply_patch best-effort, unknown tools wrapped as no-op shell-echoes that preserve the original metadata). Thinking blocks (Claude) and reasoning items (Codex) are dropped — they don't translate.
38
+ - `--yes` / `-y` — skip the resume prompt and resume immediately if the agent CLI is on PATH.
39
+ - `--no-resume` — place the file but don't offer to resume.
40
+
41
+ ### Exporting / sharing a session
42
+
43
+ In the dashboard, open any session in Replay. Two buttons in the header:
44
+
45
+ - **Hand off ↗** — downloads a `.vyasa` bundle. Recipient runs `npx vyasa import` (optionally `--to=<other-platform>` to translate) and resumes natively in their CLI.
46
+ - **Continue elsewhere ⎘** — copies a primer prompt to your clipboard. Paste into any other agent (Codex, Cursor, ChatGPT, OpenCode, …) to warm-start with prior context. Lossy in a different way than `--to`: no tool-call transcript appears in the receiving CLI's UI, but the receiving agent gets a clean text summary.
47
+
48
+ ### `.vyasa` bundle format
49
+
50
+ Gzipped tar with three entries:
51
+
52
+ ```
53
+ manifest.json metadata: platform, sessionId, projectDir, originalPath, jsonlSizeBytes, exportedAt, …
54
+ session.jsonl verbatim copy of the source JSONL
55
+ README.md one-line install instructions for the recipient
56
+ ```
57
+
58
+ Power users can `tar -xzf foo.vyasa` and place files manually if they prefer not to install vyasa.
59
+
60
+ ## Requirements
61
+
62
+ - Node.js >= 20
63
+ - Claude Code with sessions in `~/.claude/projects/`, or Codex with sessions in `~/.codex/sessions/`
64
+
65
+ ## Known limitations
66
+
67
+ - **Subagent sessions** (when the same `sessionId` appears in multiple JSONL files under one parent session directory) collapse into a single row in the local DB; the exported bundle uses whichever file was ingested last. Resume still works because the recipient's CLI re-discovers the parent session from the file location.
68
+ - The recipient's Claude Code shows imported sessions under the sender's encoded project directory name (which is the sender's absolute project path). This is functional but visually foreign on the recipient side.
69
+ - The primer prompt (cross-tool warm-start) is intentionally lossy — it summarizes recent turns but does not carry the agent's internal state, prompt cache, or full tool-call output history.
@@ -0,0 +1,34 @@
1
+ {
2
+ "version": 1,
3
+ "skills": [
4
+ {
5
+ "id": "code-reviewer",
6
+ "purpose": "Code review tasks",
7
+ "install": "Add to ~/.claude/skills/code-reviewer/SKILL.md"
8
+ },
9
+ {
10
+ "id": "security-audit",
11
+ "purpose": "Security review of code/configs",
12
+ "install": "Add to ~/.claude/skills/security-audit/SKILL.md"
13
+ },
14
+ {
15
+ "id": "commit-message-writer",
16
+ "purpose": "Generate conventional commit messages",
17
+ "install": "Add to ~/.claude/skills/commit-message-writer/SKILL.md"
18
+ }
19
+ ],
20
+ "mcpServers": [
21
+ {
22
+ "id": "github",
23
+ "purpose": "GitHub PR / issue / repo operations natively",
24
+ "install": "claude mcp add github",
25
+ "replaces": ["Bash:gh "]
26
+ },
27
+ {
28
+ "id": "context7",
29
+ "purpose": "Pull up-to-date library docs without manual WebFetch",
30
+ "install": "claude mcp add context7",
31
+ "replaces": ["WebFetch:react.dev", "WebFetch:vercel.com/docs", "WebFetch:nextjs.org/docs"]
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,119 @@
1
+ [
2
+ {
3
+ "model": "claude-opus-4-7",
4
+ "period_start": "2025-10-01",
5
+ "period_end": null,
6
+ "input_per_mtok": 15.00,
7
+ "output_per_mtok": 75.00,
8
+ "cache_write_per_mtok": 18.75,
9
+ "cache_read_per_mtok": 1.50
10
+ },
11
+ {
12
+ "model": "claude-sonnet-4-6",
13
+ "period_start": "2025-10-01",
14
+ "period_end": null,
15
+ "input_per_mtok": 3.00,
16
+ "output_per_mtok": 15.00,
17
+ "cache_write_per_mtok": 3.75,
18
+ "cache_read_per_mtok": 0.30
19
+ },
20
+ {
21
+ "model": "claude-haiku-4-5",
22
+ "period_start": "2025-10-01",
23
+ "period_end": null,
24
+ "input_per_mtok": 0.80,
25
+ "output_per_mtok": 4.00,
26
+ "cache_write_per_mtok": 1.00,
27
+ "cache_read_per_mtok": 0.08
28
+ },
29
+ {
30
+ "model": "claude-haiku-4-5-20251001",
31
+ "period_start": "2025-10-01",
32
+ "period_end": null,
33
+ "input_per_mtok": 0.80,
34
+ "output_per_mtok": 4.00,
35
+ "cache_write_per_mtok": 1.00,
36
+ "cache_read_per_mtok": 0.08
37
+ },
38
+ {
39
+ "model": "claude-sonnet-4-5",
40
+ "period_start": "2025-07-01",
41
+ "period_end": null,
42
+ "input_per_mtok": 3.00,
43
+ "output_per_mtok": 15.00,
44
+ "cache_write_per_mtok": 3.75,
45
+ "cache_read_per_mtok": 0.30
46
+ },
47
+ {
48
+ "model": "gpt-5.5",
49
+ "period_start": "2026-04-24",
50
+ "period_end": null,
51
+ "input_per_mtok": 5.00,
52
+ "output_per_mtok": 30.00,
53
+ "cache_write_per_mtok": 0,
54
+ "cache_read_per_mtok": 1.25
55
+ },
56
+ {
57
+ "model": "gpt-5",
58
+ "period_start": "2026-01-01",
59
+ "period_end": null,
60
+ "input_per_mtok": 1.25,
61
+ "output_per_mtok": 10.00,
62
+ "cache_write_per_mtok": 0,
63
+ "cache_read_per_mtok": 0.125
64
+ },
65
+ {
66
+ "model": "gpt-5-mini",
67
+ "period_start": "2026-01-01",
68
+ "period_end": null,
69
+ "input_per_mtok": 0.25,
70
+ "output_per_mtok": 2.00,
71
+ "cache_write_per_mtok": 0,
72
+ "cache_read_per_mtok": 0.025
73
+ },
74
+ {
75
+ "model": "o3",
76
+ "period_start": "2026-01-01",
77
+ "period_end": null,
78
+ "input_per_mtok": 2.00,
79
+ "output_per_mtok": 8.00,
80
+ "cache_write_per_mtok": 0,
81
+ "cache_read_per_mtok": 0.50
82
+ },
83
+ {
84
+ "model": "o4-mini",
85
+ "period_start": "2026-01-01",
86
+ "period_end": null,
87
+ "input_per_mtok": 1.10,
88
+ "output_per_mtok": 4.40,
89
+ "cache_write_per_mtok": 0,
90
+ "cache_read_per_mtok": 0.275
91
+ },
92
+ {
93
+ "model": "gpt-4.1",
94
+ "period_start": "2026-01-01",
95
+ "period_end": null,
96
+ "input_per_mtok": 2.00,
97
+ "output_per_mtok": 8.00,
98
+ "cache_write_per_mtok": 0,
99
+ "cache_read_per_mtok": 0.50
100
+ },
101
+ {
102
+ "model": "gpt-4.1-mini",
103
+ "period_start": "2026-01-01",
104
+ "period_end": null,
105
+ "input_per_mtok": 0.40,
106
+ "output_per_mtok": 1.60,
107
+ "cache_write_per_mtok": 0,
108
+ "cache_read_per_mtok": 0.10
109
+ },
110
+ {
111
+ "model": "gpt-4.1-nano",
112
+ "period_start": "2026-01-01",
113
+ "period_end": null,
114
+ "input_per_mtok": 0.10,
115
+ "output_per_mtok": 0.40,
116
+ "cache_write_per_mtok": 0,
117
+ "cache_read_per_mtok": 0.025
118
+ }
119
+ ]
@@ -0,0 +1,214 @@
1
+ {
2
+ "$ref": "#/definitions/AnalyticsData",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "definitions": {
5
+ "ActivityCell": {
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "dayOfWeek": {
9
+ "type": "number"
10
+ },
11
+ "errorCount": {
12
+ "description": "Error tool-calls in this bucket — drives \"depth\"/run-health tint.",
13
+ "type": "number"
14
+ },
15
+ "hour": {
16
+ "type": "number"
17
+ },
18
+ "sessionCount": {
19
+ "type": "number"
20
+ },
21
+ "tokens": {
22
+ "type": "number"
23
+ }
24
+ },
25
+ "required": [
26
+ "dayOfWeek",
27
+ "hour",
28
+ "sessionCount",
29
+ "tokens",
30
+ "errorCount"
31
+ ],
32
+ "type": "object"
33
+ },
34
+ "ActivityClock": {
35
+ "additionalProperties": false,
36
+ "properties": {
37
+ "cells": {
38
+ "description": "7×24 grid of buckets (index = dayOfWeek*24 + hour). dayOfWeek: 0=Sun..6=Sat, hour: 0–23, both in the server's local timezone (where sessions were recorded).",
39
+ "items": {
40
+ "$ref": "#/definitions/ActivityCell"
41
+ },
42
+ "type": "array"
43
+ },
44
+ "maxSessions": {
45
+ "description": "Max sessionCount across all cells (for color-ramp normalization on the client).",
46
+ "type": "number"
47
+ },
48
+ "maxTokens": {
49
+ "description": "Max tokens across all cells.",
50
+ "type": "number"
51
+ }
52
+ },
53
+ "required": [
54
+ "cells",
55
+ "maxSessions",
56
+ "maxTokens"
57
+ ],
58
+ "type": "object"
59
+ },
60
+ "AnalyticsData": {
61
+ "additionalProperties": false,
62
+ "properties": {
63
+ "activityClock": {
64
+ "$ref": "#/definitions/ActivityClock",
65
+ "description": "Day-of-week × hour activity grid — the work-rhythm \"flow map\"."
66
+ },
67
+ "dailyCost": {
68
+ "items": {
69
+ "additionalProperties": false,
70
+ "properties": {
71
+ "costCents": {
72
+ "type": "number"
73
+ },
74
+ "date": {
75
+ "type": "string"
76
+ },
77
+ "sessionCount": {
78
+ "type": "number"
79
+ }
80
+ },
81
+ "required": [
82
+ "date",
83
+ "costCents",
84
+ "sessionCount"
85
+ ],
86
+ "type": "object"
87
+ },
88
+ "type": "array"
89
+ },
90
+ "dailyTokens": {
91
+ "description": "Per-day token totals, aligned to dailyCost dates (tokens read better than $ since most sessions show $0).",
92
+ "items": {
93
+ "additionalProperties": false,
94
+ "properties": {
95
+ "date": {
96
+ "type": "string"
97
+ },
98
+ "tokens": {
99
+ "type": "number"
100
+ }
101
+ },
102
+ "required": [
103
+ "date",
104
+ "tokens"
105
+ ],
106
+ "type": "object"
107
+ },
108
+ "type": "array"
109
+ },
110
+ "modelCost": {
111
+ "items": {
112
+ "additionalProperties": false,
113
+ "properties": {
114
+ "costCents": {
115
+ "type": "number"
116
+ },
117
+ "model": {
118
+ "type": "string"
119
+ },
120
+ "outputTokens": {
121
+ "type": "number"
122
+ }
123
+ },
124
+ "required": [
125
+ "model",
126
+ "costCents",
127
+ "outputTokens"
128
+ ],
129
+ "type": "object"
130
+ },
131
+ "type": "array"
132
+ },
133
+ "projectCost": {
134
+ "items": {
135
+ "additionalProperties": false,
136
+ "properties": {
137
+ "costCents": {
138
+ "type": "number"
139
+ },
140
+ "project": {
141
+ "type": "string"
142
+ },
143
+ "sessionCount": {
144
+ "type": "number"
145
+ }
146
+ },
147
+ "required": [
148
+ "project",
149
+ "costCents",
150
+ "sessionCount"
151
+ ],
152
+ "type": "object"
153
+ },
154
+ "type": "array"
155
+ },
156
+ "range": {
157
+ "$ref": "#/definitions/AnalyticsRange"
158
+ },
159
+ "summary": {
160
+ "$ref": "#/definitions/AnalyticsSummary",
161
+ "description": "Headline stats for the selected range."
162
+ }
163
+ },
164
+ "required": [
165
+ "range",
166
+ "dailyCost",
167
+ "projectCost",
168
+ "modelCost",
169
+ "dailyTokens",
170
+ "summary",
171
+ "activityClock"
172
+ ],
173
+ "type": "object"
174
+ },
175
+ "AnalyticsRange": {
176
+ "enum": [
177
+ "7d",
178
+ "30d",
179
+ "90d",
180
+ "all"
181
+ ],
182
+ "type": "string"
183
+ },
184
+ "AnalyticsSummary": {
185
+ "additionalProperties": false,
186
+ "properties": {
187
+ "activeDays": {
188
+ "description": "Distinct calendar days with at least one session.",
189
+ "type": "number"
190
+ },
191
+ "busiestHour": {
192
+ "description": "Local hour 0–23 with the most sessions, or null if no data.",
193
+ "type": [
194
+ "number",
195
+ "null"
196
+ ]
197
+ },
198
+ "totalSessions": {
199
+ "type": "number"
200
+ },
201
+ "totalTokens": {
202
+ "type": "number"
203
+ }
204
+ },
205
+ "required": [
206
+ "totalSessions",
207
+ "totalTokens",
208
+ "activeDays",
209
+ "busiestHour"
210
+ ],
211
+ "type": "object"
212
+ }
213
+ }
214
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "$ref": "#/definitions/FoundationData",
3
+ "$schema": "http://json-schema.org/draft-07/schema#",
4
+ "definitions": {
5
+ "FoundationData": {
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "cacheHitRateLast30Days": {
9
+ "type": "number"
10
+ },
11
+ "modelMix": {
12
+ "items": {
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "model": {
16
+ "type": "string"
17
+ },
18
+ "pct": {
19
+ "type": "number"
20
+ }
21
+ },
22
+ "required": [
23
+ "model",
24
+ "pct"
25
+ ],
26
+ "type": "object"
27
+ },
28
+ "type": "array"
29
+ },
30
+ "totalCostCentsThisWeek": {
31
+ "type": "number"
32
+ }
33
+ },
34
+ "required": [
35
+ "totalCostCentsThisWeek",
36
+ "cacheHitRateLast30Days",
37
+ "modelMix"
38
+ ],
39
+ "type": "object"
40
+ }
41
+ }
42
+ }