@promptowl/contextnest-community 1.5.0 → 1.7.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.
@@ -1,16 +1,18 @@
1
1
  import {
2
2
  createVersion,
3
3
  setApprovedVersion
4
- } from "./chunk-HIH7I232.js";
4
+ } from "./chunk-VD5QX2ZQ.js";
5
5
  import {
6
6
  buildTitleMap,
7
7
  canUserApprove,
8
8
  engineCache,
9
9
  resolveStewardsForNode
10
- } from "./chunk-EMOE53KX.js";
10
+ } from "./chunk-43DOX4LH.js";
11
11
  import {
12
- getDb
13
- } from "./chunk-RMU3LOPH.js";
12
+ getDb,
13
+ insertOrReplace,
14
+ nowExpr
15
+ } from "./chunk-QMLAXQES.js";
14
16
 
15
17
  // src/governance/review-service.ts
16
18
  import { v4 as uuid } from "uuid";
@@ -43,43 +45,47 @@ function stripUndefinedDeep(value) {
43
45
  }
44
46
 
45
47
  // src/governance/review-service.ts
46
- function submitForReview(params) {
48
+ async function submitForReview(params) {
47
49
  const db = getDb();
48
- const existing = db.prepare(
49
- "SELECT id FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending'"
50
- ).get(params.nestId, params.nodeId);
50
+ const existing = await db.get(
51
+ "SELECT id FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending'",
52
+ [params.nestId, params.nodeId]
53
+ );
51
54
  if (existing) {
52
55
  throw new Error("A review is already pending for this node");
53
56
  }
54
57
  const id = uuid();
55
- db.prepare(
58
+ await db.run(
56
59
  `INSERT INTO review_requests
57
60
  (id, nest_id, node_id, version, requested_by, request_note, priority)
58
- VALUES (?, ?, ?, ?, ?, ?, ?)`
59
- ).run(
60
- id,
61
- params.nestId,
62
- params.nodeId,
63
- params.version,
64
- params.requestedBy,
65
- params.note || null,
66
- params.priority || "normal"
61
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
62
+ [
63
+ id,
64
+ params.nestId,
65
+ params.nodeId,
66
+ params.version,
67
+ params.requestedBy,
68
+ params.note || null,
69
+ params.priority || "normal"
70
+ ]
71
+ );
72
+ await db.run(
73
+ "UPDATE node_versions SET status = 'pending_review' WHERE nest_id = ? AND node_id = ? AND version = ?",
74
+ [params.nestId, params.nodeId, params.version]
67
75
  );
68
- db.prepare(
69
- "UPDATE node_versions SET status = 'pending_review' WHERE nest_id = ? AND node_id = ? AND version = ?"
70
- ).run(params.nestId, params.nodeId, params.version);
71
- return getReviewRequest(id);
76
+ return await getReviewRequest(id);
72
77
  }
73
78
  async function approve(params) {
74
79
  const db = getDb();
75
- const pending = db.prepare(
76
- "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1"
77
- ).get(params.nestId, params.nodeId);
80
+ const pending = await db.get(
81
+ "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1",
82
+ [params.nestId, params.nodeId]
83
+ );
78
84
  if (!pending) {
79
85
  throw new Error("No pending review for this node");
80
86
  }
81
87
  if (!params.override) {
82
- const check = canUserApprove(
88
+ const check = await canUserApprove(
83
89
  params.nestId,
84
90
  params.nodeId,
85
91
  params.approvedBy
@@ -88,26 +94,29 @@ async function approve(params) {
88
94
  throw new Error(check.reason);
89
95
  }
90
96
  }
91
- db.prepare(
97
+ await db.run(
92
98
  `UPDATE review_requests
93
- SET status = 'approved', resolved_by = ?, resolved_at = datetime('now'),
99
+ SET status = 'approved', resolved_by = ?, resolved_at = ${nowExpr(db)},
94
100
  resolution_note = ?, is_override = ?
95
- WHERE id = ?`
96
- ).run(
97
- params.approvedBy,
98
- params.note || null,
99
- params.override ? 1 : 0,
100
- pending.id
101
+ WHERE id = ?`,
102
+ [params.approvedBy, params.note || null, params.override ? 1 : 0, pending.id]
103
+ );
104
+ await db.run(
105
+ "UPDATE node_versions SET status = 'published' WHERE nest_id = ? AND node_id = ? AND version = ?",
106
+ [params.nestId, params.nodeId, params.version]
107
+ );
108
+ await db.run(
109
+ insertOrReplace(
110
+ db,
111
+ `INSERT INTO approved_versions (nest_id, node_id, approved_version, approved_by)
112
+ VALUES (?, ?, ?, ?)`,
113
+ ["nest_id", "node_id"],
114
+ `approved_version = excluded.approved_version, approved_by = excluded.approved_by, approved_at = ${nowExpr(db)}`
115
+ ),
116
+ [params.nestId, params.nodeId, params.version, params.approvedBy]
101
117
  );
102
- db.prepare(
103
- "UPDATE node_versions SET status = 'published' WHERE nest_id = ? AND node_id = ? AND version = ?"
104
- ).run(params.nestId, params.nodeId, params.version);
105
- db.prepare(
106
- `INSERT OR REPLACE INTO approved_versions (nest_id, node_id, approved_version, approved_by)
107
- VALUES (?, ?, ?, ?)`
108
- ).run(params.nestId, params.nodeId, params.version, params.approvedBy);
109
118
  try {
110
- const { storage } = engineCache.get(params.nestId);
119
+ const { storage } = await engineCache.get(params.nestId);
111
120
  const result = await safePublishDocument(storage, params.nodeId, {
112
121
  editedBy: params.approvedBy,
113
122
  note: params.note || `Approved review request ${pending.id}`
@@ -116,7 +125,7 @@ async function approve(params) {
116
125
  if (engineVersion !== params.version) {
117
126
  const node = result.node;
118
127
  const tags = node.frontmatter.tags || [];
119
- createVersion({
128
+ await createVersion({
120
129
  nestId: params.nestId,
121
130
  nodeId: params.nodeId,
122
131
  version: engineVersion,
@@ -126,7 +135,7 @@ async function approve(params) {
126
135
  tags,
127
136
  changeNote: params.note || `Approved review request ${pending.id}`
128
137
  });
129
- setApprovedVersion(
138
+ await setApprovedVersion(
130
139
  params.nestId,
131
140
  params.nodeId,
132
141
  engineVersion,
@@ -139,17 +148,18 @@ async function approve(params) {
139
148
  err
140
149
  );
141
150
  }
142
- return getReviewRequest(pending.id);
151
+ return await getReviewRequest(pending.id);
143
152
  }
144
- function reject(params) {
153
+ async function reject(params) {
145
154
  const db = getDb();
146
- const pending = db.prepare(
147
- "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1"
148
- ).get(params.nestId, params.nodeId);
155
+ const pending = await db.get(
156
+ "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1",
157
+ [params.nestId, params.nodeId]
158
+ );
149
159
  if (!pending) {
150
160
  throw new Error("No pending review for this node");
151
161
  }
152
- const check = canUserApprove(
162
+ const check = await canUserApprove(
153
163
  params.nestId,
154
164
  params.nodeId,
155
165
  params.rejectedBy
@@ -157,31 +167,36 @@ function reject(params) {
157
167
  if (!check.allowed) {
158
168
  throw new Error(check.reason);
159
169
  }
160
- db.prepare(
170
+ await db.run(
161
171
  `UPDATE review_requests
162
- SET status = 'rejected', resolved_by = ?, resolved_at = datetime('now'), resolution_note = ?
163
- WHERE id = ?`
164
- ).run(params.rejectedBy, params.note, pending.id);
165
- db.prepare(
166
- "UPDATE node_versions SET status = 'rejected' WHERE nest_id = ? AND node_id = ? AND version = ?"
167
- ).run(params.nestId, params.nodeId, params.version);
168
- return getReviewRequest(pending.id);
172
+ SET status = 'rejected', resolved_by = ?, resolved_at = ${nowExpr(db)}, resolution_note = ?
173
+ WHERE id = ?`,
174
+ [params.rejectedBy, params.note, pending.id]
175
+ );
176
+ await db.run(
177
+ "UPDATE node_versions SET status = 'rejected' WHERE nest_id = ? AND node_id = ? AND version = ?",
178
+ [params.nestId, params.nodeId, params.version]
179
+ );
180
+ return await getReviewRequest(pending.id);
169
181
  }
170
- function cancelReview(params) {
182
+ async function cancelReview(params) {
171
183
  const db = getDb();
172
- const pending = db.prepare(
173
- "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1"
174
- ).get(params.nestId, params.nodeId);
184
+ const pending = await db.get(
185
+ "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1",
186
+ [params.nestId, params.nodeId]
187
+ );
175
188
  if (!pending) return null;
176
- db.prepare(
189
+ await db.run(
177
190
  `UPDATE review_requests
178
- SET status = 'cancelled', resolved_by = ?, resolved_at = datetime('now')
179
- WHERE id = ?`
180
- ).run(params.cancelledBy, pending.id);
181
- db.prepare(
182
- "UPDATE node_versions SET status = 'draft' WHERE nest_id = ? AND node_id = ? AND version = ?"
183
- ).run(params.nestId, params.nodeId, pending.version);
184
- return getReviewRequest(pending.id);
191
+ SET status = 'cancelled', resolved_by = ?, resolved_at = ${nowExpr(db)}
192
+ WHERE id = ?`,
193
+ [params.cancelledBy, pending.id]
194
+ );
195
+ await db.run(
196
+ "UPDATE node_versions SET status = 'draft' WHERE nest_id = ? AND node_id = ? AND version = ?",
197
+ [params.nestId, params.nodeId, pending.version]
198
+ );
199
+ return await getReviewRequest(pending.id);
185
200
  }
186
201
  async function getReviewQueue(params) {
187
202
  const db = getDb();
@@ -199,24 +214,30 @@ async function getReviewQueue(params) {
199
214
  args.push(...statuses);
200
215
  }
201
216
  const where = whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : "";
202
- const total = db.prepare(`SELECT COUNT(*) as c FROM review_requests ${where}`).get(...args).c;
217
+ const total = (await db.get(
218
+ `SELECT COUNT(*) as c FROM review_requests ${where}`,
219
+ args
220
+ )).c;
203
221
  const limit = params.limit || 50;
204
222
  const offset = params.offset || 0;
205
- const rows = db.prepare(
223
+ const rows = await db.all(
206
224
  `SELECT * FROM review_requests ${where}
207
225
  ORDER BY
208
226
  CASE priority WHEN 'urgent' THEN 0 WHEN 'high' THEN 1 WHEN 'normal' THEN 2 ELSE 3 END,
209
227
  requested_at DESC
210
- LIMIT ? OFFSET ?`
211
- ).all(...args, limit, offset);
228
+ LIMIT ? OFFSET ?`,
229
+ [...args, limit, offset]
230
+ );
212
231
  let requests = rows.map(rowToReviewRequest);
213
232
  if (params.stewardEmail) {
214
- requests = requests.filter((r) => {
215
- const stewards = resolveStewardsForNode(r.nestId, r.nodeId);
216
- return stewards.some(
217
- (s) => s.steward.userEmail === params.stewardEmail
218
- );
219
- });
233
+ const filtered = [];
234
+ for (const r of requests) {
235
+ const stewards = await resolveStewardsForNode(r.nestId, r.nodeId);
236
+ if (stewards.some((s) => s.steward.userEmail === params.stewardEmail)) {
237
+ filtered.push(r);
238
+ }
239
+ }
240
+ requests = filtered;
220
241
  }
221
242
  const titleMapsByNest = /* @__PURE__ */ new Map();
222
243
  const nestIds = new Set(requests.map((r) => r.nestId));
@@ -229,23 +250,28 @@ async function getReviewQueue(params) {
229
250
  }));
230
251
  return { requests, total };
231
252
  }
232
- function getReviewHistory(nestId, nodeId) {
253
+ async function getReviewHistory(nestId, nodeId) {
233
254
  const db = getDb();
234
- const rows = db.prepare(
235
- "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? ORDER BY requested_at DESC"
236
- ).all(nestId, nodeId);
255
+ const rows = await db.all(
256
+ "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? ORDER BY requested_at DESC",
257
+ [nestId, nodeId]
258
+ );
237
259
  return rows.map(rowToReviewRequest);
238
260
  }
239
- function getPendingReview(nestId, nodeId) {
261
+ async function getPendingReview(nestId, nodeId) {
240
262
  const db = getDb();
241
- const row = db.prepare(
242
- "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1"
243
- ).get(nestId, nodeId);
263
+ const row = await db.get(
264
+ "SELECT * FROM review_requests WHERE nest_id = ? AND node_id = ? AND status = 'pending' ORDER BY requested_at DESC LIMIT 1",
265
+ [nestId, nodeId]
266
+ );
244
267
  return row ? rowToReviewRequest(row) : null;
245
268
  }
246
- function getReviewRequest(id) {
269
+ async function getReviewRequest(id) {
247
270
  const db = getDb();
248
- const row = db.prepare("SELECT * FROM review_requests WHERE id = ?").get(id);
271
+ const row = await db.get(
272
+ "SELECT * FROM review_requests WHERE id = ?",
273
+ [id]
274
+ );
249
275
  return row ? rowToReviewRequest(row) : null;
250
276
  }
251
277
  function rowToReviewRequest(row) {