@sigil0/looking-glass 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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +572 -0
  3. package/dist/agents/coordinator.d.ts +21 -0
  4. package/dist/agents/coordinator.d.ts.map +1 -0
  5. package/dist/agents/coordinator.js +171 -0
  6. package/dist/agents/coordinator.js.map +1 -0
  7. package/dist/app.d.ts +44 -0
  8. package/dist/app.d.ts.map +1 -0
  9. package/dist/app.js +215 -0
  10. package/dist/app.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +419 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +4 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +132 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/engine/context.d.ts +6 -0
  20. package/dist/engine/context.d.ts.map +1 -0
  21. package/dist/engine/context.js +65 -0
  22. package/dist/engine/context.js.map +1 -0
  23. package/dist/engine/engine.d.ts +74 -0
  24. package/dist/engine/engine.d.ts.map +1 -0
  25. package/dist/engine/engine.js +573 -0
  26. package/dist/engine/engine.js.map +1 -0
  27. package/dist/engine/types.d.ts +35 -0
  28. package/dist/engine/types.d.ts.map +1 -0
  29. package/dist/engine/types.js +2 -0
  30. package/dist/engine/types.js.map +1 -0
  31. package/dist/instructions.d.ts +8 -0
  32. package/dist/instructions.d.ts.map +1 -0
  33. package/dist/instructions.js +60 -0
  34. package/dist/instructions.js.map +1 -0
  35. package/dist/model/codex-lb.d.ts +141 -0
  36. package/dist/model/codex-lb.d.ts.map +1 -0
  37. package/dist/model/codex-lb.js +471 -0
  38. package/dist/model/codex-lb.js.map +1 -0
  39. package/dist/paths.d.ts +7 -0
  40. package/dist/paths.d.ts.map +1 -0
  41. package/dist/paths.js +41 -0
  42. package/dist/paths.js.map +1 -0
  43. package/dist/scheduler/daemon.d.ts +40 -0
  44. package/dist/scheduler/daemon.d.ts.map +1 -0
  45. package/dist/scheduler/daemon.js +189 -0
  46. package/dist/scheduler/daemon.js.map +1 -0
  47. package/dist/scheduler/index.d.ts +8 -0
  48. package/dist/scheduler/index.d.ts.map +1 -0
  49. package/dist/scheduler/index.js +6 -0
  50. package/dist/scheduler/index.js.map +1 -0
  51. package/dist/scheduler/runner.d.ts +18 -0
  52. package/dist/scheduler/runner.d.ts.map +1 -0
  53. package/dist/scheduler/runner.js +173 -0
  54. package/dist/scheduler/runner.js.map +1 -0
  55. package/dist/scheduler/schedule.d.ts +7 -0
  56. package/dist/scheduler/schedule.d.ts.map +1 -0
  57. package/dist/scheduler/schedule.js +94 -0
  58. package/dist/scheduler/schedule.js.map +1 -0
  59. package/dist/scheduler/store.d.ts +55 -0
  60. package/dist/scheduler/store.d.ts.map +1 -0
  61. package/dist/scheduler/store.js +1203 -0
  62. package/dist/scheduler/store.js.map +1 -0
  63. package/dist/scheduler/systemd.d.ts +7 -0
  64. package/dist/scheduler/systemd.d.ts.map +1 -0
  65. package/dist/scheduler/systemd.js +97 -0
  66. package/dist/scheduler/systemd.js.map +1 -0
  67. package/dist/scheduler/types.d.ts +145 -0
  68. package/dist/scheduler/types.d.ts.map +1 -0
  69. package/dist/scheduler/types.js +7 -0
  70. package/dist/scheduler/types.js.map +1 -0
  71. package/dist/security.d.ts +6 -0
  72. package/dist/security.d.ts.map +1 -0
  73. package/dist/security.js +27 -0
  74. package/dist/security.js.map +1 -0
  75. package/dist/storage/artifact-store.d.ts +19 -0
  76. package/dist/storage/artifact-store.d.ts.map +1 -0
  77. package/dist/storage/artifact-store.js +47 -0
  78. package/dist/storage/artifact-store.js.map +1 -0
  79. package/dist/storage/database.d.ts +5 -0
  80. package/dist/storage/database.d.ts.map +1 -0
  81. package/dist/storage/database.js +395 -0
  82. package/dist/storage/database.js.map +1 -0
  83. package/dist/storage/session-store.d.ts +114 -0
  84. package/dist/storage/session-store.d.ts.map +1 -0
  85. package/dist/storage/session-store.js +731 -0
  86. package/dist/storage/session-store.js.map +1 -0
  87. package/dist/tools/agents.d.ts +14 -0
  88. package/dist/tools/agents.d.ts.map +1 -0
  89. package/dist/tools/agents.js +35 -0
  90. package/dist/tools/agents.js.map +1 -0
  91. package/dist/tools/apply-patch.d.ts +7 -0
  92. package/dist/tools/apply-patch.d.ts.map +1 -0
  93. package/dist/tools/apply-patch.js +429 -0
  94. package/dist/tools/apply-patch.js.map +1 -0
  95. package/dist/tools/ask.d.ts +8 -0
  96. package/dist/tools/ask.d.ts.map +1 -0
  97. package/dist/tools/ask.js +27 -0
  98. package/dist/tools/ask.js.map +1 -0
  99. package/dist/tools/bash.d.ts +9 -0
  100. package/dist/tools/bash.d.ts.map +1 -0
  101. package/dist/tools/bash.js +98 -0
  102. package/dist/tools/bash.js.map +1 -0
  103. package/dist/tools/index.d.ts +9 -0
  104. package/dist/tools/index.d.ts.map +1 -0
  105. package/dist/tools/index.js +34 -0
  106. package/dist/tools/index.js.map +1 -0
  107. package/dist/tools/paths.d.ts +3 -0
  108. package/dist/tools/paths.d.ts.map +1 -0
  109. package/dist/tools/paths.js +34 -0
  110. package/dist/tools/paths.js.map +1 -0
  111. package/dist/tools/process.d.ts +21 -0
  112. package/dist/tools/process.d.ts.map +1 -0
  113. package/dist/tools/process.js +104 -0
  114. package/dist/tools/process.js.map +1 -0
  115. package/dist/tools/read.d.ts +9 -0
  116. package/dist/tools/read.d.ts.map +1 -0
  117. package/dist/tools/read.js +95 -0
  118. package/dist/tools/read.js.map +1 -0
  119. package/dist/tools/registry.d.ts +19 -0
  120. package/dist/tools/registry.d.ts.map +1 -0
  121. package/dist/tools/registry.js +188 -0
  122. package/dist/tools/registry.js.map +1 -0
  123. package/dist/tools/safety.d.ts +9 -0
  124. package/dist/tools/safety.d.ts.map +1 -0
  125. package/dist/tools/safety.js +199 -0
  126. package/dist/tools/safety.js.map +1 -0
  127. package/dist/tools/schedule.d.ts +4 -0
  128. package/dist/tools/schedule.d.ts.map +1 -0
  129. package/dist/tools/schedule.js +191 -0
  130. package/dist/tools/schedule.js.map +1 -0
  131. package/dist/tools/search.d.ts +16 -0
  132. package/dist/tools/search.d.ts.map +1 -0
  133. package/dist/tools/search.js +75 -0
  134. package/dist/tools/search.js.map +1 -0
  135. package/dist/tools/types.d.ts +54 -0
  136. package/dist/tools/types.d.ts.map +1 -0
  137. package/dist/tools/types.js +10 -0
  138. package/dist/tools/types.js.map +1 -0
  139. package/dist/types.d.ts +90 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +2 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/ui/stdio.d.ts +5 -0
  144. package/dist/ui/stdio.d.ts.map +1 -0
  145. package/dist/ui/stdio.js +65 -0
  146. package/dist/ui/stdio.js.map +1 -0
  147. package/dist/ui/tui.d.ts +93 -0
  148. package/dist/ui/tui.d.ts.map +1 -0
  149. package/dist/ui/tui.js +2246 -0
  150. package/dist/ui/tui.js.map +1 -0
  151. package/package.json +53 -0
@@ -0,0 +1,395 @@
1
+ import Database from "better-sqlite3";
2
+ import { dirname } from "node:path";
3
+ import { chmodSync, existsSync, mkdirSync } from "node:fs";
4
+ import { bashApprovalExecutable } from "../tools/safety.js";
5
+ const SESSION_SCHEMA = `
6
+ CREATE TABLE IF NOT EXISTS schema_migrations (
7
+ version INTEGER PRIMARY KEY,
8
+ applied_at INTEGER NOT NULL
9
+ ) STRICT;
10
+
11
+ CREATE TABLE IF NOT EXISTS sessions (
12
+ id TEXT PRIMARY KEY,
13
+ workspace TEXT NOT NULL,
14
+ title TEXT NOT NULL,
15
+ model TEXT NOT NULL,
16
+ reasoning_effort TEXT NOT NULL,
17
+ verbosity TEXT NOT NULL,
18
+ fast INTEGER NOT NULL CHECK (fast IN (0, 1)),
19
+ prompt_cache_key TEXT NOT NULL UNIQUE,
20
+ last_response_id TEXT,
21
+ created_at INTEGER NOT NULL,
22
+ updated_at INTEGER NOT NULL
23
+ ) STRICT;
24
+
25
+ CREATE INDEX IF NOT EXISTS sessions_workspace_updated
26
+ ON sessions(workspace, updated_at DESC);
27
+
28
+ CREATE TABLE IF NOT EXISTS session_events (
29
+ id INTEGER PRIMARY KEY,
30
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
31
+ sequence INTEGER NOT NULL,
32
+ kind TEXT NOT NULL CHECK (kind IN (
33
+ 'user', 'response', 'tool_started', 'tool_result',
34
+ 'tool_denied', 'error', 'note'
35
+ )),
36
+ payload_json TEXT NOT NULL CHECK (json_valid(payload_json)),
37
+ created_at INTEGER NOT NULL,
38
+ UNIQUE(session_id, sequence)
39
+ ) STRICT;
40
+
41
+ CREATE INDEX IF NOT EXISTS session_events_ordered
42
+ ON session_events(session_id, sequence);
43
+
44
+ CREATE TABLE IF NOT EXISTS context_checkpoints (
45
+ id INTEGER PRIMARY KEY,
46
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
47
+ through_sequence INTEGER NOT NULL,
48
+ compact_json TEXT NOT NULL CHECK (json_valid(compact_json)),
49
+ input_tokens INTEGER,
50
+ created_at INTEGER NOT NULL,
51
+ UNIQUE(session_id, through_sequence)
52
+ ) STRICT;
53
+
54
+ CREATE INDEX IF NOT EXISTS context_checkpoints_latest
55
+ ON context_checkpoints(session_id, through_sequence DESC);
56
+
57
+ CREATE TABLE IF NOT EXISTS tool_calls (
58
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
59
+ call_id TEXT NOT NULL,
60
+ name TEXT NOT NULL,
61
+ arguments_json TEXT NOT NULL CHECK (json_valid(arguments_json)),
62
+ state TEXT NOT NULL CHECK (state IN (
63
+ 'started', 'completed', 'denied', 'failed', 'unknown'
64
+ )),
65
+ output_text TEXT,
66
+ error_text TEXT,
67
+ started_at INTEGER NOT NULL,
68
+ finished_at INTEGER,
69
+ PRIMARY KEY(session_id, call_id)
70
+ ) STRICT;
71
+
72
+ CREATE INDEX IF NOT EXISTS tool_calls_state
73
+ ON tool_calls(state, started_at);
74
+
75
+ CREATE TABLE IF NOT EXISTS artifacts (
76
+ id TEXT PRIMARY KEY,
77
+ session_id TEXT REFERENCES sessions(id) ON DELETE SET NULL,
78
+ kind TEXT NOT NULL,
79
+ file_path TEXT NOT NULL UNIQUE,
80
+ byte_count INTEGER NOT NULL,
81
+ metadata_json TEXT NOT NULL CHECK (json_valid(metadata_json)),
82
+ created_at INTEGER NOT NULL
83
+ ) STRICT;
84
+ `;
85
+ const SCHEDULER_SCHEMA = `
86
+ CREATE TABLE scheduler_jobs (
87
+ id TEXT PRIMARY KEY,
88
+ kind TEXT NOT NULL CHECK (kind IN ('reminder', 'command')),
89
+ schedule_kind TEXT NOT NULL CHECK (schedule_kind IN ('once', 'cron')),
90
+ schedule TEXT NOT NULL,
91
+ timezone TEXT NOT NULL,
92
+ message TEXT,
93
+ command_text TEXT,
94
+ cwd TEXT,
95
+ env_json TEXT CHECK (env_json IS NULL OR json_valid(env_json)),
96
+ start_grace_ms INTEGER,
97
+ timeout_ms INTEGER,
98
+ output_bytes INTEGER,
99
+ enabled INTEGER NOT NULL CHECK (enabled IN (0, 1)),
100
+ blocked_reason TEXT,
101
+ next_due INTEGER,
102
+ created_at INTEGER NOT NULL,
103
+ CHECK (
104
+ (kind = 'reminder' AND message IS NOT NULL AND command_text IS NULL AND cwd IS NULL
105
+ AND env_json IS NULL AND start_grace_ms IS NULL AND timeout_ms IS NULL AND output_bytes IS NULL)
106
+ OR
107
+ (kind = 'command' AND message IS NULL AND command_text IS NOT NULL AND cwd IS NOT NULL
108
+ AND env_json IS NOT NULL AND start_grace_ms IS NOT NULL AND timeout_ms IS NOT NULL
109
+ AND output_bytes IS NOT NULL)
110
+ )
111
+ ) STRICT;
112
+
113
+ CREATE INDEX scheduler_jobs_due
114
+ ON scheduler_jobs(enabled, next_due)
115
+ WHERE enabled = 1 AND blocked_reason IS NULL AND next_due IS NOT NULL;
116
+
117
+ CREATE TABLE scheduler_occurrences (
118
+ id INTEGER PRIMARY KEY,
119
+ job_id TEXT NOT NULL REFERENCES scheduler_jobs(id),
120
+ scheduled_at INTEGER NOT NULL,
121
+ state TEXT NOT NULL CHECK (state IN (
122
+ 'pending', 'claimed', 'running', 'succeeded', 'failed', 'timed_out',
123
+ 'cancelled', 'skipped', 'unknown'
124
+ )),
125
+ claim_token TEXT,
126
+ claim_owner TEXT,
127
+ claim_boot_id TEXT,
128
+ claim_lease_expires_at INTEGER,
129
+ created_at INTEGER NOT NULL,
130
+ claimed_at INTEGER,
131
+ started_at INTEGER,
132
+ finished_at INTEGER,
133
+ exit_code INTEGER,
134
+ signal TEXT,
135
+ reason TEXT,
136
+ stdout BLOB,
137
+ stderr BLOB,
138
+ stdout_bytes INTEGER NOT NULL DEFAULT 0 CHECK (stdout_bytes >= 0),
139
+ stderr_bytes INTEGER NOT NULL DEFAULT 0 CHECK (stderr_bytes >= 0),
140
+ stdout_truncated INTEGER NOT NULL DEFAULT 0 CHECK (stdout_truncated IN (0, 1)),
141
+ stderr_truncated INTEGER NOT NULL DEFAULT 0 CHECK (stderr_truncated IN (0, 1)),
142
+ UNIQUE(job_id, scheduled_at)
143
+ ) STRICT;
144
+
145
+ CREATE INDEX scheduler_occurrences_job_runs
146
+ ON scheduler_occurrences(job_id, scheduled_at DESC);
147
+
148
+ CREATE INDEX scheduler_occurrences_pending
149
+ ON scheduler_occurrences(state, scheduled_at)
150
+ WHERE state = 'pending';
151
+
152
+ CREATE UNIQUE INDEX scheduler_occurrences_no_overlap
153
+ ON scheduler_occurrences(job_id)
154
+ WHERE state IN ('pending', 'claimed', 'running');
155
+
156
+ CREATE TABLE scheduler_inbox (
157
+ id INTEGER PRIMARY KEY,
158
+ kind TEXT NOT NULL CHECK (kind IN ('reminder', 'command_result')),
159
+ job_id TEXT NOT NULL REFERENCES scheduler_jobs(id),
160
+ occurrence_id INTEGER NOT NULL UNIQUE REFERENCES scheduler_occurrences(id),
161
+ message TEXT NOT NULL,
162
+ created_at INTEGER NOT NULL,
163
+ acknowledged_at INTEGER
164
+ ) STRICT;
165
+
166
+ CREATE INDEX scheduler_inbox_unacked
167
+ ON scheduler_inbox(acknowledged_at, created_at DESC);
168
+
169
+ CREATE TABLE scheduler_daemon_lease (
170
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
171
+ owner TEXT NOT NULL,
172
+ boot_id TEXT NOT NULL,
173
+ acquired_at INTEGER NOT NULL,
174
+ renewed_at INTEGER NOT NULL,
175
+ expires_at INTEGER NOT NULL
176
+ ) STRICT;
177
+ `;
178
+ const SESSION_LEASE_SCHEMA = `
179
+ ALTER TABLE tool_calls ADD COLUMN execution_token TEXT;
180
+
181
+ CREATE TABLE session_operation_leases (
182
+ session_id TEXT PRIMARY KEY REFERENCES sessions(id) ON DELETE CASCADE,
183
+ owner TEXT NOT NULL,
184
+ token TEXT NOT NULL UNIQUE,
185
+ kind TEXT NOT NULL CHECK (kind IN ('turn', 'compact')),
186
+ acquired_at INTEGER NOT NULL,
187
+ renewed_at INTEGER NOT NULL,
188
+ expires_at INTEGER NOT NULL
189
+ ) STRICT;
190
+
191
+ CREATE INDEX session_operation_leases_expiry
192
+ ON session_operation_leases(expires_at);
193
+ `;
194
+ const SESSION_AUTOMATION_SCHEMA = `
195
+ ALTER TABLE sessions ADD COLUMN show_reasoning INTEGER NOT NULL DEFAULT 0
196
+ CHECK (show_reasoning IN (0, 1));
197
+ ALTER TABLE sessions ADD COLUMN persistent INTEGER NOT NULL DEFAULT 0
198
+ CHECK (persistent IN (0, 1));
199
+
200
+ ALTER TABLE scheduler_jobs ADD COLUMN session_id TEXT REFERENCES sessions(id) ON DELETE CASCADE;
201
+ ALTER TABLE scheduler_jobs ADD COLUMN prompt TEXT;
202
+
203
+ CREATE INDEX scheduler_jobs_session
204
+ ON scheduler_jobs(session_id, created_at DESC);
205
+ `;
206
+ const SESSION_SCHEDULE_STATE_SCHEMA = `
207
+ ALTER TABLE scheduler_jobs ADD COLUMN suspended_by_session INTEGER NOT NULL DEFAULT 0
208
+ CHECK (suspended_by_session IN (0, 1));
209
+
210
+ UPDATE scheduler_jobs
211
+ SET enabled = 0, suspended_by_session = 1
212
+ WHERE session_id IS NOT NULL AND enabled = 1 AND EXISTS (
213
+ SELECT 1 FROM sessions s WHERE s.id = scheduler_jobs.session_id AND s.persistent = 0
214
+ );
215
+ `;
216
+ const SESSION_SCHEDULE_RECONCILIATION_SCHEMA = `
217
+ UPDATE scheduler_jobs
218
+ SET enabled = 0, suspended_by_session = 1
219
+ WHERE session_id IS NOT NULL AND enabled = 1 AND EXISTS (
220
+ SELECT 1 FROM sessions s WHERE s.id = scheduler_jobs.session_id AND s.persistent = 0
221
+ );
222
+ `;
223
+ const SESSION_PROVIDER_SCHEMA = `
224
+ ALTER TABLE sessions ADD COLUMN provider TEXT NOT NULL DEFAULT 'codex-lb'
225
+ CHECK (provider IN ('codex-lb', 'lm-studio'));
226
+
227
+ CREATE INDEX sessions_workspace_provider_updated
228
+ ON sessions(workspace, provider, updated_at DESC);
229
+ `;
230
+ const SESSION_APPROVAL_SCHEMA = `
231
+ ALTER TABLE sessions ADD COLUMN approval_mode TEXT NOT NULL DEFAULT 'review'
232
+ CHECK (approval_mode IN ('review', 'code', 'unrestricted'));
233
+ `;
234
+ const SESSION_COMMAND_APPROVAL_SCHEMA = `
235
+ CREATE TABLE session_command_approvals (
236
+ session_id TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
237
+ signature TEXT NOT NULL CHECK (length(signature) > 0),
238
+ approved_at INTEGER NOT NULL,
239
+ PRIMARY KEY (session_id, signature)
240
+ ) STRICT;
241
+ `;
242
+ const SESSION_AGENT_SCHEMA = `
243
+ ALTER TABLE sessions ADD COLUMN agent_provider TEXT
244
+ CHECK (agent_provider IS NULL OR agent_provider IN ('codex-lb', 'lm-studio'));
245
+ ALTER TABLE sessions ADD COLUMN agent_model TEXT
246
+ CHECK (agent_model IS NULL OR length(agent_model) > 0);
247
+ ALTER TABLE sessions ADD COLUMN agent_reasoning_effort TEXT;
248
+ ALTER TABLE sessions ADD COLUMN session_kind TEXT NOT NULL DEFAULT 'interactive'
249
+ CHECK (session_kind IN ('interactive', 'agent'));
250
+ ALTER TABLE sessions ADD COLUMN parent_session_id TEXT REFERENCES sessions(id) ON DELETE CASCADE;
251
+
252
+ UPDATE sessions
253
+ SET agent_provider = provider,
254
+ agent_model = model,
255
+ agent_reasoning_effort = reasoning_effort;
256
+
257
+ CREATE INDEX sessions_parent_kind
258
+ ON sessions(parent_session_id, session_kind, created_at);
259
+ `;
260
+ const SESSION_AGENT_TOGGLE_SCHEMA = `
261
+ ALTER TABLE sessions ADD COLUMN agents_enabled INTEGER NOT NULL DEFAULT 1
262
+ CHECK (agents_enabled IN (0, 1));
263
+ `;
264
+ function migrateBashApprovalScopes(db) {
265
+ const rows = db.prepare(`
266
+ SELECT session_id, signature, approved_at
267
+ FROM session_command_approvals
268
+ WHERE signature LIKE '["bash-exec",%'
269
+ OR signature LIKE '["bash-executable",1,%'
270
+ `).all();
271
+ const register = db.prepare(`
272
+ INSERT OR IGNORE INTO session_command_approvals(session_id, signature, approved_at)
273
+ VALUES (?, ?, ?)
274
+ `);
275
+ for (const row of rows) {
276
+ let parsed;
277
+ try {
278
+ parsed = JSON.parse(row.signature);
279
+ }
280
+ catch {
281
+ continue;
282
+ }
283
+ if (!Array.isArray(parsed))
284
+ continue;
285
+ const executable = parsed[0] === "bash-exec" && typeof parsed[2] === "string"
286
+ ? bashApprovalExecutable(parsed[2])
287
+ : parsed[0] === "bash-executable" && parsed[1] === 1 && typeof parsed[3] === "string"
288
+ ? parsed[3]
289
+ : null;
290
+ if (executable) {
291
+ register.run(row.session_id, JSON.stringify(["bash-executable", 2, executable]), row.approved_at);
292
+ }
293
+ }
294
+ }
295
+ export function openDatabase(path) {
296
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
297
+ const previousUmask = process.umask(0o077);
298
+ let db;
299
+ try {
300
+ db = new Database(path, { timeout: 5_000 });
301
+ chmodSync(path, 0o600);
302
+ db.pragma("journal_mode = WAL");
303
+ db.pragma("synchronous = FULL");
304
+ db.pragma("foreign_keys = ON");
305
+ db.pragma("busy_timeout = 5000");
306
+ db.pragma("wal_autocheckpoint = 1000");
307
+ for (const sidecar of [`${path}-wal`, `${path}-shm`]) {
308
+ if (existsSync(sidecar))
309
+ chmodSync(sidecar, 0o600);
310
+ }
311
+ }
312
+ finally {
313
+ process.umask(previousUmask);
314
+ }
315
+ const migrate = db.transaction(() => {
316
+ db.exec(SESSION_SCHEMA);
317
+ db.prepare("INSERT OR IGNORE INTO schema_migrations(version, applied_at) VALUES (1, ?)").run(Date.now());
318
+ const schedulerMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 2").get();
319
+ if (!schedulerMigration) {
320
+ db.exec(SCHEDULER_SCHEMA);
321
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (2, ?)").run(Date.now());
322
+ }
323
+ const sessionLeaseMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 3").get();
324
+ if (!sessionLeaseMigration) {
325
+ db.exec(SESSION_LEASE_SCHEMA);
326
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (3, ?)").run(Date.now());
327
+ }
328
+ const sessionAutomationMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 4").get();
329
+ if (!sessionAutomationMigration) {
330
+ db.exec(SESSION_AUTOMATION_SCHEMA);
331
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (4, ?)").run(Date.now());
332
+ }
333
+ const sessionScheduleStateMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 5").get();
334
+ if (!sessionScheduleStateMigration) {
335
+ db.exec(SESSION_SCHEDULE_STATE_SCHEMA);
336
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (5, ?)").run(Date.now());
337
+ }
338
+ const sessionScheduleReconciliation = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 6").get();
339
+ if (!sessionScheduleReconciliation) {
340
+ db.exec(SESSION_SCHEDULE_RECONCILIATION_SCHEMA);
341
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (6, ?)").run(Date.now());
342
+ }
343
+ const sessionScheduleOccurrenceReconciliation = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 7").get();
344
+ if (!sessionScheduleOccurrenceReconciliation) {
345
+ const now = Date.now();
346
+ db.prepare(`
347
+ UPDATE scheduler_occurrences
348
+ SET state = 'cancelled', finished_at = ?, reason = 'Session persistence is disabled'
349
+ WHERE state IN ('pending', 'claimed') AND job_id IN (
350
+ SELECT j.id FROM scheduler_jobs j
351
+ JOIN sessions s ON s.id = j.session_id
352
+ WHERE s.persistent = 0
353
+ )
354
+ `).run(now);
355
+ db.exec(SESSION_SCHEDULE_RECONCILIATION_SCHEMA);
356
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (7, ?)").run(now);
357
+ }
358
+ const sessionProviderMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 8").get();
359
+ if (!sessionProviderMigration) {
360
+ db.exec(SESSION_PROVIDER_SCHEMA);
361
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (8, ?)").run(Date.now());
362
+ }
363
+ const sessionApprovalMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 9").get();
364
+ if (!sessionApprovalMigration) {
365
+ db.exec(SESSION_APPROVAL_SCHEMA);
366
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (9, ?)").run(Date.now());
367
+ }
368
+ const sessionCommandApprovalMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 10").get();
369
+ if (!sessionCommandApprovalMigration) {
370
+ db.exec(SESSION_COMMAND_APPROVAL_SCHEMA);
371
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (10, ?)").run(Date.now());
372
+ }
373
+ const sessionAgentMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 11").get();
374
+ if (!sessionAgentMigration) {
375
+ db.exec(SESSION_AGENT_SCHEMA);
376
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (11, ?)").run(Date.now());
377
+ }
378
+ const sessionAgentToggleMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 12").get();
379
+ if (!sessionAgentToggleMigration) {
380
+ db.exec(SESSION_AGENT_TOGGLE_SCHEMA);
381
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (12, ?)").run(Date.now());
382
+ }
383
+ const bashApprovalScopeMigration = db.prepare("SELECT 1 FROM schema_migrations WHERE version = 13").get();
384
+ if (!bashApprovalScopeMigration) {
385
+ migrateBashApprovalScopes(db);
386
+ db.prepare("INSERT INTO schema_migrations(version, applied_at) VALUES (13, ?)").run(Date.now());
387
+ }
388
+ });
389
+ migrate.immediate();
390
+ return db;
391
+ }
392
+ export function checkpointDatabase(db) {
393
+ db.pragma("wal_checkpoint(PASSIVE)");
394
+ }
395
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import type { GlassDatabase } from "./database.js";
2
+ import type { ApprovalMode, EventKind, GatewayProvider, ReasoningEffort, SessionEvent, SessionKind, SessionRecord, Verbosity } from "../types.js";
3
+ export interface ContextCheckpoint {
4
+ id: number;
5
+ sessionId: string;
6
+ throughSequence: number;
7
+ compact: Record<string, unknown>;
8
+ inputTokens: number | null;
9
+ createdAt: number;
10
+ }
11
+ export type ToolCallState = "started" | "completed" | "denied" | "failed" | "unknown";
12
+ export interface ToolCallRecord {
13
+ sessionId: string;
14
+ callId: string;
15
+ name: string;
16
+ arguments: unknown;
17
+ state: ToolCallState;
18
+ output: string | null;
19
+ error: string | null;
20
+ startedAt: number;
21
+ finishedAt: number | null;
22
+ executionToken: string | null;
23
+ }
24
+ export interface ToolCallClaim {
25
+ record: ToolCallRecord;
26
+ acquired: boolean;
27
+ }
28
+ export interface NewSession {
29
+ workspace: string;
30
+ provider?: GatewayProvider;
31
+ model: string;
32
+ reasoningEffort: ReasoningEffort;
33
+ verbosity: Verbosity;
34
+ fast: boolean;
35
+ approvalMode?: ApprovalMode;
36
+ agentProvider?: GatewayProvider;
37
+ agentModel?: string;
38
+ agentReasoningEffort?: ReasoningEffort;
39
+ agentsEnabled?: boolean;
40
+ kind?: SessionKind;
41
+ parentSessionId?: string | null;
42
+ }
43
+ export interface SessionDeletionSummary {
44
+ events: number;
45
+ checkpoints: number;
46
+ toolCalls: number;
47
+ schedules: number;
48
+ occurrences: number;
49
+ inboxItems: number;
50
+ commandApprovals: number;
51
+ retainedArtifacts: number;
52
+ }
53
+ export interface CommandApprovalRecord {
54
+ signature: string;
55
+ approvedAt: number;
56
+ }
57
+ export declare class SessionStore {
58
+ private readonly db;
59
+ constructor(db: GlassDatabase);
60
+ create(input: NewSession): SessionRecord;
61
+ get(id: string): SessionRecord | null;
62
+ list(workspace?: string, limit?: number): SessionRecord[];
63
+ listWithMessages(workspace?: string, limit?: number): SessionRecord[];
64
+ deleteIfEmpty(id: string): boolean;
65
+ updateSettings(id: string, changes: Partial<Pick<SessionRecord, "provider" | "model" | "reasoningEffort" | "agentProvider" | "agentModel" | "agentReasoningEffort" | "agentsEnabled" | "verbosity" | "fast" | "approvalMode" | "showReasoning" | "persistent">>): SessionRecord;
66
+ setLastResponseId(id: string, responseId: string | null): void;
67
+ resetContinuity(id: string): SessionRecord;
68
+ setTitleFromPrompt(id: string, prompt: string): void;
69
+ rename(id: string, title: string): SessionRecord;
70
+ hasCommandApproval(sessionId: string, signature: string): boolean;
71
+ registerCommandApproval(sessionId: string, signature: string, now?: number): boolean;
72
+ listCommandApprovals(sessionId: string): CommandApprovalRecord[];
73
+ revokeCommandApproval(sessionId: string, signature: string): boolean;
74
+ deletionSummary(id: string): SessionDeletionSummary;
75
+ delete(id: string, expected?: SessionDeletionSummary): SessionDeletionSummary;
76
+ appendEvent<T>(sessionId: string, kind: EventKind, payload: T): SessionEvent<T>;
77
+ appendResponseAndSetContinuity<T>(sessionId: string, payload: T, responseId: string): SessionEvent<T>;
78
+ appendResponseAndSetContinuityFenced<T>(sessionId: string, executionToken: string, payload: T, responseId: string): SessionEvent<T> | null;
79
+ appendUserAndSetTitle<T>(sessionId: string, prompt: string, payload: T): SessionEvent<T>;
80
+ appendUserAndSetTitleFenced<T>(sessionId: string, executionToken: string, prompt: string, payload: T): SessionEvent<T> | null;
81
+ appendEventFenced<T>(sessionId: string, executionToken: string, kind: EventKind, payload: T): SessionEvent<T> | null;
82
+ events(sessionId: string, afterSequence?: number): SessionEvent[];
83
+ latestResponseUsage(sessionId: string): {
84
+ sequence: number;
85
+ inputTokens: number;
86
+ } | null;
87
+ semanticEventCount(sessionId: string, afterSequence?: number): number;
88
+ latestSequence(sessionId: string): number;
89
+ saveCheckpoint(sessionId: string, throughSequence: number, compact: Record<string, unknown>, inputTokens: number | null): ContextCheckpoint;
90
+ saveCheckpointAndResetContinuity(sessionId: string, throughSequence: number, compact: Record<string, unknown>, inputTokens: number | null): ContextCheckpoint;
91
+ saveCheckpointAndResetContinuityFenced(sessionId: string, executionToken: string, throughSequence: number, compact: Record<string, unknown>, inputTokens: number | null): ContextCheckpoint | null;
92
+ latestCheckpoint(sessionId: string): ContextCheckpoint | null;
93
+ beginToolCall(sessionId: string, callId: string, name: string, args: unknown, executionToken: string): ToolCallClaim;
94
+ finishToolCall(sessionId: string, callId: string, state: Extract<ToolCallState, "completed" | "denied" | "failed">, output: string | null, error: string | null): ToolCallRecord;
95
+ finishToolCallWithEvent<T>(sessionId: string, callId: string, executionToken: string, state: Extract<ToolCallState, "completed" | "denied" | "failed">, output: string, error: string | null, kind: Extract<EventKind, "tool_result" | "tool_denied">, payload: T): ToolCallRecord;
96
+ markToolCallUnknownWithEvent<T>(sessionId: string, callId: string, executionToken: string, payload: T): ToolCallRecord;
97
+ resetUnknownToolCall(sessionId: string, callId: string, executionToken: string): ToolCallClaim;
98
+ markInterruptedToolCallsUnknown(): number;
99
+ acquireOperationLease(sessionId: string, owner: string, token: string, kind: "turn" | "compact", now?: number, leaseMs?: number): boolean;
100
+ renewOperationLease(sessionId: string, owner: string, token: string, now?: number, leaseMs?: number): boolean;
101
+ assertOperationLease(sessionId: string, owner: string, token: string, now?: number): boolean;
102
+ assertOperationToken(sessionId: string, token: string, now?: number): boolean;
103
+ releaseOperationLease(sessionId: string, owner: string, token: string): boolean;
104
+ reconcileToolCallEvents(sessionId: string, executionToken: string): number;
105
+ hasUnanchoredContext(sessionId: string): boolean;
106
+ resetContinuityFenced(sessionId: string, executionToken: string): SessionRecord | null;
107
+ getToolCall(sessionId: string, callId: string): ToolCallRecord | null;
108
+ private readDeletionSummary;
109
+ private require;
110
+ private requireToolCall;
111
+ private appendEventRow;
112
+ private hasOperationLeaseRow;
113
+ }
114
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/storage/session-store.ts"],"names":[],"mappings":"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"}