@punica/editor 1.29.0 → 1.31.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@punica/editor",
3
- "version": "1.29.0",
3
+ "version": "1.31.0",
4
4
  "description": "Punica Editor",
5
5
  "private": false,
6
6
  "type": "module",
@@ -29,6 +29,7 @@
29
29
  "check:duplicate-capabilities": "node scripts/check-duplicate-capabilities.mjs",
30
30
  "check:instruction-classes": "node scripts/check-instruction-classes.mjs",
31
31
  "report:capability-actions": "node scripts/report-capability-actions.mjs",
32
+ "report:input-enforcement": "node scripts/report-input-enforcement.mjs",
32
33
  "test": "vitest run",
33
34
  "test:watch": "vitest",
34
35
  "test:ui": "vitest --ui",
@@ -263,9 +263,52 @@ declare module 'punica' {
263
263
  * permanent.
264
264
  */
265
265
  expiresAt?: number;
266
+ /**
267
+ * Which run this grant authorises, and where in it.
268
+ * Carried onto the `approval.granted` audit event, never
269
+ * onto the stored record — a `workspace` grant outlives the
270
+ * call that prompted it, so a trace on the record would name
271
+ * the wrong call the second time it is honoured.
272
+ */
273
+ traceId?: string;
274
+ parentSpanId?: string;
275
+ /** The sitting the run belongs to, one level above it. */
276
+ conversationId?: string;
266
277
  }
267
278
  ): ApprovalRecord;
268
279
 
280
+ /**
281
+ * Record that a person was asked and said no.
282
+ *
283
+ * **Writes nothing to the approval store.** A decline is not a
284
+ * grant with a negative sign — the gate only ever asks
285
+ * `hasApproval`, and a call nobody approved is already refused,
286
+ * so a stored negative record would be state with no reader.
287
+ * What this produces is the audit record the trail had no shape
288
+ * for: before it, `recordApproval` and `revokeApproval` were the
289
+ * only two expressible decisions, so "an operator looked at this
290
+ * and refused it" was indistinguishable from a client that
291
+ * simply moved on.
292
+ *
293
+ * The caller is responsible for having actually asked somebody.
294
+ * This records a decision; it cannot tell a human's refusal from
295
+ * one invented by whatever called it, which is why `decidedBy`
296
+ * is the load-bearing field — and why an absent one is honest
297
+ * where an invented one is not.
298
+ */
299
+ declineApproval(
300
+ req: PolicyRequest,
301
+ ctx?: {
302
+ workspaceId?: string;
303
+ decidedBy?: string;
304
+ /** Why, in the decider's words. Stored verbatim. */
305
+ reason?: string;
306
+ traceId?: string;
307
+ parentSpanId?: string;
308
+ conversationId?: string;
309
+ }
310
+ ): void;
311
+
269
312
  /**
270
313
  * `argsBinding` must be supplied when revoking a bound grant —
271
314
  * omitting it targets the unbound key and silently revokes