botnote 0.1.56 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/cli.js +21 -8
  2. package/dist/cli.js.map +1 -1
  3. package/dist/db/client.d.ts +4 -0
  4. package/dist/db/client.js.map +1 -1
  5. package/dist/db/migrations/0029_drop_global_uniques.sql +38 -0
  6. package/dist/db/schema.d.ts +4 -4
  7. package/dist/db/schema.js +6 -6
  8. package/dist/db/schema.js.map +1 -1
  9. package/dist/rest/routes.js +58 -58
  10. package/dist/rest/routes.js.map +1 -1
  11. package/dist/rest/server.d.ts +11 -1
  12. package/dist/rest/server.js +19 -3
  13. package/dist/rest/server.js.map +1 -1
  14. package/dist/service/embedding.d.ts +5 -0
  15. package/dist/service/embedding.js +6 -1
  16. package/dist/service/embedding.js.map +1 -1
  17. package/dist/service/embedding_settings.d.ts +4 -3
  18. package/dist/service/embedding_settings.js +13 -16
  19. package/dist/service/embedding_settings.js.map +1 -1
  20. package/dist/service/entities.d.ts +29 -20
  21. package/dist/service/entities.js +101 -60
  22. package/dist/service/entities.js.map +1 -1
  23. package/dist/service/feedback.d.ts +3 -2
  24. package/dist/service/feedback.js +8 -4
  25. package/dist/service/feedback.js.map +1 -1
  26. package/dist/service/locks.d.ts +25 -0
  27. package/dist/service/locks.js +34 -0
  28. package/dist/service/locks.js.map +1 -0
  29. package/dist/service/opening_brief.d.ts +2 -1
  30. package/dist/service/opening_brief.js +6 -7
  31. package/dist/service/opening_brief.js.map +1 -1
  32. package/dist/service/projects.d.ts +6 -5
  33. package/dist/service/projects.js +25 -13
  34. package/dist/service/projects.js.map +1 -1
  35. package/dist/service/recurrence.d.ts +16 -6
  36. package/dist/service/recurrence.js +102 -53
  37. package/dist/service/recurrence.js.map +1 -1
  38. package/dist/service/scope.d.ts +14 -0
  39. package/dist/service/scope.js +19 -0
  40. package/dist/service/scope.js.map +1 -0
  41. package/dist/service/search.d.ts +3 -2
  42. package/dist/service/search.js +12 -9
  43. package/dist/service/search.js.map +1 -1
  44. package/dist/service/sessions.d.ts +7 -8
  45. package/dist/service/sessions.js +8 -8
  46. package/dist/service/sessions.js.map +1 -1
  47. package/dist/service/tasks.d.ts +5 -1
  48. package/dist/service/tasks.js +17 -22
  49. package/dist/service/tasks.js.map +1 -1
  50. package/dist/service/tokens.d.ts +7 -6
  51. package/dist/service/tokens.js +17 -10
  52. package/dist/service/tokens.js.map +1 -1
  53. package/dist/service/workspace_settings.d.ts +3 -2
  54. package/dist/service/workspace_settings.js +11 -15
  55. package/dist/service/workspace_settings.js.map +1 -1
  56. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ import type { Database } from "../db/client.js";
2
+ /**
3
+ * The tenant boundary every service call runs under. Single-user builds use
4
+ * DEFAULT_SCOPE for everything; the hosted build resolves it per request from
5
+ * the token or session. Service functions take it as their first argument and
6
+ * MUST filter every read and stamp every write with it.
7
+ */
8
+ export interface Scope {
9
+ workspaceId: string;
10
+ }
11
+ export declare const DEFAULT_SCOPE: Scope;
12
+ export declare function scopeFor(workspaceId: string): Scope;
13
+ /** Verify the default workspace row exists (migration 0028 seeds it). */
14
+ export declare function resolveDefaultScope(db: Database["db"]): Promise<Scope>;
@@ -0,0 +1,19 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { DEFAULT_WORKSPACE_ID, workspaces } from "../db/schema.js";
3
+ export const DEFAULT_SCOPE = Object.freeze({ workspaceId: DEFAULT_WORKSPACE_ID });
4
+ export function scopeFor(workspaceId) {
5
+ return { workspaceId };
6
+ }
7
+ /** Verify the default workspace row exists (migration 0028 seeds it). */
8
+ export async function resolveDefaultScope(db) {
9
+ const rows = await db
10
+ .select({ id: workspaces.id })
11
+ .from(workspaces)
12
+ .where(eq(workspaces.id, DEFAULT_WORKSPACE_ID))
13
+ .limit(1);
14
+ if (!rows[0]) {
15
+ throw new Error(`default workspace ${DEFAULT_WORKSPACE_ID} missing; run migrations before starting the daemon`);
16
+ }
17
+ return DEFAULT_SCOPE;
18
+ }
19
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/service/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAYnE,MAAM,CAAC,MAAM,aAAa,GAAU,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC;AAEzF,MAAM,UAAU,QAAQ,CAAC,WAAmB;IAC1C,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAkB;IAC1D,MAAM,IAAI,GAAG,MAAM,EAAE;SAClB,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC;SAC7B,IAAI,CAAC,UAAU,CAAC;SAChB,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;SAC9C,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,qBAAqB,oBAAoB,qDAAqD,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { Database } from "../db/client.js";
2
2
  import { type Entity } from "../db/schema.js";
3
+ import type { Scope } from "./scope.js";
3
4
  import type { SearchInput } from "./types.js";
4
5
  export interface SearchHit {
5
6
  entity: Entity;
@@ -13,7 +14,7 @@ export interface SearchHit {
13
14
  /** True when another entity supersedes this one (score multiplied down). */
14
15
  superseded?: boolean;
15
16
  }
16
- export declare function search(db: Database["db"], input: SearchInput, opts?: {
17
+ export declare function search(scope: Scope, db: Database["db"], input: SearchInput, opts?: {
17
18
  queryEmbedding?: number[];
18
19
  }): Promise<SearchHit[]>;
19
20
  /**
@@ -21,7 +22,7 @@ export declare function search(db: Database["db"], input: SearchInput, opts?: {
21
22
  * to hint the caller that a similar memory may already exist. Queries with
22
23
  * the note's label line (title or first body line) so tsquery stays short.
23
24
  */
24
- export declare function findSimilar(db: Database["db"], opts: {
25
+ export declare function findSimilar(scope: Scope, db: Database["db"], opts: {
25
26
  title?: string | null;
26
27
  body: string;
27
28
  projectId?: string | null;
@@ -22,7 +22,8 @@ function rrfScore(rank) {
22
22
  return 0;
23
23
  return 1 / (RRF_K + rank);
24
24
  }
25
- export async function search(db, input, opts = {}) {
25
+ export async function search(scope, db, input, opts = {}) {
26
+ const wsFilter = sql `AND workspace_id = ${scope.workspaceId}::uuid`;
26
27
  const projectFilter = input.projectId
27
28
  ? sql `AND project_id = ${input.projectId}::uuid`
28
29
  : sql ``;
@@ -30,14 +31,16 @@ export async function search(db, input, opts = {}) {
30
31
  const activeProjectFilter = input.projectId
31
32
  ? sql ``
32
33
  : sql `AND (project_id IS NULL OR project_id IN (
33
- SELECT id FROM projects WHERE status <> 'archived'
34
+ SELECT id FROM projects
35
+ WHERE status <> 'archived' AND workspace_id = ${scope.workspaceId}::uuid
34
36
  ))`;
35
37
  const notTrashed = sql `AND deleted_at IS NULL`;
38
+ const commonFilter = sql `${wsFilter} ${projectFilter} ${kindFilter} ${activeProjectFilter} ${notTrashed}`;
36
39
  const fetchN = Math.max(input.limit * 4, 40);
37
40
  const bm25Rows = (await db.execute(sql `
38
41
  SELECT id, ROW_NUMBER() OVER (ORDER BY ts_rank_cd(body_tsv, q) DESC) AS rank_pos
39
42
  FROM entities, websearch_to_tsquery('simple', ${input.query}) q
40
- WHERE body_tsv @@ q ${projectFilter} ${kindFilter} ${activeProjectFilter} ${notTrashed}
43
+ WHERE body_tsv @@ q ${commonFilter}
41
44
  ORDER BY ts_rank_cd(body_tsv, q) DESC
42
45
  LIMIT ${fetchN}
43
46
  `)).rows;
@@ -47,7 +50,7 @@ export async function search(db, input, opts = {}) {
47
50
  ROW_NUMBER() OVER (ORDER BY created_at DESC) AS rank_pos
48
51
  FROM entities
49
52
  WHERE (title ILIKE ${`%${input.query}%`} OR body ILIKE ${`%${input.query}%`})
50
- ${projectFilter} ${kindFilter} ${activeProjectFilter} ${notTrashed}
53
+ ${commonFilter}
51
54
  LIMIT ${fetchN}
52
55
  `)).rows
53
56
  : [];
@@ -57,7 +60,7 @@ export async function search(db, input, opts = {}) {
57
60
  vecRows = (await db.execute(sql `
58
61
  SELECT id, ROW_NUMBER() OVER (ORDER BY body_vec <=> ${vecLiteral}::vector) AS rank_pos
59
62
  FROM entities
60
- WHERE body_vec IS NOT NULL ${projectFilter} ${kindFilter} ${activeProjectFilter} ${notTrashed}
63
+ WHERE body_vec IS NOT NULL ${commonFilter}
61
64
  ORDER BY body_vec <=> ${vecLiteral}::vector
62
65
  LIMIT ${fetchN}
63
66
  `)).rows;
@@ -65,7 +68,7 @@ export async function search(db, input, opts = {}) {
65
68
  const timeRows = (await db.execute(sql `
66
69
  SELECT id, ROW_NUMBER() OVER (ORDER BY created_at DESC) AS rank_pos
67
70
  FROM entities
68
- WHERE 1=1 ${projectFilter} ${kindFilter} ${activeProjectFilter} ${notTrashed}
71
+ WHERE 1=1 ${commonFilter}
69
72
  ORDER BY created_at DESC
70
73
  LIMIT ${fetchN}
71
74
  `)).rows;
@@ -86,7 +89,7 @@ export async function search(db, input, opts = {}) {
86
89
  const entitiesRows = await db
87
90
  .select()
88
91
  .from(entitiesTable)
89
- .where(inArray(entitiesTable.id, idArr));
92
+ .where(and(eq(entitiesTable.workspaceId, scope.workspaceId), inArray(entitiesTable.id, idArr)));
90
93
  const entityMap = new Map();
91
94
  for (const r of entitiesRows)
92
95
  entityMap.set(r.id, r);
@@ -132,12 +135,12 @@ const SIMILAR_MIN_SCORE = 0.015;
132
135
  * to hint the caller that a similar memory may already exist. Queries with
133
136
  * the note's label line (title or first body line) so tsquery stays short.
134
137
  */
135
- export async function findSimilar(db, opts) {
138
+ export async function findSimilar(scope, db, opts) {
136
139
  const label = (opts.title ?? opts.body.split("\n")[0] ?? "").trim().slice(0, 200);
137
140
  if (!label)
138
141
  return [];
139
142
  const limit = opts.limit ?? 3;
140
- const hits = await search(db, { query: label, projectId: opts.projectId ?? null, kind: "note", limit: limit + 1 }, opts.queryEmbedding ? { queryEmbedding: opts.queryEmbedding } : {});
143
+ const hits = await search(scope, db, { query: label, projectId: opts.projectId ?? null, kind: "note", limit: limit + 1 }, opts.queryEmbedding ? { queryEmbedding: opts.queryEmbedding } : {});
141
144
  return hits
142
145
  .filter((h) => h.entity.id !== opts.excludeId && !h.superseded && h.score >= SIMILAR_MIN_SCORE)
143
146
  .slice(0, limit);
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/service/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/service/search.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { sql } from "drizzle-orm";
2
1
  import type { Database } from "../db/client.js";
3
2
  import { type Session } from "../db/schema.js";
3
+ import type { Scope } from "./scope.js";
4
4
  /** Verify a candidate master password against BOTNOTE_PASSWORD env. Returns
5
5
  * false (not throws) when the env is unset, so callers can degrade safely. */
6
6
  export declare function verifyMasterPassword(candidate: string): boolean;
@@ -8,18 +8,17 @@ export interface CreatedSession {
8
8
  session: Session;
9
9
  plaintext: string;
10
10
  }
11
- export declare function createSession(db: Database["db"], opts?: {
11
+ export declare function createSession(scope: Scope, db: Database["db"], opts?: {
12
12
  userAgent?: string | null;
13
13
  ttlDays?: number;
14
14
  }): Promise<CreatedSession>;
15
15
  /** Look up a session by cookie plaintext. Returns the row if it exists and
16
- * has not expired; otherwise null. Bumps last_used_at on hit. */
16
+ * has not expired; otherwise null. Bumps last_used_at on hit. Unscoped by
17
+ * design: the row's workspaceId becomes the request Scope. */
17
18
  export declare function consumeSession(db: Database["db"], plaintext: string): Promise<Session | null>;
18
19
  /** Revoke a single session by cookie plaintext. No-op when the cookie does
19
- * not match any row. */
20
+ * not match any row. The plaintext is the credential, so no scope is needed. */
20
21
  export declare function revokeSession(db: Database["db"], plaintext: string): Promise<boolean>;
21
- /** Periodic cleanup — called on daemon start. Deletes expired rows so the
22
- * table doesn't bloat over months. */
22
+ /** Daemon-level maintenance across all workspaces: deletes expired rows so
23
+ * the table doesn't bloat over months. */
23
24
  export declare function pruneExpiredSessions(db: Database["db"]): Promise<number>;
24
- /** Drizzle helper to noop a linter complaint when sql is unused. */
25
- export declare const _sql: typeof sql;
@@ -1,5 +1,5 @@
1
1
  import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
- import { and, eq, gt, lt, sql } from "drizzle-orm";
2
+ import { and, eq, gt, lt } from "drizzle-orm";
3
3
  import { sessions } from "../db/schema.js";
4
4
  const DEFAULT_TTL_DAYS = 30;
5
5
  function hashToken(plaintext) {
@@ -30,7 +30,7 @@ export function verifyMasterPassword(candidate) {
30
30
  return false;
31
31
  return constantTimeEqual(candidate, expected);
32
32
  }
33
- export async function createSession(db, opts = {}) {
33
+ export async function createSession(scope, db, opts = {}) {
34
34
  const ttlDays = opts.ttlDays ?? DEFAULT_TTL_DAYS;
35
35
  const plaintext = randomBytes(32).toString("hex");
36
36
  const tokenHash = hashToken(plaintext);
@@ -38,6 +38,7 @@ export async function createSession(db, opts = {}) {
38
38
  const [row] = await db
39
39
  .insert(sessions)
40
40
  .values({
41
+ workspaceId: scope.workspaceId,
41
42
  tokenHash,
42
43
  expiresAt,
43
44
  userAgent: opts.userAgent ?? null
@@ -46,7 +47,8 @@ export async function createSession(db, opts = {}) {
46
47
  return { session: row, plaintext };
47
48
  }
48
49
  /** Look up a session by cookie plaintext. Returns the row if it exists and
49
- * has not expired; otherwise null. Bumps last_used_at on hit. */
50
+ * has not expired; otherwise null. Bumps last_used_at on hit. Unscoped by
51
+ * design: the row's workspaceId becomes the request Scope. */
50
52
  export async function consumeSession(db, plaintext) {
51
53
  if (typeof plaintext !== "string" || plaintext.length === 0)
52
54
  return null;
@@ -66,7 +68,7 @@ export async function consumeSession(db, plaintext) {
66
68
  return row;
67
69
  }
68
70
  /** Revoke a single session by cookie plaintext. No-op when the cookie does
69
- * not match any row. */
71
+ * not match any row. The plaintext is the credential, so no scope is needed. */
70
72
  export async function revokeSession(db, plaintext) {
71
73
  if (typeof plaintext !== "string" || plaintext.length === 0)
72
74
  return false;
@@ -77,13 +79,11 @@ export async function revokeSession(db, plaintext) {
77
79
  const r = result;
78
80
  return r.rowCount === undefined ? true : r.rowCount > 0;
79
81
  }
80
- /** Periodic cleanup — called on daemon start. Deletes expired rows so the
81
- * table doesn't bloat over months. */
82
+ /** Daemon-level maintenance across all workspaces: deletes expired rows so
83
+ * the table doesn't bloat over months. */
82
84
  export async function pruneExpiredSessions(db) {
83
85
  const result = await db.delete(sessions).where(lt(sessions.expiresAt, new Date()));
84
86
  const r = result;
85
87
  return r.rowCount ?? 0;
86
88
  }
87
- /** Drizzle helper to noop a linter complaint when sql is unused. */
88
- export const _sql = sql;
89
89
  //# sourceMappingURL=sessions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/service/sessions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/service/sessions.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { Database } from "../db/client.js";
2
2
  import { type Entity } from "../db/schema.js";
3
+ import type { Scope } from "./scope.js";
3
4
  import type { TasksRangeInput } from "./types.js";
4
5
  export interface VirtualOccurrence {
5
6
  virtual: true;
@@ -23,6 +24,9 @@ export interface TasksRangeResult {
23
24
  }
24
25
  /**
25
26
  * Tasks in a date range, split into scheduled / overdue / backlog buckets.
27
+ * Pure read: recurring occurrences are materialized by the daemon scheduler
28
+ * (startup pass + interval), never from this path, so concurrent polls from
29
+ * several UI tabs and agents cannot race on rule advancement.
26
30
  *
27
31
  * Each task has a "display date" that decides where it lands on the calendar:
28
32
  * - status='done' → completedAt (when actually finished)
@@ -35,4 +39,4 @@ export interface TasksRangeResult {
35
39
  * when no range start is supplied), so a task scheduled inside the active day
36
40
  * cannot also appear in the overdue alert.
37
41
  */
38
- export declare function tasksRange(db: Database["db"], input: TasksRangeInput): Promise<TasksRangeResult>;
42
+ export declare function tasksRange(scope: Scope, db: Database["db"], input: TasksRangeInput): Promise<TasksRangeResult>;
@@ -1,22 +1,11 @@
1
1
  import { and, asc, desc, eq, gte, inArray, isNotNull, isNull, lt, lte, ne, or, sql } from "drizzle-orm";
2
2
  import { entities, recurrenceExceptions, recurrenceRules } from "../db/schema.js";
3
- import { buildRRule, materializeScheduledRecurrences, normalizeOccurrenceDueAt } from "./recurrence.js";
4
- function endOfToday(now) {
5
- const end = new Date(now);
6
- end.setHours(23, 59, 59, 999);
7
- return end;
8
- }
9
- function materializationHorizon(input, now) {
10
- const todayEnd = endOfToday(now);
11
- if (!input.to)
12
- return todayEnd;
13
- const requestedEnd = new Date(input.to);
14
- if (Number.isNaN(requestedEnd.getTime()))
15
- return todayEnd;
16
- return requestedEnd.getTime() < todayEnd.getTime() ? requestedEnd : todayEnd;
17
- }
3
+ import { buildRRule, normalizeOccurrenceDueAt } from "./recurrence.js";
18
4
  /**
19
5
  * Tasks in a date range, split into scheduled / overdue / backlog buckets.
6
+ * Pure read: recurring occurrences are materialized by the daemon scheduler
7
+ * (startup pass + interval), never from this path, so concurrent polls from
8
+ * several UI tabs and agents cannot race on rule advancement.
20
9
  *
21
10
  * Each task has a "display date" that decides where it lands on the calendar:
22
11
  * - status='done' → completedAt (when actually finished)
@@ -29,16 +18,17 @@ function materializationHorizon(input, now) {
29
18
  * when no range start is supplied), so a task scheduled inside the active day
30
19
  * cannot also appear in the overdue alert.
31
20
  */
32
- export async function tasksRange(db, input) {
21
+ export async function tasksRange(scope, db, input) {
33
22
  const now = new Date();
34
- await materializeScheduledRecurrences(db, materializationHorizon(input, now));
23
+ const inWorkspace = eq(entities.workspaceId, scope.workspaceId);
35
24
  const projectFilter = input.projectIds?.length
36
25
  ? inArray(entities.projectId, input.projectIds)
37
26
  : undefined;
38
27
  const activeProjectFilter = projectFilter
39
28
  ? undefined
40
29
  : sql `(${entities.projectId} IS NULL OR ${entities.projectId} IN (
41
- SELECT id FROM projects WHERE status <> 'archived'
30
+ SELECT id FROM projects
31
+ WHERE status <> 'archived' AND workspace_id = ${scope.workspaceId}::uuid
42
32
  ))`;
43
33
  const notStatus = (status) => or(ne(entities.status, status), isNull(entities.status));
44
34
  // Base filter applied to every bucket: only tasks, optional project filter,
@@ -46,6 +36,7 @@ export async function tasksRange(db, input) {
46
36
  // includeDone means "show completion history", not "show abandoned work",
47
37
  // and a cancelled task with a leftover dueAt is not scheduled for anything.
48
38
  const baseConds = [
39
+ inWorkspace,
49
40
  eq(entities.kind, "task"),
50
41
  isNull(entities.deletedAt),
51
42
  notStatus("rejected"),
@@ -87,6 +78,7 @@ export async function tasksRange(db, input) {
87
78
  let doneByCompleted = [];
88
79
  if (input.includeDone) {
89
80
  const doneByCompletedConds = [
81
+ inWorkspace,
90
82
  eq(entities.kind, "task"),
91
83
  isNull(entities.deletedAt),
92
84
  eq(entities.status, "done"),
@@ -103,6 +95,7 @@ export async function tasksRange(db, input) {
103
95
  .where(and(...doneByCompletedConds))
104
96
  .orderBy(asc(entities.completedAt));
105
97
  const legacyDoneConds = [
98
+ inWorkspace,
106
99
  eq(entities.kind, "task"),
107
100
  isNull(entities.deletedAt),
108
101
  eq(entities.status, "done"),
@@ -127,6 +120,7 @@ export async function tasksRange(db, input) {
127
120
  (!input.to || now < new Date(input.to));
128
121
  if (todayInRange) {
129
122
  const ipConds = [
123
+ inWorkspace,
130
124
  eq(entities.kind, "task"),
131
125
  isNull(entities.deletedAt),
132
126
  eq(entities.status, "in_progress")
@@ -156,6 +150,7 @@ export async function tasksRange(db, input) {
156
150
  // later in the same day.
157
151
  const overdueCutoff = input.from ?? now;
158
152
  const overdueConds = [
153
+ inWorkspace,
159
154
  eq(entities.kind, "task"),
160
155
  isNull(entities.deletedAt),
161
156
  isNotNull(entities.dueAt),
@@ -183,7 +178,7 @@ export async function tasksRange(db, input) {
183
178
  .orderBy(desc(entities.createdAt))
184
179
  .limit(200);
185
180
  }
186
- const virtualOccurrences = await expandVirtualOccurrences(db, input, scheduled);
181
+ const virtualOccurrences = await expandVirtualOccurrences(scope, db, input, scheduled);
187
182
  return { scheduled, overdue, backlog, virtualOccurrences };
188
183
  }
189
184
  /**
@@ -195,7 +190,7 @@ export async function tasksRange(db, input) {
195
190
  * The window is clamped to [max(input.from, now), input.to) so only strictly
196
191
  * future ghosts are returned.
197
192
  */
198
- async function expandVirtualOccurrences(db, input, realScheduled) {
193
+ async function expandVirtualOccurrences(scope, db, input, realScheduled) {
199
194
  // Guard: feature must be explicitly requested and a horizon must be present.
200
195
  if (!input.includeVirtualRecurrences || !input.to)
201
196
  return [];
@@ -208,7 +203,7 @@ async function expandVirtualOccurrences(db, input, realScheduled) {
208
203
  const candidateRules = await db
209
204
  .select()
210
205
  .from(recurrenceRules)
211
- .where(and(eq(recurrenceRules.enabled, true), eq(recurrenceRules.anchor, "scheduled"), lte(recurrenceRules.dtstart, windowEnd), or(isNull(recurrenceRules.endedAt),
206
+ .where(and(eq(recurrenceRules.workspaceId, scope.workspaceId), eq(recurrenceRules.enabled, true), eq(recurrenceRules.anchor, "scheduled"), lte(recurrenceRules.dtstart, windowEnd), or(isNull(recurrenceRules.endedAt),
212
207
  // endedAt >= windowStart means rule may still have occurrences in window
213
208
  gte(recurrenceRules.endedAt, windowStart))));
214
209
  if (candidateRules.length === 0)
@@ -220,7 +215,7 @@ async function expandVirtualOccurrences(db, input, realScheduled) {
220
215
  const displaySourceRows = await db
221
216
  .select()
222
217
  .from(entities)
223
- .where(inArray(entities.id, uniqueDisplaySourceIds));
218
+ .where(and(eq(entities.workspaceId, scope.workspaceId), inArray(entities.id, uniqueDisplaySourceIds)));
224
219
  const displaySourceById = new Map(displaySourceRows.map((e) => [e.id, e]));
225
220
  // --- Query 3: batch-fetch this-only baselines for display sources ---
226
221
  // These are 'modified' exceptions where the baseline records what the
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/service/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/service/tasks.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,19 @@
1
1
  import type { Database } from "../db/client.js";
2
2
  import { type Token } from "../db/schema.js";
3
+ import type { Scope } from "./scope.js";
3
4
  export interface CreatedToken {
4
5
  token: Token;
5
6
  /** The recoverable plaintext token. NULL only for tokens created before 0014. */
6
7
  plaintext: string;
7
8
  }
8
- export declare function createToken(db: Database["db"], input: {
9
+ export declare function createToken(scope: Scope, db: Database["db"], input: {
9
10
  name: string;
10
11
  }): Promise<CreatedToken>;
11
- export declare function listTokens(db: Database["db"]): Promise<Token[]>;
12
- export declare function revokeToken(db: Database["db"], id: string): Promise<boolean>;
12
+ export declare function listTokens(scope: Scope, db: Database["db"]): Promise<Token[]>;
13
+ export declare function revokeToken(scope: Scope, db: Database["db"], id: string): Promise<boolean>;
13
14
  /**
14
- * Look up a token by its plaintext. Returns null if not found.
15
- * Bumps last_used_at on success. Not currently called by middleware; reserved
16
- * for when auth enforcement is enabled.
15
+ * Look up a token by its plaintext. Returns null if not found. Bumps
16
+ * last_used_at on success. Unscoped by design: the returned row's workspaceId
17
+ * is what the transport turns into the request Scope.
17
18
  */
18
19
  export declare function consumeToken(db: Database["db"], plaintext: string): Promise<Token | null>;
@@ -1,33 +1,40 @@
1
1
  import { createHash, randomBytes } from "node:crypto";
2
- import { desc, eq } from "drizzle-orm";
2
+ import { and, desc, eq } from "drizzle-orm";
3
3
  import { tokens } from "../db/schema.js";
4
4
  const TOKEN_PREFIX = "bn_";
5
5
  function sha256(input) {
6
6
  return createHash("sha256").update(input).digest("hex");
7
7
  }
8
- export async function createToken(db, input) {
8
+ export async function createToken(scope, db, input) {
9
9
  const plaintext = `${TOKEN_PREFIX}${randomBytes(24).toString("hex")}`;
10
10
  const tokenHash = sha256(plaintext);
11
11
  const prefix = plaintext.slice(0, 11); // bn_ + first 8 hex
12
12
  const [row] = await db
13
13
  .insert(tokens)
14
- .values({ name: input.name, tokenHash, prefix, plaintext })
14
+ .values({ workspaceId: scope.workspaceId, name: input.name, tokenHash, prefix, plaintext })
15
15
  .returning();
16
16
  if (!row)
17
17
  throw new Error("token insert returned no row");
18
18
  return { token: row, plaintext };
19
19
  }
20
- export async function listTokens(db) {
21
- return db.select().from(tokens).orderBy(desc(tokens.createdAt));
20
+ export async function listTokens(scope, db) {
21
+ return db
22
+ .select()
23
+ .from(tokens)
24
+ .where(eq(tokens.workspaceId, scope.workspaceId))
25
+ .orderBy(desc(tokens.createdAt));
22
26
  }
23
- export async function revokeToken(db, id) {
24
- const res = await db.delete(tokens).where(eq(tokens.id, id)).returning({ id: tokens.id });
27
+ export async function revokeToken(scope, db, id) {
28
+ const res = await db
29
+ .delete(tokens)
30
+ .where(and(eq(tokens.id, id), eq(tokens.workspaceId, scope.workspaceId)))
31
+ .returning({ id: tokens.id });
25
32
  return res.length > 0;
26
33
  }
27
34
  /**
28
- * Look up a token by its plaintext. Returns null if not found.
29
- * Bumps last_used_at on success. Not currently called by middleware; reserved
30
- * for when auth enforcement is enabled.
35
+ * Look up a token by its plaintext. Returns null if not found. Bumps
36
+ * last_used_at on success. Unscoped by design: the returned row's workspaceId
37
+ * is what the transport turns into the request Scope.
31
38
  */
32
39
  export async function consumeToken(db, plaintext) {
33
40
  const tokenHash = sha256(plaintext);
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/service/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,MAAM,EAAc,MAAM,iBAAiB,CAAC;AAErD,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAkB,EAClB,KAAuB;IAEvB,MAAM,SAAS,GAAG,GAAG,YAAY,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB;IAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE;SACnB,MAAM,CAAC,MAAM,CAAC;SACd,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;SAC1D,SAAS,EAAE,CAAC;IACf,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAkB;IACjD,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAkB,EAAE,EAAU;IAC9D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAkB,EAClB,SAAiB;IAEjB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/service/tokens.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import type { Database } from "../db/client.js";
2
2
  import { type WorkspaceSettings } from "../db/schema.js";
3
+ import type { Scope } from "./scope.js";
3
4
  import type { UpdateWorkspaceSettingsInput } from "./types.js";
4
5
  export declare const WORKSPACE_SETTINGS_ID = "default";
5
6
  export declare const DEFAULT_WORKSPACE_TIMEZONE = "UTC";
6
7
  export declare function isValidTimezone(tz: string): boolean;
7
- export declare function getWorkspaceSettings(db: Database["db"]): Promise<WorkspaceSettings>;
8
- export declare function updateWorkspaceSettings(db: Database["db"], input: UpdateWorkspaceSettingsInput): Promise<WorkspaceSettings>;
8
+ export declare function getWorkspaceSettings(scope: Scope, db: Database["db"]): Promise<WorkspaceSettings>;
9
+ export declare function updateWorkspaceSettings(scope: Scope, db: Database["db"], input: UpdateWorkspaceSettingsInput): Promise<WorkspaceSettings>;