@jagit/shared 0.0.1

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 (54) hide show
  1. package/dist/approval-bridge.d.ts +12 -0
  2. package/dist/approval-bridge.js +35 -0
  3. package/dist/branch.d.ts +10 -0
  4. package/dist/branch.js +20 -0
  5. package/dist/branch.test.d.ts +1 -0
  6. package/dist/branch.test.js +32 -0
  7. package/dist/config.d.ts +19 -0
  8. package/dist/config.js +36 -0
  9. package/dist/config.test.d.ts +1 -0
  10. package/dist/config.test.js +31 -0
  11. package/dist/credentials.d.ts +82 -0
  12. package/dist/credentials.js +94 -0
  13. package/dist/credentials.test.d.ts +1 -0
  14. package/dist/credentials.test.js +206 -0
  15. package/dist/crypto.d.ts +12 -0
  16. package/dist/crypto.js +29 -0
  17. package/dist/crypto.test.d.ts +1 -0
  18. package/dist/crypto.test.js +20 -0
  19. package/dist/events.d.ts +13 -0
  20. package/dist/events.js +24 -0
  21. package/dist/git-worktree.d.ts +2 -0
  22. package/dist/git-worktree.js +14 -0
  23. package/dist/index.d.ts +15 -0
  24. package/dist/index.js +14 -0
  25. package/dist/mcp-config.d.ts +77 -0
  26. package/dist/mcp-config.js +71 -0
  27. package/dist/mcp-servers.d.ts +54 -0
  28. package/dist/mcp-servers.js +73 -0
  29. package/dist/prisma.d.ts +3 -0
  30. package/dist/prisma.js +20 -0
  31. package/dist/prisma.test.d.ts +1 -0
  32. package/dist/prisma.test.js +16 -0
  33. package/dist/queue.d.ts +10 -0
  34. package/dist/queue.js +7 -0
  35. package/dist/retry.d.ts +5 -0
  36. package/dist/retry.js +16 -0
  37. package/dist/retry.test.d.ts +1 -0
  38. package/dist/retry.test.js +24 -0
  39. package/dist/seed.d.ts +99 -0
  40. package/dist/seed.js +123 -0
  41. package/dist/seed.test.d.ts +1 -0
  42. package/dist/seed.test.js +126 -0
  43. package/dist/types.d.ts +16 -0
  44. package/dist/types.js +5 -0
  45. package/package.json +29 -0
  46. package/prisma/migrations/20260615000000_init/migration.sql +157 -0
  47. package/prisma/migrations/20260615000001_add_updated_at_agent_template/migration.sql +2 -0
  48. package/prisma/migrations/20260616000000_mcp_review/migration.sql +23 -0
  49. package/prisma/migrations/20260616100000_mcp_http_transport/migration.sql +5 -0
  50. package/prisma/migrations/20260616120000_review_default_false/migration.sql +1 -0
  51. package/prisma/migrations/20260620040203_add_usage_models/migration.sql +28 -0
  52. package/prisma/migrations/20260620120000_add_agent_session/migration.sql +35 -0
  53. package/prisma/migrations/migration_lock.toml +3 -0
  54. package/prisma/schema.prisma +257 -0
@@ -0,0 +1,257 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ }
8
+
9
+ // ─── Enums ───────────────────────────────────────────────────────────────────
10
+
11
+ enum JobStatus {
12
+ queued
13
+ cloning
14
+ running
15
+ awaiting_approval
16
+ pushing
17
+ opening_mr
18
+ reporting
19
+ done
20
+ paused
21
+ stopped
22
+ failed
23
+ }
24
+
25
+ enum CredentialKind {
26
+ jira
27
+ gitlab
28
+ telegram
29
+ anthropic
30
+ }
31
+
32
+ enum ApprovalStatus {
33
+ pending
34
+ approved
35
+ rejected
36
+ expired
37
+ }
38
+
39
+ // ─── AgentTemplate ───────────────────────────────────────────────────────────
40
+ // Seeded; CRUD deferred to Phase 2+.
41
+ // Controls which model and tools are used for a coding run.
42
+
43
+ model AgentTemplate {
44
+ id String @id @default(cuid())
45
+ name String @unique
46
+ model String // e.g. "claude-opus-4-5"
47
+ systemPrompt String
48
+ maxConcurrent Int @default(1)
49
+ allowedTools Json @default("[]") // string[] of ACP tool names
50
+ skills Json @default("[]") // string[] of skill names (MVP: name-only)
51
+ mcpServerIds Json @default("[]") // string[] of McpServerConfig ids
52
+ requireReviewBeforeCommit Boolean @default(false)
53
+ createdAt DateTime @default(now())
54
+ updatedAt DateTime @updatedAt
55
+
56
+ jobs Job[]
57
+ repoMappings RepoMapping[]
58
+ }
59
+
60
+ // ─── McpServerConfig ───────────────────────────────────────────────────────────
61
+ // MCP servers injected into ACP session/new via AgentTemplate.mcpServerIds.
62
+ // transport: "stdio" (command/args/env) or "http" (url/headers).
63
+ // env/headers values are literals or credential refs (resolved at session spawn).
64
+
65
+ model McpServerConfig {
66
+ id String @id @default(cuid())
67
+ name String @unique
68
+ transport String @default("stdio") // "stdio" | "http"
69
+ command String @default("")
70
+ args Json @default("[]") // string[] — stdio only
71
+ env Json @default("{}") // stdio process env
72
+ url String? // http only
73
+ headers Json @default("{}") // http request headers
74
+ enabled Boolean @default(true)
75
+ createdAt DateTime @default(now())
76
+ updatedAt DateTime @updatedAt
77
+ }
78
+
79
+ // ─── Credential ──────────────────────────────────────────────────────────────
80
+ // One row per integration account. `secrets` stores an encrypted JSON blob
81
+ // (never logged or returned in API responses). `meta` stores non-secret config
82
+ // like base URLs, project IDs, Telegram chat IDs.
83
+
84
+ model Credential {
85
+ id String @id @default(cuid())
86
+ kind CredentialKind
87
+ name String
88
+ secrets Json // encrypted at rest with APP_ENCRYPTION_KEY
89
+ meta Json @default("{}")
90
+ createdAt DateTime @default(now())
91
+ updatedAt DateTime @updatedAt
92
+
93
+ @@unique([kind, name])
94
+ }
95
+
96
+ // ─── RepoMapping ─────────────────────────────────────────────────────────────
97
+ // Maps a Jira project to a GitLab project + agent template + branch rules.
98
+ // branchPrefixRules example: { "Bug": "bugfix/", "Story": "feature/", "default": "feature/" }
99
+
100
+ model RepoMapping {
101
+ id String @id @default(cuid())
102
+ jiraProjectKey String @unique
103
+ gitlabProjectId String
104
+ defaultBaseBranch String @default("main")
105
+ branchPrefixRules Json @default("{}")
106
+ agentTemplateId String
107
+ agentTemplate AgentTemplate @relation(fields: [agentTemplateId], references: [id])
108
+ createdAt DateTime @default(now())
109
+ updatedAt DateTime @updatedAt
110
+ }
111
+
112
+ // ─── Job ─────────────────────────────────────────────────────────────────────
113
+ // One row per triggered coding run.
114
+ // checkpointThreadId: used by the LangGraph Postgres checkpointer (= dedupeKey).
115
+ // dedupeKey: SHA-1 of (source:issueKey:eventId) — prevents duplicate jobs.
116
+
117
+ model Job {
118
+ id String @id @default(cuid())
119
+ source String // "jira" | "gitlab"
120
+ jiraIssueKey String?
121
+ gitlabProjectId String?
122
+ branch String?
123
+ mrUrl String?
124
+ status JobStatus @default(queued)
125
+ agentTemplateId String?
126
+ agentTemplate AgentTemplate? @relation(fields: [agentTemplateId], references: [id])
127
+ checkpointThreadId String @unique
128
+ dedupeKey String @unique
129
+ tokensUsed Int @default(0)
130
+ costUsd Float @default(0)
131
+ error String?
132
+ workdir String? // ephemeral clone path (cleaned on terminal state)
133
+ reviewApprovedAt DateTime? // set when human_review approved before commit
134
+ createdAt DateTime @default(now())
135
+ updatedAt DateTime @updatedAt
136
+
137
+ steps JobStep[]
138
+ events JobEvent[]
139
+ approvals Approval[]
140
+ }
141
+
142
+ // ─── JobStep ─────────────────────────────────────────────────────────────────
143
+ // One row per LangGraph node execution.
144
+ // name: node name (e.g. "resolveContext", "cloneRepo", "runAgent")
145
+ // status: "pending" | "running" | "done" | "failed"
146
+
147
+ model JobStep {
148
+ id String @id @default(cuid())
149
+ jobId String
150
+ job Job @relation(fields: [jobId], references: [id], onDelete: Cascade)
151
+ name String
152
+ status String @default("pending")
153
+ detail Json @default("{}")
154
+ startedAt DateTime?
155
+ finishedAt DateTime?
156
+ createdAt DateTime @default(now())
157
+ }
158
+
159
+ // ─── JobEvent ────────────────────────────────────────────────────────────────
160
+ // Append-only timeline; streamed to the dashboard over SSE.
161
+ // type examples: "step_started", "step_done", "agent_message", "tool_use",
162
+ // "approval_requested", "approval_resolved", "error"
163
+
164
+ model JobEvent {
165
+ id String @id @default(cuid())
166
+ jobId String
167
+ job Job @relation(fields: [jobId], references: [id], onDelete: Cascade)
168
+ ts DateTime @default(now())
169
+ level String @default("info") // "info" | "warn" | "error"
170
+ type String
171
+ message String
172
+ payload Json @default("{}")
173
+
174
+ @@index([jobId, ts])
175
+ }
176
+
177
+ // ─── Approval ────────────────────────────────────────────────────────────────
178
+ // Created when Claude Code emits a session/request_permission event.
179
+ // Single-resolution: whichever channel (Telegram or dashboard) responds first
180
+ // wins; subsequent resolutions are no-ops.
181
+ // telegramMessageRef: message_id from the sent Telegram message (for editing it
182
+ // after resolution to show the chosen option).
183
+
184
+ model Approval {
185
+ id String @id @default(cuid())
186
+ jobId String
187
+ job Job @relation(fields: [jobId], references: [id], onDelete: Cascade)
188
+ stepId String? // FK to the JobStep that triggered this approval
189
+ kind String // e.g. "tool_permission"
190
+ prompt String
191
+ options Json @default("[]") // { optionId: string; name: string }[]
192
+ status ApprovalStatus @default(pending)
193
+ decidedBy String? // user identifier or "system" (timeout)
194
+ decidedVia String? // "telegram" | "dashboard" | "system"
195
+ chosenOptionId String?
196
+ telegramMessageRef String? // stringified Telegram message_id
197
+ createdAt DateTime @default(now())
198
+ decidedAt DateTime?
199
+
200
+ @@index([jobId, status])
201
+ }
202
+
203
+ // ─── User ────────────────────────────────────────────────────────────────────
204
+ // Represents a user for usage tracking (CodeBurn consolidation).
205
+
206
+ model User {
207
+ id String @id @default(cuid())
208
+ username String @unique
209
+ createdAt DateTime @default(now())
210
+ uploads UsageUpload[]
211
+ agentSessions AgentSession[]
212
+ }
213
+
214
+ // ─── UsageUpload ─────────────────────────────────────────────────────────────
215
+ // Stores parsed usage data (e.g., from CSV uploads) per user and period.
216
+
217
+ model UsageUpload {
218
+ id String @id @default(cuid())
219
+ userId String
220
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
221
+ uploadedAt DateTime @default(now())
222
+ period String // "today", "7days", "30days"
223
+ data Json // structured JSON containing all parsed CSV data
224
+
225
+ @@index([userId, uploadedAt])
226
+ }
227
+
228
+ // ─── AgentSession ────────────────────────────────────────────────────────────
229
+ // Live per-session usage snapshots pushed by per-tool hook adapters.
230
+
231
+ enum AgentTool {
232
+ claude_code
233
+ codex
234
+ copilot
235
+ }
236
+
237
+ model AgentSession {
238
+ id String @id @default(cuid())
239
+ tool AgentTool
240
+ sessionId String
241
+ userId String
242
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
243
+ model String
244
+ inputTokens Int @default(0)
245
+ cachedInputTokens Int @default(0)
246
+ outputTokens Int @default(0)
247
+ costUsd Float?
248
+ toolCallCount Int?
249
+ startedAt DateTime
250
+ lastUpdatedAt DateTime @updatedAt
251
+ rawPayload Json @default("{}")
252
+ createdAt DateTime @default(now())
253
+
254
+ @@unique([tool, sessionId])
255
+ @@index([userId, lastUpdatedAt])
256
+ @@index([tool, lastUpdatedAt])
257
+ }