@agentshouse/mdruntime-adapter 0.1.0-cafd7caa7ae65 → 0.1.0-cb0bbc4ccacd0
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 +2 -2
- package/dist/actions.d.ts +4 -65
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +8 -347
- package/dist/adapter.d.ts +1 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +257 -277
- package/dist/app-reference.d.ts +2 -0
- package/dist/app-reference.d.ts.map +1 -0
- package/dist/app-reference.js +2 -0
- package/dist/crockford.d.ts +4 -0
- package/dist/crockford.d.ts.map +1 -0
- package/dist/crockford.js +3 -0
- package/dist/discovery.d.ts +24 -14
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +93 -54
- package/dist/history.d.ts +12 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +92 -0
- package/dist/house-model.d.ts +641 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +361 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/model.d.ts +8 -4
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +36 -36
- package/dist/part.d.ts +14 -0
- package/dist/part.d.ts.map +1 -0
- package/dist/part.js +90 -0
- package/dist/read.d.ts +58 -43
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +245 -204
- package/dist/refusal.d.ts +0 -3
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +2 -6
- package/dist/room-stream.d.ts +20 -0
- package/dist/room-stream.d.ts.map +1 -0
- package/dist/room-stream.js +57 -0
- package/dist/room-types.d.ts +7 -0
- package/dist/room-types.d.ts.map +1 -0
- package/dist/room-types.js +123 -0
- package/dist/search.d.ts +5 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +47 -0
- package/dist/site.d.ts +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +120 -131
- package/dist/space-schema.d.ts +7 -0
- package/dist/space-schema.d.ts.map +1 -0
- package/dist/space-schema.js +18 -0
- package/dist/stream.d.ts +13 -12
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +209 -158
- package/dist/transport.d.ts +85 -25
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +54 -11
- package/dist/upload.d.ts +12 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +63 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/write.d.ts +18 -2
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +105 -71
- package/package.json +8 -4
- package/AGENTS.md +0 -302
- package/dist/gather.d.ts +0 -4
- package/dist/gather.d.ts.map +0 -1
- package/dist/gather.js +0 -45
- package/dist/handed.d.ts +0 -15
- package/dist/handed.d.ts.map +0 -1
- package/dist/handed.js +0 -38
- package/dist/referrer.d.ts +0 -7
- package/dist/referrer.d.ts.map +0 -1
- package/dist/referrer.js +0 -35
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
export const HOUSE_MODEL_DECLARATION = {
|
|
2
|
+
$defs: {
|
|
3
|
+
room: {
|
|
4
|
+
description: 'A Room, by its Room reference, under the key `room`.',
|
|
5
|
+
type: 'string',
|
|
6
|
+
pattern: '^r_([0123456789abcdefghjkmnpqrstvwxyz]+)\\.([0123456789abcdefghjkmnpqrstvwxyz])$',
|
|
7
|
+
},
|
|
8
|
+
app: {
|
|
9
|
+
description: 'An App, by its App reference, under the key `app`.',
|
|
10
|
+
type: 'string',
|
|
11
|
+
pattern: '^a_([0123456789abcdefghjkmnpqrstvwxyz]+)\\.([0123456789abcdefghjkmnpqrstvwxyz])$',
|
|
12
|
+
},
|
|
13
|
+
document: {
|
|
14
|
+
description: 'A document of a Room, by its file reference, under the key `document`.',
|
|
15
|
+
type: 'string',
|
|
16
|
+
pattern: '^af_([123456789abcdefghjkmnpqrstvwxyz][0123456789abcdefghjkmnpqrstvwxyz]*)\\.([0123456789abcdefghjkmnpqrstvwxyz])$',
|
|
17
|
+
},
|
|
18
|
+
id: {
|
|
19
|
+
description: 'Any other entity, by its identifier, under the key of its kind. An entity a type says more about is an object holding it under that key beside its facts.',
|
|
20
|
+
type: 'string',
|
|
21
|
+
format: 'uuid',
|
|
22
|
+
},
|
|
23
|
+
namespace: {
|
|
24
|
+
description: 'The Namespace a grant entry covers, an App or a Room by its reference with the area of it.',
|
|
25
|
+
type: 'string',
|
|
26
|
+
maxLength: 512,
|
|
27
|
+
pattern: '^(?:a_[A-Za-z0-9._-]+(?:\\/source)?|r_[A-Za-z0-9._-]+(?:\\/(?:settings|settings\\/schema|settings\\/model|settings\\/indexing|content))?)$',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
'house-app-preferences': {
|
|
31
|
+
description: "An App's preferences. Its own vocabulary is in the body.",
|
|
32
|
+
properties: { app: { $ref: '#/$defs/app' } },
|
|
33
|
+
required: ['app'],
|
|
34
|
+
},
|
|
35
|
+
'house-notification': {
|
|
36
|
+
description: "One kept Notification for this User: its kind, when it was sent as `created`, its way in, its email's subject and each fact of its value that is not sealed, named in snake_case. An entity a fact names is an object holding its identifier under the key of its kind, when the notification carries it, and its `name`, `email` and other facts beside it; a fact holding null is absent. `way_in` is either the House `path` it opens or the entity it is about, by its identifier under the key of its kind, a Trigger with its `room`. Its body is its email's words in Markdown. Both were worded once, in the User's language when it was delivered; an App may show them or word it itself from its kind and value. `read` is when the User opened it or marked it read, on any device: the one field House adds after delivery.",
|
|
37
|
+
properties: {
|
|
38
|
+
notification: { $ref: '#/$defs/id' },
|
|
39
|
+
kind: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
enum: [
|
|
42
|
+
'share-offer',
|
|
43
|
+
'join-request',
|
|
44
|
+
'join-request-approved',
|
|
45
|
+
'room-ownership-offer',
|
|
46
|
+
'managed-environment-retention-opened',
|
|
47
|
+
'storage-full',
|
|
48
|
+
'sandbox-budget-spent',
|
|
49
|
+
'trigger-failed',
|
|
50
|
+
'break-glass-owner-disclosure',
|
|
51
|
+
'export-ready',
|
|
52
|
+
'export-failed',
|
|
53
|
+
'custom',
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
created: { type: 'string', format: 'date-time' },
|
|
57
|
+
read: { type: 'string', format: 'date-time' },
|
|
58
|
+
way_in: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
additionalProperties: false,
|
|
61
|
+
properties: {
|
|
62
|
+
path: { type: 'string', pattern: '^\\/' },
|
|
63
|
+
room: { $ref: '#/$defs/room' },
|
|
64
|
+
environment: { $ref: '#/$defs/id' },
|
|
65
|
+
trigger: { $ref: '#/$defs/id' },
|
|
66
|
+
},
|
|
67
|
+
minProperties: 1,
|
|
68
|
+
},
|
|
69
|
+
subject: { type: 'string' },
|
|
70
|
+
share: { $ref: '#/$defs/id' },
|
|
71
|
+
issuer: {
|
|
72
|
+
type: 'object',
|
|
73
|
+
additionalProperties: false,
|
|
74
|
+
properties: { name: { type: 'string' }, email: { type: 'string', format: 'email' } },
|
|
75
|
+
required: ['name', 'email'],
|
|
76
|
+
},
|
|
77
|
+
rooms: {
|
|
78
|
+
type: 'array',
|
|
79
|
+
items: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
additionalProperties: false,
|
|
82
|
+
properties: { name: { type: 'string' } },
|
|
83
|
+
required: ['name'],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
apps: {
|
|
87
|
+
maxItems: 20,
|
|
88
|
+
type: 'array',
|
|
89
|
+
items: {
|
|
90
|
+
type: 'object',
|
|
91
|
+
additionalProperties: false,
|
|
92
|
+
properties: {
|
|
93
|
+
name: { type: 'string', minLength: 1, maxLength: 200 },
|
|
94
|
+
reaches: { type: 'array', items: { type: 'string', minLength: 1, maxLength: 512 } },
|
|
95
|
+
},
|
|
96
|
+
required: ['name', 'reaches'],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
expires_at: { type: 'string', format: 'date-time' },
|
|
100
|
+
join_request: { $ref: '#/$defs/id' },
|
|
101
|
+
user: {
|
|
102
|
+
type: 'object',
|
|
103
|
+
additionalProperties: false,
|
|
104
|
+
properties: { name: { type: 'string' }, email: { type: 'string', format: 'email' } },
|
|
105
|
+
required: ['name', 'email'],
|
|
106
|
+
},
|
|
107
|
+
room: {
|
|
108
|
+
type: 'object',
|
|
109
|
+
additionalProperties: false,
|
|
110
|
+
properties: { room: { $ref: '#/$defs/room' }, name: { type: 'string' } },
|
|
111
|
+
minProperties: 1,
|
|
112
|
+
},
|
|
113
|
+
app: {
|
|
114
|
+
type: 'object',
|
|
115
|
+
additionalProperties: false,
|
|
116
|
+
properties: { app: { $ref: '#/$defs/app' } },
|
|
117
|
+
required: ['app'],
|
|
118
|
+
},
|
|
119
|
+
ownership_offer: { $ref: '#/$defs/id' },
|
|
120
|
+
offerer: {
|
|
121
|
+
type: 'object',
|
|
122
|
+
additionalProperties: false,
|
|
123
|
+
properties: { name: { type: 'string' }, email: { type: 'string', format: 'email' } },
|
|
124
|
+
required: ['name', 'email'],
|
|
125
|
+
},
|
|
126
|
+
environment: {
|
|
127
|
+
type: 'object',
|
|
128
|
+
additionalProperties: false,
|
|
129
|
+
properties: {
|
|
130
|
+
environment: { $ref: '#/$defs/id' },
|
|
131
|
+
name: { type: 'string' },
|
|
132
|
+
kind: { enum: ['vps', 'sandbox'] },
|
|
133
|
+
},
|
|
134
|
+
required: ['environment', 'name'],
|
|
135
|
+
},
|
|
136
|
+
reason: { type: 'string' },
|
|
137
|
+
deadline: { type: 'string', format: 'date-time' },
|
|
138
|
+
free: {
|
|
139
|
+
type: 'object',
|
|
140
|
+
additionalProperties: false,
|
|
141
|
+
properties: {
|
|
142
|
+
held: { type: 'string', pattern: '^\\d+$' },
|
|
143
|
+
limit: { type: 'string', pattern: '^[1-9]\\d*$' },
|
|
144
|
+
measure: { type: 'string', enum: ['content', 'retained'] },
|
|
145
|
+
},
|
|
146
|
+
required: ['held', 'limit', 'measure'],
|
|
147
|
+
},
|
|
148
|
+
budget: { type: 'string', pattern: '^\\d+(?:\\.\\d+)?$' },
|
|
149
|
+
resets_at: { type: 'string', format: 'date-time' },
|
|
150
|
+
grant: { $ref: '#/$defs/id' },
|
|
151
|
+
category: { type: 'string' },
|
|
152
|
+
access_started_at: { type: 'string', format: 'date-time' },
|
|
153
|
+
access_ended_at: { type: 'string', format: 'date-time' },
|
|
154
|
+
systems: { type: 'array', items: { type: 'string' } },
|
|
155
|
+
case_reference: { type: 'string' },
|
|
156
|
+
export: { $ref: '#/$defs/id' },
|
|
157
|
+
size_bytes: { type: 'integer', minimum: 0 },
|
|
158
|
+
title: { type: 'string' },
|
|
159
|
+
body: { type: 'string' },
|
|
160
|
+
authorship: {
|
|
161
|
+
type: 'object',
|
|
162
|
+
additionalProperties: false,
|
|
163
|
+
properties: {
|
|
164
|
+
kind: { type: 'string', const: 'trigger-action' },
|
|
165
|
+
trigger: { $ref: '#/$defs/id' },
|
|
166
|
+
position: { type: 'integer', minimum: 0 },
|
|
167
|
+
},
|
|
168
|
+
required: ['kind', 'trigger', 'position'],
|
|
169
|
+
},
|
|
170
|
+
path: { type: 'string', maxLength: 4096, pattern: '^\\/.*' },
|
|
171
|
+
trigger: {
|
|
172
|
+
type: 'object',
|
|
173
|
+
additionalProperties: false,
|
|
174
|
+
properties: { trigger: { $ref: '#/$defs/id' }, description: { type: 'string' } },
|
|
175
|
+
required: ['trigger', 'description'],
|
|
176
|
+
},
|
|
177
|
+
code: {
|
|
178
|
+
type: 'string',
|
|
179
|
+
enum: [
|
|
180
|
+
'failed',
|
|
181
|
+
'function_failed',
|
|
182
|
+
'function_not_started',
|
|
183
|
+
'agent_function_request_not_started',
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
action: { type: 'integer', minimum: 0 },
|
|
187
|
+
moment: { type: 'string', format: 'date-time' },
|
|
188
|
+
error: { type: 'string' },
|
|
189
|
+
},
|
|
190
|
+
required: ['notification', 'kind', 'created', 'way_in', 'subject'],
|
|
191
|
+
},
|
|
192
|
+
'house-panel-preferences': {
|
|
193
|
+
description: "The panel's preferences at /rooms/private/settings/panel.md. Its own vocabulary is in the body.",
|
|
194
|
+
properties: {},
|
|
195
|
+
},
|
|
196
|
+
'house-agent-function': {
|
|
197
|
+
description: "One Agent function that serves this Room, which House alone writes from its owner's document in their Private Room: the `agent_function` by identifier, its `description`, the `input` a caller sends, empty when it takes nothing, and the `agent` it starts, by `agent` and the `name` that Agent had when this card was last written. The Agent function's instruction is never written here.",
|
|
198
|
+
properties: {
|
|
199
|
+
reflected: { type: 'string', format: 'date-time' },
|
|
200
|
+
agent_function: { $ref: '#/$defs/id' },
|
|
201
|
+
description: { type: 'string' },
|
|
202
|
+
input: { type: 'string' },
|
|
203
|
+
agent: {
|
|
204
|
+
type: 'object',
|
|
205
|
+
additionalProperties: false,
|
|
206
|
+
properties: { agent: { $ref: '#/$defs/id' }, name: { type: 'string' } },
|
|
207
|
+
required: ['agent', 'name'],
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
required: ['reflected', 'agent_function', 'description', 'input', 'agent'],
|
|
211
|
+
},
|
|
212
|
+
'house-agent-function-document': {
|
|
213
|
+
description: 'One Agent function as its owner writes it in their Private Room at rooms/<room-handle>/agent-functions/<name>.md, a path that binds this type and a document that names no type: what it does as `description`, what a caller sends as `input`, empty when it takes nothing, and the `agent` it starts, by identifier. Its body is the instruction that Agent follows.',
|
|
214
|
+
properties: {
|
|
215
|
+
description: { type: 'string', maxLength: 2000, pattern: '\\S' },
|
|
216
|
+
input: { type: 'string' },
|
|
217
|
+
agent: { $ref: '#/$defs/id' },
|
|
218
|
+
},
|
|
219
|
+
required: ['description', 'input', 'agent'],
|
|
220
|
+
},
|
|
221
|
+
'house-trigger': {
|
|
222
|
+
description: "One Trigger of this Room as its acts wrote it, which House alone writes: its `description`, the `condition` it fires on, its `actions` in order, whether each action and the Trigger are `enabled`, `paused_by` `types` while a change of the Room's types paused it, its `creator` by `user` and the `name` they had then, and when it was `created`. A `notify` action reaches the `users` its `to` names, the members its `fields` name in the matched document and the holders of its `roles`; an `agent_function` action sends its `payload` to the Agent function whose card under this Room's `house/agent-functions/` its `card` names, absent while this Room holds no card of that Agent function; a `message` action puts its `text` into the active conversation that Agent function started for what the Event is about, or starts that Agent function when none is active; a `done` action marks Done every active conversation an Agent function request of this Room started for the Event's document; a `function` action runs the `function` its `app`'s latest release declares, on House's servers, or, naming no `app`, the Room owner's Environment function of that name on its Environment, which only a Trigger of their Private Room holds. Whether an action's target holds is not written: it follows from the Room's members, the Agent function's card, the App's latest release and the owner's functions.",
|
|
223
|
+
properties: {
|
|
224
|
+
reflected: { type: 'string', format: 'date-time' },
|
|
225
|
+
trigger: { $ref: '#/$defs/id' },
|
|
226
|
+
description: { type: 'string' },
|
|
227
|
+
condition: {
|
|
228
|
+
description: 'When it fires, as the Trigger reference page writes it, a document it names at its current path.',
|
|
229
|
+
type: 'object',
|
|
230
|
+
additionalProperties: true,
|
|
231
|
+
},
|
|
232
|
+
actions: {
|
|
233
|
+
type: 'array',
|
|
234
|
+
items: {
|
|
235
|
+
anyOf: [
|
|
236
|
+
{
|
|
237
|
+
type: 'object',
|
|
238
|
+
additionalProperties: false,
|
|
239
|
+
properties: {
|
|
240
|
+
kind: { const: 'notify' },
|
|
241
|
+
enabled: { type: 'boolean' },
|
|
242
|
+
title: { type: 'string' },
|
|
243
|
+
text: { type: 'string' },
|
|
244
|
+
to: {
|
|
245
|
+
type: 'object',
|
|
246
|
+
additionalProperties: false,
|
|
247
|
+
properties: {
|
|
248
|
+
users: {
|
|
249
|
+
type: 'array',
|
|
250
|
+
items: {
|
|
251
|
+
type: 'object',
|
|
252
|
+
additionalProperties: false,
|
|
253
|
+
properties: { user: { $ref: '#/$defs/id' } },
|
|
254
|
+
required: ['user'],
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
fields: { type: 'array', items: { type: 'string' } },
|
|
258
|
+
roles: { type: 'array', items: { type: 'string' } },
|
|
259
|
+
},
|
|
260
|
+
required: ['users', 'fields', 'roles'],
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
required: ['kind', 'enabled', 'title', 'text', 'to'],
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
type: 'object',
|
|
267
|
+
additionalProperties: false,
|
|
268
|
+
properties: {
|
|
269
|
+
kind: { const: 'agent_function' },
|
|
270
|
+
enabled: { type: 'boolean' },
|
|
271
|
+
card: { type: 'string', minLength: 1 },
|
|
272
|
+
payload: { type: 'string' },
|
|
273
|
+
},
|
|
274
|
+
required: ['kind', 'enabled', 'payload'],
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
type: 'object',
|
|
278
|
+
additionalProperties: false,
|
|
279
|
+
properties: {
|
|
280
|
+
kind: { const: 'message' },
|
|
281
|
+
enabled: { type: 'boolean' },
|
|
282
|
+
card: { type: 'string', minLength: 1 },
|
|
283
|
+
text: { type: 'string' },
|
|
284
|
+
},
|
|
285
|
+
required: ['kind', 'enabled', 'text'],
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
type: 'object',
|
|
289
|
+
additionalProperties: false,
|
|
290
|
+
properties: { kind: { const: 'done' }, enabled: { type: 'boolean' } },
|
|
291
|
+
required: ['kind', 'enabled'],
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
type: 'object',
|
|
295
|
+
additionalProperties: false,
|
|
296
|
+
properties: {
|
|
297
|
+
kind: { const: 'function' },
|
|
298
|
+
enabled: { type: 'boolean' },
|
|
299
|
+
app: { $ref: '#/$defs/app' },
|
|
300
|
+
function: { type: 'string' },
|
|
301
|
+
},
|
|
302
|
+
required: ['kind', 'enabled', 'function'],
|
|
303
|
+
},
|
|
304
|
+
],
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
enabled: { type: 'boolean' },
|
|
308
|
+
paused_by: { enum: ['types'] },
|
|
309
|
+
creator: {
|
|
310
|
+
type: 'object',
|
|
311
|
+
additionalProperties: false,
|
|
312
|
+
properties: { user: { $ref: '#/$defs/id' }, name: { type: 'string' } },
|
|
313
|
+
required: ['user', 'name'],
|
|
314
|
+
},
|
|
315
|
+
created: { type: 'string', format: 'date-time' },
|
|
316
|
+
},
|
|
317
|
+
required: [
|
|
318
|
+
'reflected',
|
|
319
|
+
'trigger',
|
|
320
|
+
'description',
|
|
321
|
+
'condition',
|
|
322
|
+
'actions',
|
|
323
|
+
'enabled',
|
|
324
|
+
'creator',
|
|
325
|
+
'created',
|
|
326
|
+
],
|
|
327
|
+
},
|
|
328
|
+
'house-web-wizard': {
|
|
329
|
+
description: "One Web Wizard an agent made for this User: the `environment` it runs on, with the `name` that Environment had when the Web Wizard was made, and its `state`, `waiting` until its owner presses Run or Keep, `running`, `finished` with the script's `exit_code`, `failed`, `cancelled` when its page closed before the script ended, `lapsed` when nobody ran it in its time, or `kept` when its owner kept the script, without running it, as their Environment function named `function`. Its body is the script, whole, in one fenced code block. The terminal's output is never kept.",
|
|
330
|
+
properties: {
|
|
331
|
+
reflected: { type: 'string', format: 'date-time' },
|
|
332
|
+
web_wizard: { $ref: '#/$defs/id' },
|
|
333
|
+
environment: {
|
|
334
|
+
type: 'object',
|
|
335
|
+
additionalProperties: false,
|
|
336
|
+
properties: { environment: { $ref: '#/$defs/id' }, name: { type: 'string' } },
|
|
337
|
+
required: ['environment', 'name'],
|
|
338
|
+
},
|
|
339
|
+
state: { enum: ['waiting', 'running', 'finished', 'failed', 'cancelled', 'lapsed', 'kept'] },
|
|
340
|
+
exit_code: { type: 'integer' },
|
|
341
|
+
function: { type: 'string' },
|
|
342
|
+
},
|
|
343
|
+
required: ['reflected', 'web_wizard', 'environment', 'state'],
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
function modelText(model) {
|
|
347
|
+
return `${Object.entries(model)
|
|
348
|
+
.map(([name, declared]) => `${name}: ${JSON.stringify(declared)}`)
|
|
349
|
+
.join('\n')}\n`;
|
|
350
|
+
}
|
|
351
|
+
export const HOUSE_MODEL_TYPES = modelText(HOUSE_MODEL_DECLARATION);
|
|
352
|
+
export const HOUSE_TYPED_PATHS = [
|
|
353
|
+
{ path: 'settings/panel.md', type: 'house-panel-preferences', named: true, body: false },
|
|
354
|
+
{ path: 'settings/apps/*.md', type: 'house-app-preferences', named: true, body: false },
|
|
355
|
+
{
|
|
356
|
+
path: 'rooms/*/agent-functions/*.md',
|
|
357
|
+
type: 'house-agent-function-document',
|
|
358
|
+
named: false,
|
|
359
|
+
body: true,
|
|
360
|
+
},
|
|
361
|
+
];
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
export { createAgentsHouseAdapter, type AgentsHouseAdapterOptions } from './adapter.js';
|
|
2
|
-
export {
|
|
3
|
-
export
|
|
2
|
+
export { foldedAuthorities } from './discovery.js';
|
|
3
|
+
export { finishedUpload, houseUpload, type HouseUpload } from './upload.js';
|
|
4
|
+
export { houseAction, type HouseActDoor } from './actions.js';
|
|
5
|
+
export { HISTORY_PAGE } from './history.js';
|
|
6
|
+
export { houseParts, type ChangeMapping } from './write.js';
|
|
7
|
+
export { APP_REFERENCE_PATTERN } from './app-reference.js';
|
|
8
|
+
export { HOUSE_MODEL_DECLARATION, HOUSE_MODEL_TYPES, HOUSE_TYPED_PATHS, type HouseDocumentFields, type HouseModelType, } from './house-model.js';
|
|
9
|
+
export { CROCKFORD_ALPHABET, CROCKFORD_CHARACTER, CROCKFORD_LEADING_CHARACTER, } from './crockford.js';
|
|
10
|
+
export { CHAT_MESSAGE_TYPE, CHAT_TYPE, HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES, INBOX_CHANNEL_KINDS, type InboxChannelKind, } from './room-types.js';
|
|
11
|
+
export { HOUSE_RUNTIME_READS, houseDoorRoute, houseSiteRoute, type HouseRuntimeAct, type HouseRuntimeFrame, } from './transport.js';
|
|
12
|
+
export type { HouseByteAct, HouseByteTransfer, HouseBytesAnswer, HouseClosing, HouseDoorAnswer, HouseHeldRoom, HouseOpening, HouseStream, HouseStreamed, HouseStreamEntry, HouseStreamFrame, HouseSiteTransport, HouseTransport, } from './transport.js';
|
|
4
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,GACf,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
1
|
export { createAgentsHouseAdapter } from './adapter.js';
|
|
2
|
-
export {
|
|
2
|
+
export { foldedAuthorities } from './discovery.js';
|
|
3
|
+
export { finishedUpload, houseUpload } from './upload.js';
|
|
4
|
+
export { houseAction } from './actions.js';
|
|
5
|
+
export { HISTORY_PAGE } from './history.js';
|
|
6
|
+
export { houseParts } from './write.js';
|
|
7
|
+
export { APP_REFERENCE_PATTERN } from './app-reference.js';
|
|
8
|
+
export { HOUSE_MODEL_DECLARATION, HOUSE_MODEL_TYPES, HOUSE_TYPED_PATHS, } from './house-model.js';
|
|
9
|
+
export { CROCKFORD_ALPHABET, CROCKFORD_CHARACTER, CROCKFORD_LEADING_CHARACTER, } from './crockford.js';
|
|
10
|
+
export { CHAT_MESSAGE_TYPE, CHAT_TYPE, HOUSE_NAMEABLE_ROOM_TYPES, HOUSE_ROOM_TYPES, INBOX_CHANNEL_KINDS, } from './room-types.js';
|
|
11
|
+
export { HOUSE_RUNTIME_READS, houseDoorRoute, houseSiteRoute, } from './transport.js';
|
package/dist/model.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { RoomModels } from '@agentshouse/mdruntime';
|
|
2
2
|
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
-
import { type
|
|
3
|
+
import { type HouseRoomHead, type HouseScope } from './read.js';
|
|
4
|
+
import { type SpaceSchemas } from './space-schema.js';
|
|
4
5
|
import type { HouseMode, HouseStreamEntry } from './transport.js';
|
|
5
6
|
export declare function partModels(scope: HouseScope, tracked: TrackedAuthority, seen: ReadonlySet<string>, final: boolean): Promise<RoomModels | undefined>;
|
|
6
|
-
export declare function
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
export declare function manifestedModels(room: HouseRoomHead, tracked: TrackedAuthority, spaces: SpaceSchemas): Promise<{
|
|
8
|
+
readonly models: RoomModels | undefined;
|
|
9
|
+
readonly seen: string[];
|
|
10
|
+
}>;
|
|
11
|
+
export declare function keptSpaceSchemas(entries: readonly HouseStreamEntry[], spaces: SpaceSchemas): void;
|
|
12
|
+
export declare function streamedModels(schemas: ReadonlyMap<string, HouseStreamEntry>, tracked: TrackedAuthority, mode: HouseMode, spaces: SpaceSchemas): Promise<RoomModels | undefined>;
|
|
9
13
|
//# sourceMappingURL=model.d.ts.map
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAIL,KAAK,aAAa,EAElB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA+BlE,wBAAgB,UAAU,CACxB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EACzB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAKjC;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAS/E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAKjG;AAQD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC9C,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAajC"}
|
package/dist/model.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { sha256Hex } from './digest.js';
|
|
2
|
-
import { schemaOf, schemaPath } from './read.js';
|
|
2
|
+
import { modelScope, schemaOf, schemaPath, } from './read.js';
|
|
3
|
+
import { spaceIdentity } from './space-schema.js';
|
|
3
4
|
const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
|
|
4
5
|
const ABSENT_SCHEMA = { schema: null, version: null, revision: null };
|
|
5
6
|
async function heldModel(read, identity) {
|
|
@@ -8,23 +9,19 @@ async function heldModel(read, identity) {
|
|
|
8
9
|
const version = await sha256Hex(JSON.stringify(read.version));
|
|
9
10
|
return {
|
|
10
11
|
kind: 'model',
|
|
11
|
-
snapshot: {
|
|
12
|
+
snapshot: {
|
|
13
|
+
identity: read.space === undefined ? identity : spaceIdentity(read.space),
|
|
14
|
+
version,
|
|
15
|
+
schema: read.schema,
|
|
16
|
+
revision: read.revision,
|
|
17
|
+
},
|
|
12
18
|
};
|
|
13
19
|
}
|
|
14
20
|
async function modelsOf(tracked, read) {
|
|
15
|
-
const models = {};
|
|
16
21
|
const collection = read(tracked.schema);
|
|
17
|
-
if (collection
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
if (tracked.houseModel !== null) {
|
|
21
|
-
const root = tracked.houseModel.root;
|
|
22
|
-
const selection = read(root);
|
|
23
|
-
if (selection !== undefined) {
|
|
24
|
-
models.selection = await heldModel(selection, schemaPath(tracked.handle, root));
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return models.collection === undefined && models.selection === undefined ? undefined : models;
|
|
22
|
+
if (collection === undefined)
|
|
23
|
+
return undefined;
|
|
24
|
+
return { collection: await heldModel(collection, schemaPath(tracked.handle, tracked.schema)) };
|
|
28
25
|
}
|
|
29
26
|
export function partModels(scope, tracked, seen, final) {
|
|
30
27
|
return modelsOf(tracked, (schema) => {
|
|
@@ -33,38 +30,41 @@ export function partModels(scope, tracked, seen, final) {
|
|
|
33
30
|
return final && !seen.has(schema) ? ABSENT_SCHEMA : undefined;
|
|
34
31
|
});
|
|
35
32
|
}
|
|
36
|
-
export function
|
|
37
|
-
|
|
33
|
+
export async function manifestedModels(room, tracked, spaces) {
|
|
34
|
+
const scope = modelScope(room);
|
|
35
|
+
const held = schemaOf(scope, tracked.schema);
|
|
36
|
+
if (held?.space !== undefined && held.schema !== null && held.revision !== null)
|
|
37
|
+
spaces.keep(held.space, held.revision, held.schema);
|
|
38
|
+
return {
|
|
39
|
+
models: await partModels(scope, tracked, new Set(), true),
|
|
40
|
+
seen: scope.files.some((file) => file.path === tracked.schema) ? [tracked.schema] : [],
|
|
41
|
+
};
|
|
38
42
|
}
|
|
39
|
-
export function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
version: change.version,
|
|
50
|
-
revision: change.revision ?? null,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
});
|
|
43
|
+
export function keptSpaceSchemas(entries, spaces) {
|
|
44
|
+
for (const entry of entries) {
|
|
45
|
+
if (entry.space !== undefined && entry.text !== undefined && entry.revision !== undefined)
|
|
46
|
+
spaces.keep(entry.space, entry.revision, entry.text);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function streamedText(entry, spaces) {
|
|
50
|
+
if (entry.text !== undefined || entry.space === undefined || entry.revision === undefined)
|
|
51
|
+
return entry.text;
|
|
52
|
+
return spaces.held(entry.space, entry.revision);
|
|
55
53
|
}
|
|
56
|
-
export function streamedModels(schemas, tracked, mode) {
|
|
54
|
+
export function streamedModels(schemas, tracked, mode, spaces) {
|
|
57
55
|
return modelsOf(tracked, (schema) => {
|
|
58
56
|
const entry = schemas.get(schema);
|
|
59
57
|
if (entry === undefined)
|
|
60
58
|
return undefined;
|
|
59
|
+
const space = entry.space === undefined ? {} : { space: entry.space };
|
|
61
60
|
if (entry.kind === 'removed')
|
|
62
|
-
return ABSENT_SCHEMA;
|
|
63
|
-
|
|
61
|
+
return { ...ABSENT_SCHEMA, ...space };
|
|
62
|
+
const text = streamedText(entry, spaces);
|
|
63
|
+
if (text === undefined)
|
|
64
64
|
return null;
|
|
65
65
|
const version = mode === 'site' ? entry.sha256 : entry.revision;
|
|
66
66
|
return version === undefined
|
|
67
67
|
? null
|
|
68
|
-
: { schema:
|
|
68
|
+
: { schema: text, version, revision: mode === 'site' ? null : version, ...space };
|
|
69
69
|
});
|
|
70
70
|
}
|
package/dist/part.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type RoomFrame = {
|
|
2
|
+
readonly kind: 'frame';
|
|
3
|
+
readonly payload: Uint8Array<ArrayBuffer>;
|
|
4
|
+
readonly bytes: number;
|
|
5
|
+
} | {
|
|
6
|
+
readonly kind: 'ended';
|
|
7
|
+
} | {
|
|
8
|
+
readonly kind: 'broken';
|
|
9
|
+
};
|
|
10
|
+
export type RoomFrames = () => Promise<RoomFrame>;
|
|
11
|
+
export declare function checkedPayload(frame: Uint8Array<ArrayBuffer>): Promise<Uint8Array<ArrayBuffer> | null>;
|
|
12
|
+
export declare function roomFrames(room: ReadableStream<Uint8Array>, arrived?: (bytes: number) => void, signal?: AbortSignal): RoomFrames;
|
|
13
|
+
export declare function gunzipped(payload: Uint8Array<ArrayBuffer>): ReadableStream<string>;
|
|
14
|
+
//# sourceMappingURL=part.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"part.d.ts","sourceRoot":"","sources":["../src/part.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC7F;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEhC,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;AAQlD,wBAAsB,cAAc,CAClC,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CASzC;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACjC,MAAM,CAAC,EAAE,WAAW,GACnB,UAAU,CAwDZ;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAKlF"}
|
package/dist/part.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const PART_MAGIC = 0x48505431;
|
|
2
|
+
const PART_HEAD_BYTES = 8;
|
|
3
|
+
const PART_DIGEST_BYTES = 32;
|
|
4
|
+
function hex(bytes) {
|
|
5
|
+
let text = '';
|
|
6
|
+
for (const byte of bytes)
|
|
7
|
+
text += byte.toString(16).padStart(2, '0');
|
|
8
|
+
return text;
|
|
9
|
+
}
|
|
10
|
+
export async function checkedPayload(frame) {
|
|
11
|
+
if (frame.length < PART_HEAD_BYTES + PART_DIGEST_BYTES)
|
|
12
|
+
return null;
|
|
13
|
+
const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength);
|
|
14
|
+
if (view.getUint32(0) !== PART_MAGIC)
|
|
15
|
+
return null;
|
|
16
|
+
const length = view.getUint32(4);
|
|
17
|
+
if (PART_HEAD_BYTES + length + PART_DIGEST_BYTES !== frame.length)
|
|
18
|
+
return null;
|
|
19
|
+
const payload = frame.subarray(PART_HEAD_BYTES, PART_HEAD_BYTES + length);
|
|
20
|
+
const digest = hex(new Uint8Array(await crypto.subtle.digest('SHA-256', payload)));
|
|
21
|
+
return hex(frame.subarray(PART_HEAD_BYTES + length)) === digest ? payload : null;
|
|
22
|
+
}
|
|
23
|
+
export function roomFrames(room, arrived, signal) {
|
|
24
|
+
const reader = room.getReader();
|
|
25
|
+
signal?.addEventListener('abort', () => void reader.cancel().catch(() => { }), { once: true });
|
|
26
|
+
const chunks = [];
|
|
27
|
+
let held = 0;
|
|
28
|
+
let received = 0;
|
|
29
|
+
let ended = false;
|
|
30
|
+
async function filled(bytes) {
|
|
31
|
+
while (held < bytes && !ended) {
|
|
32
|
+
const read = await reader.read();
|
|
33
|
+
if (read.done) {
|
|
34
|
+
ended = true;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
chunks.push(read.value);
|
|
38
|
+
held += read.value.byteLength;
|
|
39
|
+
received += read.value.byteLength;
|
|
40
|
+
arrived?.(received);
|
|
41
|
+
}
|
|
42
|
+
return held >= bytes;
|
|
43
|
+
}
|
|
44
|
+
function taken(bytes) {
|
|
45
|
+
const out = new Uint8Array(bytes);
|
|
46
|
+
let at = 0;
|
|
47
|
+
while (at < bytes) {
|
|
48
|
+
const chunk = chunks[0];
|
|
49
|
+
const used = Math.min(chunk.byteLength, bytes - at);
|
|
50
|
+
out.set(chunk.subarray(0, used), at);
|
|
51
|
+
at += used;
|
|
52
|
+
if (used === chunk.byteLength)
|
|
53
|
+
chunks.shift();
|
|
54
|
+
else
|
|
55
|
+
chunks[0] = chunk.subarray(used);
|
|
56
|
+
}
|
|
57
|
+
held -= bytes;
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
return async () => {
|
|
61
|
+
try {
|
|
62
|
+
if (!(await filled(PART_HEAD_BYTES)))
|
|
63
|
+
return held === 0 ? { kind: 'ended' } : { kind: 'broken' };
|
|
64
|
+
const head = taken(PART_HEAD_BYTES);
|
|
65
|
+
const view = new DataView(head.buffer);
|
|
66
|
+
if (view.getUint32(0) !== PART_MAGIC)
|
|
67
|
+
return { kind: 'broken' };
|
|
68
|
+
const length = view.getUint32(4);
|
|
69
|
+
const rest = length + PART_DIGEST_BYTES;
|
|
70
|
+
if (!(await filled(rest)))
|
|
71
|
+
return { kind: 'broken' };
|
|
72
|
+
const frame = new Uint8Array(PART_HEAD_BYTES + rest);
|
|
73
|
+
frame.set(head, 0);
|
|
74
|
+
frame.set(taken(rest), PART_HEAD_BYTES);
|
|
75
|
+
const payload = await checkedPayload(frame);
|
|
76
|
+
return payload === null
|
|
77
|
+
? { kind: 'broken' }
|
|
78
|
+
: { kind: 'frame', payload, bytes: frame.byteLength };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return { kind: 'broken' };
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export function gunzipped(payload) {
|
|
86
|
+
return new Blob([payload])
|
|
87
|
+
.stream()
|
|
88
|
+
.pipeThrough(new DecompressionStream('gzip'))
|
|
89
|
+
.pipeThrough(new TextDecoderStream());
|
|
90
|
+
}
|