zozul-cli 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 (139) hide show
  1. package/.env.example +44 -0
  2. package/.github/workflows/publish.yml +26 -0
  3. package/DEVELOPMENT.md +288 -0
  4. package/LICENSE +201 -0
  5. package/README.md +178 -0
  6. package/dist/cli/commands.d.ts +3 -0
  7. package/dist/cli/commands.d.ts.map +1 -0
  8. package/dist/cli/commands.js +307 -0
  9. package/dist/cli/commands.js.map +1 -0
  10. package/dist/cli/format.d.ts +5 -0
  11. package/dist/cli/format.d.ts.map +1 -0
  12. package/dist/cli/format.js +115 -0
  13. package/dist/cli/format.js.map +1 -0
  14. package/dist/context/index.d.ts +8 -0
  15. package/dist/context/index.d.ts.map +1 -0
  16. package/dist/context/index.js +37 -0
  17. package/dist/context/index.js.map +1 -0
  18. package/dist/dashboard/html.d.ts +17 -0
  19. package/dist/dashboard/html.d.ts.map +1 -0
  20. package/dist/dashboard/html.js +79 -0
  21. package/dist/dashboard/html.js.map +1 -0
  22. package/dist/dashboard/index.html +1245 -0
  23. package/dist/hooks/config.d.ts +19 -0
  24. package/dist/hooks/config.d.ts.map +1 -0
  25. package/dist/hooks/config.js +106 -0
  26. package/dist/hooks/config.js.map +1 -0
  27. package/dist/hooks/git.d.ts +6 -0
  28. package/dist/hooks/git.d.ts.map +1 -0
  29. package/dist/hooks/git.js +73 -0
  30. package/dist/hooks/git.js.map +1 -0
  31. package/dist/hooks/index.d.ts +4 -0
  32. package/dist/hooks/index.d.ts.map +1 -0
  33. package/dist/hooks/index.js +3 -0
  34. package/dist/hooks/index.js.map +1 -0
  35. package/dist/hooks/server.d.ts +16 -0
  36. package/dist/hooks/server.d.ts.map +1 -0
  37. package/dist/hooks/server.js +349 -0
  38. package/dist/hooks/server.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +6 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/otel/config.d.ts +36 -0
  44. package/dist/otel/config.d.ts.map +1 -0
  45. package/dist/otel/config.js +109 -0
  46. package/dist/otel/config.js.map +1 -0
  47. package/dist/otel/index.d.ts +4 -0
  48. package/dist/otel/index.d.ts.map +1 -0
  49. package/dist/otel/index.js +3 -0
  50. package/dist/otel/index.js.map +1 -0
  51. package/dist/otel/receiver.d.ts +10 -0
  52. package/dist/otel/receiver.d.ts.map +1 -0
  53. package/dist/otel/receiver.js +155 -0
  54. package/dist/otel/receiver.js.map +1 -0
  55. package/dist/parser/index.d.ts +4 -0
  56. package/dist/parser/index.d.ts.map +1 -0
  57. package/dist/parser/index.js +3 -0
  58. package/dist/parser/index.js.map +1 -0
  59. package/dist/parser/ingest.d.ts +20 -0
  60. package/dist/parser/ingest.d.ts.map +1 -0
  61. package/dist/parser/ingest.js +98 -0
  62. package/dist/parser/ingest.js.map +1 -0
  63. package/dist/parser/jsonl.d.ts +14 -0
  64. package/dist/parser/jsonl.d.ts.map +1 -0
  65. package/dist/parser/jsonl.js +202 -0
  66. package/dist/parser/jsonl.js.map +1 -0
  67. package/dist/parser/types.d.ts +81 -0
  68. package/dist/parser/types.d.ts.map +1 -0
  69. package/dist/parser/types.js +9 -0
  70. package/dist/parser/types.js.map +1 -0
  71. package/dist/parser/watcher.d.ts +16 -0
  72. package/dist/parser/watcher.d.ts.map +1 -0
  73. package/dist/parser/watcher.js +103 -0
  74. package/dist/parser/watcher.js.map +1 -0
  75. package/dist/pricing/index.d.ts +2 -0
  76. package/dist/pricing/index.d.ts.map +1 -0
  77. package/dist/pricing/index.js +37 -0
  78. package/dist/pricing/index.js.map +1 -0
  79. package/dist/service/index.d.ts +31 -0
  80. package/dist/service/index.d.ts.map +1 -0
  81. package/dist/service/index.js +252 -0
  82. package/dist/service/index.js.map +1 -0
  83. package/dist/storage/db.d.ts +75 -0
  84. package/dist/storage/db.d.ts.map +1 -0
  85. package/dist/storage/db.js +117 -0
  86. package/dist/storage/db.js.map +1 -0
  87. package/dist/storage/index.d.ts +4 -0
  88. package/dist/storage/index.d.ts.map +1 -0
  89. package/dist/storage/index.js +3 -0
  90. package/dist/storage/index.js.map +1 -0
  91. package/dist/storage/repo.d.ts +162 -0
  92. package/dist/storage/repo.d.ts.map +1 -0
  93. package/dist/storage/repo.js +472 -0
  94. package/dist/storage/repo.js.map +1 -0
  95. package/dist/sync/client.d.ts +24 -0
  96. package/dist/sync/client.d.ts.map +1 -0
  97. package/dist/sync/client.js +41 -0
  98. package/dist/sync/client.js.map +1 -0
  99. package/dist/sync/index.d.ts +18 -0
  100. package/dist/sync/index.d.ts.map +1 -0
  101. package/dist/sync/index.js +135 -0
  102. package/dist/sync/index.js.map +1 -0
  103. package/dist/sync/sync.test.d.ts +2 -0
  104. package/dist/sync/sync.test.d.ts.map +1 -0
  105. package/dist/sync/sync.test.js +412 -0
  106. package/dist/sync/sync.test.js.map +1 -0
  107. package/dist/sync/transform.d.ts +80 -0
  108. package/dist/sync/transform.d.ts.map +1 -0
  109. package/dist/sync/transform.js +90 -0
  110. package/dist/sync/transform.js.map +1 -0
  111. package/package.json +50 -0
  112. package/src/cli/commands.ts +332 -0
  113. package/src/cli/format.ts +133 -0
  114. package/src/context/index.ts +42 -0
  115. package/src/dashboard/html.ts +97 -0
  116. package/src/dashboard/index.html +1245 -0
  117. package/src/hooks/config.ts +119 -0
  118. package/src/hooks/git.ts +77 -0
  119. package/src/hooks/index.ts +7 -0
  120. package/src/hooks/server.ts +397 -0
  121. package/src/index.ts +6 -0
  122. package/src/otel/config.ts +141 -0
  123. package/src/otel/index.ts +8 -0
  124. package/src/otel/receiver.ts +183 -0
  125. package/src/parser/index.ts +3 -0
  126. package/src/parser/ingest.ts +119 -0
  127. package/src/parser/jsonl.ts +241 -0
  128. package/src/parser/types.ts +89 -0
  129. package/src/parser/watcher.ts +116 -0
  130. package/src/pricing/index.ts +51 -0
  131. package/src/service/index.ts +272 -0
  132. package/src/storage/db.ts +198 -0
  133. package/src/storage/index.ts +3 -0
  134. package/src/storage/repo.ts +601 -0
  135. package/src/sync/client.ts +63 -0
  136. package/src/sync/index.ts +207 -0
  137. package/src/sync/sync.test.ts +447 -0
  138. package/src/sync/transform.ts +184 -0
  139. package/tsconfig.json +19 -0
@@ -0,0 +1,198 @@
1
+ import Database from "better-sqlite3";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import fs from "node:fs";
5
+
6
+ const DEFAULT_DB_DIR = path.join(os.homedir(), ".zozul");
7
+ const DEFAULT_DB_PATH = path.join(DEFAULT_DB_DIR, "zozul.db");
8
+
9
+ export function getDb(dbPath: string = DEFAULT_DB_PATH): Database.Database {
10
+ fs.mkdirSync(path.dirname(dbPath), { recursive: true });
11
+ const db = new Database(dbPath);
12
+ db.pragma("journal_mode = WAL");
13
+ db.pragma("foreign_keys = ON");
14
+ migrate(db);
15
+ return db;
16
+ }
17
+
18
+ function migrate(db: Database.Database): void {
19
+ db.exec(`
20
+ CREATE TABLE IF NOT EXISTS sessions (
21
+ id TEXT PRIMARY KEY,
22
+ project_path TEXT,
23
+ started_at TEXT NOT NULL,
24
+ ended_at TEXT,
25
+ total_input_tokens INTEGER DEFAULT 0,
26
+ total_output_tokens INTEGER DEFAULT 0,
27
+ total_cache_read_tokens INTEGER DEFAULT 0,
28
+ total_cache_creation_tokens INTEGER DEFAULT 0,
29
+ total_cost_usd REAL DEFAULT 0,
30
+ total_turns INTEGER DEFAULT 0,
31
+ total_duration_ms INTEGER DEFAULT 0,
32
+ model TEXT
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS turns (
36
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
37
+ session_id TEXT NOT NULL REFERENCES sessions(id),
38
+ turn_index INTEGER NOT NULL,
39
+ role TEXT NOT NULL,
40
+ timestamp TEXT NOT NULL,
41
+ input_tokens INTEGER DEFAULT 0,
42
+ output_tokens INTEGER DEFAULT 0,
43
+ cache_read_tokens INTEGER DEFAULT 0,
44
+ cache_creation_tokens INTEGER DEFAULT 0,
45
+ cost_usd REAL DEFAULT 0,
46
+ duration_ms INTEGER DEFAULT 0,
47
+ model TEXT,
48
+ content_text TEXT,
49
+ tool_calls TEXT,
50
+ is_real_user INTEGER DEFAULT 0,
51
+ UNIQUE(session_id, turn_index)
52
+ );
53
+
54
+ CREATE TABLE IF NOT EXISTS tool_uses (
55
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
56
+ session_id TEXT NOT NULL REFERENCES sessions(id),
57
+ turn_id INTEGER REFERENCES turns(id),
58
+ tool_name TEXT NOT NULL,
59
+ tool_input TEXT,
60
+ tool_result TEXT,
61
+ success INTEGER,
62
+ duration_ms INTEGER DEFAULT 0,
63
+ timestamp TEXT NOT NULL
64
+ );
65
+
66
+ CREATE TABLE IF NOT EXISTS hook_events (
67
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
68
+ session_id TEXT,
69
+ event_name TEXT NOT NULL,
70
+ timestamp TEXT NOT NULL,
71
+ payload TEXT NOT NULL
72
+ );
73
+
74
+ CREATE TABLE IF NOT EXISTS otel_metrics (
75
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
76
+ name TEXT NOT NULL,
77
+ value REAL NOT NULL,
78
+ attributes TEXT,
79
+ session_id TEXT,
80
+ model TEXT,
81
+ timestamp TEXT NOT NULL
82
+ );
83
+
84
+ CREATE TABLE IF NOT EXISTS otel_events (
85
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
86
+ event_name TEXT NOT NULL,
87
+ attributes TEXT,
88
+ session_id TEXT,
89
+ prompt_id TEXT,
90
+ timestamp TEXT NOT NULL
91
+ );
92
+
93
+ CREATE INDEX IF NOT EXISTS idx_turns_session ON turns(session_id);
94
+ CREATE INDEX IF NOT EXISTS idx_tool_uses_session ON tool_uses(session_id);
95
+ CREATE INDEX IF NOT EXISTS idx_hook_events_session ON hook_events(session_id);
96
+ CREATE INDEX IF NOT EXISTS idx_sessions_started ON sessions(started_at);
97
+ CREATE INDEX IF NOT EXISTS idx_otel_metrics_name ON otel_metrics(name, timestamp);
98
+ CREATE INDEX IF NOT EXISTS idx_otel_metrics_session ON otel_metrics(session_id);
99
+ CREATE INDEX IF NOT EXISTS idx_otel_events_name ON otel_events(event_name, timestamp);
100
+ CREATE INDEX IF NOT EXISTS idx_otel_events_session ON otel_events(session_id);
101
+
102
+ CREATE TABLE IF NOT EXISTS task_tags (
103
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
104
+ turn_id INTEGER NOT NULL REFERENCES turns(id),
105
+ task TEXT NOT NULL,
106
+ tagged_at TEXT NOT NULL,
107
+ UNIQUE(turn_id, task)
108
+ );
109
+
110
+ CREATE INDEX IF NOT EXISTS idx_task_tags_task ON task_tags(task);
111
+ CREATE INDEX IF NOT EXISTS idx_task_tags_turn ON task_tags(turn_id);
112
+
113
+ CREATE TABLE IF NOT EXISTS sync_watermarks (
114
+ table_name TEXT PRIMARY KEY,
115
+ last_synced_id INTEGER NOT NULL DEFAULT 0,
116
+ last_synced_at TEXT
117
+ );
118
+ `);
119
+ }
120
+
121
+ export type SessionRow = {
122
+ id: string;
123
+ project_path: string | null;
124
+ started_at: string;
125
+ ended_at: string | null;
126
+ total_input_tokens: number;
127
+ total_output_tokens: number;
128
+ total_cache_read_tokens: number;
129
+ total_cache_creation_tokens: number;
130
+ total_cost_usd: number;
131
+ total_turns: number;
132
+ total_duration_ms: number;
133
+ model: string | null;
134
+ };
135
+
136
+ export type TurnRow = {
137
+ id: number;
138
+ session_id: string;
139
+ turn_index: number;
140
+ role: string;
141
+ timestamp: string;
142
+ input_tokens: number;
143
+ output_tokens: number;
144
+ cache_read_tokens: number;
145
+ cache_creation_tokens: number;
146
+ cost_usd: number;
147
+ duration_ms: number;
148
+ model: string | null;
149
+ content_text: string | null;
150
+ tool_calls: string | null;
151
+ is_real_user: number;
152
+ };
153
+
154
+ export type ToolUseRow = {
155
+ id: number;
156
+ session_id: string;
157
+ turn_id: number | null;
158
+ tool_name: string;
159
+ tool_input: string | null;
160
+ tool_result: string | null;
161
+ success: number | null;
162
+ duration_ms: number;
163
+ timestamp: string;
164
+ };
165
+
166
+ export type HookEventRow = {
167
+ id: number;
168
+ session_id: string | null;
169
+ event_name: string;
170
+ timestamp: string;
171
+ payload: string;
172
+ };
173
+
174
+ export type OtelMetricRow = {
175
+ id: number;
176
+ name: string;
177
+ value: number;
178
+ attributes: string | null;
179
+ session_id: string | null;
180
+ model: string | null;
181
+ timestamp: string;
182
+ };
183
+
184
+ export type OtelEventRow = {
185
+ id: number;
186
+ event_name: string;
187
+ attributes: string | null;
188
+ session_id: string | null;
189
+ prompt_id: string | null;
190
+ timestamp: string;
191
+ };
192
+
193
+ export type TaskTagRow = {
194
+ id: number;
195
+ turn_id: number;
196
+ task: string;
197
+ tagged_at: string;
198
+ };
@@ -0,0 +1,3 @@
1
+ export { getDb } from "./db.js";
2
+ export { SessionRepo } from "./repo.js";
3
+ export type { SessionRow, TurnRow } from "./db.js";