@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.
- package/README.md +1 -1
- package/backend/contracts/remote-commands-v1.json +0 -12
- package/backend/contracts/remote-device-v1.json +423 -0
- package/backend/contracts/remote-relay-answers-v1.json +209 -0
- package/package.json +4 -1
- package/skills/mv3/SKILL.md +44 -0
- package/skills/mv3/skill.json +4 -0
- package/src/agent.mjs +299 -32
- package/src/auto-guard.mjs +40 -3
- package/src/autocompact.mjs +233 -0
- package/src/bash-timeouts.mjs +29 -0
- package/src/child-env.mjs +23 -0
- package/src/cli.mjs +261 -62
- package/src/code-run-artifact.mjs +30 -0
- package/src/code-run-journal.mjs +135 -0
- package/src/code-run-session-proof.mjs +50 -0
- package/src/code-run-session.mjs +97 -0
- package/src/code-run-worker.mjs +20 -4
- package/src/code-run.mjs +49 -14
- package/src/codex-provider.mjs +4 -4
- package/src/compaction-notice.mjs +22 -0
- package/src/compaction.mjs +162 -23
- package/src/connection-settings.mjs +36 -4
- package/src/context-pressure.mjs +5 -4
- package/src/context.mjs +27 -22
- package/src/execution-metrics.mjs +36 -5
- package/src/file-recovery-proof.mjs +9 -1
- package/src/file-recovery.mjs +36 -3
- package/src/gemini-provider.mjs +5 -3
- package/src/git-integration-operations.mjs +2 -1
- package/src/git-plumbing.mjs +2 -1
- package/src/git-source.mjs +2 -1
- package/src/git-workspaces.mjs +2 -1
- package/src/house.mjs +13 -1
- package/src/i18n/cli-es.mjs +12 -1
- package/src/i18n/es.mjs +38 -1
- package/src/judges.mjs +2 -1
- package/src/mcp.mjs +2 -1
- package/src/model-controls.mjs +16 -2
- package/src/model-deadline.mjs +2 -2
- package/src/openai-provider.mjs +8 -4
- package/src/operations.mjs +17 -2
- package/src/package-identity.mjs +68 -0
- package/src/peer-probe.mjs +16 -0
- package/src/permissions.mjs +97 -4
- package/src/plugin-config.mjs +18 -1
- package/src/plugin-controls.mjs +31 -8
- package/src/plugin-trust.mjs +15 -6
- package/src/plugins/chrome-lab/bridge.mjs +19 -6
- package/src/plugins/chrome-lab/client.mjs +242 -12
- package/src/plugins/chrome-lab/index.mjs +106 -24
- package/src/plugins/chrome-lab/legacy-fill.mjs +25 -0
- package/src/plugins/chrome-lab/native-reply.mjs +31 -0
- package/src/plugins/open-relay/actions.mjs +60 -9
- package/src/plugins/open-relay/client.mjs +3 -3
- package/src/plugins/open-relay/decision.mjs +3 -2
- package/src/plugins/open-relay/index.mjs +17 -7
- package/src/plugins/open-relay/lookup.mjs +41 -4
- package/src/plugins/open-relay/notices.mjs +44 -3
- package/src/plugins/open-relay/panel.mjs +4 -1
- package/src/plugins/open-relay/watch.mjs +27 -8
- package/src/process-lock.mjs +20 -12
- package/src/provider-auth.mjs +6 -3
- package/src/provider-profiles.mjs +13 -3
- package/src/provider.mjs +175 -30
- package/src/qr-scan.mjs +240 -0
- package/src/read-only-check.mjs +6 -1
- package/src/relay/broker.mjs +173 -0
- package/src/relay/cards.mjs +702 -0
- package/src/relay/flow.mjs +886 -0
- package/src/relay/follow.mjs +119 -0
- package/src/relay/git.mjs +23 -0
- package/src/relay/hub-client.mjs +163 -0
- package/src/relay/state.mjs +55 -0
- package/src/remote-control.mjs +283 -15
- package/src/remote-device-card.mjs +111 -0
- package/src/remote-device.mjs +92 -0
- package/src/remote-permissions.mjs +159 -0
- package/src/remote-relay.mjs +468 -0
- package/src/remote-stats.mjs +205 -0
- package/src/session-bus.mjs +13 -3
- package/src/session-provider-settings.mjs +2 -2
- package/src/skill-runtime.mjs +8 -6
- package/src/source-ownership.mjs +3 -1
- package/src/tool-manifest.mjs +71 -0
- package/src/tool-packs.mjs +22 -6
- package/src/tool-schema.mjs +14 -2
- package/src/tools.mjs +96 -27
- package/src/tui/controller.mjs +4 -1
- package/src/tui/discovery.mjs +17 -7
- package/src/tui/inbound-blocks.mjs +5 -1
- package/src/tui/screen.mjs +53 -14
- package/src/tui/swarm-panel.mjs +19 -8
- package/src/turn-timing.mjs +82 -0
- package/src/usage-accounting.mjs +12 -1
- package/src/vision.mjs +6 -1
- package/src/visual/chrome.mjs +379 -0
- package/src/visual/fingerprint.mjs +30 -0
- package/src/visual/fixtures.mjs +201 -0
- package/src/visual/gate.mjs +92 -0
- package/src/visual/judge.mjs +114 -0
- package/src/visual/ledger.mjs +160 -0
- package/src/visual/measure.mjs +145 -0
- package/src/visual/names.mjs +7 -0
- package/src/visual/operations.mjs +211 -0
- package/src/visual/pixel-diff.mjs +96 -0
- package/src/visual/png.mjs +103 -0
- package/src/visual/registry.mjs +265 -0
- package/src/visual/report.mjs +64 -0
- package/src/visual/verify.mjs +292 -0
- package/src/work-assertions.mjs +15 -4
- package/src/work-plan.mjs +166 -30
- package/src/work-state.mjs +4 -4
- package/src/workflows/chrome-task-adoption.mjs +7 -3
- 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.
|
|
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.
|
|
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",
|