@milpa/comal 0.2.2 → 0.2.4

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 (115) hide show
  1. package/README.md +1 -1
  2. package/backend/contracts/remote-commands-v1.json +0 -12
  3. package/backend/contracts/remote-device-v1.json +423 -0
  4. package/backend/contracts/remote-relay-answers-v1.json +209 -0
  5. package/package.json +4 -1
  6. package/skills/mv3/SKILL.md +44 -0
  7. package/skills/mv3/skill.json +4 -0
  8. package/src/agent.mjs +299 -32
  9. package/src/auto-guard.mjs +40 -3
  10. package/src/autocompact.mjs +233 -0
  11. package/src/bash-timeouts.mjs +29 -0
  12. package/src/child-env.mjs +23 -0
  13. package/src/cli.mjs +261 -62
  14. package/src/code-run-artifact.mjs +30 -0
  15. package/src/code-run-journal.mjs +135 -0
  16. package/src/code-run-session-proof.mjs +50 -0
  17. package/src/code-run-session.mjs +97 -0
  18. package/src/code-run-worker.mjs +20 -4
  19. package/src/code-run.mjs +49 -14
  20. package/src/codex-provider.mjs +4 -4
  21. package/src/compaction-notice.mjs +22 -0
  22. package/src/compaction.mjs +162 -23
  23. package/src/connection-settings.mjs +36 -4
  24. package/src/context-pressure.mjs +5 -4
  25. package/src/context.mjs +27 -22
  26. package/src/execution-metrics.mjs +36 -5
  27. package/src/file-recovery-proof.mjs +9 -1
  28. package/src/file-recovery.mjs +36 -3
  29. package/src/gemini-provider.mjs +5 -3
  30. package/src/git-integration-operations.mjs +2 -1
  31. package/src/git-plumbing.mjs +2 -1
  32. package/src/git-source.mjs +2 -1
  33. package/src/git-workspaces.mjs +2 -1
  34. package/src/house.mjs +13 -1
  35. package/src/i18n/cli-es.mjs +12 -1
  36. package/src/i18n/es.mjs +38 -1
  37. package/src/judges.mjs +2 -1
  38. package/src/mcp.mjs +2 -1
  39. package/src/model-controls.mjs +16 -2
  40. package/src/model-deadline.mjs +2 -2
  41. package/src/openai-provider.mjs +8 -4
  42. package/src/operations.mjs +17 -2
  43. package/src/package-identity.mjs +68 -0
  44. package/src/peer-probe.mjs +16 -0
  45. package/src/permissions.mjs +97 -4
  46. package/src/plugin-config.mjs +18 -1
  47. package/src/plugin-controls.mjs +31 -8
  48. package/src/plugin-trust.mjs +15 -6
  49. package/src/plugins/chrome-lab/bridge.mjs +19 -6
  50. package/src/plugins/chrome-lab/client.mjs +242 -12
  51. package/src/plugins/chrome-lab/index.mjs +106 -24
  52. package/src/plugins/chrome-lab/legacy-fill.mjs +25 -0
  53. package/src/plugins/chrome-lab/native-reply.mjs +31 -0
  54. package/src/plugins/open-relay/actions.mjs +60 -9
  55. package/src/plugins/open-relay/client.mjs +3 -3
  56. package/src/plugins/open-relay/decision.mjs +3 -2
  57. package/src/plugins/open-relay/index.mjs +17 -7
  58. package/src/plugins/open-relay/lookup.mjs +41 -4
  59. package/src/plugins/open-relay/notices.mjs +44 -3
  60. package/src/plugins/open-relay/panel.mjs +4 -1
  61. package/src/plugins/open-relay/watch.mjs +27 -8
  62. package/src/process-lock.mjs +20 -12
  63. package/src/provider-auth.mjs +6 -3
  64. package/src/provider-profiles.mjs +13 -3
  65. package/src/provider.mjs +175 -30
  66. package/src/qr-scan.mjs +240 -0
  67. package/src/read-only-check.mjs +6 -1
  68. package/src/relay/broker.mjs +173 -0
  69. package/src/relay/cards.mjs +702 -0
  70. package/src/relay/flow.mjs +886 -0
  71. package/src/relay/follow.mjs +119 -0
  72. package/src/relay/git.mjs +23 -0
  73. package/src/relay/hub-client.mjs +163 -0
  74. package/src/relay/state.mjs +55 -0
  75. package/src/remote-control.mjs +283 -15
  76. package/src/remote-device-card.mjs +111 -0
  77. package/src/remote-device.mjs +92 -0
  78. package/src/remote-permissions.mjs +159 -0
  79. package/src/remote-relay.mjs +468 -0
  80. package/src/remote-stats.mjs +205 -0
  81. package/src/session-bus.mjs +13 -3
  82. package/src/session-provider-settings.mjs +2 -2
  83. package/src/skill-runtime.mjs +8 -6
  84. package/src/source-ownership.mjs +3 -1
  85. package/src/tool-manifest.mjs +71 -0
  86. package/src/tool-packs.mjs +22 -6
  87. package/src/tool-schema.mjs +14 -2
  88. package/src/tools.mjs +96 -27
  89. package/src/tui/controller.mjs +4 -1
  90. package/src/tui/discovery.mjs +17 -7
  91. package/src/tui/inbound-blocks.mjs +5 -1
  92. package/src/tui/screen.mjs +53 -14
  93. package/src/tui/swarm-panel.mjs +19 -8
  94. package/src/turn-timing.mjs +82 -0
  95. package/src/usage-accounting.mjs +12 -1
  96. package/src/vision.mjs +6 -1
  97. package/src/visual/chrome.mjs +379 -0
  98. package/src/visual/fingerprint.mjs +30 -0
  99. package/src/visual/fixtures.mjs +201 -0
  100. package/src/visual/gate.mjs +92 -0
  101. package/src/visual/judge.mjs +114 -0
  102. package/src/visual/ledger.mjs +160 -0
  103. package/src/visual/measure.mjs +145 -0
  104. package/src/visual/names.mjs +7 -0
  105. package/src/visual/operations.mjs +211 -0
  106. package/src/visual/pixel-diff.mjs +96 -0
  107. package/src/visual/png.mjs +103 -0
  108. package/src/visual/registry.mjs +265 -0
  109. package/src/visual/report.mjs +64 -0
  110. package/src/visual/verify.mjs +292 -0
  111. package/src/work-assertions.mjs +15 -4
  112. package/src/work-plan.mjs +166 -30
  113. package/src/work-state.mjs +4 -4
  114. package/src/workflows/chrome-task-adoption.mjs +7 -3
  115. package/src/workspace-serve.mjs +59 -0
package/README.md CHANGED
@@ -28,7 +28,7 @@ comal --help
28
28
 
29
29
  Keep the PATH line in your shell startup file if you use that prefix. If your Node manager already provides a user prefix, you can omit `--prefix "$HOME/.local"`. The package registers the `comal` executable; you do not need to create a shell alias.
30
30
 
31
- You can pin a version with `npx @milpa/comal@0.2.2` or `npm install --global @milpa/comal@0.2.2`. The local release manifest preserves SHA-256 and SHA-512 integrity is checked against npm at publish time. No independent publisher signature is claimed.
31
+ You can pin a version with `npx @milpa/comal@0.2.4` or `npm install --global @milpa/comal@0.2.4`. The local release manifest preserves SHA-256 and SHA-512 integrity is checked against npm at publish time. No independent publisher signature is claimed.
32
32
 
33
33
  ## Test without account or model
34
34
 
@@ -91,18 +91,6 @@
91
91
  "description": "Model capability support and provenance",
92
92
  "argument_pattern": "(?:refresh)?"
93
93
  },
94
- {
95
- "name": "permissions",
96
- "arguments": "",
97
- "description": "Permission mode, saved rules and recent decisions (read-only)",
98
- "argument_pattern": ""
99
- },
100
- {
101
- "name": "autonomy",
102
- "arguments": "",
103
- "description": "Current autonomy level (read-only)",
104
- "argument_pattern": ""
105
- },
106
94
  {
107
95
  "name": "plugins",
108
96
  "arguments": "[status|list]",
@@ -0,0 +1,423 @@
1
+ {
2
+ "protocol": "comal.remote.device.v1",
3
+ "description": "Contract between a Comal Remote Control (/rc) session and an M5Stack device: pairing, the two inputs a device may send, the ephemeral permission card, the session.stats projection and the reasons a device is refused. The device is a pre-check surface only: the local Comal host revalidates every answer (arm, expiry, card digest, session, device) before mutating. Owned by the Comal Node repository; the backend keeps a byte-identical copy.",
4
+ "pairing": {
5
+ "code_alphabet": "0123456789ABCDEFGHJKMNPQRSTVWXYZ",
6
+ "code_length": 8,
7
+ "code_ttl_seconds": 600,
8
+ "poll_interval_seconds": 5
9
+ },
10
+ "inputs": {
11
+ "permission_answer": {
12
+ "type": "object",
13
+ "additionalProperties": false,
14
+ "properties": {
15
+ "question_id": {
16
+ "type": "string",
17
+ "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
18
+ },
19
+ "card_digest": {
20
+ "type": "string",
21
+ "pattern": "^[a-f0-9]{64}$"
22
+ },
23
+ "decision": {
24
+ "type": "string",
25
+ "enum": [
26
+ "allow_once",
27
+ "deny"
28
+ ]
29
+ }
30
+ },
31
+ "required": [
32
+ "question_id",
33
+ "card_digest",
34
+ "decision"
35
+ ]
36
+ },
37
+ "quick_reply": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "properties": {
41
+ "text": {
42
+ "type": "string",
43
+ "enum": [
44
+ "continúa",
45
+ "sí",
46
+ "no"
47
+ ]
48
+ }
49
+ },
50
+ "required": [
51
+ "text"
52
+ ]
53
+ }
54
+ },
55
+ "stats": {
56
+ "maxBytes": 2048,
57
+ "schema": {
58
+ "type": "object",
59
+ "additionalProperties": false,
60
+ "properties": {
61
+ "model": {
62
+ "type": "object",
63
+ "additionalProperties": false,
64
+ "properties": {
65
+ "provider": {
66
+ "type": "string",
67
+ "maxLength": 64
68
+ },
69
+ "profile": {
70
+ "type": "string",
71
+ "maxLength": 64
72
+ },
73
+ "model": {
74
+ "type": "string",
75
+ "maxLength": 64
76
+ },
77
+ "effort": {
78
+ "type": "string",
79
+ "maxLength": 64
80
+ },
81
+ "effort_levels": {
82
+ "type": "array",
83
+ "maxItems": 8,
84
+ "items": {
85
+ "type": "string",
86
+ "maxLength": 64
87
+ }
88
+ }
89
+ }
90
+ },
91
+ "capabilities": {
92
+ "type": "object",
93
+ "additionalProperties": false,
94
+ "properties": {
95
+ "tools": {
96
+ "type": [
97
+ "boolean",
98
+ "null"
99
+ ]
100
+ },
101
+ "vision": {
102
+ "type": [
103
+ "boolean",
104
+ "null"
105
+ ]
106
+ },
107
+ "thinking": {
108
+ "type": [
109
+ "boolean",
110
+ "null"
111
+ ]
112
+ },
113
+ "cache": {
114
+ "type": [
115
+ "boolean",
116
+ "null"
117
+ ]
118
+ },
119
+ "sources": {
120
+ "type": "object",
121
+ "maxProperties": 8,
122
+ "additionalProperties": {
123
+ "type": "string",
124
+ "maxLength": 64
125
+ }
126
+ }
127
+ }
128
+ },
129
+ "permissions": {
130
+ "type": "object",
131
+ "additionalProperties": false,
132
+ "properties": {
133
+ "mode": {
134
+ "type": "string",
135
+ "enum": [
136
+ "default",
137
+ "acceptEdits",
138
+ "plan",
139
+ "auto",
140
+ "bypassPermissions"
141
+ ]
142
+ },
143
+ "device_armed": {
144
+ "type": "boolean"
145
+ },
146
+ "device_until": {
147
+ "type": [
148
+ "integer",
149
+ "null"
150
+ ],
151
+ "minimum": 0
152
+ },
153
+ "add_dirs": {
154
+ "type": "integer",
155
+ "minimum": 0
156
+ }
157
+ }
158
+ },
159
+ "context": {
160
+ "type": "object",
161
+ "additionalProperties": false,
162
+ "properties": {
163
+ "input_tokens": {
164
+ "type": "integer",
165
+ "minimum": 0
166
+ },
167
+ "window": {
168
+ "type": "integer",
169
+ "minimum": 0
170
+ },
171
+ "output_reserve": {
172
+ "type": "integer",
173
+ "minimum": 0
174
+ },
175
+ "percent": {
176
+ "type": "number",
177
+ "minimum": 0,
178
+ "maximum": 100
179
+ },
180
+ "compaction_window": {
181
+ "type": "integer",
182
+ "minimum": 0
183
+ },
184
+ "soft_threshold": {
185
+ "type": "integer",
186
+ "minimum": 0
187
+ },
188
+ "hard_threshold": {
189
+ "type": "integer",
190
+ "minimum": 0
191
+ },
192
+ "last_compaction": {
193
+ "type": [
194
+ "object",
195
+ "null"
196
+ ],
197
+ "additionalProperties": false,
198
+ "properties": {
199
+ "at": {
200
+ "type": "integer",
201
+ "minimum": 0
202
+ },
203
+ "trigger": {
204
+ "type": "string",
205
+ "maxLength": 64
206
+ },
207
+ "before": {
208
+ "type": "integer",
209
+ "minimum": 0
210
+ },
211
+ "after": {
212
+ "type": "integer",
213
+ "minimum": 0
214
+ }
215
+ }
216
+ },
217
+ "messages_active": {
218
+ "type": "integer",
219
+ "minimum": 0
220
+ },
221
+ "messages_original": {
222
+ "type": "integer",
223
+ "minimum": 0
224
+ }
225
+ }
226
+ },
227
+ "usage": {
228
+ "type": "object",
229
+ "additionalProperties": false,
230
+ "properties": {
231
+ "last": {
232
+ "type": "object",
233
+ "additionalProperties": false,
234
+ "properties": {
235
+ "input": {
236
+ "type": "integer",
237
+ "minimum": 0
238
+ },
239
+ "output": {
240
+ "type": "integer",
241
+ "minimum": 0
242
+ },
243
+ "cached": {
244
+ "type": "integer",
245
+ "minimum": 0
246
+ }
247
+ }
248
+ },
249
+ "session": {
250
+ "type": "object",
251
+ "additionalProperties": false,
252
+ "properties": {
253
+ "input": {
254
+ "type": "integer",
255
+ "minimum": 0
256
+ },
257
+ "output": {
258
+ "type": "integer",
259
+ "minimum": 0
260
+ },
261
+ "cached": {
262
+ "type": "integer",
263
+ "minimum": 0
264
+ }
265
+ }
266
+ },
267
+ "calls": {
268
+ "type": "integer",
269
+ "minimum": 0
270
+ },
271
+ "call_limit": {
272
+ "type": "integer",
273
+ "minimum": 0
274
+ }
275
+ }
276
+ },
277
+ "timing": {
278
+ "type": "object",
279
+ "additionalProperties": false,
280
+ "properties": {
281
+ "comal_ms": {
282
+ "type": "integer",
283
+ "minimum": 0
284
+ },
285
+ "reasoning_ms": {
286
+ "type": "integer",
287
+ "minimum": 0
288
+ },
289
+ "first_response_ms": {
290
+ "type": "integer",
291
+ "minimum": 0
292
+ },
293
+ "tools_ms": {
294
+ "type": "integer",
295
+ "minimum": 0
296
+ },
297
+ "human_wait_ms": {
298
+ "type": "integer",
299
+ "minimum": 0
300
+ }
301
+ }
302
+ },
303
+ "work": {
304
+ "type": "object",
305
+ "additionalProperties": false,
306
+ "properties": {
307
+ "objective": {
308
+ "type": "string",
309
+ "maxLength": 120
310
+ },
311
+ "done": {
312
+ "type": "integer",
313
+ "minimum": 0
314
+ },
315
+ "total": {
316
+ "type": "integer",
317
+ "minimum": 0
318
+ },
319
+ "current_task": {
320
+ "type": [
321
+ "string",
322
+ "null"
323
+ ],
324
+ "maxLength": 120
325
+ },
326
+ "checks_passing": {
327
+ "type": "integer",
328
+ "minimum": 0
329
+ },
330
+ "checks_failing": {
331
+ "type": "integer",
332
+ "minimum": 0
333
+ }
334
+ }
335
+ },
336
+ "connection": {
337
+ "type": "object",
338
+ "additionalProperties": false,
339
+ "properties": {
340
+ "transport": {
341
+ "type": "string",
342
+ "enum": [
343
+ "websocket",
344
+ "https-polling",
345
+ "disconnected"
346
+ ]
347
+ },
348
+ "host_online": {
349
+ "type": "boolean"
350
+ }
351
+ }
352
+ }
353
+ }
354
+ }
355
+ },
356
+ "card": {
357
+ "maxBytes": 4096,
358
+ "schema": {
359
+ "type": "object",
360
+ "additionalProperties": false,
361
+ "properties": {
362
+ "question_id": {
363
+ "type": "string",
364
+ "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
365
+ },
366
+ "card_digest": {
367
+ "type": "string",
368
+ "pattern": "^[a-f0-9]{64}$"
369
+ },
370
+ "tool": {
371
+ "type": "string",
372
+ "maxLength": 64
373
+ },
374
+ "kind": {
375
+ "type": "string",
376
+ "enum": [
377
+ "bash",
378
+ "write",
379
+ "edit",
380
+ "summary",
381
+ "terminal"
382
+ ]
383
+ },
384
+ "lines": {
385
+ "type": "array",
386
+ "maxItems": 16,
387
+ "items": {
388
+ "type": "string",
389
+ "maxLength": 120
390
+ }
391
+ },
392
+ "truncated": {
393
+ "type": "boolean"
394
+ },
395
+ "overwrite": {
396
+ "type": "boolean"
397
+ }
398
+ },
399
+ "required": [
400
+ "question_id",
401
+ "card_digest",
402
+ "tool",
403
+ "kind",
404
+ "lines",
405
+ "truncated"
406
+ ]
407
+ }
408
+ },
409
+ "arm": {
410
+ "default_seconds": 1800,
411
+ "max_seconds": 28800
412
+ },
413
+ "refusals": [
414
+ "disarmed",
415
+ "expired",
416
+ "stale",
417
+ "terminal_only",
418
+ "other_device",
419
+ "plan_mode",
420
+ "confirm_always",
421
+ "offline"
422
+ ]
423
+ }
@@ -0,0 +1,209 @@
1
+ {
2
+ "protocol": "comal.remote.relay.answers.v1",
3
+ "description": "Typed browser answers to /relay cards (remote.inputs.enqueue kind=relay). Admission in Milpa is a useful pre-check, never authority: the local Comal host claims each control, revalidates it (ledger by request_id, session and epoch, local arm, expiry, card still pending, remote.inputs.validate, live relayd read) and only then mutates with the same functions as its terminal cards. The browser never sends tokens, idempotency keys, paths or ADR text. Owned by the Comal Node repository; the backend keeps a byte-identical copy.",
4
+ "control_ttl_seconds": 600,
5
+ "step_up_seconds": 600,
6
+ "arm_max_seconds": 28800,
7
+ "actions": {
8
+ "plan.approve": {
9
+ "card": "plan",
10
+ "fields": [
11
+ "digest",
12
+ "projection_sha256"
13
+ ],
14
+ "text": "none",
15
+ "text_max": 0,
16
+ "caps": [
17
+ "plans"
18
+ ],
19
+ "step_up": "recent_login"
20
+ },
21
+ "plan.reject": {
22
+ "card": "plan",
23
+ "fields": [
24
+ "digest"
25
+ ],
26
+ "text": "required",
27
+ "text_max": 4096,
28
+ "caps": [
29
+ "plans"
30
+ ],
31
+ "step_up": "none"
32
+ },
33
+ "question.option": {
34
+ "card": "question",
35
+ "fields": [
36
+ "option_index",
37
+ "option_label_sha256"
38
+ ],
39
+ "text": "optional",
40
+ "text_max": 1024,
41
+ "caps": [
42
+ "decide",
43
+ "converse"
44
+ ],
45
+ "step_up": "none"
46
+ },
47
+ "question.reply": {
48
+ "card": "question",
49
+ "fields": [],
50
+ "text": "required",
51
+ "text_max": 4096,
52
+ "caps": [
53
+ "converse"
54
+ ],
55
+ "step_up": "none"
56
+ },
57
+ "question.ack": {
58
+ "card": "question",
59
+ "fields": [],
60
+ "text": "none",
61
+ "text_max": 0,
62
+ "caps": [
63
+ "converse"
64
+ ],
65
+ "step_up": "none"
66
+ },
67
+ "criteria.accept": {
68
+ "card": "criteria",
69
+ "fields": [
70
+ "digest"
71
+ ],
72
+ "text": "none",
73
+ "text_max": 0,
74
+ "caps": [
75
+ "plans"
76
+ ],
77
+ "step_up": "recent_login"
78
+ },
79
+ "criteria.reject": {
80
+ "card": "criteria",
81
+ "fields": [
82
+ "digest"
83
+ ],
84
+ "text": "required",
85
+ "text_max": 4096,
86
+ "caps": [
87
+ "plans"
88
+ ],
89
+ "step_up": "none"
90
+ }
91
+ },
92
+ "outcomes": {
93
+ "applied": [
94
+ "approved",
95
+ "rejected",
96
+ "decided",
97
+ "answered",
98
+ "acked"
99
+ ],
100
+ "stale": [
101
+ "already_decided",
102
+ "stale",
103
+ "card_gone",
104
+ "epoch",
105
+ "digest",
106
+ "projection",
107
+ "option",
108
+ "not_pending",
109
+ "kind"
110
+ ],
111
+ "refused": [
112
+ "local_arm_off",
113
+ "local_in_progress",
114
+ "revoked",
115
+ "relay_unavailable",
116
+ "delegation",
117
+ "cap_missing",
118
+ "host_legacy",
119
+ "invalid",
120
+ "host_error"
121
+ ],
122
+ "expired": [
123
+ "expired"
124
+ ]
125
+ },
126
+ "terminal_only": [
127
+ "task.resume",
128
+ "review.override",
129
+ "review.retry",
130
+ "relay.trust",
131
+ "project.create",
132
+ "project.start",
133
+ "project.stop",
134
+ "project.attach",
135
+ "swarm.start",
136
+ "budget"
137
+ ],
138
+ "control": {
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "properties": {
142
+ "action": {
143
+ "enum": [
144
+ "plan.approve",
145
+ "plan.reject",
146
+ "question.option",
147
+ "question.reply",
148
+ "question.ack",
149
+ "criteria.accept",
150
+ "criteria.reject"
151
+ ]
152
+ },
153
+ "card_id": {
154
+ "type": "string",
155
+ "pattern": "^[a-f0-9]{32}$"
156
+ },
157
+ "card_seq": {
158
+ "type": "string",
159
+ "pattern": "^[1-9][0-9]{0,8}$"
160
+ },
161
+ "host_epoch": {
162
+ "type": "string",
163
+ "pattern": "^[a-f0-9]{32}$"
164
+ },
165
+ "project": {
166
+ "type": "string",
167
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:@-]{0,59}$"
168
+ },
169
+ "swarm": {
170
+ "type": "string",
171
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:@-]{0,119}$"
172
+ },
173
+ "subject": {
174
+ "type": "string",
175
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:@-]{0,199}$"
176
+ },
177
+ "digest": {
178
+ "type": "string",
179
+ "pattern": "^[a-f0-9]{64}$"
180
+ },
181
+ "projection_sha256": {
182
+ "type": "string",
183
+ "pattern": "^[a-f0-9]{64}$"
184
+ },
185
+ "option_index": {
186
+ "type": "integer",
187
+ "minimum": 0,
188
+ "maximum": 3
189
+ },
190
+ "option_label_sha256": {
191
+ "type": "string",
192
+ "pattern": "^[a-f0-9]{64}$"
193
+ },
194
+ "text": {
195
+ "type": "string",
196
+ "maxLength": 4096
197
+ }
198
+ },
199
+ "required": [
200
+ "action",
201
+ "card_id",
202
+ "card_seq",
203
+ "host_epoch",
204
+ "project",
205
+ "swarm",
206
+ "subject"
207
+ ]
208
+ }
209
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milpa/comal",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Comal: governed operations, execution receipts, and programming assistance in any language",
5
5
  "type": "module",
6
6
  "private": false,
@@ -19,10 +19,13 @@
19
19
  "files": [
20
20
  "bin",
21
21
  "src",
22
+ "skills",
22
23
  "backend/verifier/transport.mjs",
23
24
  "backend/contracts/artifact-check-v1.schema.json",
24
25
  "backend/contracts/remote-commands-v1.json",
26
+ "backend/contracts/remote-relay-answers-v1.json",
25
27
  "backend/contracts/remote-workspace-v1.schema.json",
28
+ "backend/contracts/remote-device-v1.json",
26
29
  "governance/source-task-v1.json",
27
30
  "governance/source-task-v2.json",
28
31
  "governance/chrome-task-v1.json",