@stoneforge/shared-routes 1.7.0 → 1.8.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.
package/dist/index.d.ts CHANGED
@@ -12,5 +12,6 @@ export { createLibraryRoutes } from './libraries.js';
12
12
  export { createDocumentRoutes } from './documents.js';
13
13
  export { createInboxRoutes } from './inbox.js';
14
14
  export { createPlanRoutes } from './plans.js';
15
+ export { createTaskRoutes } from './tasks.js';
15
16
  export * from './ws/index.js';
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGhJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,qBAAqB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGhJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,cAAc,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ export { createLibraryRoutes } from './libraries.js';
12
12
  export { createDocumentRoutes } from './documents.js';
13
13
  export { createInboxRoutes } from './inbox.js';
14
14
  export { createPlanRoutes } from './plans.js';
15
+ export { createTaskRoutes } from './tasks.js';
15
16
  // WebSocket types, broadcaster, and handler utilities
16
17
  export * from './ws/index.js';
17
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,kBAAkB;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,sDAAsD;AACtD,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,kBAAkB;AAClB,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,sDAAsD;AACtD,cAAc,eAAe,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Task Bulk Routes Factory
3
+ *
4
+ * Bulk update and bulk delete endpoints for tasks.
5
+ * These are shared across quarry and smithy servers to avoid duplication.
6
+ */
7
+ import { Hono } from 'hono';
8
+ import type { CollaborateServices } from './types.js';
9
+ export declare function createTaskRoutes(services: CollaborateServices): Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
10
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,8EAoI7D"}
package/dist/tasks.js ADDED
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Task Bulk Routes Factory
3
+ *
4
+ * Bulk update and bulk delete endpoints for tasks.
5
+ * These are shared across quarry and smithy servers to avoid duplication.
6
+ */
7
+ import { Hono } from 'hono';
8
+ export function createTaskRoutes(services) {
9
+ const { api } = services;
10
+ const app = new Hono();
11
+ /**
12
+ * PATCH /api/tasks/bulk
13
+ * Bulk update tasks by IDs.
14
+ *
15
+ * IMPORTANT: This route MUST be registered before any PATCH /api/tasks/:id
16
+ * route, otherwise "bulk" gets matched as a task ID parameter.
17
+ *
18
+ * Body:
19
+ * - ids: string[] — Non-empty array of task IDs to update
20
+ * - updates: object — Fields to update (whitelisted)
21
+ */
22
+ app.patch('/api/tasks/bulk', async (c) => {
23
+ try {
24
+ const body = await c.req.json();
25
+ // Validate request structure
26
+ if (!body.ids || !Array.isArray(body.ids) || body.ids.length === 0) {
27
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'ids must be a non-empty array' } }, 400);
28
+ }
29
+ if (!body.updates || typeof body.updates !== 'object') {
30
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'updates must be an object' } }, 400);
31
+ }
32
+ const ids = body.ids;
33
+ // Extract allowed updates
34
+ const updates = {};
35
+ const allowedFields = [
36
+ 'status', 'priority', 'complexity', 'taskType',
37
+ 'assignee', 'owner', 'deadline', 'scheduledFor', 'tags',
38
+ ];
39
+ for (const field of allowedFields) {
40
+ if (body.updates[field] !== undefined) {
41
+ updates[field] = body.updates[field];
42
+ }
43
+ }
44
+ if (Object.keys(updates).length === 0) {
45
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'No valid fields to update' } }, 400);
46
+ }
47
+ // Update each task
48
+ const results = [];
49
+ for (const id of ids) {
50
+ try {
51
+ const existing = await api.get(id);
52
+ if (!existing || existing.type !== 'task') {
53
+ results.push({ id, success: false, error: 'Task not found' });
54
+ continue;
55
+ }
56
+ await api.update(id, updates);
57
+ results.push({ id, success: true });
58
+ }
59
+ catch (error) {
60
+ results.push({ id, success: false, error: error.message });
61
+ }
62
+ }
63
+ const successCount = results.filter((r) => r.success).length;
64
+ const failureCount = results.filter((r) => !r.success).length;
65
+ return c.json({
66
+ updated: successCount,
67
+ failed: failureCount,
68
+ results,
69
+ });
70
+ }
71
+ catch (error) {
72
+ console.error('[stoneforge] Failed to bulk update tasks:', error);
73
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to bulk update tasks' } }, 500);
74
+ }
75
+ });
76
+ /**
77
+ * POST /api/tasks/bulk-delete
78
+ * Bulk delete tasks by IDs.
79
+ *
80
+ * Uses POST with a body for better proxy compatibility
81
+ * (some proxies strip bodies from DELETE requests).
82
+ *
83
+ * Body:
84
+ * - ids: string[] — Non-empty array of task IDs to delete
85
+ */
86
+ app.post('/api/tasks/bulk-delete', async (c) => {
87
+ try {
88
+ const body = await c.req.json();
89
+ // Validate request structure
90
+ if (!body.ids || !Array.isArray(body.ids) || body.ids.length === 0) {
91
+ return c.json({ error: { code: 'VALIDATION_ERROR', message: 'ids must be a non-empty array' } }, 400);
92
+ }
93
+ const ids = body.ids;
94
+ // Delete each task
95
+ const results = [];
96
+ for (const id of ids) {
97
+ try {
98
+ const existing = await api.get(id);
99
+ if (!existing || existing.type !== 'task') {
100
+ results.push({ id, success: false, error: 'Task not found' });
101
+ continue;
102
+ }
103
+ await api.delete(id);
104
+ results.push({ id, success: true });
105
+ }
106
+ catch (error) {
107
+ results.push({ id, success: false, error: error.message });
108
+ }
109
+ }
110
+ const successCount = results.filter((r) => r.success).length;
111
+ const failureCount = results.filter((r) => !r.success).length;
112
+ return c.json({
113
+ deleted: successCount,
114
+ failed: failureCount,
115
+ results,
116
+ });
117
+ }
118
+ catch (error) {
119
+ console.error('[stoneforge] Failed to bulk delete tasks:', error);
120
+ return c.json({ error: { code: 'INTERNAL_ERROR', message: 'Failed to bulk delete tasks' } }, 500);
121
+ }
122
+ });
123
+ return app;
124
+ }
125
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stoneforge/shared-routes",
3
- "version": "1.7.0",
3
+ "version": "1.8.0",
4
4
  "type": "module",
5
5
  "description": "Shared route factories for Stoneforge servers",
6
6
  "repository": {
@@ -29,8 +29,8 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "hono": "^4.7.0",
32
- "@stoneforge/core": "1.7.0",
33
- "@stoneforge/storage": "1.7.0"
32
+ "@stoneforge/core": "1.8.0",
33
+ "@stoneforge/storage": "1.8.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/bun": "latest",