@agentshouse/mdruntime-adapter 0.1.0-cd23c45caa798 → 0.1.0-cd36fe2bc9d48

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/AGENTS.md CHANGED
@@ -52,28 +52,30 @@ change, and no tab sees it then.
52
52
 
53
53
  A binary file at a Path is a binary Path entry. Query lists it by `path`, and History each
54
54
  of its revisions, with its `binaryFile` record and never its bytes: `{ state: 'accepted',
55
- revision, path, fileRef, byteLength, mediaType, sha256 }`, or, from a Save until the
55
+ revision, path, byteLength, mediaType, sha256 }`, or, from a Save until the
56
56
  Provider accepts it, `{ state: 'pending', localId, path, byteLength, mediaType, sha256 }`.
57
57
  Write one with a Room Draft whose only part is `file: { blob }`, the `Blob`'s `type` its
58
58
  media type: Save keeps the bytes in its Pending Change, offline too, and acceptance gives
59
59
  the record the Provider's revision. Move or remove one as a Document, a pending one too,
60
60
  its bytes following; once its Pending Change has gone to the Provider, Save refuses that
61
61
  as `unknown-revision` until it is accepted. `binaryFile.read(room, path, revision?)`
62
- answers a pending record's saved bytes, or asks the Provider on every read of an accepted
63
- one or a History revision, a removed file's last included, keeping nothing. Text, a Record
64
- attachment or a conversation message may name a file by its `fileRef`; read it with
65
- `binaryFile.readReference({ fileRef, referrer })`, the `referrer` the Provider gave beside
66
- it, or `{ room, path }` of the document whose text names it. Both answer
67
- `{ kind: 'binary', blob }` or a refusal or failure.
62
+ answers a pending record's saved bytes, or an accepted one's or a History revision's, a
63
+ removed file's last included: the first read asks the Provider and the browser keeps the
64
+ bytes, and every later read of that revision, offline too, answers them from the browser.
65
+ Text names a file only by a link to its Path. A read answers
66
+ `{ kind: 'binary', stream, byteLength, mediaType }`, the bytes a `ReadableStream`
67
+ of parts of at most a mebibyte, or a refusal or failure; read the stream to its end, or
68
+ take it whole with `new Response(stream).blob()` where a screen needs one `Blob`.
68
69
 
69
70
  Rooms, Query, Search, Observe, Types, Room Draft, Save, and Reached never touch the
70
- network; History, the binary file reads and Call go to the Provider through the Adapter.
71
+ network; History, a binary file read the browser does not keep yet and Call go to the
72
+ Provider through the Adapter.
71
73
  Call takes the Action names the Adapter declares, any other answering `undeclared`. A Call
72
74
  result whose effect the Provider places in a Room carries `at`, that Room and Room
73
75
  Version: `reached(room, roomVersion)` answers whether the Room's confirmed state has
74
76
  reached it, refreshing the Room until it has, and `reached(room, roomVersion, path)`
75
77
  whether the held copy of that document was written later. A History revision names its
76
- author, `{ kind: 'user', id }` or `{ kind: 'site', id, name }`; History of a Path no
78
+ author, `{ kind: 'user', id }` or `{ kind: 'site' | 'inbox', id, name }`; History of a Path no
77
79
  document holds answers the removed document's revisions, newest first, with `deleted:
78
80
  true`, which a link to the Path opens. Every member is asynchronous and every result a
79
81
  detached snapshot; nothing returns the authorization, performs a request the App's code
@@ -122,36 +124,38 @@ draw it as loading and observe the query to hear the complete answer. A query is
122
124
  - **Relations.** Within one Room, `hop: { field, types, where, pathPrefix }` keeps Documents
123
125
  whose reference at pointer `field`, at any depth, points to a matching Document, and
124
126
  `backlinks` with the same keys those a matching Document references, each once. A body
125
- link, or a reference declaring `cross_room`, may name another Room's
126
- `/rooms/<handle>/<path>`: `resolve(room, path, destination)` answers its `document`, the
127
- `deleted` one's last `revision`, or `unreadable` where the App does not bind it or it is
128
- locked.
127
+ link or a `cross_room` reference may name another Room's `/rooms/<handle>/<path>`:
128
+ `resolve(room, path, destination)` answers its `document`, the `deleted` one's last
129
+ `revision`, or `unreadable` where the App does not bind it or it is locked.
129
130
  - **Parts.** A Document query must `select`: `'all'`, or `fields`, `sections`,
130
- `preamble`, `markdown`, `backlinks`, `change` and `fileId`, where `fields` is `'all'`
131
+ `preamble`, `markdown`, `backlinks`, `change`, `fileId` and `revision`, where `fields` is `'all'`
131
132
  or a list of pointers and `sections` `'all'` or a list of names. Selected pointers
132
133
  return the frontmatter holding only them, nested as written. A backlink names the
133
134
  referring Path, MD Type and the pointer it came from as `field`. Room and Path always
134
135
  return; a Markdown Document also returns its MD Type, and at most its first 1,000
135
136
  backlinks: a query on the referring field reads the rest. A non-Markdown Document
136
- returns only Room, Path and a selected `fileId`, and a binary Path entry its
137
- `binaryFile` record too. An unselected part is absent. Select only what a screen shows:
138
- a list that selects the Markdown hears every edit of it.
139
- - **Change and file ID.** `change` is `{ author, time }` of the Document's head revision
140
- as the Provider last delivered it: `author` is `{ kind: 'user' | 'site', id, name }`, or
137
+ returns only Room, Path and a selected `fileId` and `revision`, a binary Path entry its `binaryFile`
138
+ record too, and a YAML file under `settings/` its text as a selected `markdown`, kept
139
+ out of Search. An unselected part is absent. Select only what a screen shows: a list
140
+ that selects the Markdown hears every edit of it.
141
+ - **Change, file ID and revision.** `change` is `{ author, time }` of the Document's head revision
142
+ as the Provider last delivered it: `author` is `{ kind: 'user' | 'site' | 'inbox', id, name }`, or
141
143
  `null` for a write the Provider made itself, and `time` its ISO 8601 change time, or the
142
144
  whole change `null` where it delivered no time, as at a Site. `fileId` is the Provider's
143
145
  Stable File ID of the file at the Path, or `null`. An unsent edit keeps both, an unsent
144
146
  move keeps the change and carries the file ID to the new Path, so a file ID that leaves
145
147
  one Path for another is the same file moved, and an unsent creation has neither until it
146
- is Accepted. A Room's last change is its Document with the latest `time`.
147
- - **Order and groups.** `orderBy` sorts by `room`, `path`, `type`, `folder` or `{ field }`
148
- with TanStack DB's own options; ties end with Room, then Path. `groupBy` by `room`,
149
- `type`, `folder` or `{ field }` answers `{ groups: [{ key, count }] }`, counted over every
150
- match and ordered by `count` or a key. A sort or group takes only a single-value pointer.
151
- `limit`, at most 1,000 whatever a query names, bounds the Documents or the groups, and a
152
- result it cuts short names `next`: the same query with it as `after` reads the next
153
- window, in the same order, ties included. `total: true` adds `total`, every match's
154
- count. An observed window hears rows entering, leaving or changing, and `next`, `total`.
148
+ is Accepted. `revision` is the Provider's head revision, `null` for an unsent creation or edit,
149
+ and moves with an unsent move. A Room's last change is its Document with the latest `time`.
150
+ - **Order and groups.** `orderBy` sorts by `room`, `path`, `type`, `folder` or `{ field }`: missing
151
+ and null first, last with `nulls: 'last'`, then numbers and booleans, then text by `locale` or
152
+ code point with `stringSort: 'lexical'`, then lists item by item; ties end with Room, then Path.
153
+ `groupBy` by `room`, `type`, `folder` or `{ field }` answers `{ groups: [{ key, count }] }`,
154
+ counted over every match and ordered by `count` or a key. A sort or group takes only a
155
+ single-value pointer. `limit`, at most 1,000 whatever a query names, bounds the Documents or the
156
+ groups, and a result it cuts short names `next`: the same query with it as `after` reads the next
157
+ window, in the same order, ties included. `total: true` adds `total`, every match's count. An
158
+ observed window hears rows entering, leaving or changing, and `next`, `total`.
155
159
  - **Results and errors.** A result carries no Room Version: read freshness from Rooms and
156
160
  Sync Status. `coverage` names each Room read as `{ room, generation, current }`,
157
161
  `current` false while a newer copy of that Room is being fetched, and the queued changes
@@ -161,28 +165,36 @@ draw it as loading and observe the query to hear the complete answer. A query is
161
165
  ## Local Search rules
162
166
 
163
167
  `search({ text, documents, collection, conversations, limit, after, total })` answers
164
- once, by words, from local state, with MiniSearch's defaults. There is no observed search.
168
+ once, by words, from the full-text index the browser keeps with its local state, so it
169
+ answers at once after a reload. There is no observed search.
165
170
 
166
- - **Declaration.** Only an App whose release declares Local Search searches, its first
167
- readiness waiting for its index; any other App's `search` answers the never retryable
168
- `undeclared` refusal `search-undeclared`, its `fields` naming `local_search`.
171
+ - **Declaration.** Only an App whose release declares Local Search searches; any other
172
+ App's `search` answers the never retryable `undeclared` refusal `search-undeclared`, its
173
+ `fields` naming `local_search`.
169
174
  - **What is found.** A Document by its field values, its sections' headings and text, its
170
175
  preamble and its Path, and a message by its text, never a frontmatter key, a Room Draft,
171
- a chat draft or a running turn's parts, with no phrases, word forms, typo tolerance or
172
- prefix matching.
176
+ a chat draft or a running turn's parts. Any word found ranks a hit, more found rank it
177
+ higher, and adjacent words higher still; case and the marks of Latin, Greek and
178
+ Cyrillic letters fold, English word forms stem, the last word also matches as the start
179
+ of a word unless the text ends with a space, and Chinese, Japanese, Korean and Thai text
180
+ matches by character pairs. There is no typo tolerance and no operator syntax.
173
181
  - **Narrowing.** `documents` is a Local Query filter, and `collection: true` leaves out
174
182
  what each Room's `typedSelection` roots hold; `conversations` names conversations. All
175
183
  apply before `limit`, which bounds each list, at most 1,000 whatever a search names. A
176
184
  complete answer it cuts short names `next`, which `after` takes for the next window of
177
- both lists. `total: true` adds `total`, each list's count.
185
+ both lists. `total: true` adds `total`, each list's count. A word in very many Documents
186
+ ranks among a bounded set of them, the Documents of a rarer word of the search always
187
+ among them.
178
188
  - **Results.** `{ documents, messages, coverage }`, or the same with `pending` naming each
179
- Room or conversation the search still waits for: show its hits, ask again, and never
180
- read pending as no hits. `coverage` names the Rooms and conversations searched. Each
181
- list is ranked by `score`, comparable only within it; ties come by `room`, then `path`,
182
- or by `conversation`, then `identity`. A Document hit names its `room`, `path` and
183
- `type`, a message hit its `conversation` and `identity`; `matches` maps each matched
184
- word to the parts it matched in: `fields`, `sections`, `preamble`, `path` or `text`. A
185
- hit carries no position: mark the words you show. A bad filter fails as a query does.
189
+ Room the search still waits for: show its hits, ask again, and never read pending as no
190
+ hits. `coverage` names the Rooms and conversations searched. Each list is ranked by
191
+ `score`, comparable only within it; ties come by `room`, then `path`, or by
192
+ `conversation`, then `identity`. A Document hit names its `room`, `path` and `type`, a
193
+ message hit its `conversation` and `identity`; `matches` maps each word of the search
194
+ to the parts it was found in: `fields`, `sections`, `preamble`, `path` or `text`. A hit
195
+ whose words were found carries `snippet: { part, text, at }`: the part's text around
196
+ the first word found, at most 80 characters on either side, and `at` that word's start
197
+ and end in `text`. Mark the words you show. A bad filter fails as a query does.
186
198
 
187
199
  ## Room Draft, Save, and outcome rules
188
200
 
@@ -219,19 +231,19 @@ Provider unavailability and a refusal marked retryable, until the reset it names
219
231
  work Pending; the MD Runtime retries the same Change Batch identity and payload, never
220
232
  infers an outcome from transport uncertainty, and never combines, reorders, or rebases.
221
233
 
222
- On a Site, every Save stays in the visitor's browser: write grants and revisions do not
223
- refuse it, and its Pending Change shows in every query and across reloads until the
224
- browser's storage is cleared. It is never sent: `observe('queue', room)` shows it `local`,
225
- Sync Status never waits on it, and once the Room no longer lets it apply it leaves the
226
- queue and returns no Room Draft.
234
+ On a Site, every Save stays in the visitor's browser: write grants and revisions do not refuse it,
235
+ and its Pending Change shows in every query and across reloads until the browser's storage is
236
+ cleared. It is never sent: `observe('queue', room)` shows it `local`, Sync Status never waits on
237
+ it, and once the Room no longer lets it apply it leaves the queue and returns no Room Draft.
227
238
 
228
- `observe('service-mode')` answers the Provider's Service Mode, `open` or `write-halted`.
229
- While writes are halted, Save succeeds, its Change Batch waits unsent and the queue is
230
- submitted in order once writes reopen; an Action is never held, and one the halt refuses
231
- returns that refusal: show the Provider as read-only instead of retrying.
232
- `observe('readiness')` tells whether the App's code and bound Rooms are held locally
233
- (`ready`), each Room's state, each refused Room's file and rule, the persistence answer
234
- and a paused preparation's `capacity` cause; `retry()` resumes a paused preparation.
239
+ `observe('service-mode')` answers the Provider's Service Mode, `open` or `write-halted`. While writes
240
+ are halted, Save succeeds, its Change Batch waits unsent and the queue is submitted in order once writes
241
+ reopen; an Action is never held, and one the halt refuses returns that refusal: show the Provider as
242
+ read-only instead of retrying. `observe('readiness')` tells whether code and bound Rooms are held
243
+ locally (`ready`), each Room's state, each refused Room's file and rule, the persistence answer, `space`
244
+ (`full` once the device's storage refused a write, Save and messages refusing as `durable-write` until
245
+ `retry()` or a later test write finds space, or once the origin refused a newer release), and the
246
+ `installation`'s Rooms, parts, bytes, `received`, `step` and `paused`.
235
247
 
236
248
  ## Content safety and launch promises
237
249
 
@@ -297,8 +309,9 @@ Mix `ChatMessageList` (`components` takes your `UserMessage` and `AssistantMessa
297
309
  `ChatInput` and `ChatQuestionCard` with your own design inside a `ChatProvider`, or
298
310
  compose assistant-ui's primitives there; `useChat()` gives `send`, the conversations, the
299
311
  Agents, questions to `answer`, `options` to `choose`, `commands`, the queue to `edit` or
300
- `unqueue`, `stop`, `kill` and outcomes; never replace its messages, sending or store. It
301
- shows a conversation's latest 50 messages, and assistant-ui's `loadEarlier()` the 50
302
- before, which `ChatMessageList` calls as the reader scrolls back. A secret question is
303
- never answered here; typed answers live in the Presentation State members named `typed:…`:
304
- leave them. `Markdown` draws Markdown safely.
312
+ `unqueue`, `stop`, `kill`, `renew`, which starts a new chat with the same Agent in place
313
+ of a conversation whose session could not resume, and outcomes; never replace its
314
+ messages, sending or store. It shows a conversation's latest 50 messages, and
315
+ assistant-ui's `loadEarlier()` the 50 before, which `ChatMessageList` calls as the reader
316
+ scrolls back. A secret question is never answered here; typed answers live in the
317
+ Presentation State members named `typed:…`: leave them. `Markdown` draws Markdown safely.
package/dist/actions.d.ts CHANGED
@@ -19,6 +19,7 @@ export type AppInputs = {
19
19
  };
20
20
  readonly 'conversation.create': Operated & {
21
21
  readonly agent_id: string;
22
+ readonly replaces?: string;
22
23
  };
23
24
  readonly 'conversation.delete': ConversationControl;
24
25
  readonly 'conversation.history': ConversationHistoryRequest;
@@ -45,22 +46,6 @@ export type AppAnswerAdditions = {
45
46
  readonly 'conversation.send': {
46
47
  readonly turn: string;
47
48
  };
48
- readonly 'record.list': {
49
- readonly attachments: readonly {
50
- readonly referrer: {
51
- readonly room_ref: string;
52
- readonly record: string;
53
- };
54
- }[];
55
- readonly records: readonly {
56
- readonly attachments: readonly {
57
- readonly referrer: {
58
- readonly room_ref: string;
59
- readonly record: string;
60
- };
61
- }[];
62
- }[];
63
- };
64
49
  };
65
50
  export declare const HOUSE_APP_ACTS: Readonly<Record<string, string>>;
66
51
  export declare const SITE_SUBMIT = "submit";
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
package/dist/actions.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { changeBatchIdentity, } from '@agentshouse/mdruntime';
2
2
  import { doorRefusal } from './refusal.js';
3
+ import { finishedUpload, houseUpload } from './upload.js';
3
4
  const HISTORY_PAGE = 100;
4
5
  const HISTORY_CONVERSATIONS = 64;
5
6
  const TRIGGER_ROOMS = 100;
@@ -37,10 +38,13 @@ const APP_ACTS = {
37
38
  'feature.list': mapped('apps/features/read'),
38
39
  'holder.list': mapped('apps/holders'),
39
40
  'holder.ring': mapped('apps/ring'),
41
+ 'inboxChat.assign': mapped('chats/assign'),
42
+ 'inboxChat.return': mapped('chats/return'),
43
+ 'inboxChat.takeControl': mapped('chats/take-control'),
40
44
  'member.list': mapped('rooms/members'),
41
45
  'message.send': mapped('apps/messages/send'),
42
46
  'processing.read': mapped('rooms/settings/processing/read'),
43
- 'record.list': carried('records/read', recordsAction),
47
+ 'record.list': mapped('records/read'),
44
48
  'relay.read': mapped('apps/relay'),
45
49
  'routine.list': mapped('routines/access'),
46
50
  'routineAccess.list': mapped('routines/granted'),
@@ -106,7 +110,12 @@ function unimplemented(name) {
106
110
  return { kind: 'rejected', code: 'action-unimplemented', fields: { name }, retryable: false };
107
111
  }
108
112
  function createBody(input) {
109
- return { agent_id: text(input, 'agent_id'), operation_id: operationId(input) };
113
+ const replaces = text(input, 'replaces');
114
+ return {
115
+ agent_id: text(input, 'agent_id'),
116
+ operation_id: operationId(input),
117
+ ...(replaces === undefined ? {} : { replaces }),
118
+ };
110
119
  }
111
120
  function controlBody(input) {
112
121
  return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };
@@ -154,32 +163,6 @@ export function actionOutcome(answer, name) {
154
163
  return { kind: 'transport-uncertainty' };
155
164
  return { kind: 'action', result: answer.body };
156
165
  }
157
- function referredRecord(view, roomRef) {
158
- const held = record(view);
159
- if (roomRef === undefined || typeof held.record !== 'string' || !Array.isArray(held.attachments))
160
- return view;
161
- const referrer = {
162
- room_ref: roomRef,
163
- record: held.record,
164
- };
165
- return {
166
- ...held,
167
- attachments: held.attachments.map((attachment) => ({ ...record(attachment), referrer })),
168
- };
169
- }
170
- async function recordsAction(transport, route, input, name) {
171
- const outcome = actionOutcome(await transport.door(route, input), name);
172
- if (outcome.kind !== 'action')
173
- return outcome;
174
- const roomRef = text(input, 'room_ref');
175
- const read = record(outcome.result);
176
- return {
177
- ...outcome,
178
- result: Array.isArray(read.records)
179
- ? { ...read, records: read.records.map((view) => referredRecord(view, roomRef)) }
180
- : referredRecord(outcome.result, roomRef),
181
- };
182
- }
183
166
  async function carry(transport, route, name, input) {
184
167
  return actionOutcome(await transport.door(route, input), name);
185
168
  }
@@ -217,14 +200,6 @@ function attachBody(input) {
217
200
  media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,
218
201
  };
219
202
  }
220
- function uploadGrant(answer) {
221
- const upload = record(record(answer).upload);
222
- if (upload.method !== 'POST')
223
- return null;
224
- if (typeof upload.operation !== 'string' || typeof upload.url !== 'string')
225
- return null;
226
- return { operation: upload.operation, url: upload.url };
227
- }
228
203
  async function attachAction(transport, route, input, name) {
229
204
  const body = attachBody(input);
230
205
  const blob = record(input).blob;
@@ -233,20 +208,16 @@ async function attachAction(transport, route, input, name) {
233
208
  const outcome = actionOutcome(await transport.door(route, body), name);
234
209
  if (outcome.kind !== 'action')
235
210
  return outcome;
236
- const grant = uploadGrant(outcome.result);
237
- if (grant === null)
211
+ const upload = houseUpload(record(outcome.result).upload);
212
+ if (upload === null)
238
213
  return { kind: 'transport-uncertainty' };
239
- const sent = await transport.transfer({
240
- act: 'file_upload',
241
- url: grant.url,
242
- body: new Uint8Array(await blob.arrayBuffer()),
243
- operation: grant.operation,
244
- });
245
- if (sent.status !== 200) {
246
- const refusal = doorRefusal(sent.body);
247
- return refusal === null ? { kind: 'transport-uncertainty' } : { kind: 'rejected', ...refusal };
248
- }
249
- const path = text(sent.body, 'path');
214
+ const finished = await finishedUpload(transport, upload, blob);
215
+ if (finished === null)
216
+ return { kind: 'transport-uncertainty' };
217
+ const settled = actionOutcome(finished, name);
218
+ if (settled.kind !== 'action')
219
+ return settled;
220
+ const path = text(settled.result, 'path');
250
221
  if (path === undefined)
251
222
  return { kind: 'transport-uncertainty' };
252
223
  const result = { path };
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EACP,aAAa,EAmBd,MAAM,wBAAwB,CAAC;AA6ChC,OAAO,EASL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AA0BxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAuFrD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CA2mBpF"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EACP,aAAa,EAkBd,MAAM,wBAAwB,CAAC;AA0ChC,OAAO,EASL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AA0BxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA8ErD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAioBpF"}