@gmickel/gno 1.23.0 → 1.25.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 (68) hide show
  1. package/README.md +26 -12
  2. package/assets/skill/SKILL.md +37 -19
  3. package/assets/skill/recipes/capture-and-file.md +20 -5
  4. package/browser-extension/artifacts/gno-browser-clipper-v1.25.1.zip +0 -0
  5. package/browser-extension/artifacts/gno-browser-clipper-v1.25.1.zip.sha256 +1 -0
  6. package/browser-extension/dist/PRIVACY.md +55 -0
  7. package/browser-extension/dist/chunk-vn5f663b.js +50 -0
  8. package/browser-extension/dist/chunk-ydfx5d7p.css +1 -0
  9. package/browser-extension/dist/content.js +1 -0
  10. package/browser-extension/dist/manifest.json +25 -0
  11. package/browser-extension/dist/preview.html +13 -0
  12. package/browser-extension/dist/service-worker.js +40 -0
  13. package/package.json +13 -3
  14. package/spec/cli.md +141 -0
  15. package/spec/db/schema.sql +101 -0
  16. package/spec/mcp.md +10 -0
  17. package/spec/output-schemas/browser-clip-preview.schema.json +83 -0
  18. package/spec/output-schemas/browser-clip.schema.json +586 -0
  19. package/spec/output-schemas/capture-receipt.schema.json +22 -1
  20. package/spec/output-schemas/clipper-csrf.schema.json +12 -0
  21. package/spec/output-schemas/clipper-error.schema.json +46 -0
  22. package/spec/output-schemas/clipper-pair-approval.schema.json +17 -0
  23. package/spec/output-schemas/clipper-pair-start.schema.json +26 -0
  24. package/spec/output-schemas/clipper-pair-status.schema.json +46 -0
  25. package/spec/output-schemas/clipper-revoke.schema.json +28 -0
  26. package/spec/output-schemas/mcp-capture-result.schema.json +12 -1
  27. package/spec/output-schemas/setup-activation-result.schema.json +456 -0
  28. package/spec/output-schemas/setup-command-result.schema.json +93 -0
  29. package/spec/output-schemas/setup-receipt.schema.json +258 -0
  30. package/spec/output-schemas/setup-semantic-receipt.schema.json +195 -0
  31. package/src/cli/commands/completion/scripts.ts +2 -0
  32. package/src/cli/commands/embed.ts +7 -2
  33. package/src/cli/commands/setup-activation.ts +324 -0
  34. package/src/cli/commands/setup-semantic.ts +591 -0
  35. package/src/cli/commands/setup.ts +410 -0
  36. package/src/cli/program.ts +64 -0
  37. package/src/cli/setup-semantic-worker.ts +177 -0
  38. package/src/core/browser-clip-provenance.ts +139 -0
  39. package/src/core/browser-clip.ts +473 -0
  40. package/src/core/capture-write.ts +5 -0
  41. package/src/core/capture.ts +75 -18
  42. package/src/core/config-mutation.ts +94 -64
  43. package/src/core/file-lock.ts +89 -36
  44. package/src/core/folder-setup-planning.ts +453 -0
  45. package/src/core/folder-setup.ts +490 -0
  46. package/src/core/setup-activation.ts +309 -0
  47. package/src/core/setup-receipt.ts +321 -0
  48. package/src/serve/capture-service.ts +420 -0
  49. package/src/serve/clipper-body.ts +62 -0
  50. package/src/serve/clipper-capture.ts +248 -0
  51. package/src/serve/clipper-contract.ts +57 -0
  52. package/src/serve/clipper-idempotency.ts +35 -0
  53. package/src/serve/clipper-pairing.ts +297 -0
  54. package/src/serve/clipper-security-errors.ts +23 -0
  55. package/src/serve/clipper-security.ts +449 -0
  56. package/src/serve/connectors.ts +29 -2
  57. package/src/serve/public/app.tsx +8 -1
  58. package/src/serve/public/globals.built.css +1 -1
  59. package/src/serve/public/index.html +1 -0
  60. package/src/serve/public/lib/clipper-approval.ts +206 -0
  61. package/src/serve/public/pages/ClipperPairing.tsx +210 -0
  62. package/src/serve/routes/api.ts +19 -115
  63. package/src/serve/routes/clipper.ts +394 -0
  64. package/src/serve/server.ts +22 -0
  65. package/src/store/migrations/020-browser-clipper-security.ts +128 -0
  66. package/src/store/migrations/index.ts +2 -0
  67. package/src/store/sqlite/clipper-store-types.ts +104 -0
  68. package/src/store/sqlite/clipper-store.ts +496 -0
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/clipper-error@1.0",
4
+ "title": "Browser Clipper Error",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["error"],
8
+ "properties": {
9
+ "error": {
10
+ "type": "object",
11
+ "additionalProperties": false,
12
+ "required": ["code", "message"],
13
+ "properties": {
14
+ "code": {
15
+ "enum": [
16
+ "CLIPPER_ABORTED",
17
+ "CLIPPER_BODY_TOO_LARGE",
18
+ "CLIPPER_BUSY",
19
+ "CLIPPER_FORBIDDEN",
20
+ "CLIPPER_INVALID_JSON",
21
+ "CLIPPER_RATE_LIMITED",
22
+ "CLIPPER_UNAUTHORIZED",
23
+ "CLIPPER_PAIRING_UNAVAILABLE",
24
+ "CLIPPER_CSRF",
25
+ "CLIPPER_INVALID_REQUEST",
26
+ "CLIPPER_PAIR_NOT_FOUND",
27
+ "CLIPPER_PAIR_EXPIRED",
28
+ "CLIPPER_PAIR_INVALID_CODE",
29
+ "CLIPPER_PAIR_ALREADY_USED",
30
+ "CLIPPER_PREVIEW_MISMATCH",
31
+ "CLIPPER_PREVIEW_REQUIRED",
32
+ "CLIPPER_IDEMPOTENCY_PENDING",
33
+ "CLIPPER_IDEMPOTENCY_CONFLICT",
34
+ "CLIPPER_IDEMPOTENCY_RECOVERY_CONFLICT",
35
+ "CLIPPER_IDEMPOTENCY_GRANT_INACTIVE",
36
+ "CLIPPER_CAPTURE_FAILED",
37
+ "NOT_FOUND",
38
+ "RUNTIME",
39
+ "VALIDATION"
40
+ ]
41
+ },
42
+ "message": { "type": "string", "minLength": 1 }
43
+ }
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/clipper-pair-approval@1.0",
4
+ "title": "Browser Clipper Pair Approval",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "status", "origin", "expiresAt"],
8
+ "properties": {
9
+ "schemaVersion": { "const": "1.0" },
10
+ "status": { "const": "approved" },
11
+ "origin": {
12
+ "type": "string",
13
+ "pattern": "^chrome-extension://[a-p]{32}$"
14
+ },
15
+ "expiresAt": { "type": "string", "format": "date-time" }
16
+ }
17
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/clipper-pair-start@1.0",
4
+ "title": "Browser Clipper Pair Start",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "pairId",
10
+ "pairingCode",
11
+ "expiresAt",
12
+ "origin",
13
+ "approvalPath"
14
+ ],
15
+ "properties": {
16
+ "schemaVersion": { "const": "1.0" },
17
+ "pairId": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
18
+ "pairingCode": { "type": "string", "pattern": "^[0-9]{8}$" },
19
+ "expiresAt": { "type": "string", "format": "date-time" },
20
+ "origin": {
21
+ "type": "string",
22
+ "pattern": "^chrome-extension://[a-p]{32}$"
23
+ },
24
+ "approvalPath": { "const": "/api/clipper/pair/approve" }
25
+ }
26
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/clipper-pair-status@1.0",
4
+ "title": "Browser Clipper Pair Status",
5
+ "oneOf": [
6
+ {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["schemaVersion", "status", "expiresAt"],
10
+ "properties": {
11
+ "schemaVersion": { "const": "1.0" },
12
+ "status": { "const": "pending" },
13
+ "expiresAt": { "type": "string", "format": "date-time" }
14
+ }
15
+ },
16
+ {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "required": [
20
+ "schemaVersion",
21
+ "status",
22
+ "grantId",
23
+ "grantToken",
24
+ "expiresAt"
25
+ ],
26
+ "properties": {
27
+ "schemaVersion": { "const": "1.0" },
28
+ "status": { "const": "approved" },
29
+ "grantId": { "type": "string", "format": "uuid" },
30
+ "grantToken": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
31
+ "expiresAt": { "type": "string", "format": "date-time" }
32
+ }
33
+ },
34
+ {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "required": ["schemaVersion", "status"],
38
+ "properties": {
39
+ "schemaVersion": { "const": "1.0" },
40
+ "status": {
41
+ "enum": ["consumed", "expired", "not_found", "origin_mismatch"]
42
+ }
43
+ }
44
+ }
45
+ ]
46
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/clipper-revoke@1.0",
4
+ "title": "Browser Clipper Grant Revocation",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "grantId", "status"],
8
+ "properties": {
9
+ "schemaVersion": { "const": "1.0" },
10
+ "grantId": { "type": "string", "format": "uuid" },
11
+ "status": {
12
+ "enum": ["revoked", "already_revoked", "expired", "not_found"]
13
+ },
14
+ "revokedAt": { "type": "string", "format": "date-time" }
15
+ },
16
+ "allOf": [
17
+ {
18
+ "if": { "properties": { "status": { "const": "revoked" } } },
19
+ "then": {
20
+ "properties": {
21
+ "revokedAt": { "type": "string", "format": "date-time" }
22
+ },
23
+ "required": ["revokedAt"]
24
+ },
25
+ "else": { "not": { "required": ["revokedAt"] } }
26
+ }
27
+ ]
28
+ }
@@ -89,9 +89,20 @@
89
89
  "mime": { "type": "string" },
90
90
  "ext": { "type": "string" },
91
91
  "author": { "type": "string" },
92
+ "canonicalUrl": { "type": "string", "format": "uri" },
93
+ "site": { "type": "string" },
94
+ "publishedAt": {
95
+ "oneOf": [
96
+ { "type": "string", "format": "date" },
97
+ { "type": "string", "format": "date-time" }
98
+ ]
99
+ },
92
100
  "observedAt": { "type": "string", "format": "date-time" },
93
101
  "capturedAt": { "type": "string", "format": "date-time" },
94
- "externalId": { "type": "string" }
102
+ "externalId": { "type": "string" },
103
+ "browserClip": {
104
+ "$ref": "gno://schemas/browser-clip@1.0#/definitions/provenance"
105
+ }
95
106
  }
96
107
  },
97
108
  "tags": {
@@ -0,0 +1,456 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "gno://schemas/setup-activation-result@1.0",
4
+ "title": "GNO Setup Activation Result",
5
+ "description": "Closed connector onboarding composition beside an unchanged verified setup result.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["schemaVersion", "status", "setup", "connectors"],
9
+ "properties": {
10
+ "schemaVersion": { "const": "1.0" },
11
+ "status": { "enum": ["completed", "completed_with_actions", "failed"] },
12
+ "setup": { "$ref": "gno://schemas/setup-command-result@1.0" },
13
+ "connectors": {
14
+ "type": "array",
15
+ "maxItems": 7,
16
+ "items": {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "required": [
20
+ "connectorId",
21
+ "kind",
22
+ "target",
23
+ "scope",
24
+ "installation",
25
+ "verification",
26
+ "code",
27
+ "remediation",
28
+ "receipt"
29
+ ],
30
+ "properties": {
31
+ "connectorId": {
32
+ "enum": [
33
+ "claude-code-skill",
34
+ "claude-desktop-mcp",
35
+ "cursor-mcp",
36
+ "codex-skill",
37
+ "opencode-skill",
38
+ "openclaw-skill",
39
+ "hermes-skill"
40
+ ]
41
+ },
42
+ "kind": { "enum": ["skill", "mcp"] },
43
+ "target": {
44
+ "enum": [
45
+ "claude",
46
+ "claude-desktop",
47
+ "cursor",
48
+ "codex",
49
+ "opencode",
50
+ "openclaw",
51
+ "hermes"
52
+ ]
53
+ },
54
+ "scope": { "const": "user" },
55
+ "installation": {
56
+ "enum": ["installed", "reused", "failed"]
57
+ },
58
+ "verification": {
59
+ "enum": ["passed", "failed", "skipped", "not_run"]
60
+ },
61
+ "code": {
62
+ "enum": [
63
+ "connector_verified",
64
+ "connector_configuration_unavailable",
65
+ "connector_install_failed",
66
+ "connector_verification_failed",
67
+ "connector_not_configured",
68
+ "connector_probe_unavailable",
69
+ "connector_unsupported_config",
70
+ "connector_start_failed",
71
+ "connector_timeout",
72
+ "connector_missing_tools",
73
+ "connector_status_failed",
74
+ "connector_search_failed",
75
+ "connector_result_mismatch",
76
+ "target_runtime_unverifiable"
77
+ ]
78
+ },
79
+ "remediation": {
80
+ "type": "string",
81
+ "minLength": 1,
82
+ "maxLength": 512
83
+ },
84
+ "receipt": {
85
+ "oneOf": [
86
+ {
87
+ "$ref": "gno://schemas/activation-verification@1.0"
88
+ },
89
+ { "type": "null" }
90
+ ]
91
+ }
92
+ },
93
+ "allOf": [
94
+ {
95
+ "if": {
96
+ "properties": {
97
+ "connectorId": { "const": "claude-code-skill" }
98
+ },
99
+ "required": ["connectorId"]
100
+ },
101
+ "then": {
102
+ "properties": {
103
+ "kind": { "const": "skill" },
104
+ "target": { "const": "claude" }
105
+ }
106
+ }
107
+ },
108
+ {
109
+ "if": {
110
+ "properties": {
111
+ "connectorId": { "const": "claude-desktop-mcp" }
112
+ },
113
+ "required": ["connectorId"]
114
+ },
115
+ "then": {
116
+ "properties": {
117
+ "kind": { "const": "mcp" },
118
+ "target": { "const": "claude-desktop" }
119
+ }
120
+ }
121
+ },
122
+ {
123
+ "if": {
124
+ "properties": { "connectorId": { "const": "cursor-mcp" } },
125
+ "required": ["connectorId"]
126
+ },
127
+ "then": {
128
+ "properties": {
129
+ "kind": { "const": "mcp" },
130
+ "target": { "const": "cursor" }
131
+ }
132
+ }
133
+ },
134
+ {
135
+ "if": {
136
+ "properties": { "connectorId": { "const": "codex-skill" } },
137
+ "required": ["connectorId"]
138
+ },
139
+ "then": {
140
+ "properties": {
141
+ "kind": { "const": "skill" },
142
+ "target": { "const": "codex" }
143
+ }
144
+ }
145
+ },
146
+ {
147
+ "if": {
148
+ "properties": {
149
+ "connectorId": { "const": "opencode-skill" }
150
+ },
151
+ "required": ["connectorId"]
152
+ },
153
+ "then": {
154
+ "properties": {
155
+ "kind": { "const": "skill" },
156
+ "target": { "const": "opencode" }
157
+ }
158
+ }
159
+ },
160
+ {
161
+ "if": {
162
+ "properties": {
163
+ "connectorId": { "const": "openclaw-skill" }
164
+ },
165
+ "required": ["connectorId"]
166
+ },
167
+ "then": {
168
+ "properties": {
169
+ "kind": { "const": "skill" },
170
+ "target": { "const": "openclaw" }
171
+ }
172
+ }
173
+ },
174
+ {
175
+ "if": {
176
+ "properties": { "connectorId": { "const": "hermes-skill" } },
177
+ "required": ["connectorId"]
178
+ },
179
+ "then": {
180
+ "properties": {
181
+ "kind": { "const": "skill" },
182
+ "target": { "const": "hermes" }
183
+ }
184
+ }
185
+ },
186
+ {
187
+ "if": {
188
+ "properties": {
189
+ "verification": { "const": "passed" }
190
+ },
191
+ "required": ["verification"]
192
+ },
193
+ "then": {
194
+ "properties": {
195
+ "installation": { "enum": ["installed", "reused"] },
196
+ "code": { "const": "connector_verified" },
197
+ "receipt": {
198
+ "allOf": [
199
+ { "$ref": "gno://schemas/activation-verification@1.0" },
200
+ {
201
+ "type": "object",
202
+ "properties": {
203
+ "stages": {
204
+ "type": "object",
205
+ "properties": {
206
+ "connector": {
207
+ "type": "object",
208
+ "properties": {
209
+ "status": { "const": "passed" }
210
+ },
211
+ "required": ["status"]
212
+ }
213
+ },
214
+ "required": ["connector"]
215
+ }
216
+ },
217
+ "required": ["stages"]
218
+ }
219
+ ]
220
+ }
221
+ }
222
+ }
223
+ },
224
+ {
225
+ "if": {
226
+ "properties": {
227
+ "verification": { "const": "skipped" }
228
+ },
229
+ "required": ["verification"]
230
+ },
231
+ "then": {
232
+ "properties": {
233
+ "installation": { "enum": ["installed", "reused"] },
234
+ "code": {
235
+ "enum": [
236
+ "connector_not_configured",
237
+ "connector_probe_unavailable",
238
+ "target_runtime_unverifiable"
239
+ ]
240
+ },
241
+ "receipt": {
242
+ "allOf": [
243
+ { "$ref": "gno://schemas/activation-verification@1.0" },
244
+ {
245
+ "type": "object",
246
+ "properties": {
247
+ "stages": {
248
+ "type": "object",
249
+ "properties": {
250
+ "connector": {
251
+ "type": "object",
252
+ "properties": {
253
+ "status": { "const": "skipped" }
254
+ },
255
+ "required": ["status"]
256
+ }
257
+ },
258
+ "required": ["connector"]
259
+ }
260
+ },
261
+ "required": ["stages"]
262
+ }
263
+ ]
264
+ }
265
+ }
266
+ }
267
+ },
268
+ {
269
+ "if": {
270
+ "properties": {
271
+ "verification": { "const": "failed" }
272
+ },
273
+ "required": ["verification"]
274
+ },
275
+ "then": {
276
+ "properties": {
277
+ "installation": { "enum": ["installed", "reused"] },
278
+ "code": {
279
+ "enum": [
280
+ "connector_verification_failed",
281
+ "connector_probe_unavailable",
282
+ "connector_unsupported_config",
283
+ "connector_start_failed",
284
+ "connector_timeout",
285
+ "connector_missing_tools",
286
+ "connector_status_failed",
287
+ "connector_search_failed",
288
+ "connector_result_mismatch"
289
+ ]
290
+ }
291
+ },
292
+ "allOf": [
293
+ {
294
+ "if": {
295
+ "properties": {
296
+ "receipt": { "type": "object" }
297
+ },
298
+ "required": ["receipt"]
299
+ },
300
+ "then": {
301
+ "properties": {
302
+ "receipt": {
303
+ "allOf": [
304
+ {
305
+ "$ref": "gno://schemas/activation-verification@1.0"
306
+ },
307
+ {
308
+ "type": "object",
309
+ "properties": {
310
+ "stages": {
311
+ "type": "object",
312
+ "properties": {
313
+ "connector": {
314
+ "type": "object",
315
+ "properties": {
316
+ "status": { "const": "failed" }
317
+ },
318
+ "required": ["status"]
319
+ }
320
+ },
321
+ "required": ["connector"]
322
+ }
323
+ },
324
+ "required": ["stages"]
325
+ }
326
+ ]
327
+ }
328
+ }
329
+ },
330
+ "else": {
331
+ "properties": {
332
+ "code": { "const": "connector_verification_failed" }
333
+ }
334
+ }
335
+ }
336
+ ]
337
+ }
338
+ },
339
+ {
340
+ "if": {
341
+ "properties": {
342
+ "verification": { "const": "not_run" }
343
+ },
344
+ "required": ["verification"]
345
+ },
346
+ "then": {
347
+ "properties": {
348
+ "installation": { "const": "failed" },
349
+ "code": {
350
+ "enum": [
351
+ "connector_configuration_unavailable",
352
+ "connector_install_failed",
353
+ "connector_verification_failed"
354
+ ]
355
+ },
356
+ "receipt": { "type": "null" }
357
+ }
358
+ }
359
+ }
360
+ ]
361
+ }
362
+ }
363
+ },
364
+ "allOf": [
365
+ {
366
+ "if": {
367
+ "properties": { "status": { "const": "completed" } },
368
+ "required": ["status"]
369
+ },
370
+ "then": {
371
+ "properties": {
372
+ "setup": {
373
+ "allOf": [
374
+ { "$ref": "gno://schemas/setup-command-result@1.0" },
375
+ {
376
+ "type": "object",
377
+ "properties": { "status": { "const": "completed" } },
378
+ "required": ["status"]
379
+ }
380
+ ]
381
+ },
382
+ "connectors": {
383
+ "type": "array",
384
+ "minItems": 1,
385
+ "items": {
386
+ "type": "object",
387
+ "properties": {
388
+ "verification": { "const": "passed" },
389
+ "code": { "const": "connector_verified" }
390
+ }
391
+ }
392
+ }
393
+ }
394
+ }
395
+ },
396
+ {
397
+ "if": {
398
+ "properties": {
399
+ "status": { "const": "completed_with_actions" }
400
+ },
401
+ "required": ["status"]
402
+ },
403
+ "then": {
404
+ "properties": {
405
+ "setup": {
406
+ "allOf": [
407
+ { "$ref": "gno://schemas/setup-command-result@1.0" },
408
+ {
409
+ "type": "object",
410
+ "properties": { "status": { "const": "completed" } },
411
+ "required": ["status"]
412
+ }
413
+ ]
414
+ },
415
+ "connectors": {
416
+ "type": "array",
417
+ "minItems": 1,
418
+ "contains": {
419
+ "type": "object",
420
+ "properties": {
421
+ "verification": {
422
+ "enum": ["failed", "skipped", "not_run"]
423
+ }
424
+ },
425
+ "required": ["verification"]
426
+ }
427
+ }
428
+ }
429
+ }
430
+ },
431
+ {
432
+ "if": {
433
+ "properties": { "status": { "const": "failed" } },
434
+ "required": ["status"]
435
+ },
436
+ "then": {
437
+ "properties": {
438
+ "setup": {
439
+ "allOf": [
440
+ { "$ref": "gno://schemas/setup-command-result@1.0" },
441
+ {
442
+ "type": "object",
443
+ "properties": { "status": { "const": "failed" } },
444
+ "required": ["status"]
445
+ }
446
+ ]
447
+ },
448
+ "connectors": {
449
+ "type": "array",
450
+ "maxItems": 0
451
+ }
452
+ }
453
+ }
454
+ }
455
+ ]
456
+ }