@plandesk/api 1.0.0-beta.8 → 1.0.2

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 (57) hide show
  1. package/dist/agent-keys.d.ts +26 -2
  2. package/dist/agent-keys.js +22 -2
  3. package/dist/auth-context.d.ts +17 -1
  4. package/dist/auth.d.ts +10 -0
  5. package/dist/auth.js +25 -6
  6. package/dist/better-auth.js +4 -3
  7. package/dist/identity.d.ts +34 -0
  8. package/dist/identity.js +190 -1
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js +2 -2
  11. package/dist/invitations.d.ts +13 -2
  12. package/dist/invitations.js +14 -2
  13. package/dist/organizations.d.ts +3 -0
  14. package/dist/organizations.js +18 -0
  15. package/dist/projection.d.ts +28 -0
  16. package/dist/projection.js +29 -1
  17. package/dist/routes/auth.js +21 -5
  18. package/dist/routes/comments.js +3 -1
  19. package/dist/routes/orgs.js +139 -24
  20. package/dist/routes/projects.js +36 -5
  21. package/dist/routes/shares.js +32 -0
  22. package/dist/routes/tasks.js +3 -0
  23. package/dist/serialize.d.ts +2 -0
  24. package/dist/serialize.js +1 -0
  25. package/dist/server.js +9 -6
  26. package/dist/services/agent-runs.js +18 -0
  27. package/dist/services/artifacts.js +18 -0
  28. package/dist/services/canvas.js +9 -0
  29. package/dist/services/comments.js +63 -13
  30. package/dist/services/documents.js +36 -0
  31. package/dist/services/files.js +19 -1
  32. package/dist/services/folders.js +27 -0
  33. package/dist/services/goals.js +45 -0
  34. package/dist/services/index.d.ts +3 -0
  35. package/dist/services/index.js +1 -1
  36. package/dist/services/notes.js +27 -0
  37. package/dist/services/projects.d.ts +27 -0
  38. package/dist/services/projects.js +113 -4
  39. package/dist/services/scope.d.ts +4 -0
  40. package/dist/services/scope.js +22 -0
  41. package/dist/services/share.d.ts +25 -3
  42. package/dist/services/share.js +160 -9
  43. package/dist/services/sync.d.ts +1 -1
  44. package/dist/services/sync.js +52 -1
  45. package/dist/services/tags.js +18 -0
  46. package/dist/services/tasks.d.ts +1 -1
  47. package/dist/services/tasks.js +22 -0
  48. package/dist/test-helpers.d.ts +1 -0
  49. package/dist/test-helpers.js +14 -0
  50. package/dist/vercel.js +9 -1
  51. package/dist/worker.js +1 -1
  52. package/package.json +3 -3
  53. package/web/assets/index-BBNvafSX.js +358 -0
  54. package/web/assets/index-BqoMRSUH.css +2 -0
  55. package/web/index.html +2 -2
  56. package/web/assets/index-aQ0kLFAX.js +0 -358
  57. package/web/assets/index-nXT4L9C-.css +0 -2
@@ -109,7 +109,7 @@ export declare function createTaskService(deps: TaskServiceDeps): {
109
109
  updated_at: string;
110
110
  } | undefined>;
111
111
  delete(id: string): Promise<boolean>;
112
- claim(taskId: string, agentRef: string): Promise<ClaimTaskResult>;
112
+ claim(taskId: string, agentRef: string): Promise<ClaimTaskResult | undefined>;
113
113
  nextActionable(projectId: string, filter?: {
114
114
  goalId?: string;
115
115
  tags?: string[];
@@ -43,6 +43,15 @@ export function createTaskService(deps) {
43
43
  if (!task) {
44
44
  return undefined;
45
45
  }
46
+ try {
47
+ await assertProjectInOrg(db, task.projectId, resolveOrgId(deps));
48
+ }
49
+ catch (error) {
50
+ if (error instanceof ProjectNotInOrgError) {
51
+ return undefined;
52
+ }
53
+ throw error;
54
+ }
46
55
  return serializeTask(task, await listTagsForTask(db, id));
47
56
  },
48
57
  async listByProject(projectId, filter = {}, pagination = {}) {
@@ -166,6 +175,19 @@ export function createTaskService(deps) {
166
175
  },
167
176
  async claim(taskId, agentRef) {
168
177
  assertPermission(deps, 'task', 'update');
178
+ const existing = await getTask(db, taskId);
179
+ if (!existing) {
180
+ return undefined;
181
+ }
182
+ try {
183
+ await assertProjectInOrg(db, existing.projectId, resolveOrgId(deps));
184
+ }
185
+ catch (error) {
186
+ if (error instanceof ProjectNotInOrgError) {
187
+ return undefined;
188
+ }
189
+ throw error;
190
+ }
169
191
  const row = await claimTask(db, taskId, resolveOrgId(deps), agentRef);
170
192
  if (!row) {
171
193
  return { claimed: false, reason: 'taken_or_not_actionable' };
@@ -16,6 +16,7 @@ type ProjectResponse = {
16
16
  id: string;
17
17
  name: string;
18
18
  description: string | null;
19
+ workspace_id: string;
19
20
  created_at: string;
20
21
  updated_at: string;
21
22
  };
@@ -1,15 +1,29 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { createDb, DEFAULT_ORG_ID, migrate } from '@plandesk/db';
3
3
  import { createApp } from './server.js';
4
+ import { createBetterAuth, runBetterAuthMigrations } from './better-auth.js';
5
+ import { ensureLocalBetterAuthOrganization } from './identity.js';
6
+ const TEST_SECRET = 'test-secret-not-a-real-one-0123456789abcdef';
7
+ const TEST_BASE_URL = 'http://localhost:3000';
4
8
  export async function createTestApp(opts) {
5
9
  const db = await createDb(':memory:');
6
10
  await migrate(db);
11
+ const auth = createBetterAuth({
12
+ client: db.$client,
13
+ secret: TEST_SECRET,
14
+ baseURL: TEST_BASE_URL,
15
+ });
16
+ if (auth !== undefined) {
17
+ await runBetterAuthMigrations(auth);
18
+ await ensureLocalBetterAuthOrganization(db, auth);
19
+ }
7
20
  return {
8
21
  app: createApp({
9
22
  db,
10
23
  authPassword: opts?.authPassword,
11
24
  bindHost: opts?.bindHost ?? '127.0.0.1',
12
25
  github: opts?.github,
26
+ betterAuth: { secret: TEST_SECRET, baseURL: TEST_BASE_URL },
13
27
  }),
14
28
  db,
15
29
  orgId: DEFAULT_ORG_ID,
package/dist/vercel.js CHANGED
@@ -9,6 +9,7 @@ import { createApp } from './server.js';
9
9
  import { createServices } from './services/index.js';
10
10
  import { githubConfigFromEnv } from './github.js';
11
11
  import { createStorageAdapter } from './storage/index.js';
12
+ import { createBetterAuth } from './better-auth.js';
12
13
  import { hostedMisconfigResponse, resolveHostedBetterAuth } from './hosted-auth.js';
13
14
  let appPromise;
14
15
  function vercelBaseUrlFallback() {
@@ -32,9 +33,16 @@ async function getApp() {
32
33
  PLANDESK_BASE_URL: process.env.PLANDESK_BASE_URL ?? vercelBaseUrlFallback(),
33
34
  });
34
35
  const db = await createDb(url, process.env.PLANDESK_DB_TOKEN);
36
+ const auth = createBetterAuth({
37
+ client: db.$client,
38
+ db,
39
+ secret: betterAuth.secret,
40
+ baseURL: betterAuth.baseURL,
41
+ github: githubConfigFromEnv(process.env),
42
+ });
35
43
  // Select s3 via PLANDESK_STORAGE=s3 (+ S3_* env); local remains default when unset.
36
44
  const storage = createStorageAdapter({ db, env: process.env });
37
- const services = createServices({ db, storage });
45
+ const services = createServices({ db, auth, storage });
38
46
  return createApp({
39
47
  db,
40
48
  services,
package/dist/worker.js CHANGED
@@ -112,7 +112,7 @@ export default {
112
112
  // Storage is optional: prefer R2 binding, then S3 creds, else unavailable
113
113
  // (file uploads/artifacts off — no crash). Mirrors `plandesk serve`.
114
114
  const storage = resolveWorkerStorage(env, db);
115
- const services = createServices({ db, ...(storage !== undefined ? { storage } : {}) });
115
+ const services = createServices({ db, auth: authInstance, ...(storage !== undefined ? { storage } : {}) });
116
116
  const app = createApp({
117
117
  db,
118
118
  services,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plandesk/api",
3
- "version": "1.0.0-beta.8",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -26,7 +26,7 @@
26
26
  "@libsql/kysely-libsql": "^0.4.1",
27
27
  "better-auth": "1.6.23",
28
28
  "hono": "^4.12.23",
29
- "@plandesk/db": "1.0.0-beta.8"
29
+ "@plandesk/db": "1.0.0"
30
30
  },
31
31
  "description": "Plan Desk REST + SSE API and service layer (local-first planning workspace).",
32
32
  "license": "MIT",
@@ -48,7 +48,7 @@
48
48
  "tasks"
49
49
  ],
50
50
  "scripts": {
51
- "build": "rm -rf dist && tsc -p tsconfig.json",
51
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
52
52
  "test": "vitest run",
53
53
  "lint": "eslint src"
54
54
  }