alaska-ai 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 (74) hide show
  1. package/README.md +56 -0
  2. package/dist/adapters/slack.d.ts +130 -0
  3. package/dist/adapters/slack.js +1484 -0
  4. package/dist/adapters/slack.js.map +1 -0
  5. package/dist/backends/claude.d.ts +78 -0
  6. package/dist/backends/claude.js +452 -0
  7. package/dist/backends/claude.js.map +1 -0
  8. package/dist/backends/codex.d.ts +53 -0
  9. package/dist/backends/codex.js +324 -0
  10. package/dist/backends/codex.js.map +1 -0
  11. package/dist/cli/init.d.ts +50 -0
  12. package/dist/cli/init.js +386 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/cli/prompt.d.ts +31 -0
  15. package/dist/cli/prompt.js +145 -0
  16. package/dist/cli/prompt.js.map +1 -0
  17. package/dist/cli/start.d.ts +28 -0
  18. package/dist/cli/start.js +522 -0
  19. package/dist/cli/start.js.map +1 -0
  20. package/dist/cli.d.ts +2 -0
  21. package/dist/cli.js +65 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/index.d.ts +1 -0
  24. package/dist/index.js +8 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mcp/callbacks.d.ts +32 -0
  27. package/dist/mcp/callbacks.js +181 -0
  28. package/dist/mcp/callbacks.js.map +1 -0
  29. package/dist/mcp/config.d.ts +15 -0
  30. package/dist/mcp/config.js +22 -0
  31. package/dist/mcp/config.js.map +1 -0
  32. package/dist/mcp/entry.d.ts +13 -0
  33. package/dist/mcp/entry.js +119 -0
  34. package/dist/mcp/entry.js.map +1 -0
  35. package/dist/mcp/file-browser.d.ts +15 -0
  36. package/dist/mcp/file-browser.js +135 -0
  37. package/dist/mcp/file-browser.js.map +1 -0
  38. package/dist/mcp/ipc-server.d.ts +64 -0
  39. package/dist/mcp/ipc-server.js +380 -0
  40. package/dist/mcp/ipc-server.js.map +1 -0
  41. package/dist/mcp/preview-server.d.ts +33 -0
  42. package/dist/mcp/preview-server.js +254 -0
  43. package/dist/mcp/preview-server.js.map +1 -0
  44. package/dist/mcp/server.d.ts +51 -0
  45. package/dist/mcp/server.js +257 -0
  46. package/dist/mcp/server.js.map +1 -0
  47. package/dist/mcp/tunnel.d.ts +17 -0
  48. package/dist/mcp/tunnel.js +154 -0
  49. package/dist/mcp/tunnel.js.map +1 -0
  50. package/dist/router.d.ts +113 -0
  51. package/dist/router.js +511 -0
  52. package/dist/router.js.map +1 -0
  53. package/dist/sandbox-policy.d.ts +6 -0
  54. package/dist/sandbox-policy.js +46 -0
  55. package/dist/sandbox-policy.js.map +1 -0
  56. package/dist/scheduler.d.ts +42 -0
  57. package/dist/scheduler.js +169 -0
  58. package/dist/scheduler.js.map +1 -0
  59. package/dist/store.d.ts +95 -0
  60. package/dist/store.js +353 -0
  61. package/dist/store.js.map +1 -0
  62. package/dist/types/adapter.d.ts +50 -0
  63. package/dist/types/adapter.js +9 -0
  64. package/dist/types/adapter.js.map +1 -0
  65. package/dist/types/backend.d.ts +73 -0
  66. package/dist/types/backend.js +8 -0
  67. package/dist/types/backend.js.map +1 -0
  68. package/dist/types/events.d.ts +47 -0
  69. package/dist/types/events.js +9 -0
  70. package/dist/types/events.js.map +1 -0
  71. package/dist/utils.d.ts +59 -0
  72. package/dist/utils.js +272 -0
  73. package/dist/utils.js.map +1 -0
  74. package/package.json +50 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Scheduler for Alaska scheduled sessions.
3
+ *
4
+ * Runs a periodic check loop that fires due schedules by creating
5
+ * threads and running full backend sessions via the router.
6
+ */
7
+ import { CronExpressionParser } from 'cron-parser';
8
+ import { clearPostMessageFlag, wasPostMessageCalled, clearScheduleFlag } from './mcp/callbacks.js';
9
+ /** Default scheduler tick interval in milliseconds (30 seconds). */
10
+ export const DEFAULT_TICK_INTERVAL_MS = 30_000;
11
+ /** System timezone detected at startup, e.g. "America/New_York". */
12
+ export const SYSTEM_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone;
13
+ /**
14
+ * Compute the next run time from a cron expression in the system timezone.
15
+ * Returns an ISO 8601 datetime string (UTC).
16
+ * Throws if the cron expression is invalid.
17
+ */
18
+ export function computeNextRun(cronExpression) {
19
+ const interval = CronExpressionParser.parse(cronExpression, { tz: SYSTEM_TIMEZONE });
20
+ const next = interval.next();
21
+ return next.toISOString();
22
+ }
23
+ export class Scheduler {
24
+ store;
25
+ router;
26
+ adapters;
27
+ timer = null;
28
+ tickIntervalMs;
29
+ ticking = false;
30
+ constructor(store, router, adapters, options) {
31
+ this.store = store;
32
+ this.router = router;
33
+ this.adapters = adapters;
34
+ this.tickIntervalMs = options?.tickIntervalMs ?? DEFAULT_TICK_INTERVAL_MS;
35
+ }
36
+ /** Start the scheduler loop. Runs an immediate tick, then repeats at the configured interval. */
37
+ start() {
38
+ if (this.timer)
39
+ return;
40
+ console.log(`[scheduler] started (interval: ${this.tickIntervalMs}ms)`);
41
+ this.timer = setInterval(() => this.tick(), this.tickIntervalMs);
42
+ // Fire immediately on start
43
+ this.tick();
44
+ }
45
+ /** Stop the scheduler loop. */
46
+ stop() {
47
+ if (this.timer) {
48
+ clearInterval(this.timer);
49
+ this.timer = null;
50
+ console.log('[scheduler] stopped');
51
+ }
52
+ }
53
+ /** Check for due schedules and fire them. */
54
+ async tick() {
55
+ // Prevent overlapping ticks
56
+ if (this.ticking)
57
+ return;
58
+ this.ticking = true;
59
+ try {
60
+ const now = new Date().toISOString();
61
+ const due = await this.store.getDueSchedules(now);
62
+ if (due.length > 0) {
63
+ console.log(`[scheduler] ${due.length} schedule(s) due`);
64
+ }
65
+ for (const schedule of due) {
66
+ try {
67
+ await this.fire(schedule);
68
+ }
69
+ catch (err) {
70
+ const msg = err instanceof Error ? err.message : String(err);
71
+ console.error(`[scheduler] failed to fire schedule ${schedule.id}: ${msg}`);
72
+ }
73
+ }
74
+ }
75
+ finally {
76
+ this.ticking = false;
77
+ }
78
+ }
79
+ /** Fire a single schedule: create thread, run session, handle aftermath. */
80
+ async fire(schedule) {
81
+ const project = await this.store.getProjectById(schedule.project_id);
82
+ if (!project) {
83
+ console.warn(`[scheduler] schedule ${schedule.id}: project ${schedule.project_id} not found — deactivating`);
84
+ await this.store.deactivateSchedule(schedule.id);
85
+ return;
86
+ }
87
+ const adapter = this.adapters.get(project.platform);
88
+ if (!adapter) {
89
+ console.warn(`[scheduler] schedule ${schedule.id}: no adapter for platform '${project.platform}' — deactivating`);
90
+ await this.store.deactivateSchedule(schedule.id);
91
+ return;
92
+ }
93
+ console.log(`[scheduler] firing schedule ${schedule.id}: "${schedule.original_request}"`);
94
+ // One-time schedules with a stored thread_id reply in the original thread.
95
+ // Recurring schedules always create a new thread.
96
+ let threadId;
97
+ if (!schedule.is_recurring && schedule.thread_id) {
98
+ threadId = schedule.thread_id;
99
+ console.log(`[scheduler] schedule ${schedule.id}: replying in original thread ${threadId}`);
100
+ }
101
+ else {
102
+ const label = schedule.title ?? schedule.original_request;
103
+ const threadTitle = schedule.is_recurring
104
+ ? `${label} — ${new Date().toLocaleDateString()}`
105
+ : `Scheduled: ${label}`;
106
+ threadId = await adapter.createThread(schedule.channel_id, threadTitle);
107
+ }
108
+ // Run the session and post results. If the original thread is gone, fall back to a new thread.
109
+ try {
110
+ await this.runSession(adapter, schedule, threadId);
111
+ }
112
+ catch (err) {
113
+ if (!schedule.is_recurring && schedule.thread_id) {
114
+ // Original thread may have been deleted — fall back to a new thread
115
+ const msg = err instanceof Error ? err.message : String(err);
116
+ console.warn(`[scheduler] schedule ${schedule.id}: original thread failed (${msg}), creating new thread`);
117
+ const fallbackLabel = schedule.title ?? schedule.original_request;
118
+ const fallbackId = await adapter.createThread(schedule.channel_id, `Scheduled: ${fallbackLabel}`);
119
+ try {
120
+ await this.runSession(adapter, schedule, fallbackId);
121
+ }
122
+ catch (innerErr) {
123
+ const innerMsg = innerErr instanceof Error ? innerErr.message : String(innerErr);
124
+ console.error(`[scheduler] session failed for schedule ${schedule.id} (fallback): ${innerMsg}`);
125
+ await adapter.sendMessage(schedule.channel_id, fallbackId, `Scheduled session failed: ${innerMsg}`);
126
+ }
127
+ }
128
+ else {
129
+ const msg = err instanceof Error ? err.message : String(err);
130
+ console.error(`[scheduler] session failed for schedule ${schedule.id}: ${msg}`);
131
+ await adapter.sendMessage(schedule.channel_id, threadId, `Scheduled session failed: ${msg}`);
132
+ }
133
+ }
134
+ // Update schedule: advance next_run_at for recurring, deactivate one-time
135
+ if (schedule.is_recurring && schedule.cron_expression) {
136
+ try {
137
+ const nextRun = computeNextRun(schedule.cron_expression);
138
+ await this.store.updateNextRun(schedule.id, nextRun);
139
+ console.log(`[scheduler] schedule ${schedule.id}: next run at ${nextRun}`);
140
+ }
141
+ catch (err) {
142
+ const msg = err instanceof Error ? err.message : String(err);
143
+ console.error(`[scheduler] failed to compute next run for schedule ${schedule.id}: ${msg} — deactivating`);
144
+ await this.store.deactivateSchedule(schedule.id);
145
+ }
146
+ }
147
+ else {
148
+ await this.store.deactivateSchedule(schedule.id);
149
+ console.log(`[scheduler] schedule ${schedule.id}: one-time schedule completed`);
150
+ }
151
+ }
152
+ /** Run a session in a thread and post the results. Throws on failure. */
153
+ async runSession(adapter, schedule, threadId) {
154
+ clearPostMessageFlag(threadId);
155
+ clearScheduleFlag(threadId);
156
+ const result = await this.router.send(schedule.channel_id, threadId, schedule.prompt);
157
+ // If Claude already posted via post_message MCP tool, skip assistant_text (avoid duplicates)
158
+ const postMessageUsed = wasPostMessageCalled(threadId);
159
+ for (const event of result.events) {
160
+ if (event.type === 'assistant_text' && event.text && !postMessageUsed) {
161
+ await adapter.sendMessage(schedule.channel_id, threadId, event.text);
162
+ }
163
+ else if (event.type === 'error') {
164
+ await adapter.sendMessage(schedule.channel_id, threadId, `Error: ${event.message}`);
165
+ }
166
+ }
167
+ }
168
+ }
169
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Supabase persistence layer for Alaska.
3
+ *
4
+ * Uses PostgREST endpoints with SUPABASE_URL + SUPABASE_SECRET_KEY.
5
+ * Database foreign keys are intentionally not used; consistency is enforced
6
+ * in code by explicit existence checks and manual cascade deletes.
7
+ */
8
+ export type PermissionMode = 'supervised';
9
+ export type SandboxMode = 'workspace-write';
10
+ export interface Project {
11
+ id: number;
12
+ channel_id: string;
13
+ project_dir: string;
14
+ backend_name: string;
15
+ platform: string;
16
+ permission_mode: PermissionMode;
17
+ sandbox_mode: SandboxMode;
18
+ created_at: string;
19
+ }
20
+ export interface AllowedTool {
21
+ id: number;
22
+ project_id: number;
23
+ tool_pattern: string;
24
+ created_at: string;
25
+ }
26
+ export type SessionState = 'idle' | 'running' | 'waiting_for_input' | 'dead';
27
+ export interface Session {
28
+ id: number;
29
+ thread_id: string;
30
+ project_id: number;
31
+ backend_session_id: string | null;
32
+ state: SessionState;
33
+ created_at: string;
34
+ updated_at: string;
35
+ }
36
+ export interface Schedule {
37
+ id: number;
38
+ project_id: number;
39
+ channel_id: string;
40
+ thread_id: string | null;
41
+ title: string | null;
42
+ prompt: string;
43
+ original_request: string;
44
+ cron_expression: string | null;
45
+ scheduled_at: string | null;
46
+ next_run_at: string;
47
+ is_recurring: number;
48
+ is_active: number;
49
+ created_at: string;
50
+ }
51
+ export interface Setting {
52
+ key: string;
53
+ value: string;
54
+ }
55
+ export interface Store {
56
+ createProject(channelId: string, projectDir: string, backendName: string, platform?: string): Promise<Project>;
57
+ getProjectById(id: number): Promise<Project | undefined>;
58
+ getProjectByChannelId(channelId: string): Promise<Project | undefined>;
59
+ listProjects(): Promise<Project[]>;
60
+ deleteProject(id: number): Promise<boolean>;
61
+ updateProjectBackend(id: number, backendName: string): Promise<void>;
62
+ updatePermissionMode(id: number, mode: PermissionMode): Promise<void>;
63
+ updateSandboxMode(id: number, sandboxMode: SandboxMode): Promise<void>;
64
+ createSession(threadId: string, projectId: number): Promise<Session>;
65
+ getSessionById(id: number): Promise<Session | undefined>;
66
+ getSessionByThreadId(threadId: string): Promise<Session | undefined>;
67
+ updateSessionState(id: number, newState: SessionState): Promise<void>;
68
+ updateBackendSessionId(id: number, backendSessionId: string | null): Promise<void>;
69
+ deleteSession(id: number): Promise<boolean>;
70
+ addAllowedTool(projectId: number, toolPattern: string): Promise<AllowedTool>;
71
+ getAllowedTools(projectId: number): Promise<AllowedTool[]>;
72
+ removeAllowedTool(id: number): Promise<boolean>;
73
+ createSchedule(projectId: number, channelId: string, prompt: string, originalRequest: string, opts: {
74
+ cronExpression?: string;
75
+ scheduledAt?: string;
76
+ nextRunAt: string;
77
+ threadId?: string;
78
+ title?: string;
79
+ }): Promise<Schedule>;
80
+ getDueSchedules(now: string): Promise<Schedule[]>;
81
+ getSchedulesByChannelId(channelId: string): Promise<Schedule[]>;
82
+ getScheduleById(id: number): Promise<Schedule | undefined>;
83
+ deactivateSchedule(id: number): Promise<boolean>;
84
+ updateNextRun(id: number, nextRunAt: string): Promise<void>;
85
+ getSetting(key: string): Promise<string | null>;
86
+ setSetting(key: string, value: string): Promise<void>;
87
+ deleteSetting(key: string): Promise<boolean>;
88
+ close(): void;
89
+ }
90
+ /**
91
+ * Validates a session state transition.
92
+ * Throws if the transition is not allowed.
93
+ */
94
+ export declare function validateTransition(from: SessionState, to: SessionState): void;
95
+ export declare function createStore(): Store;
package/dist/store.js ADDED
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Supabase persistence layer for Alaska.
3
+ *
4
+ * Uses PostgREST endpoints with SUPABASE_URL + SUPABASE_SECRET_KEY.
5
+ * Database foreign keys are intentionally not used; consistency is enforced
6
+ * in code by explicit existence checks and manual cascade deletes.
7
+ */
8
+ import * as fs from 'node:fs';
9
+ import * as path from 'node:path';
10
+ import { getEnvPath } from './utils.js';
11
+ /** Valid session state transitions. */
12
+ const VALID_TRANSITIONS = {
13
+ idle: ['running'],
14
+ running: ['idle', 'waiting_for_input', 'dead'],
15
+ waiting_for_input: ['running'],
16
+ dead: ['idle'],
17
+ };
18
+ /**
19
+ * Validates a session state transition.
20
+ * Throws if the transition is not allowed.
21
+ */
22
+ export function validateTransition(from, to) {
23
+ const allowed = VALID_TRANSITIONS[from];
24
+ if (!allowed || !allowed.includes(to)) {
25
+ throw new Error(`Invalid session state transition: ${from} -> ${to}`);
26
+ }
27
+ }
28
+ function parseEnvFile(filePath) {
29
+ const env = {};
30
+ if (!fs.existsSync(filePath))
31
+ return env;
32
+ const content = fs.readFileSync(filePath, 'utf-8');
33
+ for (const line of content.split('\n')) {
34
+ const trimmed = line.trim();
35
+ if (!trimmed || trimmed.startsWith('#'))
36
+ continue;
37
+ const eq = trimmed.indexOf('=');
38
+ if (eq < 0)
39
+ continue;
40
+ const key = trimmed.slice(0, eq).trim();
41
+ let value = trimmed.slice(eq + 1).trim();
42
+ if (value.length >= 2 &&
43
+ ((value[0] === '"' && value[value.length - 1] === '"') ||
44
+ (value[0] === "'" && value[value.length - 1] === "'"))) {
45
+ value = value.slice(1, -1);
46
+ }
47
+ env[key] = value;
48
+ }
49
+ return env;
50
+ }
51
+ function resolveEnvVar(name) {
52
+ if (process.env[name])
53
+ return process.env[name];
54
+ const cwdEnv = parseEnvFile(path.resolve(process.cwd(), '.env'));
55
+ if (cwdEnv[name])
56
+ return cwdEnv[name];
57
+ const configEnv = parseEnvFile(getEnvPath());
58
+ if (configEnv[name])
59
+ return configEnv[name];
60
+ return undefined;
61
+ }
62
+ function requireEnvVar(name) {
63
+ const value = resolveEnvVar(name);
64
+ if (!value) {
65
+ throw new Error(`Missing required environment variable: ${name}`);
66
+ }
67
+ return value;
68
+ }
69
+ function makeSelectPath(table, filters = [], options) {
70
+ const params = new URLSearchParams();
71
+ params.set('select', options?.select ?? '*');
72
+ for (const f of filters) {
73
+ params.set(f.column, `${f.op}.${String(f.value)}`);
74
+ }
75
+ if (options?.order) {
76
+ const dir = options.order.ascending === false ? 'desc' : 'asc';
77
+ params.set('order', `${options.order.column}.${dir}`);
78
+ }
79
+ if (options?.limit !== undefined) {
80
+ params.set('limit', String(options.limit));
81
+ }
82
+ return `${table}?${params.toString()}`;
83
+ }
84
+ function toErrorMessage(payload, status, method, resource) {
85
+ if (!payload) {
86
+ return `Supabase request failed (${status}) for ${method} ${resource}`;
87
+ }
88
+ const base = payload.message ?? `Supabase request failed (${status}) for ${method} ${resource}`;
89
+ const detail = payload.details ? ` Details: ${payload.details}` : '';
90
+ const hint = payload.hint ? ` Hint: ${payload.hint}` : '';
91
+ return `${base}${detail}${hint}`;
92
+ }
93
+ export function createStore() {
94
+ const supabaseUrl = requireEnvVar('SUPABASE_URL').replace(/\/+$/, '');
95
+ const supabaseSecretKey = requireEnvVar('SUPABASE_SECRET_KEY');
96
+ const restBase = `${supabaseUrl}/rest/v1`;
97
+ async function request(method, resource, options) {
98
+ const headers = {
99
+ apikey: supabaseSecretKey,
100
+ Authorization: `Bearer ${supabaseSecretKey}`,
101
+ ...options?.headers,
102
+ };
103
+ if (options?.body !== undefined) {
104
+ headers['Content-Type'] = 'application/json';
105
+ }
106
+ const response = await fetch(`${restBase}/${resource}`, {
107
+ method,
108
+ headers,
109
+ body: options?.body !== undefined ? JSON.stringify(options.body) : undefined,
110
+ });
111
+ const text = await response.text();
112
+ let parsed = null;
113
+ if (text) {
114
+ try {
115
+ parsed = JSON.parse(text);
116
+ }
117
+ catch {
118
+ parsed = text;
119
+ }
120
+ }
121
+ if (!response.ok) {
122
+ const payload = parsed && typeof parsed === 'object' ? parsed : null;
123
+ throw new Error(toErrorMessage(payload, response.status, method, resource));
124
+ }
125
+ return parsed;
126
+ }
127
+ async function selectOne(table, filters) {
128
+ const rows = await request('GET', makeSelectPath(table, filters, { limit: 1 }));
129
+ return rows[0];
130
+ }
131
+ async function insertOne(table, row) {
132
+ const rows = await request('POST', `${table}?select=*`, {
133
+ body: [row],
134
+ headers: { Prefer: 'return=representation' },
135
+ });
136
+ if (!rows[0])
137
+ throw new Error(`Insert into ${table} returned no row`);
138
+ return rows[0];
139
+ }
140
+ async function patchRows(table, filters, patch) {
141
+ return request('PATCH', makeSelectPath(table, filters), {
142
+ body: patch,
143
+ headers: { Prefer: 'return=representation' },
144
+ });
145
+ }
146
+ async function deleteRows(table, filters) {
147
+ return request('DELETE', makeSelectPath(table, filters), {
148
+ headers: { Prefer: 'return=representation' },
149
+ });
150
+ }
151
+ async function assertProjectExists(projectId) {
152
+ const project = await getProjectById(projectId);
153
+ if (!project) {
154
+ throw new Error(`Project ${projectId} not found`);
155
+ }
156
+ return project;
157
+ }
158
+ async function createProject(channelId, projectDir, backendName, platform = 'unknown') {
159
+ return insertOne('projects', {
160
+ channel_id: channelId,
161
+ project_dir: projectDir,
162
+ backend_name: backendName,
163
+ platform,
164
+ });
165
+ }
166
+ async function getProjectById(id) {
167
+ return selectOne('projects', [{ column: 'id', op: 'eq', value: id }]);
168
+ }
169
+ async function getProjectByChannelId(channelId) {
170
+ return selectOne('projects', [{ column: 'channel_id', op: 'eq', value: channelId }]);
171
+ }
172
+ async function listProjects() {
173
+ return request('GET', makeSelectPath('projects', [], { order: { column: 'created_at' } }));
174
+ }
175
+ async function deleteProject(id) {
176
+ const project = await getProjectById(id);
177
+ if (!project)
178
+ return false;
179
+ // Manual cascade to keep consistency without database foreign keys.
180
+ await deleteRows('allowed_tools', [{ column: 'project_id', op: 'eq', value: id }]);
181
+ await deleteRows('sessions', [{ column: 'project_id', op: 'eq', value: id }]);
182
+ await deleteRows('schedules', [{ column: 'project_id', op: 'eq', value: id }]);
183
+ const deleted = await deleteRows('projects', [{ column: 'id', op: 'eq', value: id }]);
184
+ return deleted.length > 0;
185
+ }
186
+ async function updateProjectBackend(id, backendName) {
187
+ await patchRows('projects', [{ column: 'id', op: 'eq', value: id }], {
188
+ backend_name: backendName,
189
+ });
190
+ }
191
+ async function updatePermissionMode(id, mode) {
192
+ if (mode !== 'supervised') {
193
+ throw new Error(`Unsupported permission mode: ${mode}`);
194
+ }
195
+ await patchRows('projects', [{ column: 'id', op: 'eq', value: id }], {
196
+ permission_mode: mode,
197
+ });
198
+ }
199
+ async function updateSandboxMode(id, sandboxMode) {
200
+ if (sandboxMode !== 'workspace-write') {
201
+ throw new Error(`Unsupported sandbox mode: ${sandboxMode}`);
202
+ }
203
+ await patchRows('projects', [{ column: 'id', op: 'eq', value: id }], {
204
+ sandbox_mode: sandboxMode,
205
+ });
206
+ }
207
+ async function createSession(threadId, projectId) {
208
+ await assertProjectExists(projectId);
209
+ return insertOne('sessions', {
210
+ thread_id: threadId,
211
+ project_id: projectId,
212
+ });
213
+ }
214
+ async function getSessionById(id) {
215
+ return selectOne('sessions', [{ column: 'id', op: 'eq', value: id }]);
216
+ }
217
+ async function getSessionByThreadId(threadId) {
218
+ return selectOne('sessions', [{ column: 'thread_id', op: 'eq', value: threadId }]);
219
+ }
220
+ async function updateSessionState(id, newState) {
221
+ const session = await getSessionById(id);
222
+ if (!session) {
223
+ throw new Error(`Session ${id} not found`);
224
+ }
225
+ validateTransition(session.state, newState);
226
+ await patchRows('sessions', [{ column: 'id', op: 'eq', value: id }], {
227
+ state: newState,
228
+ updated_at: new Date().toISOString(),
229
+ });
230
+ }
231
+ async function updateBackendSessionId(id, backendSessionId) {
232
+ await patchRows('sessions', [{ column: 'id', op: 'eq', value: id }], {
233
+ backend_session_id: backendSessionId,
234
+ updated_at: new Date().toISOString(),
235
+ });
236
+ }
237
+ async function deleteSession(id) {
238
+ const deleted = await deleteRows('sessions', [{ column: 'id', op: 'eq', value: id }]);
239
+ return deleted.length > 0;
240
+ }
241
+ async function addAllowedTool(projectId, toolPattern) {
242
+ await assertProjectExists(projectId);
243
+ const existing = await selectOne('allowed_tools', [
244
+ { column: 'project_id', op: 'eq', value: projectId },
245
+ { column: 'tool_pattern', op: 'eq', value: toolPattern },
246
+ ]);
247
+ if (existing)
248
+ return existing;
249
+ return insertOne('allowed_tools', {
250
+ project_id: projectId,
251
+ tool_pattern: toolPattern,
252
+ });
253
+ }
254
+ async function getAllowedTools(projectId) {
255
+ return request('GET', makeSelectPath('allowed_tools', [{ column: 'project_id', op: 'eq', value: projectId }], { order: { column: 'created_at' } }));
256
+ }
257
+ async function removeAllowedTool(id) {
258
+ const deleted = await deleteRows('allowed_tools', [{ column: 'id', op: 'eq', value: id }]);
259
+ return deleted.length > 0;
260
+ }
261
+ async function createSchedule(projectId, channelId, prompt, originalRequest, opts) {
262
+ const project = await assertProjectExists(projectId);
263
+ if (project.channel_id !== channelId) {
264
+ throw new Error(`Schedule channel mismatch: project ${projectId} belongs to ${project.channel_id}, got ${channelId}`);
265
+ }
266
+ return insertOne('schedules', {
267
+ project_id: projectId,
268
+ channel_id: channelId,
269
+ thread_id: opts.threadId ?? null,
270
+ title: opts.title ?? null,
271
+ prompt,
272
+ original_request: originalRequest,
273
+ cron_expression: opts.cronExpression ?? null,
274
+ scheduled_at: opts.scheduledAt ?? null,
275
+ next_run_at: opts.nextRunAt,
276
+ is_recurring: opts.cronExpression ? 1 : 0,
277
+ is_active: 1,
278
+ });
279
+ }
280
+ async function getDueSchedules(now) {
281
+ return request('GET', makeSelectPath('schedules', [
282
+ { column: 'is_active', op: 'eq', value: 1 },
283
+ { column: 'next_run_at', op: 'lte', value: now },
284
+ ], { order: { column: 'next_run_at' } }));
285
+ }
286
+ async function getSchedulesByChannelId(channelId) {
287
+ return request('GET', makeSelectPath('schedules', [
288
+ { column: 'channel_id', op: 'eq', value: channelId },
289
+ { column: 'is_active', op: 'eq', value: 1 },
290
+ ], { order: { column: 'next_run_at' } }));
291
+ }
292
+ async function getScheduleById(id) {
293
+ return selectOne('schedules', [{ column: 'id', op: 'eq', value: id }]);
294
+ }
295
+ async function deactivateSchedule(id) {
296
+ const rows = await patchRows('schedules', [{ column: 'id', op: 'eq', value: id }], {
297
+ is_active: 0,
298
+ });
299
+ return rows.length > 0;
300
+ }
301
+ async function updateNextRun(id, nextRunAt) {
302
+ await patchRows('schedules', [{ column: 'id', op: 'eq', value: id }], {
303
+ next_run_at: nextRunAt,
304
+ });
305
+ }
306
+ async function getSetting(key) {
307
+ const row = await selectOne('settings', [{ column: 'key', op: 'eq', value: key }]);
308
+ return row?.value ?? null;
309
+ }
310
+ async function setSetting(key, value) {
311
+ await request('POST', 'settings?on_conflict=key&select=key,value', {
312
+ body: [{ key, value }],
313
+ headers: { Prefer: 'resolution=merge-duplicates,return=representation' },
314
+ });
315
+ }
316
+ async function deleteSetting(key) {
317
+ const rows = await deleteRows('settings', [{ column: 'key', op: 'eq', value: key }]);
318
+ return rows.length > 0;
319
+ }
320
+ function close() {
321
+ // No persistent connection to close when using HTTP-based PostgREST.
322
+ }
323
+ return {
324
+ createProject,
325
+ getProjectById,
326
+ getProjectByChannelId,
327
+ listProjects,
328
+ deleteProject,
329
+ updateProjectBackend,
330
+ updatePermissionMode,
331
+ updateSandboxMode,
332
+ createSession,
333
+ getSessionById,
334
+ getSessionByThreadId,
335
+ updateSessionState,
336
+ updateBackendSessionId,
337
+ deleteSession,
338
+ addAllowedTool,
339
+ getAllowedTools,
340
+ removeAllowedTool,
341
+ createSchedule,
342
+ getDueSchedules,
343
+ getSchedulesByChannelId,
344
+ getScheduleById,
345
+ deactivateSchedule,
346
+ updateNextRun,
347
+ getSetting,
348
+ setSetting,
349
+ deleteSetting,
350
+ close,
351
+ };
352
+ }
353
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}