@wastedcode/memex 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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +291 -0
  3. package/dist/cli/client.d.ts +35 -0
  4. package/dist/cli/client.js +183 -0
  5. package/dist/cli/client.js.map +1 -0
  6. package/dist/cli/commands/chown.d.ts +2 -0
  7. package/dist/cli/commands/chown.js +22 -0
  8. package/dist/cli/commands/chown.js.map +1 -0
  9. package/dist/cli/commands/config.d.ts +2 -0
  10. package/dist/cli/commands/config.js +132 -0
  11. package/dist/cli/commands/config.js.map +1 -0
  12. package/dist/cli/commands/create.d.ts +2 -0
  13. package/dist/cli/commands/create.js +21 -0
  14. package/dist/cli/commands/create.js.map +1 -0
  15. package/dist/cli/commands/destroy.d.ts +2 -0
  16. package/dist/cli/commands/destroy.js +34 -0
  17. package/dist/cli/commands/destroy.js.map +1 -0
  18. package/dist/cli/commands/ingest.d.ts +2 -0
  19. package/dist/cli/commands/ingest.js +74 -0
  20. package/dist/cli/commands/ingest.js.map +1 -0
  21. package/dist/cli/commands/lint.d.ts +2 -0
  22. package/dist/cli/commands/lint.js +46 -0
  23. package/dist/cli/commands/lint.js.map +1 -0
  24. package/dist/cli/commands/list.d.ts +2 -0
  25. package/dist/cli/commands/list.js +28 -0
  26. package/dist/cli/commands/list.js.map +1 -0
  27. package/dist/cli/commands/login.d.ts +2 -0
  28. package/dist/cli/commands/login.js +51 -0
  29. package/dist/cli/commands/login.js.map +1 -0
  30. package/dist/cli/commands/logs.d.ts +2 -0
  31. package/dist/cli/commands/logs.js +26 -0
  32. package/dist/cli/commands/logs.js.map +1 -0
  33. package/dist/cli/commands/query.d.ts +2 -0
  34. package/dist/cli/commands/query.js +48 -0
  35. package/dist/cli/commands/query.js.map +1 -0
  36. package/dist/cli/commands/serve.d.ts +2 -0
  37. package/dist/cli/commands/serve.js +14 -0
  38. package/dist/cli/commands/serve.js.map +1 -0
  39. package/dist/cli/commands/status.d.ts +2 -0
  40. package/dist/cli/commands/status.js +66 -0
  41. package/dist/cli/commands/status.js.map +1 -0
  42. package/dist/daemon/auth.d.ts +31 -0
  43. package/dist/daemon/auth.js +84 -0
  44. package/dist/daemon/auth.js.map +1 -0
  45. package/dist/daemon/db.d.ts +36 -0
  46. package/dist/daemon/db.js +181 -0
  47. package/dist/daemon/db.js.map +1 -0
  48. package/dist/daemon/namespace.d.ts +34 -0
  49. package/dist/daemon/namespace.js +74 -0
  50. package/dist/daemon/namespace.js.map +1 -0
  51. package/dist/daemon/peercred.d.ts +15 -0
  52. package/dist/daemon/peercred.js +19 -0
  53. package/dist/daemon/peercred.js.map +1 -0
  54. package/dist/daemon/queue.d.ts +26 -0
  55. package/dist/daemon/queue.js +126 -0
  56. package/dist/daemon/queue.js.map +1 -0
  57. package/dist/daemon/routes.d.ts +38 -0
  58. package/dist/daemon/routes.js +258 -0
  59. package/dist/daemon/routes.js.map +1 -0
  60. package/dist/daemon/runner.d.ts +25 -0
  61. package/dist/daemon/runner.js +195 -0
  62. package/dist/daemon/runner.js.map +1 -0
  63. package/dist/daemon/scaffold.d.ts +38 -0
  64. package/dist/daemon/scaffold.js +141 -0
  65. package/dist/daemon/scaffold.js.map +1 -0
  66. package/dist/daemon/server.d.ts +11 -0
  67. package/dist/daemon/server.js +145 -0
  68. package/dist/daemon/server.js.map +1 -0
  69. package/dist/daemon.d.ts +1 -0
  70. package/dist/daemon.js +55 -0
  71. package/dist/daemon.js.map +1 -0
  72. package/dist/index.d.ts +2 -0
  73. package/dist/index.js +36 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/lib/constants.d.ts +17 -0
  76. package/dist/lib/constants.js +30 -0
  77. package/dist/lib/constants.js.map +1 -0
  78. package/dist/lib/errors.d.ts +32 -0
  79. package/dist/lib/errors.js +64 -0
  80. package/dist/lib/errors.js.map +1 -0
  81. package/dist/lib/prompts/ingest.d.ts +9 -0
  82. package/dist/lib/prompts/ingest.js +48 -0
  83. package/dist/lib/prompts/ingest.js.map +1 -0
  84. package/dist/lib/prompts/lint.d.ts +8 -0
  85. package/dist/lib/prompts/lint.js +62 -0
  86. package/dist/lib/prompts/lint.js.map +1 -0
  87. package/dist/lib/prompts/query.d.ts +8 -0
  88. package/dist/lib/prompts/query.js +37 -0
  89. package/dist/lib/prompts/query.js.map +1 -0
  90. package/dist/lib/prompts/wiki.d.ts +11 -0
  91. package/dist/lib/prompts/wiki.js +112 -0
  92. package/dist/lib/prompts/wiki.js.map +1 -0
  93. package/dist/lib/types.d.ts +76 -0
  94. package/dist/lib/types.js +3 -0
  95. package/dist/lib/types.js.map +1 -0
  96. package/dist/standalone/memex.mjs +2313 -0
  97. package/dist/standalone/memex.mjs.map +7 -0
  98. package/package.json +54 -0
@@ -0,0 +1,126 @@
1
+ import { AUTO_LINT_INTERVAL } from '../lib/constants.js';
2
+ export class QueueManager {
3
+ db;
4
+ runner;
5
+ autoLintInterval;
6
+ wikis = new Map();
7
+ shuttingDown = false;
8
+ constructor(db, runner, autoLintInterval = AUTO_LINT_INTERVAL) {
9
+ this.db = db;
10
+ this.runner = runner;
11
+ this.autoLintInterval = autoLintInterval;
12
+ }
13
+ /**
14
+ * Start draining queues. Called on daemon startup.
15
+ * Kicks off drain loops for all wikis with pending jobs.
16
+ */
17
+ start() {
18
+ const wikisWithWork = this.db.wikisWithPendingJobs();
19
+ for (const wikiId of wikisWithWork) {
20
+ this.notify(wikiId);
21
+ }
22
+ console.log(`[queue] Started. ${wikisWithWork.length} wiki(s) have pending work.`);
23
+ }
24
+ /**
25
+ * Signal that a wiki has new work to process.
26
+ * If the wiki isn't already draining, starts a drain loop.
27
+ */
28
+ notify(wikiId) {
29
+ if (this.shuttingDown)
30
+ return;
31
+ let state = this.wikis.get(wikiId);
32
+ if (!state) {
33
+ state = { active: false, pending: false, ingestCount: 0 };
34
+ this.wikis.set(wikiId, state);
35
+ }
36
+ if (state.active) {
37
+ // Drain loop already running — just flag that new work exists
38
+ state.pending = true;
39
+ }
40
+ else {
41
+ // No active drain loop — start one
42
+ this.drainWiki(wikiId, state);
43
+ }
44
+ }
45
+ /**
46
+ * Graceful shutdown. Waits for active jobs to finish.
47
+ */
48
+ async stop() {
49
+ this.shuttingDown = true;
50
+ console.log('[queue] Shutting down...');
51
+ // Wait for all active drain loops to complete their current job
52
+ const maxWait = 30_000;
53
+ const start = Date.now();
54
+ while (this.runner.activeCount > 0 && Date.now() - start < maxWait) {
55
+ await sleep(500);
56
+ }
57
+ if (this.runner.activeCount > 0) {
58
+ console.warn(`[queue] ${this.runner.activeCount} job(s) still active after ${maxWait}ms, killing`);
59
+ this.runner.killAll();
60
+ }
61
+ console.log('[queue] Shutdown complete.');
62
+ }
63
+ // ── Private ────────────────────────────────────────────────────────────
64
+ async drainWiki(wikiId, state) {
65
+ state.active = true;
66
+ state.pending = false;
67
+ try {
68
+ while (!this.shuttingDown) {
69
+ const job = this.db.claimNextJob(wikiId);
70
+ if (!job)
71
+ break; // no more pending jobs
72
+ console.log(`[queue] Running job #${job.id} (${job.type}) for wiki '${wikiId}'`);
73
+ try {
74
+ const result = await this.runner.run(job);
75
+ if (result.success) {
76
+ this.db.completeJob(job.id, result);
77
+ this.db.logAudit(wikiId, `job.${job.type}.completed`, `job #${job.id} (${result.duration_ms}ms)`);
78
+ console.log(`[queue] Job #${job.id} completed in ${result.duration_ms}ms`);
79
+ }
80
+ else {
81
+ this.db.failJob(job.id, result.output);
82
+ this.db.logAudit(wikiId, `job.${job.type}.failed`, `job #${job.id}: ${result.output.slice(0, 200)}`);
83
+ console.error(`[queue] Job #${job.id} failed (exit ${result.exit_code})`);
84
+ }
85
+ // Auto-lint tracking
86
+ if (job.type === 'ingest' && result.success) {
87
+ state.ingestCount++;
88
+ if (this.autoLintInterval > 0 && state.ingestCount >= this.autoLintInterval) {
89
+ state.ingestCount = 0;
90
+ this.scheduleAutoLint(wikiId);
91
+ }
92
+ }
93
+ }
94
+ catch (err) {
95
+ const msg = err instanceof Error ? err.message : String(err);
96
+ this.db.failJob(job.id, msg);
97
+ this.db.logAudit(wikiId, `job.${job.type}.error`, `job #${job.id}: ${msg}`);
98
+ console.error(`[queue] Job #${job.id} error: ${msg}`);
99
+ }
100
+ }
101
+ }
102
+ finally {
103
+ state.active = false;
104
+ // If new work arrived while we were draining, restart
105
+ if (state.pending && !this.shuttingDown) {
106
+ this.drainWiki(wikiId, state);
107
+ }
108
+ }
109
+ }
110
+ scheduleAutoLint(wikiId) {
111
+ // Check if there's already a pending lint job to avoid stacking
112
+ const pendingLints = this.db.listJobs(wikiId, { status: 'pending' })
113
+ .filter(j => j.type === 'lint');
114
+ if (pendingLints.length > 0) {
115
+ console.log(`[queue] Skipping auto-lint for '${wikiId}' — lint already pending`);
116
+ return;
117
+ }
118
+ console.log(`[queue] Scheduling auto-lint for '${wikiId}' after ${this.autoLintInterval} ingests`);
119
+ this.db.createJob(wikiId, 'lint', {});
120
+ // No need to notify — we're already in the drain loop and will pick it up
121
+ }
122
+ }
123
+ function sleep(ms) {
124
+ return new Promise(resolve => setTimeout(resolve, ms));
125
+ }
126
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/daemon/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { ServerResponse } from 'node:http';
2
+ import type { Database } from './db.js';
3
+ import type { WikiScaffold } from './scaffold.js';
4
+ import type { NamespaceManager } from './namespace.js';
5
+ import type { QueueManager } from './queue.js';
6
+ import type { AuthManager } from './auth.js';
7
+ import type { RouteResponse } from '../lib/types.js';
8
+ interface RouteContext {
9
+ wait?: boolean;
10
+ res?: ServerResponse;
11
+ callerUid: number;
12
+ }
13
+ export declare class RouteHandler {
14
+ private db;
15
+ private scaffold;
16
+ private namespace;
17
+ private queue;
18
+ private auth;
19
+ private routes;
20
+ constructor(db: Database, scaffold: WikiScaffold, namespace: NamespaceManager, queue: QueueManager, auth: AuthManager);
21
+ handle(method: string, path: string, body: unknown, ctx: RouteContext): Promise<RouteResponse>;
22
+ private createWiki;
23
+ private listWikis;
24
+ private getWiki;
25
+ private destroyWiki;
26
+ private chownWiki;
27
+ private updateConfig;
28
+ private setApiKey;
29
+ private setCredentials;
30
+ private submitJob;
31
+ private getJob;
32
+ private listJobs;
33
+ private getAuditLog;
34
+ private receiveFile;
35
+ private requireWiki;
36
+ private waitForJob;
37
+ }
38
+ export {};
@@ -0,0 +1,258 @@
1
+ import { WIKI_ID_PATTERN, JOB_POLL_INTERVAL_MS, ALLOWED_TOOLS_WHITELIST, BASE_ALLOWED_TOOLS } from '../lib/constants.js';
2
+ import { WikiNotFoundError, WikiExistsError, JobNotFoundError, ValidationError, ForbiddenError, } from '../lib/errors.js';
3
+ export class RouteHandler {
4
+ db;
5
+ scaffold;
6
+ namespace;
7
+ queue;
8
+ auth;
9
+ routes;
10
+ constructor(db, scaffold, namespace, queue, auth) {
11
+ this.db = db;
12
+ this.scaffold = scaffold;
13
+ this.namespace = namespace;
14
+ this.queue = queue;
15
+ this.auth = auth;
16
+ this.routes = [
17
+ { method: 'POST', pattern: /^\/wikis$/, handler: this.createWiki.bind(this) },
18
+ { method: 'GET', pattern: /^\/wikis$/, handler: this.listWikis.bind(this) },
19
+ { method: 'GET', pattern: /^\/wikis\/(?<id>[^/]+)$/, handler: this.getWiki.bind(this) },
20
+ { method: 'DELETE', pattern: /^\/wikis\/(?<id>[^/]+)$/, handler: this.destroyWiki.bind(this) },
21
+ { method: 'PUT', pattern: /^\/wikis\/(?<id>[^/]+)\/config$/, handler: this.updateConfig.bind(this) },
22
+ { method: 'POST', pattern: /^\/wikis\/(?<id>[^/]+)\/chown$/, handler: this.chownWiki.bind(this) },
23
+ { method: 'POST', pattern: /^\/wikis\/(?<id>[^/]+)\/api-key$/, handler: this.setApiKey.bind(this) },
24
+ { method: 'POST', pattern: /^\/wikis\/(?<id>[^/]+)\/credentials$/, handler: this.setCredentials.bind(this) },
25
+ { method: 'POST', pattern: /^\/wikis\/(?<id>[^/]+)\/jobs$/, handler: this.submitJob.bind(this) },
26
+ { method: 'GET', pattern: /^\/wikis\/(?<id>[^/]+)\/jobs\/(?<jobId>\d+)$/, handler: this.getJob.bind(this) },
27
+ { method: 'GET', pattern: /^\/wikis\/(?<id>[^/]+)\/jobs$/, handler: this.listJobs.bind(this) },
28
+ { method: 'GET', pattern: /^\/wikis\/(?<id>[^/]+)\/logs$/, handler: this.getAuditLog.bind(this) },
29
+ { method: 'POST', pattern: /^\/wikis\/(?<id>[^/]+)\/ingest-file$/, handler: this.receiveFile.bind(this) },
30
+ ];
31
+ }
32
+ async handle(method, path, body, ctx) {
33
+ for (const route of this.routes) {
34
+ if (route.method !== method)
35
+ continue;
36
+ const match = path.match(route.pattern);
37
+ if (match) {
38
+ return route.handler(match.groups ?? {}, body, ctx);
39
+ }
40
+ }
41
+ return { status: 404, body: { ok: false, error: 'Not found' } };
42
+ }
43
+ // ── Wiki CRUD ───────────────────────────────────────────────────────────
44
+ async createWiki(params, body, ctx) {
45
+ const b = requireBody(body);
46
+ const id = b.id;
47
+ const name = b.name;
48
+ if (!id || !WIKI_ID_PATTERN.test(id)) {
49
+ throw new ValidationError(`Invalid wiki ID '${id}'. Must be 3-64 chars, lowercase alphanumeric and hyphens, ` +
50
+ 'cannot start or end with a hyphen.');
51
+ }
52
+ if (this.db.getWiki(id)) {
53
+ throw new WikiExistsError(id);
54
+ }
55
+ const wiki = this.db.createWiki(id, name ?? id, ctx.callerUid);
56
+ this.scaffold.create(id);
57
+ this.namespace.validateWiki(id);
58
+ this.db.logAudit(id, 'wiki.created');
59
+ return { status: 201, body: { ok: true, data: wiki } };
60
+ }
61
+ async listWikis(params, body, ctx) {
62
+ const wikis = this.db.listWikis(ctx.callerUid);
63
+ return { status: 200, body: { ok: true, data: wikis } };
64
+ }
65
+ async getWiki(params, body, ctx) {
66
+ const wiki = this.requireWiki(params['id'], ctx.callerUid);
67
+ const pendingJobs = this.db.getPendingJobCount(wiki.id);
68
+ return {
69
+ status: 200,
70
+ body: { ok: true, data: { ...wiki, pending_jobs: pendingJobs } },
71
+ };
72
+ }
73
+ async destroyWiki(params, body, ctx) {
74
+ const wikiId = params['id'];
75
+ this.requireWiki(wikiId, ctx.callerUid);
76
+ const keepData = body && typeof body === 'object' && 'keepData' in body
77
+ ? Boolean(body.keepData)
78
+ : false;
79
+ this.scaffold.destroy(wikiId, keepData);
80
+ this.db.deleteWiki(wikiId);
81
+ return { status: 200, body: { ok: true } };
82
+ }
83
+ async chownWiki(params, body, ctx) {
84
+ const wikiId = params['id'];
85
+ // Root (uid 0) can chown any wiki; otherwise only the current owner can transfer
86
+ const wiki = this.db.getWiki(wikiId);
87
+ if (!wiki)
88
+ throw new WikiNotFoundError(wikiId);
89
+ if (ctx.callerUid !== 0 && wiki.owner_uid !== ctx.callerUid) {
90
+ throw new ForbiddenError(wikiId);
91
+ }
92
+ const b = requireBody(body);
93
+ const newOwnerUid = b.uid;
94
+ if (newOwnerUid === undefined || typeof newOwnerUid !== 'number' || !Number.isInteger(newOwnerUid) || newOwnerUid < 0) {
95
+ throw new ValidationError('uid (non-negative integer) is required');
96
+ }
97
+ const updated = this.db.chownWiki(wikiId, newOwnerUid);
98
+ this.db.logAudit(wikiId, 'wiki.chown', `uid ${ctx.callerUid} → ${newOwnerUid}`);
99
+ return { status: 200, body: { ok: true, data: updated } };
100
+ }
101
+ async updateConfig(params, body, ctx) {
102
+ const wikiId = params['id'];
103
+ this.requireWiki(wikiId, ctx.callerUid);
104
+ const config = requireBody(body);
105
+ // Handle allowed_tools separately — validated and written to disk
106
+ if (config.allowed_tools !== undefined) {
107
+ if (!Array.isArray(config.allowed_tools)) {
108
+ throw new ValidationError('allowed_tools must be an array of tool names');
109
+ }
110
+ const invalid = config.allowed_tools.filter(t => !ALLOWED_TOOLS_WHITELIST.has(t));
111
+ if (invalid.length > 0) {
112
+ const allowed = [...ALLOWED_TOOLS_WHITELIST].filter(t => !BASE_ALLOWED_TOOLS.includes(t));
113
+ throw new ValidationError(`Invalid tools: ${invalid.join(', ')}. ` +
114
+ `Allowed extras: ${allowed.join(', ')}`);
115
+ }
116
+ this.scaffold.writeAllowedTools(wikiId, config.allowed_tools);
117
+ this.db.logAudit(wikiId, 'wiki.allowed_tools_updated', JSON.stringify(config.allowed_tools));
118
+ }
119
+ // Pass remaining DB-backed fields
120
+ const { allowed_tools: _, ...dbConfig } = config;
121
+ if (Object.keys(dbConfig).length > 0) {
122
+ const wiki = this.db.updateWiki(wikiId, dbConfig);
123
+ this.db.logAudit(wikiId, 'wiki.config_updated', JSON.stringify(dbConfig));
124
+ return { status: 200, body: { ok: true, data: wiki } };
125
+ }
126
+ const wiki = this.db.getWiki(wikiId);
127
+ return { status: 200, body: { ok: true, data: wiki } };
128
+ }
129
+ // ── Auth ─────────────────────────────────────────────────────────────────
130
+ async setApiKey(params, body, ctx) {
131
+ const wikiId = params['id'];
132
+ this.requireWiki(wikiId, ctx.callerUid);
133
+ const b = requireBody(body);
134
+ const key = b.key;
135
+ if (!key || typeof key !== 'string') {
136
+ throw new ValidationError('API key is required');
137
+ }
138
+ this.auth.setApiKey(wikiId, key);
139
+ this.db.logAudit(wikiId, 'wiki.api_key_set');
140
+ return { status: 200, body: { ok: true } };
141
+ }
142
+ async setCredentials(params, body, ctx) {
143
+ const wikiId = params['id'];
144
+ this.requireWiki(wikiId, ctx.callerUid);
145
+ const b = requireBody(body);
146
+ const credentials = b.credentials;
147
+ if (!credentials || typeof credentials !== 'string') {
148
+ throw new ValidationError('credentials (JSON string) is required');
149
+ }
150
+ // Validate it's actually JSON
151
+ try {
152
+ JSON.parse(credentials);
153
+ }
154
+ catch {
155
+ throw new ValidationError('credentials must be valid JSON');
156
+ }
157
+ this.auth.setCredentials(wikiId, credentials);
158
+ this.db.logAudit(wikiId, 'wiki.credentials_set');
159
+ return { status: 200, body: { ok: true } };
160
+ }
161
+ // ── Jobs ─────────────────────────────────────────────────────────────────
162
+ async submitJob(params, body, ctx) {
163
+ const wikiId = params['id'];
164
+ this.requireWiki(wikiId, ctx.callerUid);
165
+ const b = requireBody(body);
166
+ const type = b.type;
167
+ const payload = b.payload;
168
+ if (!type || !isValidJobType(type)) {
169
+ throw new ValidationError(`Invalid job type '${type}'. Must be one of: ingest, query, lint`);
170
+ }
171
+ const job = this.db.createJob(wikiId, type, payload ?? {});
172
+ this.queue.notify(wikiId);
173
+ this.db.logAudit(wikiId, `job.${type}.submitted`, `job #${job.id}`);
174
+ // If wait mode, poll until job completes
175
+ if (ctx.wait) {
176
+ const result = await this.waitForJob(job.id);
177
+ return { status: 200, body: { ok: true, data: result } };
178
+ }
179
+ return { status: 202, body: { ok: true, data: job } };
180
+ }
181
+ async getJob(params, body, ctx) {
182
+ const wikiId = params['id'];
183
+ this.requireWiki(wikiId, ctx.callerUid);
184
+ const jobId = Number(params['jobId']);
185
+ const job = this.db.getJob(jobId);
186
+ if (!job || job.wiki_id !== wikiId)
187
+ throw new JobNotFoundError(jobId);
188
+ return { status: 200, body: { ok: true, data: job } };
189
+ }
190
+ async listJobs(params, body, ctx) {
191
+ const wikiId = params['id'];
192
+ this.requireWiki(wikiId, ctx.callerUid);
193
+ const jobs = this.db.listJobs(wikiId, { limit: 50 });
194
+ return { status: 200, body: { ok: true, data: jobs } };
195
+ }
196
+ // ── Audit ────────────────────────────────────────────────────────────────
197
+ async getAuditLog(params, body, ctx) {
198
+ const wikiId = params['id'];
199
+ this.requireWiki(wikiId, ctx.callerUid);
200
+ const log = this.db.getAuditLog(wikiId);
201
+ return { status: 200, body: { ok: true, data: log } };
202
+ }
203
+ // ── File upload ──────────────────────────────────────────────────────────
204
+ async receiveFile(params, body, ctx) {
205
+ const wikiId = params['id'];
206
+ this.requireWiki(wikiId, ctx.callerUid);
207
+ const b = requireBody(body);
208
+ const filename = b.filename;
209
+ const content = b.content;
210
+ if (!filename || typeof filename !== 'string' || !content || typeof content !== 'string') {
211
+ throw new ValidationError('filename (string) and content (base64 string) are required');
212
+ }
213
+ const buffer = Buffer.from(content, 'base64');
214
+ const stored = this.scaffold.writeRawFile(wikiId, filename, buffer);
215
+ return { status: 201, body: { ok: true, data: { filename: stored } } };
216
+ }
217
+ // ── Helpers ──────────────────────────────────────────────────────────────
218
+ requireWiki(wikiId, callerUid) {
219
+ const wiki = this.db.getWiki(wikiId);
220
+ if (!wiki)
221
+ throw new WikiNotFoundError(wikiId);
222
+ if (wiki.owner_uid !== callerUid)
223
+ throw new ForbiddenError(wikiId);
224
+ return wiki;
225
+ }
226
+ waitForJob(jobId, timeoutMs = 10 * 60_000) {
227
+ return new Promise((resolve, reject) => {
228
+ const deadline = Date.now() + timeoutMs;
229
+ const check = () => {
230
+ const job = this.db.getJob(jobId);
231
+ if (!job || job.status === 'completed' || job.status === 'failed') {
232
+ resolve(job);
233
+ }
234
+ else if (Date.now() > deadline) {
235
+ resolve(job); // return current state rather than error — client can poll again
236
+ }
237
+ else {
238
+ setTimeout(check, JOB_POLL_INTERVAL_MS);
239
+ }
240
+ };
241
+ check();
242
+ });
243
+ }
244
+ }
245
+ function isValidJobType(type) {
246
+ return type === 'ingest' || type === 'query' || type === 'lint';
247
+ }
248
+ /**
249
+ * Validate that a request body is a non-null object.
250
+ * Throws ValidationError if not.
251
+ */
252
+ function requireBody(body) {
253
+ if (!body || typeof body !== 'object' || Array.isArray(body)) {
254
+ throw new ValidationError('Request body must be a JSON object');
255
+ }
256
+ return body;
257
+ }
258
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/daemon/routes.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzH,OAAO,EACL,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,GACtF,MAAM,kBAAkB,CAAC;AAc1B,MAAM,OAAO,YAAY;IAIb;IACA;IACA;IACA;IACA;IAPF,MAAM,CAAU;IAExB,YACU,EAAY,EACZ,QAAsB,EACtB,SAA2B,EAC3B,KAAmB,EACnB,IAAiB;QAJjB,OAAE,GAAF,EAAE,CAAU;QACZ,aAAQ,GAAR,QAAQ,CAAc;QACtB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAAc;QACnB,SAAI,GAAJ,IAAI,CAAa;QAEzB,IAAI,CAAC,MAAM,GAAG;YACZ,EAAE,MAAM,EAAE,MAAM,EAAI,OAAO,EAAE,WAAW,EAA8B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC3G,EAAE,MAAM,EAAE,KAAK,EAAK,OAAO,EAAE,WAAW,EAA8B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1G,EAAE,MAAM,EAAE,KAAK,EAAK,OAAO,EAAE,yBAAyB,EAAgB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,yBAAyB,EAAgB,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC5G,EAAE,MAAM,EAAE,KAAK,EAAK,OAAO,EAAE,iCAAiC,EAAQ,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7G,EAAE,MAAM,EAAE,MAAM,EAAI,OAAO,EAAE,gCAAgC,EAAS,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1G,EAAE,MAAM,EAAE,MAAM,EAAI,OAAO,EAAE,kCAAkC,EAAO,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1G,EAAE,MAAM,EAAE,MAAM,EAAI,OAAO,EAAE,sCAAsC,EAAG,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC/G,EAAE,MAAM,EAAE,MAAM,EAAI,OAAO,EAAE,+BAA+B,EAAU,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC1G,EAAE,MAAM,EAAE,KAAK,EAAK,OAAO,EAAE,8CAA8C,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC9G,EAAE,MAAM,EAAE,KAAK,EAAK,OAAO,EAAE,+BAA+B,EAAU,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzG,EAAE,MAAM,EAAE,KAAK,EAAK,OAAO,EAAE,+BAA+B,EAAU,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC5G,EAAE,MAAM,EAAE,MAAM,EAAI,OAAO,EAAE,sCAAsC,EAAG,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAC7G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,IAAY,EAAE,IAAa,EAAE,GAAiB;QACzE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;gBAAE,SAAS;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,2EAA2E;IAEnE,KAAK,CAAC,UAAU,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACvF,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,CAAC,EAAwB,CAAC;QACtC,MAAM,IAAI,GAAG,CAAC,CAAC,IAA0B,CAAC;QAE1C,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,eAAe,CACvB,oBAAoB,EAAE,6DAA6D;gBACnF,oCAAoC,CACrC,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QAErC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACtF,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE;SACjE,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACxF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,UAAU,IAAI,IAAI;YACrE,CAAC,CAAC,OAAO,CAAE,IAA8B,CAAC,QAAQ,CAAC;YACnD,CAAC,CAAC,KAAK,CAAC;QAEV,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE3B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACtF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAE7B,iFAAiF;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;YAC5D,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,GAAyB,CAAC;QAChD,IAAI,WAAW,KAAK,SAAS,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACtH,MAAM,IAAI,eAAe,CAAC,wCAAwC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,SAAS,MAAM,WAAW,EAAE,CAAC,CAAC;QAEhF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;IAC5D,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACzF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAe,CAAC;QAE/C,kEAAkE;QAClE,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzC,MAAM,IAAI,eAAe,CAAC,8CAA8C,CAAC,CAAC;YAC5E,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,CAAC,GAAG,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1F,MAAM,IAAI,eAAe,CACvB,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;oBACxC,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxC,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAC9D,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,4BAA4B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAC/F,CAAC;QAED,kCAAkC;QAClC,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,CAAC;QACjD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1E,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,SAAS,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACtF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAyB,CAAC;QACxC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,eAAe,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAE7C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QAC3F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,WAAiC,CAAC;QACxD,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,eAAe,CAAC,uCAAuC,CAAC,CAAC;QACrE,CAAC;QAED,8BAA8B;QAC9B,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CAAC,gCAAgC,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QAEjD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,SAAS,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACtF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAc,CAAC;QAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,OAA6B,CAAC;QAChD,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,eAAe,CAAC,qBAAqB,IAAI,wCAAwC,CAAC,CAAC;QAC/F,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,IAAI,YAAY,EAAE,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAEpE,yCAAyC;QACzC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;QAC3D,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACnF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM;YAAE,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACtE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACrF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IACzD,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,WAAW,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACxF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;IACxD,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,WAAW,CAAC,MAA8B,EAAE,IAAa,EAAE,GAAiB;QACxF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,CAAC,CAAC,QAA8B,CAAC;QAClD,MAAM,OAAO,GAAG,CAAC,CAAC,OAA6B,CAAC;QAChD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzF,MAAM,IAAI,eAAe,CAAC,4DAA4D,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEpE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACzE,CAAC;IAED,4EAA4E;IAEpE,WAAW,CAAC,MAAc,EAAE,SAAiB;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;YAAE,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,UAAU,CAAC,KAAa,EAAE,YAAoB,EAAE,GAAG,MAAM;QAC/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,MAAM,KAAK,GAAG,GAAG,EAAE;gBACjB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAClE,OAAO,CAAC,GAAG,CAAC,CAAC;gBACf,CAAC;qBAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,iEAAiE;gBACjF,CAAC;qBAAM,CAAC;oBACN,UAAU,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC,CAAC;YACF,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAa;IAChC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,eAAe,CAAC,oCAAoC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAA+B,CAAC;AACzC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { NamespaceManager } from './namespace.js';
2
+ import type { AuthManager } from './auth.js';
3
+ import type { Database } from './db.js';
4
+ import type { QueueJob, JobResult } from '../lib/types.js';
5
+ export declare class ClaudeRunner {
6
+ private namespace;
7
+ private auth;
8
+ private db;
9
+ private wikisDir;
10
+ private active;
11
+ constructor(namespace: NamespaceManager, auth: AuthManager, db: Database, wikisDir: string);
12
+ run(job: QueueJob): Promise<JobResult>;
13
+ /**
14
+ * Kill an active job's process. Used during graceful shutdown.
15
+ */
16
+ kill(jobId: number): void;
17
+ /**
18
+ * Kill all active processes. Used during daemon shutdown.
19
+ */
20
+ killAll(): void;
21
+ get activeCount(): number;
22
+ private buildPrompt;
23
+ private resolveTools;
24
+ private buildClaudeArgs;
25
+ }