codepiper 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 (149) hide show
  1. package/.env.example +28 -0
  2. package/CHANGELOG.md +10 -0
  3. package/LEGAL_NOTICE.md +39 -0
  4. package/LICENSE +21 -0
  5. package/README.md +524 -0
  6. package/package.json +90 -0
  7. package/packages/cli/package.json +13 -0
  8. package/packages/cli/src/commands/analytics.ts +157 -0
  9. package/packages/cli/src/commands/attach.ts +299 -0
  10. package/packages/cli/src/commands/audit.ts +50 -0
  11. package/packages/cli/src/commands/auth.ts +261 -0
  12. package/packages/cli/src/commands/daemon.ts +162 -0
  13. package/packages/cli/src/commands/doctor.ts +303 -0
  14. package/packages/cli/src/commands/env-set.ts +162 -0
  15. package/packages/cli/src/commands/hook-forward.ts +268 -0
  16. package/packages/cli/src/commands/keys.ts +77 -0
  17. package/packages/cli/src/commands/kill.ts +19 -0
  18. package/packages/cli/src/commands/logs.ts +419 -0
  19. package/packages/cli/src/commands/model.ts +172 -0
  20. package/packages/cli/src/commands/policy-set.ts +185 -0
  21. package/packages/cli/src/commands/policy.ts +227 -0
  22. package/packages/cli/src/commands/providers.ts +114 -0
  23. package/packages/cli/src/commands/resize.ts +34 -0
  24. package/packages/cli/src/commands/send.ts +184 -0
  25. package/packages/cli/src/commands/sessions.ts +202 -0
  26. package/packages/cli/src/commands/slash.ts +92 -0
  27. package/packages/cli/src/commands/start.ts +243 -0
  28. package/packages/cli/src/commands/stop.ts +19 -0
  29. package/packages/cli/src/commands/tail.ts +137 -0
  30. package/packages/cli/src/commands/workflow.ts +786 -0
  31. package/packages/cli/src/commands/workspace.ts +127 -0
  32. package/packages/cli/src/lib/api.ts +78 -0
  33. package/packages/cli/src/lib/args.ts +72 -0
  34. package/packages/cli/src/lib/format.ts +93 -0
  35. package/packages/cli/src/main.ts +563 -0
  36. package/packages/core/package.json +7 -0
  37. package/packages/core/src/config.ts +30 -0
  38. package/packages/core/src/errors.ts +38 -0
  39. package/packages/core/src/eventBus.ts +56 -0
  40. package/packages/core/src/eventBusAdapter.ts +143 -0
  41. package/packages/core/src/index.ts +10 -0
  42. package/packages/core/src/sqliteEventBus.ts +336 -0
  43. package/packages/core/src/types.ts +63 -0
  44. package/packages/daemon/package.json +11 -0
  45. package/packages/daemon/src/api/analyticsRoutes.ts +343 -0
  46. package/packages/daemon/src/api/authRoutes.ts +344 -0
  47. package/packages/daemon/src/api/bodyLimit.ts +133 -0
  48. package/packages/daemon/src/api/envSetRoutes.ts +170 -0
  49. package/packages/daemon/src/api/gitRoutes.ts +409 -0
  50. package/packages/daemon/src/api/hooks.ts +588 -0
  51. package/packages/daemon/src/api/inputPolicy.ts +249 -0
  52. package/packages/daemon/src/api/notificationRoutes.ts +532 -0
  53. package/packages/daemon/src/api/policyRoutes.ts +234 -0
  54. package/packages/daemon/src/api/policySetRoutes.ts +445 -0
  55. package/packages/daemon/src/api/routeUtils.ts +28 -0
  56. package/packages/daemon/src/api/routes.ts +1004 -0
  57. package/packages/daemon/src/api/server.ts +1388 -0
  58. package/packages/daemon/src/api/settingsRoutes.ts +367 -0
  59. package/packages/daemon/src/api/sqliteErrors.ts +47 -0
  60. package/packages/daemon/src/api/stt.ts +143 -0
  61. package/packages/daemon/src/api/terminalRoutes.ts +200 -0
  62. package/packages/daemon/src/api/validation.ts +287 -0
  63. package/packages/daemon/src/api/validationRoutes.ts +174 -0
  64. package/packages/daemon/src/api/workflowRoutes.ts +567 -0
  65. package/packages/daemon/src/api/workspaceRoutes.ts +151 -0
  66. package/packages/daemon/src/api/ws.ts +1588 -0
  67. package/packages/daemon/src/auth/apiRateLimiter.ts +73 -0
  68. package/packages/daemon/src/auth/authMiddleware.ts +305 -0
  69. package/packages/daemon/src/auth/authService.ts +496 -0
  70. package/packages/daemon/src/auth/rateLimiter.ts +137 -0
  71. package/packages/daemon/src/config/pricing.ts +79 -0
  72. package/packages/daemon/src/crypto/encryption.ts +196 -0
  73. package/packages/daemon/src/db/db.ts +2745 -0
  74. package/packages/daemon/src/db/index.ts +16 -0
  75. package/packages/daemon/src/db/migrations.ts +182 -0
  76. package/packages/daemon/src/db/policyDb.ts +349 -0
  77. package/packages/daemon/src/db/schema.sql +408 -0
  78. package/packages/daemon/src/db/workflowDb.ts +464 -0
  79. package/packages/daemon/src/git/gitUtils.ts +544 -0
  80. package/packages/daemon/src/index.ts +6 -0
  81. package/packages/daemon/src/main.ts +525 -0
  82. package/packages/daemon/src/notifications/pushNotifier.ts +369 -0
  83. package/packages/daemon/src/providers/codexAppServerScaffold.ts +49 -0
  84. package/packages/daemon/src/providers/registry.ts +111 -0
  85. package/packages/daemon/src/providers/types.ts +82 -0
  86. package/packages/daemon/src/sessions/auditLogger.ts +103 -0
  87. package/packages/daemon/src/sessions/policyEngine.ts +165 -0
  88. package/packages/daemon/src/sessions/policyMatcher.ts +114 -0
  89. package/packages/daemon/src/sessions/policyTypes.ts +94 -0
  90. package/packages/daemon/src/sessions/ptyProcess.ts +141 -0
  91. package/packages/daemon/src/sessions/sessionManager.ts +1770 -0
  92. package/packages/daemon/src/sessions/tmuxSession.ts +1073 -0
  93. package/packages/daemon/src/sessions/transcriptManager.ts +110 -0
  94. package/packages/daemon/src/sessions/transcriptParser.ts +149 -0
  95. package/packages/daemon/src/sessions/transcriptTailer.ts +214 -0
  96. package/packages/daemon/src/tracking/tokenTracker.ts +168 -0
  97. package/packages/daemon/src/workflows/contextManager.ts +83 -0
  98. package/packages/daemon/src/workflows/index.ts +31 -0
  99. package/packages/daemon/src/workflows/resultExtractor.ts +118 -0
  100. package/packages/daemon/src/workflows/waitConditionPoller.ts +131 -0
  101. package/packages/daemon/src/workflows/workflowParser.ts +217 -0
  102. package/packages/daemon/src/workflows/workflowRunner.ts +969 -0
  103. package/packages/daemon/src/workflows/workflowTypes.ts +188 -0
  104. package/packages/daemon/src/workflows/workflowValidator.ts +533 -0
  105. package/packages/providers/claude-code/package.json +11 -0
  106. package/packages/providers/claude-code/src/index.ts +7 -0
  107. package/packages/providers/claude-code/src/overlaySettings.ts +198 -0
  108. package/packages/providers/claude-code/src/provider.ts +311 -0
  109. package/packages/web/dist/android-chrome-192x192.png +0 -0
  110. package/packages/web/dist/android-chrome-512x512.png +0 -0
  111. package/packages/web/dist/apple-touch-icon.png +0 -0
  112. package/packages/web/dist/assets/AnalyticsPage-BIopKWRf.js +17 -0
  113. package/packages/web/dist/assets/PoliciesPage-CjdLN3dl.js +11 -0
  114. package/packages/web/dist/assets/SessionDetailPage-BtSA0V0M.js +179 -0
  115. package/packages/web/dist/assets/SettingsPage-Dbbz4Ca5.js +37 -0
  116. package/packages/web/dist/assets/WorkflowsPage-Dv6f3GgU.js +1 -0
  117. package/packages/web/dist/assets/chart-vendor-DlOHLaCG.js +49 -0
  118. package/packages/web/dist/assets/codicon-ngg6Pgfi.ttf +0 -0
  119. package/packages/web/dist/assets/css.worker-BvV5MPou.js +93 -0
  120. package/packages/web/dist/assets/editor.worker-CKy7Pnvo.js +26 -0
  121. package/packages/web/dist/assets/html.worker-BLJhxQJQ.js +470 -0
  122. package/packages/web/dist/assets/index-BbdhRfr2.css +1 -0
  123. package/packages/web/dist/assets/index-hgphORiw.js +204 -0
  124. package/packages/web/dist/assets/json.worker-usMZ-FED.js +58 -0
  125. package/packages/web/dist/assets/monaco-core-B_19GPAS.css +1 -0
  126. package/packages/web/dist/assets/monaco-core-DQ5Mk8AK.js +1234 -0
  127. package/packages/web/dist/assets/monaco-react-DfZNWvtW.js +11 -0
  128. package/packages/web/dist/assets/monacoSetup-DvBj52bT.js +1 -0
  129. package/packages/web/dist/assets/pencil-Dbczxz59.js +11 -0
  130. package/packages/web/dist/assets/react-vendor-B5MgMUHH.js +136 -0
  131. package/packages/web/dist/assets/refresh-cw-B0MGsYPL.js +6 -0
  132. package/packages/web/dist/assets/tabs-C8LsWiR5.js +1 -0
  133. package/packages/web/dist/assets/terminal-vendor-Cs8KPbV3.js +9 -0
  134. package/packages/web/dist/assets/terminal-vendor-LcAfv9l9.css +32 -0
  135. package/packages/web/dist/assets/trash-2-Btlg0d4l.js +6 -0
  136. package/packages/web/dist/assets/ts.worker-DGHjMaqB.js +67731 -0
  137. package/packages/web/dist/favicon.ico +0 -0
  138. package/packages/web/dist/icon.svg +1 -0
  139. package/packages/web/dist/index.html +29 -0
  140. package/packages/web/dist/manifest.json +29 -0
  141. package/packages/web/dist/og-image.png +0 -0
  142. package/packages/web/dist/originals/android-chrome-192x192.png +0 -0
  143. package/packages/web/dist/originals/android-chrome-512x512.png +0 -0
  144. package/packages/web/dist/originals/apple-touch-icon.png +0 -0
  145. package/packages/web/dist/originals/favicon.ico +0 -0
  146. package/packages/web/dist/piper.svg +1 -0
  147. package/packages/web/dist/sounds/codepiper-soft-chime.wav +0 -0
  148. package/packages/web/dist/sw.js +257 -0
  149. package/scripts/postinstall-link-workspaces.mjs +58 -0
@@ -0,0 +1,408 @@
1
+ -- sessions table
2
+ -- Stores session metadata and state
3
+ CREATE TABLE IF NOT EXISTS sessions (
4
+ id TEXT PRIMARY KEY,
5
+ provider TEXT NOT NULL,
6
+ cwd TEXT NOT NULL,
7
+ status TEXT NOT NULL,
8
+ created_at INTEGER NOT NULL,
9
+ updated_at INTEGER NOT NULL,
10
+ pid INTEGER,
11
+ pty_cols INTEGER,
12
+ pty_rows INTEGER,
13
+ transcript_path TEXT,
14
+ metadata_json TEXT
15
+ );
16
+
17
+ -- Index for filtering sessions by status
18
+ CREATE INDEX IF NOT EXISTS idx_sessions_status ON sessions(status);
19
+
20
+ -- Index for filtering sessions by provider
21
+ CREATE INDEX IF NOT EXISTS idx_sessions_provider ON sessions(provider);
22
+
23
+ -- events table
24
+ -- Stores all events from various sources (PTY, hooks, transcript, statusline)
25
+ CREATE TABLE IF NOT EXISTS events (
26
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
27
+ session_id TEXT NOT NULL,
28
+ ts INTEGER NOT NULL,
29
+ source TEXT NOT NULL,
30
+ type TEXT NOT NULL,
31
+ payload_json TEXT NOT NULL,
32
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
33
+ );
34
+
35
+ -- Index for querying events by session
36
+ CREATE INDEX IF NOT EXISTS idx_events_session_id ON events(session_id);
37
+
38
+ -- Index for querying events by session and id (for "since" queries)
39
+ CREATE INDEX IF NOT EXISTS idx_events_session_id_id ON events(session_id, id);
40
+
41
+ -- Index for filtering events by type
42
+ CREATE INDEX IF NOT EXISTS idx_events_type ON events(type);
43
+
44
+ -- Index for filtering events by source
45
+ CREATE INDEX IF NOT EXISTS idx_events_source ON events(source);
46
+
47
+ -- session_notifications table
48
+ -- Durable user-facing notifications derived from provider events
49
+ CREATE TABLE IF NOT EXISTS session_notifications (
50
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
51
+ session_id TEXT NOT NULL,
52
+ provider TEXT NOT NULL,
53
+ event_type TEXT NOT NULL,
54
+ source_event_id INTEGER,
55
+ title TEXT NOT NULL,
56
+ body TEXT,
57
+ payload_json TEXT NOT NULL,
58
+ created_at INTEGER NOT NULL,
59
+ read_at INTEGER,
60
+ read_source TEXT,
61
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
62
+ FOREIGN KEY (source_event_id) REFERENCES events(id) ON DELETE SET NULL
63
+ );
64
+
65
+ -- Index for unread-per-session queries
66
+ CREATE INDEX IF NOT EXISTS idx_session_notifications_session_read
67
+ ON session_notifications(session_id, read_at);
68
+
69
+ -- Index for newest-first inbox queries
70
+ CREATE INDEX IF NOT EXISTS idx_session_notifications_created_desc
71
+ ON session_notifications(created_at DESC);
72
+
73
+ -- Index for event-type filters
74
+ CREATE INDEX IF NOT EXISTS idx_session_notifications_event_created
75
+ ON session_notifications(event_type, created_at DESC);
76
+
77
+ -- Index for notification dedupe lookup by source event
78
+ CREATE INDEX IF NOT EXISTS idx_session_notifications_source_event_type
79
+ ON session_notifications(source_event_id, event_type);
80
+
81
+ -- session_notification_prefs table
82
+ -- Per-session notification preference overrides
83
+ CREATE TABLE IF NOT EXISTS session_notification_prefs (
84
+ session_id TEXT PRIMARY KEY,
85
+ enabled INTEGER,
86
+ updated_at INTEGER NOT NULL,
87
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
88
+ );
89
+
90
+ -- push_subscriptions table
91
+ -- Web Push subscriptions for background notifications
92
+ CREATE TABLE IF NOT EXISTS push_subscriptions (
93
+ endpoint TEXT PRIMARY KEY,
94
+ p256dh TEXT NOT NULL,
95
+ auth TEXT NOT NULL,
96
+ expiration_time INTEGER,
97
+ created_at INTEGER NOT NULL,
98
+ updated_at INTEGER NOT NULL
99
+ );
100
+
101
+ CREATE INDEX IF NOT EXISTS idx_push_subscriptions_updated_at
102
+ ON push_subscriptions(updated_at DESC);
103
+
104
+ -- transcript_offsets table
105
+ -- Stores byte offsets for crash-safe transcript tailing
106
+ CREATE TABLE IF NOT EXISTS transcript_offsets (
107
+ session_id TEXT NOT NULL,
108
+ path TEXT NOT NULL,
109
+ byte_offset INTEGER NOT NULL DEFAULT 0,
110
+ last_line_hash TEXT,
111
+ PRIMARY KEY (session_id, path),
112
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
113
+ );
114
+
115
+ -- policies table
116
+ -- Stores permission policies for programmatic control
117
+ CREATE TABLE IF NOT EXISTS policies (
118
+ id TEXT PRIMARY KEY,
119
+ name TEXT NOT NULL,
120
+ description TEXT,
121
+ enabled INTEGER NOT NULL DEFAULT 1,
122
+ priority INTEGER NOT NULL DEFAULT 0,
123
+ session_id TEXT,
124
+ rules_json TEXT NOT NULL,
125
+ created_at INTEGER NOT NULL,
126
+ updated_at INTEGER NOT NULL,
127
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
128
+ );
129
+
130
+ -- Index for filtering policies by session
131
+ CREATE INDEX IF NOT EXISTS idx_policies_session ON policies(session_id);
132
+
133
+ -- Index for ordering policies by priority
134
+ CREATE INDEX IF NOT EXISTS idx_policies_priority ON policies(priority DESC);
135
+
136
+ -- policy_decisions table
137
+ -- Audit log for all policy decisions
138
+ CREATE TABLE IF NOT EXISTS policy_decisions (
139
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
140
+ session_id TEXT NOT NULL,
141
+ event_id INTEGER,
142
+ policy_id TEXT,
143
+ tool_name TEXT NOT NULL,
144
+ args_json TEXT,
145
+ decision TEXT NOT NULL,
146
+ reason TEXT,
147
+ timestamp INTEGER NOT NULL,
148
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
149
+ FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE SET NULL,
150
+ FOREIGN KEY (policy_id) REFERENCES policies(id) ON DELETE SET NULL
151
+ );
152
+
153
+ -- Index for querying decisions by session
154
+ CREATE INDEX IF NOT EXISTS idx_policy_decisions_session ON policy_decisions(session_id);
155
+
156
+ -- Index for querying decisions by timestamp
157
+ CREATE INDEX IF NOT EXISTS idx_policy_decisions_timestamp ON policy_decisions(timestamp);
158
+
159
+ -- workflows table
160
+ -- Stores workflow definitions
161
+ CREATE TABLE IF NOT EXISTS workflows (
162
+ id TEXT PRIMARY KEY,
163
+ name TEXT NOT NULL,
164
+ description TEXT,
165
+ definition_json TEXT NOT NULL,
166
+ created_at INTEGER NOT NULL,
167
+ updated_at INTEGER NOT NULL
168
+ );
169
+
170
+ -- workflow_executions table
171
+ -- Stores workflow execution state and history
172
+ CREATE TABLE IF NOT EXISTS workflow_executions (
173
+ id TEXT PRIMARY KEY,
174
+ workflow_id TEXT NOT NULL,
175
+ status TEXT NOT NULL,
176
+ started_at INTEGER NOT NULL,
177
+ completed_at INTEGER,
178
+ error_message TEXT,
179
+ context_json TEXT,
180
+ FOREIGN KEY (workflow_id) REFERENCES workflows(id) ON DELETE CASCADE
181
+ );
182
+
183
+ -- Index for querying executions by workflow
184
+ CREATE INDEX IF NOT EXISTS idx_workflow_executions_workflow ON workflow_executions(workflow_id);
185
+
186
+ -- Index for filtering executions by status
187
+ CREATE INDEX IF NOT EXISTS idx_workflow_executions_status ON workflow_executions(status);
188
+
189
+ -- workflow_steps table
190
+ -- Stores individual workflow step execution state
191
+ CREATE TABLE IF NOT EXISTS workflow_steps (
192
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
193
+ execution_id TEXT NOT NULL,
194
+ step_name TEXT NOT NULL,
195
+ session_id TEXT,
196
+ status TEXT NOT NULL,
197
+ started_at INTEGER,
198
+ completed_at INTEGER,
199
+ result_json TEXT,
200
+ error_message TEXT,
201
+ FOREIGN KEY (execution_id) REFERENCES workflow_executions(id) ON DELETE CASCADE,
202
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE SET NULL
203
+ );
204
+
205
+ -- Index for querying steps by execution
206
+ CREATE INDEX IF NOT EXISTS idx_workflow_steps_execution ON workflow_steps(execution_id);
207
+
208
+ -- Index for querying steps by session
209
+ CREATE INDEX IF NOT EXISTS idx_workflow_steps_session ON workflow_steps(session_id);
210
+
211
+ -- token_usage table
212
+ -- Stores token usage data with cache metrics for cost tracking
213
+ -- Separating from events table provides 85% storage savings and 10-300x query speedup
214
+ CREATE TABLE IF NOT EXISTS token_usage (
215
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
216
+ session_id TEXT NOT NULL,
217
+ event_id INTEGER,
218
+ timestamp INTEGER NOT NULL,
219
+ model TEXT NOT NULL,
220
+ prompt_tokens INTEGER NOT NULL DEFAULT 0,
221
+ completion_tokens INTEGER NOT NULL DEFAULT 0,
222
+ cache_creation_input_tokens INTEGER NOT NULL DEFAULT 0,
223
+ cache_read_input_tokens INTEGER NOT NULL DEFAULT 0,
224
+ total_tokens INTEGER NOT NULL DEFAULT 0,
225
+ estimated_cost_usd REAL,
226
+ actual_cost_usd REAL,
227
+ cost_difference_usd REAL,
228
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
229
+ FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE SET NULL
230
+ );
231
+
232
+ -- Index for querying token usage by session
233
+ CREATE INDEX IF NOT EXISTS idx_token_usage_session ON token_usage(session_id);
234
+
235
+ -- Index for querying token usage by timestamp
236
+ CREATE INDEX IF NOT EXISTS idx_token_usage_timestamp ON token_usage(timestamp);
237
+
238
+ -- Index for querying token usage by model
239
+ CREATE INDEX IF NOT EXISTS idx_token_usage_model ON token_usage(model);
240
+
241
+ -- Index for aggregate queries (session + timestamp)
242
+ CREATE INDEX IF NOT EXISTS idx_token_usage_session_timestamp ON token_usage(session_id, timestamp);
243
+
244
+ -- model_switches table
245
+ -- Tracks model changes for monitoring and debugging
246
+ CREATE TABLE IF NOT EXISTS model_switches (
247
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
248
+ session_id TEXT NOT NULL,
249
+ timestamp INTEGER NOT NULL,
250
+ from_model TEXT,
251
+ to_model TEXT NOT NULL,
252
+ reason TEXT,
253
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE
254
+ );
255
+
256
+ -- Index for querying model switches by session
257
+ CREATE INDEX IF NOT EXISTS idx_model_switches_session ON model_switches(session_id);
258
+
259
+ -- Index for querying model switches by timestamp
260
+ CREATE INDEX IF NOT EXISTS idx_model_switches_timestamp ON model_switches(timestamp);
261
+
262
+ -- transcript_content table
263
+ -- Stores full transcript text separately from events for efficient storage
264
+ -- Optional table for full-text search and content analysis
265
+ CREATE TABLE IF NOT EXISTS transcript_content (
266
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
267
+ session_id TEXT NOT NULL,
268
+ event_id INTEGER,
269
+ role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system')),
270
+ content TEXT NOT NULL,
271
+ timestamp INTEGER NOT NULL,
272
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
273
+ FOREIGN KEY (event_id) REFERENCES events(id) ON DELETE SET NULL
274
+ );
275
+
276
+ -- Index for querying transcript content by session
277
+ CREATE INDEX IF NOT EXISTS idx_transcript_content_session ON transcript_content(session_id);
278
+
279
+ -- Index for querying transcript content by timestamp
280
+ CREATE INDEX IF NOT EXISTS idx_transcript_content_timestamp ON transcript_content(timestamp);
281
+
282
+ -- Index for querying transcript content by role
283
+ CREATE INDEX IF NOT EXISTS idx_transcript_content_role ON transcript_content(role);
284
+
285
+ -- policy_sets table
286
+ -- Named groups of policies that can be applied as a unit to sessions
287
+ CREATE TABLE IF NOT EXISTS policy_sets (
288
+ id TEXT PRIMARY KEY,
289
+ name TEXT NOT NULL UNIQUE,
290
+ description TEXT,
291
+ is_default INTEGER NOT NULL DEFAULT 0,
292
+ created_at INTEGER NOT NULL,
293
+ updated_at INTEGER NOT NULL
294
+ );
295
+
296
+ -- Ensure at most one default policy set
297
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_policy_sets_default
298
+ ON policy_sets(is_default) WHERE is_default = 1;
299
+
300
+ -- policy_set_members table (M:N: policy_sets <-> policies)
301
+ -- Links policies into sets
302
+ CREATE TABLE IF NOT EXISTS policy_set_members (
303
+ policy_set_id TEXT NOT NULL,
304
+ policy_id TEXT NOT NULL,
305
+ added_at INTEGER NOT NULL,
306
+ PRIMARY KEY (policy_set_id, policy_id),
307
+ FOREIGN KEY (policy_set_id) REFERENCES policy_sets(id) ON DELETE CASCADE,
308
+ FOREIGN KEY (policy_id) REFERENCES policies(id) ON DELETE CASCADE
309
+ );
310
+
311
+ -- Index for reverse lookup: which sets contain a given policy
312
+ CREATE INDEX IF NOT EXISTS idx_psm_policy ON policy_set_members(policy_id);
313
+
314
+ -- session_policy_sets table (M:N: sessions <-> policy_sets)
315
+ -- Binds policy sets to sessions
316
+ CREATE TABLE IF NOT EXISTS session_policy_sets (
317
+ session_id TEXT NOT NULL,
318
+ policy_set_id TEXT NOT NULL,
319
+ applied_at INTEGER NOT NULL,
320
+ PRIMARY KEY (session_id, policy_set_id),
321
+ FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,
322
+ FOREIGN KEY (policy_set_id) REFERENCES policy_sets(id) ON DELETE CASCADE
323
+ );
324
+
325
+ -- Index for reverse lookup: which sessions use a given set
326
+ CREATE INDEX IF NOT EXISTS idx_sps_set ON session_policy_sets(policy_set_id);
327
+
328
+ -- workspaces table
329
+ -- Saved directories for quick session creation
330
+ CREATE TABLE IF NOT EXISTS workspaces (
331
+ id TEXT PRIMARY KEY,
332
+ name TEXT NOT NULL,
333
+ path TEXT NOT NULL,
334
+ created_at INTEGER NOT NULL,
335
+ updated_at INTEGER NOT NULL
336
+ );
337
+
338
+ -- Ensure workspace names are unique
339
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_workspaces_name ON workspaces(name);
340
+
341
+ -- Index for path lookups
342
+ CREATE INDEX IF NOT EXISTS idx_workspaces_path ON workspaces(path);
343
+
344
+ -- env_sets table
345
+ -- Named collections of encrypted environment variables
346
+ CREATE TABLE IF NOT EXISTS env_sets (
347
+ id TEXT PRIMARY KEY,
348
+ name TEXT NOT NULL,
349
+ description TEXT,
350
+ encrypted_vars_json TEXT NOT NULL,
351
+ created_at INTEGER NOT NULL,
352
+ updated_at INTEGER NOT NULL
353
+ );
354
+
355
+ -- Ensure env set names are unique
356
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_env_sets_name ON env_sets(name);
357
+
358
+ -- auth_config table
359
+ -- Single-user authentication configuration (at most one row)
360
+ CREATE TABLE IF NOT EXISTS auth_config (
361
+ id INTEGER PRIMARY KEY CHECK (id = 1),
362
+ password_hash TEXT NOT NULL,
363
+ totp_secret_encrypted TEXT,
364
+ totp_enabled INTEGER NOT NULL DEFAULT 0,
365
+ mfa_setup_pending INTEGER NOT NULL DEFAULT 0,
366
+ onboarding_token_hash TEXT,
367
+ onboarding_token_expires_at INTEGER,
368
+ recovery_codes_encrypted TEXT,
369
+ created_at INTEGER NOT NULL,
370
+ updated_at INTEGER NOT NULL
371
+ );
372
+
373
+ -- auth_sessions table
374
+ -- Active login sessions (bearer tokens, hashed)
375
+ CREATE TABLE IF NOT EXISTS auth_sessions (
376
+ token_hash TEXT PRIMARY KEY,
377
+ created_at INTEGER NOT NULL,
378
+ expires_at INTEGER NOT NULL,
379
+ last_used_at INTEGER NOT NULL,
380
+ ip_address TEXT,
381
+ user_agent TEXT
382
+ );
383
+
384
+ -- Index for expiry cleanup
385
+ CREATE INDEX IF NOT EXISTS idx_auth_sessions_expires ON auth_sessions(expires_at);
386
+
387
+ -- daemon_settings table
388
+ -- Single-row table for daemon-level configuration (like auth_config)
389
+ CREATE TABLE IF NOT EXISTS daemon_settings (
390
+ id INTEGER PRIMARY KEY CHECK (id = 1),
391
+ preserve_sessions INTEGER NOT NULL DEFAULT 0,
392
+ default_policy_action TEXT NOT NULL DEFAULT 'ask',
393
+ forward_ssh_auth_sock INTEGER NOT NULL DEFAULT 1,
394
+ codex_host_access_profile_enabled INTEGER NOT NULL DEFAULT 0,
395
+ terminal_ws_pty_paste_enabled INTEGER NOT NULL DEFAULT 1,
396
+ terminal_latency_probes_enabled INTEGER NOT NULL DEFAULT 1,
397
+ terminal_diagnostics_panel_enabled INTEGER NOT NULL DEFAULT 0,
398
+ terminal_codex_app_server_spike_enabled INTEGER NOT NULL DEFAULT 0,
399
+ terminal_ws_pty_paste_canary_percent INTEGER NOT NULL DEFAULT 100,
400
+ terminal_latency_probes_canary_percent INTEGER NOT NULL DEFAULT 100,
401
+ terminal_diagnostics_panel_canary_percent INTEGER NOT NULL DEFAULT 0,
402
+ notifications_enabled INTEGER NOT NULL DEFAULT 0,
403
+ system_notifications_enabled INTEGER NOT NULL DEFAULT 0,
404
+ notification_sounds_enabled INTEGER NOT NULL DEFAULT 1,
405
+ notification_event_defaults_json TEXT NOT NULL DEFAULT '{}',
406
+ notification_sound_map_json TEXT NOT NULL DEFAULT '{}',
407
+ updated_at INTEGER NOT NULL
408
+ );