@agentshouse/mdruntime-adapter 0.1.0-alpha.16 → 0.1.0-alpha.18

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
@@ -7,14 +7,22 @@ enforcement.
7
7
  ## The MD Runtime API
8
8
 
9
9
  App code reaches the MD Runtime through the remote client. The surfaces are
10
- Rooms, Slots, Query, Observe, Types, Draft, Save, Queue, History, Call, Log,
10
+ Rooms, Slots, Query, Observe, Types, Room Draft, Save, History, Call, Log,
11
11
  storage loss, the reported persistence answer, deployment facts, Sync Status, reauthorization,
12
- conversation, the unsent instruction, and Presentation State.
12
+ conversation, the chat draft, and Presentation State.
13
+
14
+ Each conversation a Provider card names is held complete in the browser.
15
+ Observe one with `observe('conversation', id, { limit }, listener)`: the view
16
+ holds its latest `limit` messages, or all of them, oldest first, with the
17
+ growing text and the session summary while it is viewed, and its chat draft.
18
+ `chatDraft.write` and `chatDraft.discard` keep what the App Creator composes;
19
+ sending it is a Provider Action that needs the Provider reachable and is never
20
+ queued.
13
21
 
14
22
  Slots answers each Slot the Provider declares, in its order, with its entries
15
23
  in order, each a Room and its segment; a Room two Slots list is the same Room.
16
24
 
17
- Rooms, Slots, Query, Observe, Types, Draft, and Save never touch the network.
25
+ Rooms, Slots, Query, Observe, Types, Room Draft, and Save never touch the network.
18
26
  History and Call go to the Provider through the Adapter. Every member of the
19
27
  client is asynchronous. Results are detached snapshots. Nothing in this
20
28
  surface returns the authorization, performs a request the App's code
@@ -28,24 +36,40 @@ owns their boundary.
28
36
  The in-memory Adapter at `@agentshouse/mdruntime/memory` is for tests and
29
37
  ships in no bundle.
30
38
 
31
- ## Draft, Save, and outcome rules
32
-
33
- A Draft is durable: it survives reload and navigation. A Room that Discovery
34
- stops listing takes its Drafts, its queue and their outcomes with it. Save takes structured
35
- changes, validates locally, and on success appends one Change Batch to that
36
- Room's queue. A local validation failure leaves the Draft and creates
37
- nothing.
39
+ ## Room Draft, Save, and outcome rules
40
+
41
+ The MD Runtime owns one Room Draft per Room and Path, shared by every App and
42
+ tab. It is durable: it survives reload and navigation. A Room that Discovery
43
+ stops listing takes its Room Drafts, its queue and their outcomes with it.
44
+ Write a Room Draft with `roomDraft.write(room, path, revision, parts)`, naming
45
+ the revision you read, or `null` when there was none, and every part it should
46
+ now change: fields, sections and the preamble, or the whole Markdown, a
47
+ creation, a move, or a removal. A part new to the Room Draft names its base,
48
+ the value you showed when it was opened; the MD Runtime keeps a part's first
49
+ base. A write or a discard from an older revision is refused as `stale` with
50
+ the current Room Draft; read it and write again.
51
+
52
+ Save takes one Room and the Room Drafts of it to save, each with its revision,
53
+ validates locally, and on success appends one Change Batch to that Room's
54
+ queue and removes those Room Drafts. It is refused as `stale`, as
55
+ `changed-underneath` naming each part whose base no longer matches the visible
56
+ state, or by a local validation rule, and then creates nothing and leaves every
57
+ Room Draft in place. A directory move is a move part on each Document beneath
58
+ it, saved together.
38
59
 
39
60
  Outcomes follow the Provider's answer. Accepted advances the confirmed
40
- layer. Conflicted and Rejected leave the head in place, carry the affected
41
- current state and the Provider's structured refusal code and fields as
42
- returned, and block that Room's queue. The App's code resolves a head by
43
- discarding it or by saving a corrected Change Batch that replaces it in
44
- place. Transport failure and Provider unavailability keep work Pending and
45
- do not infer a rejection. A refusal the Provider marks retryable stays
46
- Pending until the reset it names; the MD Runtime retries the same Change
47
- Batch identity and payload and never infers an outcome from transport
48
- uncertainty. The MD Runtime never combines, reorders, or rebases.
61
+ layer. Conflicted and Rejected, an expired outcome record, and a change that no
62
+ longer applies over the Room each leave the queue and return as Room Drafts on
63
+ the Documents they changed, marked with why: the Provider's structured refusal
64
+ code and fields as returned, not known to have applied, or withdrawn locally.
65
+ The rest of the queue keeps synchronizing, and Sync Status requires attention
66
+ until each returned Room Draft is saved again or discarded. `outcome` answers
67
+ the saved Change Batch's outcome, and `null` while it is Pending. Transport
68
+ failure and Provider unavailability keep work Pending and do not infer a
69
+ rejection. A refusal the Provider marks retryable stays Pending until the reset
70
+ it names; the MD Runtime retries the same Change Batch identity and payload and
71
+ never infers an outcome from transport uncertainty. The MD Runtime never
72
+ combines, reorders, or rebases.
49
73
 
50
74
  ## The neutrality rule
51
75
 
package/dist/actions.d.ts CHANGED
@@ -1,13 +1,8 @@
1
- import { type ActionDeclaration, type ActionRequest, type ActionResult, type ConversationCards } from '@agentshouse/mdruntime';
2
- import type { HouseDoor, HouseDoorAnswer, HouseTransport } from './transport.js';
3
- export declare const HISTORY_PAGE = 100;
1
+ import { type AcceptedMessage, type ActionDeclaration, type ActionRequest, type ActionResult, type ConversationCards } from '@agentshouse/mdruntime';
2
+ import type { HouseDoorAnswer, HouseTransport } from './transport.js';
4
3
  export declare const HOUSE_CONVERSATION_CARDS: ConversationCards;
5
4
  export declare function declaredActions(routes: readonly string[]): readonly ActionDeclaration[];
6
5
  export declare function houseAction(transport: HouseTransport, request: ActionRequest): Promise<ActionResult>;
7
6
  export declare function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult;
8
- export declare function readConversationHistory(transport: HouseDoor, conversationId: string): Promise<{
9
- messages: unknown[];
10
- } | {
11
- outcome: ActionResult;
12
- }>;
7
+ export declare function acceptedMessage(entry: unknown): AcceptedMessage | null;
13
8
  //# sourceMappingURL=actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjF,eAAO,MAAM,YAAY,MAAM,CAAC;AAehC,eAAO,MAAM,wBAAwB,EAAE,iBAKtC,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,iBAAiB,EAAE,CASvF;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAMvB;AAoED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAWjF;AA8ID,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CA4B9D"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EAEvB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAiBtE,eAAO,MAAM,wBAAwB,EAAE,iBAKtC,CAAC;AAEF,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,iBAAiB,EAAE,CASvF;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAMvB;AAoED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAWjF;AAuID,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAUtE"}
package/dist/actions.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { changeBatchIdentity } from '@agentshouse/mdruntime';
2
2
  import { doorRefusal } from './refusal.js';
3
3
  import { PRIVATE_LOCATOR } from './transport.js';
4
- export const HISTORY_PAGE = 100;
4
+ const HISTORY_PAGE = 100;
5
5
  const OCTET_STREAM = 'application/octet-stream';
6
6
  const CONVERSATION_ROUTES = new Map([
7
7
  [
@@ -271,148 +271,79 @@ async function sendAction(transport, input) {
271
271
  return outcome;
272
272
  }
273
273
  function historyCursor(value) {
274
- let parsed;
275
- try {
276
- parsed = JSON.parse(value);
277
- } catch {
278
- return null;
279
- }
280
- const acceptedAt = text(parsed, 'accepted_at');
281
- const messageId = text(parsed, 'message_id');
274
+ const acceptedAt = text(value, 'accepted_at');
275
+ const messageId = text(value, 'message_id');
282
276
  if (acceptedAt === undefined || messageId === undefined) return null;
283
277
  return {
284
278
  accepted_at: acceptedAt,
285
279
  message_id: messageId
286
280
  };
287
281
  }
288
- function turned(entry) {
289
- const turn = text(entry, 'message_id');
290
- if (turn === undefined) return null;
291
- return {
292
- turn,
293
- message: structuredClone(entry)
294
- };
295
- }
296
- function olderCursor(entry) {
297
- const acceptedAt = text(entry.message, 'accepted_at');
298
- const messageId = text(entry.message, 'message_id');
299
- if (acceptedAt === undefined || messageId === undefined) return null;
282
+ function position(cursor) {
300
283
  return JSON.stringify({
301
- accepted_at: acceptedAt,
302
- message_id: messageId
284
+ accepted_at: cursor.accepted_at,
285
+ message_id: cursor.message_id
303
286
  });
304
287
  }
305
- export async function readConversationHistory(transport, conversationId) {
306
- const messages = [];
307
- let after;
308
- for(;;){
309
- const answer = await transport.door('/door/conversations/history', {
310
- conversation_id: conversationId,
311
- ...after === undefined ? {} : {
312
- after
313
- },
314
- limit: HISTORY_PAGE
315
- });
316
- const outcome = actionOutcome(answer, 'conversation.history');
317
- if (outcome.kind !== 'action') return {
318
- outcome
319
- };
320
- const held = record(outcome.result);
321
- if (!Array.isArray(held.messages)) return {
322
- outcome: {
323
- kind: 'transport-uncertainty'
324
- }
325
- };
326
- for (const entry of held.messages){
327
- if (text(entry, 'message_id') === undefined) {
328
- return {
329
- outcome: {
330
- kind: 'transport-uncertainty'
331
- }
332
- };
333
- }
334
- messages.push(entry);
335
- }
336
- if (held.next === null || held.next === undefined) return {
337
- messages
338
- };
339
- const next = record(held.next);
340
- const acceptedAt = text(next, 'accepted_at');
341
- const messageId = text(next, 'message_id');
342
- if (acceptedAt === undefined || messageId === undefined) {
343
- return {
344
- outcome: {
345
- kind: 'transport-uncertainty'
346
- }
347
- };
348
- }
349
- after = {
350
- accepted_at: acceptedAt,
351
- message_id: messageId
352
- };
288
+ function positionCursor(value) {
289
+ try {
290
+ return historyCursor(JSON.parse(value));
291
+ } catch {
292
+ return null;
353
293
  }
354
294
  }
355
- function historyPage(conversationId, messages, until) {
356
- const from = Math.max(0, until - HISTORY_PAGE);
357
- const page = messages.slice(from, until);
358
- const first = page[0];
359
- const cursor = from === 0 || first === undefined ? null : olderCursor(first);
360
- if (from > 0 && cursor === null) return {
361
- kind: 'transport-uncertainty'
362
- };
295
+ export function acceptedMessage(entry) {
296
+ const cursor = historyCursor(entry);
297
+ if (cursor === null) return null;
363
298
  return {
364
- kind: 'action',
365
- result: {
366
- conversation_id: conversationId,
367
- messages: page,
368
- ...cursor === null ? {} : {
369
- cursor
370
- }
371
- }
299
+ identity: cursor.message_id,
300
+ turn: cursor.message_id,
301
+ position: position(cursor),
302
+ text: text(entry, 'text') ?? '',
303
+ message: structuredClone(entry)
372
304
  };
373
305
  }
374
306
  async function historyAction(transport, input) {
375
307
  const conversationId = text(input, 'conversation');
376
308
  if (conversationId === undefined) return malformed();
377
- const cursorValue = text(input, 'cursor');
378
- let olderThan;
379
- if (cursorValue !== undefined) {
380
- const parsed = historyCursor(cursorValue);
381
- if (parsed === null) {
382
- return {
383
- kind: 'rejected',
384
- code: 'unknown-cursor',
385
- fields: {
386
- cursor: cursorValue
387
- }
388
- };
389
- }
390
- olderThan = parsed;
391
- }
392
- const held = await readConversationHistory(transport, conversationId);
393
- if ('outcome' in held) return held.outcome;
309
+ const afterValue = text(input, 'after');
310
+ const after = afterValue === undefined ? undefined : positionCursor(afterValue);
311
+ if (after === null) return malformed();
312
+ const answer = await transport.door('/door/conversations/history', {
313
+ conversation_id: conversationId,
314
+ ...after === undefined ? {} : {
315
+ after
316
+ },
317
+ limit: HISTORY_PAGE
318
+ });
319
+ const outcome = actionOutcome(answer, 'conversation.history');
320
+ if (outcome.kind !== 'action') return outcome;
321
+ const held = record(outcome.result);
322
+ if (!Array.isArray(held.messages)) return {
323
+ kind: 'transport-uncertainty'
324
+ };
394
325
  const messages = [];
395
326
  for (const entry of held.messages){
396
- const mapped = turned(entry);
397
- if (mapped === null) return {
327
+ const message = acceptedMessage(entry);
328
+ if (message === null) return {
398
329
  kind: 'transport-uncertainty'
399
330
  };
400
- messages.push(mapped);
331
+ messages.push(message);
401
332
  }
402
- if (olderThan === undefined) {
403
- return historyPage(conversationId, messages, messages.length);
404
- }
405
- const at = messages.findIndex((entry)=>text(entry.message, 'accepted_at') === olderThan.accepted_at && text(entry.message, 'message_id') === olderThan.message_id);
406
- if (at === -1) {
407
- return {
408
- kind: 'rejected',
409
- code: 'unknown-cursor',
410
- fields: {
411
- cursor: cursorValue
412
- }
413
- };
414
- }
415
- return historyPage(conversationId, messages, at);
333
+ const next = held.next === null || held.next === undefined ? undefined : historyCursor(held.next);
334
+ if (next === null) return {
335
+ kind: 'transport-uncertainty'
336
+ };
337
+ const page = {
338
+ messages,
339
+ ...next === undefined ? {} : {
340
+ next: position(next)
341
+ }
342
+ };
343
+ return {
344
+ kind: 'action',
345
+ result: page
346
+ };
416
347
  }
417
348
 
418
349
  //# sourceMappingURL=actions.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/actions.ts"],"sourcesContent":["import {\n changeBatchIdentity,\n type ActionDeclaration,\n type ActionRequest,\n type ActionResult,\n type ConversationCards,\n} from '@agentshouse/mdruntime';\nimport { doorRefusal } from './refusal.js';\nimport { PRIVATE_LOCATOR } from './transport.js';\nimport type { HouseDoor, HouseDoorAnswer, HouseTransport } from './transport.js';\n\nexport const HISTORY_PAGE = 100;\n\nconst OCTET_STREAM = 'application/octet-stream';\n\nconst CONVERSATION_ROUTES: ReadonlyMap<string, string> = new Map([\n ['conversation.create', '/door/conversations/create'],\n ['conversation.send', '/door/conversations/send'],\n ['conversation.answer', '/door/conversations/interaction/answer'],\n ['conversation.interrupt', '/door/conversations/interrupt'],\n ['conversation.kill', '/door/conversations/kill'],\n ['conversation.cancel', '/door/conversations/cancel'],\n ['conversation.delete', '/door/conversations/delete'],\n ['conversation.history', '/door/conversations/history'],\n]);\n\nexport const HOUSE_CONVERSATION_CARDS: ConversationCards = {\n locator: PRIVATE_LOCATOR,\n type: 'conversation',\n identity: 'conversation',\n agent: 'agent',\n};\n\nexport function declaredActions(routes: readonly string[]): readonly ActionDeclaration[] {\n const mapped = new Map(\n [...CONVERSATION_ROUTES].map(([name, route]) => [route.slice('/door/'.length), name]),\n );\n return routes.map((route) => ({\n name: mapped.get(route) ?? route,\n inputShape: {},\n resultKind: 'house',\n }));\n}\n\nexport function houseAction(\n transport: HouseTransport,\n request: ActionRequest,\n): Promise<ActionResult> {\n if (request.name === 'conversation.send') return sendAction(transport, request.input);\n if (request.name === 'conversation.history') return historyAction(transport, request.input);\n const route = routeOf(request.name);\n if (route === null) return Promise.resolve(malformed());\n return carry(transport, route, request.name, request.input);\n}\n\nfunction routeOf(name: string): string | null {\n const mapped = CONVERSATION_ROUTES.get(name);\n if (mapped !== undefined) return mapped;\n const parts = name.split('/');\n if (parts.some((part) => part === '.' || part === '..')) return null;\n try {\n return `/door/${parts.map(encodeURIComponent).join('/')}`;\n } catch {\n return null;\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : {};\n}\n\nfunction text(value: unknown, name: string): string | undefined {\n const held = record(value)[name];\n return typeof held === 'string' ? held : undefined;\n}\n\nfunction operationId(input: unknown): string {\n return text(input, 'operation_id') ?? changeBatchIdentity();\n}\n\nfunction malformed(): ActionResult {\n return { kind: 'rejected', code: 'invalid_request', fields: {} };\n}\n\nfunction bodyOf(name: string, input: unknown): unknown {\n if (name === 'conversation.create') {\n return { agent_id: text(input, 'agent_id'), operation_id: operationId(input) };\n }\n if (\n name === 'conversation.interrupt' ||\n name === 'conversation.kill' ||\n name === 'conversation.delete'\n ) {\n return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };\n }\n if (name === 'conversation.cancel') {\n return {\n conversation_id: text(input, 'conversation'),\n message_id: text(input, 'turn'),\n operation_id: operationId(input),\n };\n }\n if (name === 'conversation.answer') {\n const nested = record(record(input).answer);\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n interaction_id: text(nested, 'interaction_id'),\n revision: nested.revision,\n response: nested.response,\n };\n }\n return input;\n}\n\nfunction withTurn(body: unknown): unknown {\n const held = record(body);\n const turn = text(held, 'message_id');\n return turn === undefined ? body : { ...held, turn };\n}\n\nexport function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult {\n if (answer.status === 401) return { kind: 'revoked-authorization' };\n const refusal = doorRefusal(answer.body);\n if (refusal !== null) {\n return { kind: 'rejected', code: refusal.code, fields: refusal.fields };\n }\n if (answer.status === 404)\n return { kind: 'rejected', code: 'action-unimplemented', fields: { name } };\n if (answer.status === 0 || answer.status >= 400) return { kind: 'transport-uncertainty' };\n if (name === 'conversation.send') return { kind: 'action', result: withTurn(answer.body) };\n return { kind: 'action', result: answer.body };\n}\n\nasync function carry(\n transport: HouseTransport,\n route: string,\n name: string,\n input: unknown,\n): Promise<ActionResult> {\n const answer = await transport.door(route, bodyOf(name, input));\n return actionOutcome(answer, name);\n}\n\nfunction sendFile(entry: unknown): Record<string, unknown> | null {\n const file = record(entry);\n const name = text(file, 'name');\n const bytes = file.byteLength;\n const sha256 = text(file, 'contentHash');\n if (name === undefined || typeof bytes !== 'number' || sha256 === undefined) return null;\n const mediaType = text(file, 'mediaType');\n const width = file.width;\n const height = file.height;\n return {\n name,\n media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,\n bytes,\n sha256,\n ...(typeof width === 'number' && typeof height === 'number'\n ? { dimensions: { width, height } }\n : {}),\n };\n}\n\nfunction sendFiles(input: unknown): readonly Record<string, unknown>[] | null {\n const files = record(input).files;\n if (files === undefined) return [];\n if (!Array.isArray(files)) return null;\n const declared: Record<string, unknown>[] = [];\n for (const entry of files) {\n const file = sendFile(entry);\n if (file === null) return null;\n declared.push(file);\n }\n return declared;\n}\n\nfunction sendBody(input: unknown): Record<string, unknown> | null {\n const files = sendFiles(input);\n if (files === null) return null;\n const textValue = text(input, 'text');\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n ...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),\n ...(files.length === 0 ? {} : { files }),\n };\n}\n\nasync function fileBytes(file: unknown): Promise<Uint8Array | null> {\n const blob = record(file).blob;\n if (blob === undefined || typeof blob !== 'object' || blob === null) return null;\n if (!('arrayBuffer' in blob) || typeof blob.arrayBuffer !== 'function') return null;\n return new Uint8Array(await (blob as Blob).arrayBuffer());\n}\n\nfunction uploadGrant(\n entry: unknown,\n): { method: 'POST'; operation: string; url: string } | 'absent' | null {\n if (!('upload' in record(entry))) return 'absent';\n const upload = record(record(entry).upload);\n if (upload.method !== 'POST') return null;\n if (typeof upload.operation !== 'string' || typeof upload.url !== 'string') return null;\n return { method: 'POST', operation: upload.operation, url: upload.url };\n}\n\nasync function uploadOriginals(\n transport: HouseTransport,\n input: unknown,\n result: unknown,\n): Promise<ActionResult | null> {\n const originals = record(result).originals;\n if (!Array.isArray(originals) || originals.length === 0) return null;\n const files = Array.isArray(record(input).files) ? (record(input).files as unknown[]) : [];\n for (const [index, entry] of originals.entries()) {\n const grant = uploadGrant(entry);\n if (grant === 'absent') continue;\n if (grant === null) return malformed();\n const bytes = index < files.length ? await fileBytes(files[index]) : null;\n if (bytes === null) {\n return { kind: 'rejected', code: 'conversation_original_descriptor_required', fields: {} };\n }\n const delivered = await transport.transfer({\n act: 'conversation_original_upload',\n method: 'POST',\n url: grant.url,\n body: bytes,\n operation: grant.operation,\n });\n if (delivered.status === 200) continue;\n return actionOutcome(delivered, 'conversation.send');\n }\n return null;\n}\n\nasync function sendAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const body = sendBody(input);\n if (body === null) return malformed();\n const answer = await transport.door('/door/conversations/send', body);\n const outcome = actionOutcome(answer, 'conversation.send');\n if (outcome.kind !== 'action') return outcome;\n const uploaded = await uploadOriginals(transport, input, outcome.result);\n if (uploaded !== null) return uploaded;\n return outcome;\n}\n\ntype HistoryCursor = { accepted_at: string; message_id: string };\n\nfunction historyCursor(value: string): HistoryCursor | null {\n let parsed: unknown;\n try {\n parsed = JSON.parse(value) as unknown;\n } catch {\n return null;\n }\n const acceptedAt = text(parsed, 'accepted_at');\n const messageId = text(parsed, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) return null;\n return { accepted_at: acceptedAt, message_id: messageId };\n}\n\nfunction turned(entry: unknown): { turn: string; message: unknown } | null {\n const turn = text(entry, 'message_id');\n if (turn === undefined) return null;\n return { turn, message: structuredClone(entry) };\n}\n\nfunction olderCursor(entry: { message: unknown }): string | null {\n const acceptedAt = text(entry.message, 'accepted_at');\n const messageId = text(entry.message, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) return null;\n return JSON.stringify({ accepted_at: acceptedAt, message_id: messageId });\n}\n\nexport async function readConversationHistory(\n transport: HouseDoor,\n conversationId: string,\n): Promise<{ messages: unknown[] } | { outcome: ActionResult }> {\n const messages: unknown[] = [];\n let after: HistoryCursor | undefined;\n for (;;) {\n const answer = await transport.door('/door/conversations/history', {\n conversation_id: conversationId,\n ...(after === undefined ? {} : { after }),\n limit: HISTORY_PAGE,\n });\n const outcome = actionOutcome(answer, 'conversation.history');\n if (outcome.kind !== 'action') return { outcome };\n const held = record(outcome.result);\n if (!Array.isArray(held.messages)) return { outcome: { kind: 'transport-uncertainty' } };\n for (const entry of held.messages) {\n if (text(entry, 'message_id') === undefined) {\n return { outcome: { kind: 'transport-uncertainty' } };\n }\n messages.push(entry);\n }\n if (held.next === null || held.next === undefined) return { messages };\n const next = record(held.next);\n const acceptedAt = text(next, 'accepted_at');\n const messageId = text(next, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) {\n return { outcome: { kind: 'transport-uncertainty' } };\n }\n after = { accepted_at: acceptedAt, message_id: messageId };\n }\n}\n\nfunction historyPage(\n conversationId: string,\n messages: readonly { turn: string; message: unknown }[],\n until: number,\n): ActionResult {\n const from = Math.max(0, until - HISTORY_PAGE);\n const page = messages.slice(from, until);\n const first = page[0];\n const cursor = from === 0 || first === undefined ? null : olderCursor(first);\n if (from > 0 && cursor === null) return { kind: 'transport-uncertainty' };\n return {\n kind: 'action',\n result: {\n conversation_id: conversationId,\n messages: page,\n ...(cursor === null ? {} : { cursor }),\n },\n };\n}\n\nasync function historyAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const conversationId = text(input, 'conversation');\n if (conversationId === undefined) return malformed();\n const cursorValue = text(input, 'cursor');\n let olderThan: HistoryCursor | undefined;\n if (cursorValue !== undefined) {\n const parsed = historyCursor(cursorValue);\n if (parsed === null) {\n return { kind: 'rejected', code: 'unknown-cursor', fields: { cursor: cursorValue } };\n }\n olderThan = parsed;\n }\n const held = await readConversationHistory(transport, conversationId);\n if ('outcome' in held) return held.outcome;\n const messages: { turn: string; message: unknown }[] = [];\n for (const entry of held.messages) {\n const mapped = turned(entry);\n if (mapped === null) return { kind: 'transport-uncertainty' };\n messages.push(mapped);\n }\n if (olderThan === undefined) {\n return historyPage(conversationId, messages, messages.length);\n }\n const at = messages.findIndex(\n (entry) =>\n text(entry.message, 'accepted_at') === olderThan.accepted_at &&\n text(entry.message, 'message_id') === olderThan.message_id,\n );\n if (at === -1) {\n return { kind: 'rejected', code: 'unknown-cursor', fields: { cursor: cursorValue } };\n }\n return historyPage(conversationId, messages, at);\n}\n"],"names":["changeBatchIdentity","doorRefusal","PRIVATE_LOCATOR","HISTORY_PAGE","OCTET_STREAM","CONVERSATION_ROUTES","Map","HOUSE_CONVERSATION_CARDS","locator","type","identity","agent","declaredActions","routes","mapped","map","name","route","slice","length","get","inputShape","resultKind","houseAction","transport","request","sendAction","input","historyAction","routeOf","Promise","resolve","malformed","carry","undefined","parts","split","some","part","encodeURIComponent","join","record","value","text","held","operationId","kind","code","fields","bodyOf","agent_id","operation_id","conversation_id","message_id","nested","answer","interaction_id","revision","response","withTurn","body","turn","actionOutcome","status","refusal","result","door","sendFile","entry","file","bytes","byteLength","sha256","mediaType","width","height","media_type","dimensions","sendFiles","files","Array","isArray","declared","push","sendBody","textValue","fileBytes","blob","arrayBuffer","Uint8Array","uploadGrant","upload","method","operation","url","uploadOriginals","originals","index","entries","grant","delivered","transfer","act","outcome","uploaded","historyCursor","parsed","JSON","parse","acceptedAt","messageId","accepted_at","turned","message","structuredClone","olderCursor","stringify","readConversationHistory","conversationId","messages","after","limit","next","historyPage","until","from","Math","max","page","first","cursor","cursorValue","olderThan","at","findIndex"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/actions.ts"],"sourcesContent":["import {\n changeBatchIdentity,\n type AcceptedMessage,\n type ActionDeclaration,\n type ActionRequest,\n type ActionResult,\n type ConversationCards,\n type ConversationHistoryPage,\n} from '@agentshouse/mdruntime';\nimport { doorRefusal } from './refusal.js';\nimport { PRIVATE_LOCATOR } from './transport.js';\nimport type { HouseDoorAnswer, HouseTransport } from './transport.js';\n\nconst HISTORY_PAGE = 100;\n\nconst OCTET_STREAM = 'application/octet-stream';\n\nconst CONVERSATION_ROUTES: ReadonlyMap<string, string> = new Map([\n ['conversation.create', '/door/conversations/create'],\n ['conversation.send', '/door/conversations/send'],\n ['conversation.answer', '/door/conversations/interaction/answer'],\n ['conversation.interrupt', '/door/conversations/interrupt'],\n ['conversation.kill', '/door/conversations/kill'],\n ['conversation.cancel', '/door/conversations/cancel'],\n ['conversation.delete', '/door/conversations/delete'],\n ['conversation.history', '/door/conversations/history'],\n]);\n\nexport const HOUSE_CONVERSATION_CARDS: ConversationCards = {\n locator: PRIVATE_LOCATOR,\n type: 'conversation',\n identity: 'conversation',\n agent: 'agent',\n};\n\nexport function declaredActions(routes: readonly string[]): readonly ActionDeclaration[] {\n const mapped = new Map(\n [...CONVERSATION_ROUTES].map(([name, route]) => [route.slice('/door/'.length), name]),\n );\n return routes.map((route) => ({\n name: mapped.get(route) ?? route,\n inputShape: {},\n resultKind: 'house',\n }));\n}\n\nexport function houseAction(\n transport: HouseTransport,\n request: ActionRequest,\n): Promise<ActionResult> {\n if (request.name === 'conversation.send') return sendAction(transport, request.input);\n if (request.name === 'conversation.history') return historyAction(transport, request.input);\n const route = routeOf(request.name);\n if (route === null) return Promise.resolve(malformed());\n return carry(transport, route, request.name, request.input);\n}\n\nfunction routeOf(name: string): string | null {\n const mapped = CONVERSATION_ROUTES.get(name);\n if (mapped !== undefined) return mapped;\n const parts = name.split('/');\n if (parts.some((part) => part === '.' || part === '..')) return null;\n try {\n return `/door/${parts.map(encodeURIComponent).join('/')}`;\n } catch {\n return null;\n }\n}\n\nfunction record(value: unknown): Record<string, unknown> {\n return typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : {};\n}\n\nfunction text(value: unknown, name: string): string | undefined {\n const held = record(value)[name];\n return typeof held === 'string' ? held : undefined;\n}\n\nfunction operationId(input: unknown): string {\n return text(input, 'operation_id') ?? changeBatchIdentity();\n}\n\nfunction malformed(): ActionResult {\n return { kind: 'rejected', code: 'invalid_request', fields: {} };\n}\n\nfunction bodyOf(name: string, input: unknown): unknown {\n if (name === 'conversation.create') {\n return { agent_id: text(input, 'agent_id'), operation_id: operationId(input) };\n }\n if (\n name === 'conversation.interrupt' ||\n name === 'conversation.kill' ||\n name === 'conversation.delete'\n ) {\n return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };\n }\n if (name === 'conversation.cancel') {\n return {\n conversation_id: text(input, 'conversation'),\n message_id: text(input, 'turn'),\n operation_id: operationId(input),\n };\n }\n if (name === 'conversation.answer') {\n const nested = record(record(input).answer);\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n interaction_id: text(nested, 'interaction_id'),\n revision: nested.revision,\n response: nested.response,\n };\n }\n return input;\n}\n\nfunction withTurn(body: unknown): unknown {\n const held = record(body);\n const turn = text(held, 'message_id');\n return turn === undefined ? body : { ...held, turn };\n}\n\nexport function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult {\n if (answer.status === 401) return { kind: 'revoked-authorization' };\n const refusal = doorRefusal(answer.body);\n if (refusal !== null) {\n return { kind: 'rejected', code: refusal.code, fields: refusal.fields };\n }\n if (answer.status === 404)\n return { kind: 'rejected', code: 'action-unimplemented', fields: { name } };\n if (answer.status === 0 || answer.status >= 400) return { kind: 'transport-uncertainty' };\n if (name === 'conversation.send') return { kind: 'action', result: withTurn(answer.body) };\n return { kind: 'action', result: answer.body };\n}\n\nasync function carry(\n transport: HouseTransport,\n route: string,\n name: string,\n input: unknown,\n): Promise<ActionResult> {\n const answer = await transport.door(route, bodyOf(name, input));\n return actionOutcome(answer, name);\n}\n\nfunction sendFile(entry: unknown): Record<string, unknown> | null {\n const file = record(entry);\n const name = text(file, 'name');\n const bytes = file.byteLength;\n const sha256 = text(file, 'contentHash');\n if (name === undefined || typeof bytes !== 'number' || sha256 === undefined) return null;\n const mediaType = text(file, 'mediaType');\n const width = file.width;\n const height = file.height;\n return {\n name,\n media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,\n bytes,\n sha256,\n ...(typeof width === 'number' && typeof height === 'number'\n ? { dimensions: { width, height } }\n : {}),\n };\n}\n\nfunction sendFiles(input: unknown): readonly Record<string, unknown>[] | null {\n const files = record(input).files;\n if (files === undefined) return [];\n if (!Array.isArray(files)) return null;\n const declared: Record<string, unknown>[] = [];\n for (const entry of files) {\n const file = sendFile(entry);\n if (file === null) return null;\n declared.push(file);\n }\n return declared;\n}\n\nfunction sendBody(input: unknown): Record<string, unknown> | null {\n const files = sendFiles(input);\n if (files === null) return null;\n const textValue = text(input, 'text');\n return {\n conversation_id: text(input, 'conversation'),\n operation_id: operationId(input),\n ...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),\n ...(files.length === 0 ? {} : { files }),\n };\n}\n\nasync function fileBytes(file: unknown): Promise<Uint8Array | null> {\n const blob = record(file).blob;\n if (blob === undefined || typeof blob !== 'object' || blob === null) return null;\n if (!('arrayBuffer' in blob) || typeof blob.arrayBuffer !== 'function') return null;\n return new Uint8Array(await (blob as Blob).arrayBuffer());\n}\n\nfunction uploadGrant(\n entry: unknown,\n): { method: 'POST'; operation: string; url: string } | 'absent' | null {\n if (!('upload' in record(entry))) return 'absent';\n const upload = record(record(entry).upload);\n if (upload.method !== 'POST') return null;\n if (typeof upload.operation !== 'string' || typeof upload.url !== 'string') return null;\n return { method: 'POST', operation: upload.operation, url: upload.url };\n}\n\nasync function uploadOriginals(\n transport: HouseTransport,\n input: unknown,\n result: unknown,\n): Promise<ActionResult | null> {\n const originals = record(result).originals;\n if (!Array.isArray(originals) || originals.length === 0) return null;\n const files = Array.isArray(record(input).files) ? (record(input).files as unknown[]) : [];\n for (const [index, entry] of originals.entries()) {\n const grant = uploadGrant(entry);\n if (grant === 'absent') continue;\n if (grant === null) return malformed();\n const bytes = index < files.length ? await fileBytes(files[index]) : null;\n if (bytes === null) {\n return { kind: 'rejected', code: 'conversation_original_descriptor_required', fields: {} };\n }\n const delivered = await transport.transfer({\n act: 'conversation_original_upload',\n method: 'POST',\n url: grant.url,\n body: bytes,\n operation: grant.operation,\n });\n if (delivered.status === 200) continue;\n return actionOutcome(delivered, 'conversation.send');\n }\n return null;\n}\n\nasync function sendAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const body = sendBody(input);\n if (body === null) return malformed();\n const answer = await transport.door('/door/conversations/send', body);\n const outcome = actionOutcome(answer, 'conversation.send');\n if (outcome.kind !== 'action') return outcome;\n const uploaded = await uploadOriginals(transport, input, outcome.result);\n if (uploaded !== null) return uploaded;\n return outcome;\n}\n\ntype HistoryCursor = { accepted_at: string; message_id: string };\n\nfunction historyCursor(value: unknown): HistoryCursor | null {\n const acceptedAt = text(value, 'accepted_at');\n const messageId = text(value, 'message_id');\n if (acceptedAt === undefined || messageId === undefined) return null;\n return { accepted_at: acceptedAt, message_id: messageId };\n}\n\nfunction position(cursor: HistoryCursor): string {\n return JSON.stringify({ accepted_at: cursor.accepted_at, message_id: cursor.message_id });\n}\n\nfunction positionCursor(value: string): HistoryCursor | null {\n try {\n return historyCursor(JSON.parse(value) as unknown);\n } catch {\n return null;\n }\n}\n\nexport function acceptedMessage(entry: unknown): AcceptedMessage | null {\n const cursor = historyCursor(entry);\n if (cursor === null) return null;\n return {\n identity: cursor.message_id,\n turn: cursor.message_id,\n position: position(cursor),\n text: text(entry, 'text') ?? '',\n message: structuredClone(entry),\n };\n}\n\nasync function historyAction(transport: HouseTransport, input: unknown): Promise<ActionResult> {\n const conversationId = text(input, 'conversation');\n if (conversationId === undefined) return malformed();\n const afterValue = text(input, 'after');\n const after = afterValue === undefined ? undefined : positionCursor(afterValue);\n if (after === null) return malformed();\n const answer = await transport.door('/door/conversations/history', {\n conversation_id: conversationId,\n ...(after === undefined ? {} : { after }),\n limit: HISTORY_PAGE,\n });\n const outcome = actionOutcome(answer, 'conversation.history');\n if (outcome.kind !== 'action') return outcome;\n const held = record(outcome.result);\n if (!Array.isArray(held.messages)) return { kind: 'transport-uncertainty' };\n const messages: AcceptedMessage[] = [];\n for (const entry of held.messages) {\n const message = acceptedMessage(entry);\n if (message === null) return { kind: 'transport-uncertainty' };\n messages.push(message);\n }\n const next = held.next === null || held.next === undefined ? undefined : historyCursor(held.next);\n if (next === null) return { kind: 'transport-uncertainty' };\n const page: ConversationHistoryPage = {\n messages,\n ...(next === undefined ? {} : { next: position(next) }),\n };\n return { kind: 'action', result: page };\n}\n"],"names":["changeBatchIdentity","doorRefusal","PRIVATE_LOCATOR","HISTORY_PAGE","OCTET_STREAM","CONVERSATION_ROUTES","Map","HOUSE_CONVERSATION_CARDS","locator","type","identity","agent","declaredActions","routes","mapped","map","name","route","slice","length","get","inputShape","resultKind","houseAction","transport","request","sendAction","input","historyAction","routeOf","Promise","resolve","malformed","carry","undefined","parts","split","some","part","encodeURIComponent","join","record","value","text","held","operationId","kind","code","fields","bodyOf","agent_id","operation_id","conversation_id","message_id","nested","answer","interaction_id","revision","response","withTurn","body","turn","actionOutcome","status","refusal","result","door","sendFile","entry","file","bytes","byteLength","sha256","mediaType","width","height","media_type","dimensions","sendFiles","files","Array","isArray","declared","push","sendBody","textValue","fileBytes","blob","arrayBuffer","Uint8Array","uploadGrant","upload","method","operation","url","uploadOriginals","originals","index","entries","grant","delivered","transfer","act","outcome","uploaded","historyCursor","acceptedAt","messageId","accepted_at","position","cursor","JSON","stringify","positionCursor","parse","acceptedMessage","message","structuredClone","conversationId","afterValue","after","limit","messages","next","page"],"mappings":"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"}
package/dist/stream.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { RefreshPage, SelectedRooms, ViewedConversations } from '@agentshouse/mdruntime';
1
+ import type { ConversationStream, RefreshPage, SelectedRooms } from '@agentshouse/mdruntime';
2
2
  import type { TrackedAuthority } from './discovery.js';
3
3
  import type { HouseDoor } from './transport.js';
4
4
  import type { HouseMode } from './transport.js';
@@ -6,7 +6,7 @@ import { type LogPosition } from './version.js';
6
6
  export type HouseNotifications = SelectedRooms & {
7
7
  track(authorities: readonly TrackedAuthority[]): void;
8
8
  advance(tracked: TrackedAuthority, from: LogPosition): RefreshPage | null;
9
- conversations: ViewedConversations;
9
+ conversations: ConversationStream;
10
10
  };
11
11
  export declare function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications;
12
12
  //# sourceMappingURL=stream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAEX,aAAa,EACb,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAsC,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAc7D,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;IAC1E,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAaF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CA8O5F"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,WAAW,EAEX,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAwB,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAsC,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAc7D,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;IAC1E,aAAa,EAAE,kBAAkB,CAAC;CACnC,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CA6N5F"}
package/dist/stream.js CHANGED
@@ -1,4 +1,4 @@
1
- import { actionOutcome, HISTORY_PAGE, readConversationHistory } from './actions.js';
1
+ import { acceptedMessage, actionOutcome } from './actions.js';
2
2
  import { selects } from './read.js';
3
3
  import { roomVersion } from './version.js';
4
4
  const HELD_POSITIONS_MAX = 256;
@@ -6,11 +6,6 @@ function position(value) {
6
6
  if (!/^(?:0|[1-9][0-9]*)$/.test(value)) return null;
7
7
  return BigInt(value);
8
8
  }
9
- function messageTurn(message) {
10
- if (typeof message !== 'object' || message === null) return null;
11
- const turn = message.message_id;
12
- return typeof turn === 'string' ? turn : null;
13
- }
14
9
  export function houseNotifications(transport, mode) {
15
10
  const stream = transport.stream;
16
11
  const lines = new Map();
@@ -18,8 +13,8 @@ export function houseNotifications(transport, mode) {
18
13
  const authorities = new Map();
19
14
  const observers = new Set();
20
15
  const conversationObservers = new Set();
21
- const subscribedConversations = new Set();
22
16
  let selected = [];
17
+ let replicated = [];
23
18
  let viewed = [];
24
19
  let listening = false;
25
20
  function subscribe() {
@@ -43,10 +38,11 @@ export function houseNotifications(transport, mode) {
43
38
  stream.subscribe(named);
44
39
  }
45
40
  function emitConversation(event) {
46
- if (!viewed.includes(event.conversation)) return;
41
+ const delivered = event.kind === 'accepted-message' || event.kind === 'gap' ? replicated : viewed;
42
+ if (!delivered.includes(event.conversation)) return;
47
43
  for (const observer of conversationObservers)observer(event);
48
44
  }
49
- async function catchUp(conversation, history) {
45
+ async function summarize(conversation) {
50
46
  const viewedAnswer = await transport.door('/door/conversations/view', {
51
47
  conversation_id: conversation
52
48
  });
@@ -58,22 +54,6 @@ export function houseNotifications(transport, mode) {
58
54
  summary: structuredClone('session' in summary.result ? summary.result.session : null)
59
55
  });
60
56
  }
61
- if (!history) return;
62
- const heldHistory = await readConversationHistory(transport, conversation);
63
- if ('outcome' in heldHistory) return;
64
- const newest = heldHistory.messages.slice(-HISTORY_PAGE);
65
- for (const entry of newest){
66
- const turn = messageTurn(entry);
67
- if (turn === null) return;
68
- emitConversation({
69
- kind: 'accepted-message',
70
- conversation,
71
- message: {
72
- turn,
73
- message: structuredClone(entry)
74
- }
75
- });
76
- }
77
57
  }
78
58
  function announce(authority, at) {
79
59
  const version = roomVersion(at);
@@ -117,15 +97,12 @@ export function houseNotifications(transport, mode) {
117
97
  return;
118
98
  }
119
99
  if (frame.type === 'message') {
120
- const turn = messageTurn(frame.message);
121
- if (turn === null) return;
100
+ const message = acceptedMessage(frame.message);
101
+ if (message === null) return;
122
102
  emitConversation({
123
103
  kind: 'accepted-message',
124
104
  conversation: frame.conversation_id,
125
- message: {
126
- turn,
127
- message: structuredClone(frame.message)
128
- }
105
+ message
129
106
  });
130
107
  return;
131
108
  }
@@ -138,9 +115,11 @@ export function houseNotifications(transport, mode) {
138
115
  return;
139
116
  }
140
117
  if (frame.type === 'subscribed' && viewed.includes(frame.authority)) {
141
- const reconnect = subscribedConversations.has(frame.authority);
142
- subscribedConversations.add(frame.authority);
143
- void catchUp(frame.authority, reconnect);
118
+ emitConversation({
119
+ kind: 'gap',
120
+ conversation: frame.authority
121
+ });
122
+ void summarize(frame.authority);
144
123
  return;
145
124
  }
146
125
  if (frame.type === 'subscribed') {
@@ -186,11 +165,12 @@ export function houseNotifications(transport, mode) {
186
165
  }
187
166
  return {
188
167
  conversations: {
168
+ replicate (next) {
169
+ replicated = [
170
+ ...next
171
+ ];
172
+ },
189
173
  view (next) {
190
- const open = new Set(next);
191
- for (const conversation of subscribedConversations){
192
- if (!open.has(conversation)) subscribedConversations.delete(conversation);
193
- }
194
174
  viewed = [
195
175
  ...next
196
176
  ];
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/stream.ts"],"sourcesContent":["import type {\n ConversationEvent,\n RefreshPage,\n RoomVersionNotification,\n SelectedRooms,\n ViewedConversations,\n} from '@agentshouse/mdruntime';\nimport { actionOutcome, HISTORY_PAGE, readConversationHistory } from './actions.js';\nimport type { TrackedAuthority } from './discovery.js';\nimport { selects } from './read.js';\nimport type { HouseDoor, HouseStreamAuthority } from './transport.js';\nimport type { HouseMode, HouseStreamEntry, HouseStreamFrame } from './transport.js';\nimport { roomVersion, type LogPosition } from './version.js';\n\nconst HELD_POSITIONS_MAX = 256;\n\ntype HeldFrame = {\n position: bigint;\n entries: readonly HouseStreamEntry[];\n};\n\ntype HeldLine = {\n logEpoch: string;\n frames: readonly HeldFrame[];\n};\n\nexport type HouseNotifications = SelectedRooms & {\n track(authorities: readonly TrackedAuthority[]): void;\n advance(tracked: TrackedAuthority, from: LogPosition): RefreshPage | null;\n conversations: ViewedConversations;\n};\n\nfunction position(value: string): bigint | null {\n if (!/^(?:0|[1-9][0-9]*)$/.test(value)) return null;\n return BigInt(value);\n}\n\nfunction messageTurn(message: unknown): string | null {\n if (typeof message !== 'object' || message === null) return null;\n const turn = (message as { message_id?: unknown }).message_id;\n return typeof turn === 'string' ? turn : null;\n}\n\nexport function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications {\n const stream = transport.stream;\n const lines = new Map<string, HeldLine>();\n const locators = new Map<string, string[]>();\n const authorities = new Map<string, string>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const conversationObservers = new Set<(event: ConversationEvent) => void>();\n const subscribedConversations = new Set<string>();\n let selected: readonly string[] = [];\n let viewed: readonly string[] = [];\n let listening = false;\n\n function subscribe() {\n const named: HouseStreamAuthority[] = [];\n const rooms = new Set<string>();\n for (const locator of selected) {\n const authority = authorities.get(locator);\n if (authority === undefined) continue;\n rooms.add(authority);\n }\n for (const room of rooms) named.push({ kind: 'room', room });\n for (const conversation of viewed) {\n named.push({ kind: 'conversation', conversation });\n }\n stream.subscribe(named);\n }\n\n function emitConversation(event: ConversationEvent) {\n if (!viewed.includes(event.conversation)) return;\n for (const observer of conversationObservers) observer(event);\n }\n\n async function catchUp(conversation: string, history: boolean) {\n const viewedAnswer = await transport.door('/door/conversations/view', {\n conversation_id: conversation,\n });\n const summary = actionOutcome(viewedAnswer, 'conversations/view');\n if (\n summary.kind === 'action' &&\n typeof summary.result === 'object' &&\n summary.result !== null\n ) {\n emitConversation({\n kind: 'session-summary',\n conversation,\n summary: structuredClone('session' in summary.result ? summary.result.session : null),\n });\n }\n if (!history) return;\n const heldHistory = await readConversationHistory(transport, conversation);\n if ('outcome' in heldHistory) return;\n const newest = heldHistory.messages.slice(-HISTORY_PAGE);\n for (const entry of newest) {\n const turn = messageTurn(entry);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation,\n message: { turn, message: structuredClone(entry) },\n });\n }\n }\n\n function announce(authority: string, at: LogPosition) {\n const version = roomVersion(at);\n for (const locator of locators.get(authority) ?? []) {\n for (const observer of observers) observer({ locator, roomVersion: version });\n }\n }\n\n function interrupt(authority: string) {\n const line = lines.get(authority);\n if (line !== undefined) lines.set(authority, { logEpoch: line.logEpoch, frames: [] });\n }\n\n function resubscribed(authority: string, position?: string, logEpoch?: string) {\n if (position === undefined || logEpoch === undefined) {\n interrupt(authority);\n return;\n }\n const held = lines.get(authority)?.logEpoch;\n lines.set(authority, { logEpoch, frames: [] });\n if (held !== logEpoch) announce(authority, { position, logEpoch });\n }\n\n function receive(frame: HouseStreamFrame) {\n if (frame.type === 'draft') {\n emitConversation({\n kind: 'growing-text',\n conversation: frame.conversation_id,\n turn: frame.turn_id,\n text: frame.text,\n });\n return;\n }\n if (frame.type === 'message') {\n const turn = messageTurn(frame.message);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation: frame.conversation_id,\n message: { turn, message: structuredClone(frame.message) },\n });\n return;\n }\n if (frame.type === 'session') {\n emitConversation({\n kind: 'session-summary',\n conversation: frame.conversation_id,\n summary: structuredClone(frame.summary),\n });\n return;\n }\n if (frame.type === 'subscribed' && viewed.includes(frame.authority)) {\n const reconnect = subscribedConversations.has(frame.authority);\n subscribedConversations.add(frame.authority);\n void catchUp(frame.authority, reconnect);\n return;\n }\n if (frame.type === 'subscribed') {\n resubscribed(frame.authority, frame.position, frame.log_epoch);\n return;\n }\n if (frame.type !== 'entries') {\n interrupt(frame.authority);\n return;\n }\n const at = position(frame.position);\n if (at === null) {\n interrupt(frame.authority);\n return;\n }\n const line = lines.get(frame.authority);\n if (line?.logEpoch === frame.log_epoch) {\n const last = line.frames.at(-1);\n const continued = last !== undefined && last.position + 1n === at;\n const next = continued\n ? [...line.frames, { position: at, entries: frame.entries }]\n : [{ position: at, entries: frame.entries }];\n lines.set(frame.authority, {\n logEpoch: line.logEpoch,\n frames: next.length > HELD_POSITIONS_MAX ? [] : next,\n });\n } else {\n interrupt(frame.authority);\n }\n announce(frame.authority, { position: frame.position, logEpoch: frame.log_epoch });\n }\n\n return {\n conversations: {\n view(next) {\n const open = new Set(next);\n for (const conversation of subscribedConversations) {\n if (!open.has(conversation)) subscribedConversations.delete(conversation);\n }\n viewed = [...next];\n subscribe();\n },\n observe(notify) {\n conversationObservers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n conversationObservers.delete(notify);\n };\n },\n },\n track(entries) {\n locators.clear();\n authorities.clear();\n for (const entry of entries) {\n locators.set(entry.authority, [...(locators.get(entry.authority) ?? []), entry.locator]);\n authorities.set(entry.locator, entry.authority);\n if (lines.get(entry.authority)?.logEpoch !== entry.logEpoch) {\n lines.set(entry.authority, { logEpoch: entry.logEpoch, frames: [] });\n }\n }\n for (const authority of lines.keys()) {\n if (!locators.has(authority)) lines.delete(authority);\n }\n },\n select(named) {\n selected = [...named];\n subscribe();\n },\n observe(notify) {\n observers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n observers.delete(notify);\n };\n },\n advance(tracked, from) {\n const line = lines.get(tracked.authority);\n const start = position(from.position);\n if (line === undefined || start === null || line.logEpoch !== from.logEpoch) return null;\n const at = line.frames.findIndex((frame) => frame.position === start + 1n);\n if (at === -1) return null;\n const pending = line.frames.slice(at);\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const frame of pending) {\n for (const entry of frame.entries) {\n if (!selects(tracked, entry.path)) continue;\n if (entry.kind === 'removed') {\n delete documents[entry.path];\n delete revisions[entry.path];\n if (!removals.includes(entry.path)) removals.push(entry.path);\n continue;\n }\n if (entry.text === undefined) return null;\n if (mode === 'credential' && entry.revision === undefined) return null;\n documents[entry.path] = entry.text;\n if (entry.revision !== undefined) revisions[entry.path] = entry.revision;\n const removed = removals.indexOf(entry.path);\n if (removed !== -1) removals.splice(removed, 1);\n }\n }\n const last = pending.at(-1);\n if (last === undefined) return null;\n lines.set(tracked.authority, { logEpoch: line.logEpoch, frames: pending });\n return {\n kind: 'net-advancement',\n roomVersion: roomVersion({ position: last.position.toString(), logEpoch: line.logEpoch }),\n documents,\n revisions,\n binaryTargets: [],\n removals: removals.sort(),\n };\n },\n };\n}\n"],"names":["actionOutcome","HISTORY_PAGE","readConversationHistory","selects","roomVersion","HELD_POSITIONS_MAX","position","value","test","BigInt","messageTurn","message","turn","message_id","houseNotifications","transport","mode","stream","lines","Map","locators","authorities","observers","Set","conversationObservers","subscribedConversations","selected","viewed","listening","subscribe","named","rooms","locator","authority","get","undefined","add","room","push","kind","conversation","emitConversation","event","includes","observer","catchUp","history","viewedAnswer","door","conversation_id","summary","result","structuredClone","session","heldHistory","newest","messages","slice","entry","announce","at","version","interrupt","line","set","logEpoch","frames","resubscribed","held","receive","frame","type","turn_id","text","reconnect","has","log_epoch","last","continued","next","entries","length","conversations","view","open","delete","observe","notify","track","clear","keys","select","advance","tracked","from","start","findIndex","pending","documents","revisions","removals","path","revision","removed","indexOf","splice","toString","binaryTargets","sort"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/stream.ts"],"sourcesContent":["import type {\n ConversationEvent,\n ConversationStream,\n RefreshPage,\n RoomVersionNotification,\n SelectedRooms,\n} from '@agentshouse/mdruntime';\nimport { acceptedMessage, actionOutcome } from './actions.js';\nimport type { TrackedAuthority } from './discovery.js';\nimport { selects } from './read.js';\nimport type { HouseDoor, HouseStreamAuthority } from './transport.js';\nimport type { HouseMode, HouseStreamEntry, HouseStreamFrame } from './transport.js';\nimport { roomVersion, type LogPosition } from './version.js';\n\nconst HELD_POSITIONS_MAX = 256;\n\ntype HeldFrame = {\n position: bigint;\n entries: readonly HouseStreamEntry[];\n};\n\ntype HeldLine = {\n logEpoch: string;\n frames: readonly HeldFrame[];\n};\n\nexport type HouseNotifications = SelectedRooms & {\n track(authorities: readonly TrackedAuthority[]): void;\n advance(tracked: TrackedAuthority, from: LogPosition): RefreshPage | null;\n conversations: ConversationStream;\n};\n\nfunction position(value: string): bigint | null {\n if (!/^(?:0|[1-9][0-9]*)$/.test(value)) return null;\n return BigInt(value);\n}\n\nexport function houseNotifications(transport: HouseDoor, mode: HouseMode): HouseNotifications {\n const stream = transport.stream;\n const lines = new Map<string, HeldLine>();\n const locators = new Map<string, string[]>();\n const authorities = new Map<string, string>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const conversationObservers = new Set<(event: ConversationEvent) => void>();\n let selected: readonly string[] = [];\n let replicated: readonly string[] = [];\n let viewed: readonly string[] = [];\n let listening = false;\n\n function subscribe() {\n const named: HouseStreamAuthority[] = [];\n const rooms = new Set<string>();\n for (const locator of selected) {\n const authority = authorities.get(locator);\n if (authority === undefined) continue;\n rooms.add(authority);\n }\n for (const room of rooms) named.push({ kind: 'room', room });\n for (const conversation of viewed) {\n named.push({ kind: 'conversation', conversation });\n }\n stream.subscribe(named);\n }\n\n function emitConversation(event: ConversationEvent) {\n const delivered =\n event.kind === 'accepted-message' || event.kind === 'gap' ? replicated : viewed;\n if (!delivered.includes(event.conversation)) return;\n for (const observer of conversationObservers) observer(event);\n }\n\n async function summarize(conversation: string) {\n const viewedAnswer = await transport.door('/door/conversations/view', {\n conversation_id: conversation,\n });\n const summary = actionOutcome(viewedAnswer, 'conversations/view');\n if (\n summary.kind === 'action' &&\n typeof summary.result === 'object' &&\n summary.result !== null\n ) {\n emitConversation({\n kind: 'session-summary',\n conversation,\n summary: structuredClone('session' in summary.result ? summary.result.session : null),\n });\n }\n }\n\n function announce(authority: string, at: LogPosition) {\n const version = roomVersion(at);\n for (const locator of locators.get(authority) ?? []) {\n for (const observer of observers) observer({ locator, roomVersion: version });\n }\n }\n\n function interrupt(authority: string) {\n const line = lines.get(authority);\n if (line !== undefined) lines.set(authority, { logEpoch: line.logEpoch, frames: [] });\n }\n\n function resubscribed(authority: string, position?: string, logEpoch?: string) {\n if (position === undefined || logEpoch === undefined) {\n interrupt(authority);\n return;\n }\n const held = lines.get(authority)?.logEpoch;\n lines.set(authority, { logEpoch, frames: [] });\n if (held !== logEpoch) announce(authority, { position, logEpoch });\n }\n\n function receive(frame: HouseStreamFrame) {\n if (frame.type === 'draft') {\n emitConversation({\n kind: 'growing-text',\n conversation: frame.conversation_id,\n turn: frame.turn_id,\n text: frame.text,\n });\n return;\n }\n if (frame.type === 'message') {\n const message = acceptedMessage(frame.message);\n if (message === null) return;\n emitConversation({ kind: 'accepted-message', conversation: frame.conversation_id, message });\n return;\n }\n if (frame.type === 'session') {\n emitConversation({\n kind: 'session-summary',\n conversation: frame.conversation_id,\n summary: structuredClone(frame.summary),\n });\n return;\n }\n if (frame.type === 'subscribed' && viewed.includes(frame.authority)) {\n emitConversation({ kind: 'gap', conversation: frame.authority });\n void summarize(frame.authority);\n return;\n }\n if (frame.type === 'subscribed') {\n resubscribed(frame.authority, frame.position, frame.log_epoch);\n return;\n }\n if (frame.type !== 'entries') {\n interrupt(frame.authority);\n return;\n }\n const at = position(frame.position);\n if (at === null) {\n interrupt(frame.authority);\n return;\n }\n const line = lines.get(frame.authority);\n if (line?.logEpoch === frame.log_epoch) {\n const last = line.frames.at(-1);\n const continued = last !== undefined && last.position + 1n === at;\n const next = continued\n ? [...line.frames, { position: at, entries: frame.entries }]\n : [{ position: at, entries: frame.entries }];\n lines.set(frame.authority, {\n logEpoch: line.logEpoch,\n frames: next.length > HELD_POSITIONS_MAX ? [] : next,\n });\n } else {\n interrupt(frame.authority);\n }\n announce(frame.authority, { position: frame.position, logEpoch: frame.log_epoch });\n }\n\n return {\n conversations: {\n replicate(next) {\n replicated = [...next];\n },\n view(next) {\n viewed = [...next];\n subscribe();\n },\n observe(notify) {\n conversationObservers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n conversationObservers.delete(notify);\n };\n },\n },\n track(entries) {\n locators.clear();\n authorities.clear();\n for (const entry of entries) {\n locators.set(entry.authority, [...(locators.get(entry.authority) ?? []), entry.locator]);\n authorities.set(entry.locator, entry.authority);\n if (lines.get(entry.authority)?.logEpoch !== entry.logEpoch) {\n lines.set(entry.authority, { logEpoch: entry.logEpoch, frames: [] });\n }\n }\n for (const authority of lines.keys()) {\n if (!locators.has(authority)) lines.delete(authority);\n }\n },\n select(named) {\n selected = [...named];\n subscribe();\n },\n observe(notify) {\n observers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n observers.delete(notify);\n };\n },\n advance(tracked, from) {\n const line = lines.get(tracked.authority);\n const start = position(from.position);\n if (line === undefined || start === null || line.logEpoch !== from.logEpoch) return null;\n const at = line.frames.findIndex((frame) => frame.position === start + 1n);\n if (at === -1) return null;\n const pending = line.frames.slice(at);\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const frame of pending) {\n for (const entry of frame.entries) {\n if (!selects(tracked, entry.path)) continue;\n if (entry.kind === 'removed') {\n delete documents[entry.path];\n delete revisions[entry.path];\n if (!removals.includes(entry.path)) removals.push(entry.path);\n continue;\n }\n if (entry.text === undefined) return null;\n if (mode === 'credential' && entry.revision === undefined) return null;\n documents[entry.path] = entry.text;\n if (entry.revision !== undefined) revisions[entry.path] = entry.revision;\n const removed = removals.indexOf(entry.path);\n if (removed !== -1) removals.splice(removed, 1);\n }\n }\n const last = pending.at(-1);\n if (last === undefined) return null;\n lines.set(tracked.authority, { logEpoch: line.logEpoch, frames: pending });\n return {\n kind: 'net-advancement',\n roomVersion: roomVersion({ position: last.position.toString(), logEpoch: line.logEpoch }),\n documents,\n revisions,\n binaryTargets: [],\n removals: removals.sort(),\n };\n },\n };\n}\n"],"names":["acceptedMessage","actionOutcome","selects","roomVersion","HELD_POSITIONS_MAX","position","value","test","BigInt","houseNotifications","transport","mode","stream","lines","Map","locators","authorities","observers","Set","conversationObservers","selected","replicated","viewed","listening","subscribe","named","rooms","locator","authority","get","undefined","add","room","push","kind","conversation","emitConversation","event","delivered","includes","observer","summarize","viewedAnswer","door","conversation_id","summary","result","structuredClone","session","announce","at","version","interrupt","line","set","logEpoch","frames","resubscribed","held","receive","frame","type","turn","turn_id","text","message","log_epoch","last","continued","next","entries","length","conversations","replicate","view","observe","notify","delete","track","clear","entry","keys","has","select","advance","tracked","from","start","findIndex","pending","slice","documents","revisions","removals","path","revision","removed","indexOf","splice","toString","binaryTargets","sort"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EAEb,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAMhC,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AAEvD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,gBAAgB,QAAuC,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/D,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA6GrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAQ1F;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAK/D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,MAAM,EAAE,CAQhF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAEpE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1D;AAqCD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,cAAc,CAsDhB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;IAEjF,IAAI,EAAE,UAAU;IAChB,QAAQ;IACR,IAAI;IACJ,MAAM;QAAI,IAAI;;EAEjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM1B;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,aAAa,CAoDf"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EAEb,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAMhC,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AAEvD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,gBAAgB,QAAuC,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/D,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA2GrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAQ1F;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,aAAa,CAK/D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,MAAM,EAAE,CAQhF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAEpE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1D;AAqCD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,cAAc,CAsDhB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;IAEjF,IAAI,EAAE,UAAU;IAChB,QAAQ;IACR,IAAI;IACJ,MAAM;QAAI,IAAI;;EAEjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM1B;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,aAAa,CAoDf"}
package/dist/write.js CHANGED
@@ -26,7 +26,12 @@ function priorExistence(batch, path) {
26
26
  kind: 'presence'
27
27
  };
28
28
  }
29
- function typedCreate(change, path) {
29
+ function created(change, path) {
30
+ if ('content' in change) return {
31
+ op: 'create',
32
+ path,
33
+ content: change.content
34
+ };
30
35
  const { type, ...fields } = change.fields;
31
36
  if (typeof type !== 'string' || type.length === 0) return null;
32
37
  return {
@@ -89,11 +94,11 @@ function operationOf(batch, change, handle) {
89
94
  if (priorAbsence(batch, change.path) === undefined) return {
90
95
  rule: 'precondition-missing'
91
96
  };
92
- const created = typedCreate(change, path);
93
- return created === null ? {
97
+ const operation = created(change, path);
98
+ return operation === null ? {
94
99
  rule: 'type-missing'
95
100
  } : {
96
- operation: created
101
+ operation
97
102
  };
98
103
  }
99
104
  const existence = priorExistence(batch, change.path);
package/dist/write.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/write.ts"],"sourcesContent":["import type {\n Change,\n ChangeBatch,\n HistoryResult,\n HistoryRevision,\n MutationResult,\n Precondition,\n} from '@agentshouse/mdruntime';\nimport { sha256Hex, textBytes } from './digest.js';\nimport { nativePath, roomLocalPath } from './map.js';\nimport { classifyDoor, doorRefusal, scopedRefusal } from './refusal.js';\nimport { readPosition, roomVersion } from './version.js';\n\nexport const INLINE_BODY_LIMIT_BYTES = 4 * 1024 * 1024;\n\nexport const UPLOAD_LINE_BYTES = 37;\n\nexport const UPLOAD_BYTES_MAX = 32 * 1024 * 1024 - UPLOAD_LINE_BYTES;\n\nexport type HouseOperation = Readonly<Record<string, unknown>>;\n\nexport type ChangeMapping =\n | { kind: 'changes'; changes: readonly HouseOperation[] }\n | { kind: 'unmapped'; path: string; rule: string };\n\ntype Existence = { base: string } | { kind: 'presence' };\n\nfunction priorField(batch: ChangeBatch, path: string, name: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'field' }> =>\n precondition.kind === 'field' && precondition.path === path && precondition.name === name,\n );\n}\n\nfunction priorSection(batch: ChangeBatch, path: string, name: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'section' }> =>\n precondition.kind === 'section' && precondition.path === path && precondition.name === name,\n );\n}\n\nfunction priorPreamble(batch: ChangeBatch, path: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'preamble' }> =>\n precondition.kind === 'preamble' && precondition.path === path,\n );\n}\n\nfunction priorAbsence(batch: ChangeBatch, path: string) {\n return batch.preconditions.find(\n (precondition) => precondition.kind === 'absent' && precondition.path === path,\n );\n}\n\nfunction priorExistence(batch: ChangeBatch, path: string): Existence | undefined {\n const precondition = batch.preconditions.find(\n (held) => held.path === path && (held.kind === 'revision' || held.kind === 'present'),\n );\n if (precondition === undefined) return undefined;\n return precondition.kind === 'revision' ? { base: precondition.revision } : { kind: 'presence' };\n}\n\nfunction typedCreate(\n change: Extract<Change, { kind: 'create' }>,\n path: string,\n): HouseOperation | null {\n const { type, ...fields } = change.fields;\n if (typeof type !== 'string' || type.length === 0) return null;\n return { op: 'create_typed', path, type, fields, sections: change.sections };\n}\n\ntype MappedOperation = { operation: HouseOperation } | { rule: string };\n\nfunction operationOf(\n batch: ChangeBatch,\n change: Change,\n handle: string | undefined,\n): MappedOperation {\n const path = nativePath(change.path, handle);\n if (change.kind === 'field') {\n const prior = priorField(batch, change.path, change.name);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: {\n op: 'set_field',\n path,\n field: change.name,\n value: change.value,\n ...(prior.value === undefined ? {} : { base: prior.value }),\n },\n };\n }\n if (change.kind === 'section') {\n const prior = priorSection(batch, change.path, change.name);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: {\n op: 'replace_section',\n path,\n section: change.name,\n base: prior.value,\n content: change.value,\n },\n };\n }\n if (change.kind === 'preamble') {\n const prior = priorPreamble(batch, change.path);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: { op: 'replace_preamble', path, base: prior.value, content: change.value },\n };\n }\n if (change.kind === 'create') {\n if (priorAbsence(batch, change.path) === undefined) return { rule: 'precondition-missing' };\n const created = typedCreate(change, path);\n return created === null ? { rule: 'type-missing' } : { operation: created };\n }\n const existence = priorExistence(batch, change.path);\n if (existence === undefined) return { rule: 'precondition-missing' };\n if (!('base' in existence)) return { rule: 'presence-base-unrepresentable' };\n if (change.kind === 'replace') {\n return { operation: { op: 'replace', path, base: existence.base, content: change.content } };\n }\n if (change.kind === 'move') {\n if (priorAbsence(batch, change.to) === undefined) return { rule: 'precondition-missing' };\n return {\n operation: { op: 'rename', path, to: nativePath(change.to, handle), base: existence.base },\n };\n }\n return { operation: { op: 'remove', path, base: existence.base } };\n}\n\nexport function houseChanges(batch: ChangeBatch, handle: string | undefined): ChangeMapping {\n const changes: HouseOperation[] = [];\n for (const change of batch.changes) {\n const mapped = operationOf(batch, change, handle);\n if ('rule' in mapped) return { kind: 'unmapped', path: change.path, rule: mapped.rule };\n changes.push(mapped.operation);\n }\n return { kind: 'changes', changes };\n}\n\nexport type OperationHead = {\n readonly operation_id: string;\n readonly app_ref?: string;\n readonly release?: string;\n};\n\nexport function operationHead(batch: ChangeBatch): OperationHead {\n const writer = batch.writtenBy;\n return writer === undefined\n ? { operation_id: batch.id }\n : { operation_id: batch.id, app_ref: writer.app, release: writer.release };\n}\n\nexport function batchPaths(changes: readonly HouseOperation[]): readonly string[] {\n return [\n ...new Set(\n changes.flatMap((change) =>\n change.op === 'rename' ? [String(change.path), String(change.to)] : [String(change.path)],\n ),\n ),\n ].sort();\n}\n\nexport function deltaBody(changes: readonly HouseOperation[]): string {\n return JSON.stringify({ changes });\n}\n\nexport function deltaBytes(delta: string): number {\n return textBytes(delta);\n}\n\nexport function uploadable(bytes: number): boolean {\n return bytes > INLINE_BODY_LIMIT_BYTES && bytes <= UPLOAD_BYTES_MAX;\n}\n\nexport function deltaDigest(delta: string): Promise<string> {\n return sha256Hex(delta);\n}\n\ntype Material = { path: string; content: string | null; revision: string | null };\n\nfunction material(value: unknown, handle: string | undefined): readonly Material[] | null {\n if (!Array.isArray(value)) return null;\n const held: Material[] = [];\n for (const entry of value) {\n if (typeof entry !== 'object' || entry === null) return null;\n const file = entry as Record<string, unknown>;\n if (typeof file.path !== 'string') return null;\n if (file.content !== null && typeof file.content !== 'string') return null;\n if (file.revision !== null && file.revision !== undefined && typeof file.revision !== 'string')\n return null;\n let path: string;\n try {\n path = roomLocalPath(file.path, handle);\n } catch {\n return null;\n }\n held.push({\n path,\n content: file.content,\n revision: typeof file.revision === 'string' ? file.revision : null,\n });\n }\n return held;\n}\n\nfunction affectedOf(held: readonly Material[]): Readonly<Record<string, string>> {\n const affected: Record<string, string> = {};\n for (const entry of held) {\n if (entry.content !== null) affected[entry.path] = entry.content;\n }\n return affected;\n}\n\nexport function mutationOutcome(\n status: number,\n body: unknown,\n locator: string,\n handle: string | undefined,\n): MutationResult {\n const refusal = doorRefusal(body);\n if (refusal !== null && refusal.code === 'rate_limited') {\n const reset = refusal.fields.retry_at;\n return {\n kind: 'retryable-refusal',\n code: refusal.code,\n fields: refusal.fields,\n ...(typeof reset === 'string' ? { reset } : {}),\n };\n }\n if (refusal !== null && refusal.code === 'operation_expired') return { kind: 'expired' };\n if (refusal !== null && refusal.code === 'edit_conflict') {\n const { current, ...fields } = refusal.fields;\n const held = material(current, handle) ?? [];\n return { kind: 'conflicted', affected: affectedOf(held), code: refusal.code, fields };\n }\n if (refusal !== null && status === 404) {\n return scopedRefusal(locator, 'undisclosed', refusal);\n }\n const classified = classifyDoor(status, body, locator);\n if (classified !== null && classified.kind !== 'scoped-refusal') {\n return classified.kind === 'beyond-horizon' ? { kind: 'expired' } : classified;\n }\n if (classified !== null && status === 403) return classified;\n if (refusal !== null && status >= 400) {\n return { kind: 'rejected', affected: {}, code: refusal.code, fields: refusal.fields };\n }\n if (status !== 200 || typeof body !== 'object' || body === null) {\n return { kind: 'transport-uncertainty' };\n }\n const held = body as Record<string, unknown>;\n const at = readPosition(held);\n if (at === null) return { kind: 'transport-uncertainty' };\n const contents = material(held.contents, handle);\n if (contents === null) return { kind: 'transport-uncertainty' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const entry of contents) {\n if (entry.content === null || entry.revision === null) {\n removals.push(entry.path);\n continue;\n }\n documents[entry.path] = entry.content;\n revisions[entry.path] = entry.revision;\n }\n return {\n kind: 'accepted',\n roomVersion: roomVersion(at),\n documents,\n revisions,\n removals: removals.sort(),\n };\n}\n\nexport function rejectedMapping(mapping: Extract<ChangeMapping, { kind: 'unmapped' }>) {\n return {\n kind: 'rejected' as const,\n affected: {},\n code: mapping.rule,\n fields: { path: mapping.path },\n };\n}\n\nexport function revisionBody(input: {\n path: string;\n handle: string | undefined;\n revision?: string;\n pageToken?: string;\n}): Record<string, unknown> {\n return {\n path: nativePath(input.path, input.handle),\n ...(input.revision === undefined ? {} : { revision: input.revision }),\n ...(input.pageToken === undefined ? {} : { before: Number(input.pageToken) }),\n };\n}\n\nexport function historyOutcome(\n status: number,\n body: unknown,\n locator: string,\n request: { path: string; revision?: string },\n): HistoryResult {\n const classified = classifyDoor(status, body, locator);\n if (classified !== null) {\n return classified.kind === 'beyond-horizon' ? { kind: 'transport-uncertainty' } : classified;\n }\n if (status !== 200 || typeof body !== 'object' || body === null) {\n return { kind: 'transport-uncertainty' };\n }\n const held = body as Record<string, unknown>;\n if (!Array.isArray(held.revisions)) return { kind: 'transport-uncertainty' };\n const entries: Record<string, unknown>[] = [];\n for (const entry of held.revisions) {\n if (typeof entry !== 'object' || entry === null) return { kind: 'transport-uncertainty' };\n entries.push(entry as Record<string, unknown>);\n }\n if (request.revision !== undefined) {\n const named = entries[0];\n if (named === undefined) return { kind: 'no-history' };\n if (named.unavailable === true) {\n return {\n kind: 'scoped-refusal',\n locator,\n scope: 'content',\n code: 'retained_history_unavailable',\n fields: { path: request.path, revision: request.revision },\n };\n }\n if (typeof named.content !== 'string') return { kind: 'transport-uncertainty' };\n return { kind: 'revision', content: named.content };\n }\n if (entries.length === 0) return { kind: 'no-history' };\n const revisions: HistoryRevision[] = [];\n for (const entry of entries) {\n if (\n typeof entry.revision !== 'string' ||\n typeof entry.author_user !== 'string' ||\n typeof entry.created_at !== 'string'\n ) {\n return { kind: 'transport-uncertainty' };\n }\n revisions.push({\n revision: entry.revision,\n author: entry.author_user,\n time: entry.created_at,\n });\n }\n const next = held.next_before;\n return {\n kind: 'history',\n revisions,\n ...(typeof next === 'number' ? { pageToken: String(next) } : {}),\n };\n}\n"],"names":["sha256Hex","textBytes","nativePath","roomLocalPath","classifyDoor","doorRefusal","scopedRefusal","readPosition","roomVersion","INLINE_BODY_LIMIT_BYTES","UPLOAD_LINE_BYTES","UPLOAD_BYTES_MAX","priorField","batch","path","name","preconditions","find","precondition","kind","priorSection","priorPreamble","priorAbsence","priorExistence","held","undefined","base","revision","typedCreate","change","type","fields","length","op","sections","operationOf","handle","prior","rule","operation","field","value","section","content","created","existence","to","houseChanges","changes","mapped","push","operationHead","writer","writtenBy","operation_id","id","app_ref","app","release","batchPaths","Set","flatMap","String","sort","deltaBody","JSON","stringify","deltaBytes","delta","uploadable","bytes","deltaDigest","material","Array","isArray","entry","file","affectedOf","affected","mutationOutcome","status","body","locator","refusal","code","reset","retry_at","current","classified","at","contents","documents","revisions","removals","rejectedMapping","mapping","revisionBody","input","pageToken","before","Number","historyOutcome","request","entries","named","unavailable","scope","author_user","created_at","author","time","next","next_before"],"mappings":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/write.ts"],"sourcesContent":["import type {\n Change,\n ChangeBatch,\n HistoryResult,\n HistoryRevision,\n MutationResult,\n Precondition,\n} from '@agentshouse/mdruntime';\nimport { sha256Hex, textBytes } from './digest.js';\nimport { nativePath, roomLocalPath } from './map.js';\nimport { classifyDoor, doorRefusal, scopedRefusal } from './refusal.js';\nimport { readPosition, roomVersion } from './version.js';\n\nexport const INLINE_BODY_LIMIT_BYTES = 4 * 1024 * 1024;\n\nexport const UPLOAD_LINE_BYTES = 37;\n\nexport const UPLOAD_BYTES_MAX = 32 * 1024 * 1024 - UPLOAD_LINE_BYTES;\n\nexport type HouseOperation = Readonly<Record<string, unknown>>;\n\nexport type ChangeMapping =\n | { kind: 'changes'; changes: readonly HouseOperation[] }\n | { kind: 'unmapped'; path: string; rule: string };\n\ntype Existence = { base: string } | { kind: 'presence' };\n\nfunction priorField(batch: ChangeBatch, path: string, name: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'field' }> =>\n precondition.kind === 'field' && precondition.path === path && precondition.name === name,\n );\n}\n\nfunction priorSection(batch: ChangeBatch, path: string, name: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'section' }> =>\n precondition.kind === 'section' && precondition.path === path && precondition.name === name,\n );\n}\n\nfunction priorPreamble(batch: ChangeBatch, path: string) {\n return batch.preconditions.find(\n (precondition): precondition is Extract<Precondition, { kind: 'preamble' }> =>\n precondition.kind === 'preamble' && precondition.path === path,\n );\n}\n\nfunction priorAbsence(batch: ChangeBatch, path: string) {\n return batch.preconditions.find(\n (precondition) => precondition.kind === 'absent' && precondition.path === path,\n );\n}\n\nfunction priorExistence(batch: ChangeBatch, path: string): Existence | undefined {\n const precondition = batch.preconditions.find(\n (held) => held.path === path && (held.kind === 'revision' || held.kind === 'present'),\n );\n if (precondition === undefined) return undefined;\n return precondition.kind === 'revision' ? { base: precondition.revision } : { kind: 'presence' };\n}\n\nfunction created(change: Extract<Change, { kind: 'create' }>, path: string): HouseOperation | null {\n if ('content' in change) return { op: 'create', path, content: change.content };\n const { type, ...fields } = change.fields;\n if (typeof type !== 'string' || type.length === 0) return null;\n return { op: 'create_typed', path, type, fields, sections: change.sections };\n}\n\ntype MappedOperation = { operation: HouseOperation } | { rule: string };\n\nfunction operationOf(\n batch: ChangeBatch,\n change: Change,\n handle: string | undefined,\n): MappedOperation {\n const path = nativePath(change.path, handle);\n if (change.kind === 'field') {\n const prior = priorField(batch, change.path, change.name);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: {\n op: 'set_field',\n path,\n field: change.name,\n value: change.value,\n ...(prior.value === undefined ? {} : { base: prior.value }),\n },\n };\n }\n if (change.kind === 'section') {\n const prior = priorSection(batch, change.path, change.name);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: {\n op: 'replace_section',\n path,\n section: change.name,\n base: prior.value,\n content: change.value,\n },\n };\n }\n if (change.kind === 'preamble') {\n const prior = priorPreamble(batch, change.path);\n if (prior === undefined) return { rule: 'precondition-missing' };\n return {\n operation: { op: 'replace_preamble', path, base: prior.value, content: change.value },\n };\n }\n if (change.kind === 'create') {\n if (priorAbsence(batch, change.path) === undefined) return { rule: 'precondition-missing' };\n const operation = created(change, path);\n return operation === null ? { rule: 'type-missing' } : { operation };\n }\n const existence = priorExistence(batch, change.path);\n if (existence === undefined) return { rule: 'precondition-missing' };\n if (!('base' in existence)) return { rule: 'presence-base-unrepresentable' };\n if (change.kind === 'replace') {\n return { operation: { op: 'replace', path, base: existence.base, content: change.content } };\n }\n if (change.kind === 'move') {\n if (priorAbsence(batch, change.to) === undefined) return { rule: 'precondition-missing' };\n return {\n operation: { op: 'rename', path, to: nativePath(change.to, handle), base: existence.base },\n };\n }\n return { operation: { op: 'remove', path, base: existence.base } };\n}\n\nexport function houseChanges(batch: ChangeBatch, handle: string | undefined): ChangeMapping {\n const changes: HouseOperation[] = [];\n for (const change of batch.changes) {\n const mapped = operationOf(batch, change, handle);\n if ('rule' in mapped) return { kind: 'unmapped', path: change.path, rule: mapped.rule };\n changes.push(mapped.operation);\n }\n return { kind: 'changes', changes };\n}\n\nexport type OperationHead = {\n readonly operation_id: string;\n readonly app_ref?: string;\n readonly release?: string;\n};\n\nexport function operationHead(batch: ChangeBatch): OperationHead {\n const writer = batch.writtenBy;\n return writer === undefined\n ? { operation_id: batch.id }\n : { operation_id: batch.id, app_ref: writer.app, release: writer.release };\n}\n\nexport function batchPaths(changes: readonly HouseOperation[]): readonly string[] {\n return [\n ...new Set(\n changes.flatMap((change) =>\n change.op === 'rename' ? [String(change.path), String(change.to)] : [String(change.path)],\n ),\n ),\n ].sort();\n}\n\nexport function deltaBody(changes: readonly HouseOperation[]): string {\n return JSON.stringify({ changes });\n}\n\nexport function deltaBytes(delta: string): number {\n return textBytes(delta);\n}\n\nexport function uploadable(bytes: number): boolean {\n return bytes > INLINE_BODY_LIMIT_BYTES && bytes <= UPLOAD_BYTES_MAX;\n}\n\nexport function deltaDigest(delta: string): Promise<string> {\n return sha256Hex(delta);\n}\n\ntype Material = { path: string; content: string | null; revision: string | null };\n\nfunction material(value: unknown, handle: string | undefined): readonly Material[] | null {\n if (!Array.isArray(value)) return null;\n const held: Material[] = [];\n for (const entry of value) {\n if (typeof entry !== 'object' || entry === null) return null;\n const file = entry as Record<string, unknown>;\n if (typeof file.path !== 'string') return null;\n if (file.content !== null && typeof file.content !== 'string') return null;\n if (file.revision !== null && file.revision !== undefined && typeof file.revision !== 'string')\n return null;\n let path: string;\n try {\n path = roomLocalPath(file.path, handle);\n } catch {\n return null;\n }\n held.push({\n path,\n content: file.content,\n revision: typeof file.revision === 'string' ? file.revision : null,\n });\n }\n return held;\n}\n\nfunction affectedOf(held: readonly Material[]): Readonly<Record<string, string>> {\n const affected: Record<string, string> = {};\n for (const entry of held) {\n if (entry.content !== null) affected[entry.path] = entry.content;\n }\n return affected;\n}\n\nexport function mutationOutcome(\n status: number,\n body: unknown,\n locator: string,\n handle: string | undefined,\n): MutationResult {\n const refusal = doorRefusal(body);\n if (refusal !== null && refusal.code === 'rate_limited') {\n const reset = refusal.fields.retry_at;\n return {\n kind: 'retryable-refusal',\n code: refusal.code,\n fields: refusal.fields,\n ...(typeof reset === 'string' ? { reset } : {}),\n };\n }\n if (refusal !== null && refusal.code === 'operation_expired') return { kind: 'expired' };\n if (refusal !== null && refusal.code === 'edit_conflict') {\n const { current, ...fields } = refusal.fields;\n const held = material(current, handle) ?? [];\n return { kind: 'conflicted', affected: affectedOf(held), code: refusal.code, fields };\n }\n if (refusal !== null && status === 404) {\n return scopedRefusal(locator, 'undisclosed', refusal);\n }\n const classified = classifyDoor(status, body, locator);\n if (classified !== null && classified.kind !== 'scoped-refusal') {\n return classified.kind === 'beyond-horizon' ? { kind: 'expired' } : classified;\n }\n if (classified !== null && status === 403) return classified;\n if (refusal !== null && status >= 400) {\n return { kind: 'rejected', affected: {}, code: refusal.code, fields: refusal.fields };\n }\n if (status !== 200 || typeof body !== 'object' || body === null) {\n return { kind: 'transport-uncertainty' };\n }\n const held = body as Record<string, unknown>;\n const at = readPosition(held);\n if (at === null) return { kind: 'transport-uncertainty' };\n const contents = material(held.contents, handle);\n if (contents === null) return { kind: 'transport-uncertainty' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const entry of contents) {\n if (entry.content === null || entry.revision === null) {\n removals.push(entry.path);\n continue;\n }\n documents[entry.path] = entry.content;\n revisions[entry.path] = entry.revision;\n }\n return {\n kind: 'accepted',\n roomVersion: roomVersion(at),\n documents,\n revisions,\n removals: removals.sort(),\n };\n}\n\nexport function rejectedMapping(mapping: Extract<ChangeMapping, { kind: 'unmapped' }>) {\n return {\n kind: 'rejected' as const,\n affected: {},\n code: mapping.rule,\n fields: { path: mapping.path },\n };\n}\n\nexport function revisionBody(input: {\n path: string;\n handle: string | undefined;\n revision?: string;\n pageToken?: string;\n}): Record<string, unknown> {\n return {\n path: nativePath(input.path, input.handle),\n ...(input.revision === undefined ? {} : { revision: input.revision }),\n ...(input.pageToken === undefined ? {} : { before: Number(input.pageToken) }),\n };\n}\n\nexport function historyOutcome(\n status: number,\n body: unknown,\n locator: string,\n request: { path: string; revision?: string },\n): HistoryResult {\n const classified = classifyDoor(status, body, locator);\n if (classified !== null) {\n return classified.kind === 'beyond-horizon' ? { kind: 'transport-uncertainty' } : classified;\n }\n if (status !== 200 || typeof body !== 'object' || body === null) {\n return { kind: 'transport-uncertainty' };\n }\n const held = body as Record<string, unknown>;\n if (!Array.isArray(held.revisions)) return { kind: 'transport-uncertainty' };\n const entries: Record<string, unknown>[] = [];\n for (const entry of held.revisions) {\n if (typeof entry !== 'object' || entry === null) return { kind: 'transport-uncertainty' };\n entries.push(entry as Record<string, unknown>);\n }\n if (request.revision !== undefined) {\n const named = entries[0];\n if (named === undefined) return { kind: 'no-history' };\n if (named.unavailable === true) {\n return {\n kind: 'scoped-refusal',\n locator,\n scope: 'content',\n code: 'retained_history_unavailable',\n fields: { path: request.path, revision: request.revision },\n };\n }\n if (typeof named.content !== 'string') return { kind: 'transport-uncertainty' };\n return { kind: 'revision', content: named.content };\n }\n if (entries.length === 0) return { kind: 'no-history' };\n const revisions: HistoryRevision[] = [];\n for (const entry of entries) {\n if (\n typeof entry.revision !== 'string' ||\n typeof entry.author_user !== 'string' ||\n typeof entry.created_at !== 'string'\n ) {\n return { kind: 'transport-uncertainty' };\n }\n revisions.push({\n revision: entry.revision,\n author: entry.author_user,\n time: entry.created_at,\n });\n }\n const next = held.next_before;\n return {\n kind: 'history',\n revisions,\n ...(typeof next === 'number' ? { pageToken: String(next) } : {}),\n };\n}\n"],"names":["sha256Hex","textBytes","nativePath","roomLocalPath","classifyDoor","doorRefusal","scopedRefusal","readPosition","roomVersion","INLINE_BODY_LIMIT_BYTES","UPLOAD_LINE_BYTES","UPLOAD_BYTES_MAX","priorField","batch","path","name","preconditions","find","precondition","kind","priorSection","priorPreamble","priorAbsence","priorExistence","held","undefined","base","revision","created","change","op","content","type","fields","length","sections","operationOf","handle","prior","rule","operation","field","value","section","existence","to","houseChanges","changes","mapped","push","operationHead","writer","writtenBy","operation_id","id","app_ref","app","release","batchPaths","Set","flatMap","String","sort","deltaBody","JSON","stringify","deltaBytes","delta","uploadable","bytes","deltaDigest","material","Array","isArray","entry","file","affectedOf","affected","mutationOutcome","status","body","locator","refusal","code","reset","retry_at","current","classified","at","contents","documents","revisions","removals","rejectedMapping","mapping","revisionBody","input","pageToken","before","Number","historyOutcome","request","entries","named","unavailable","scope","author_user","created_at","author","time","next","next_before"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentshouse/mdruntime-adapter",
3
- "version": "0.1.0-alpha.16",
3
+ "version": "0.1.0-alpha.18",
4
4
  "description": "Agents House Adapter for the MD Runtime",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -33,7 +33,7 @@
33
33
  "url": "https://github.com/agentshouse/mdruntime/issues"
34
34
  },
35
35
  "dependencies": {
36
- "@agentshouse/mdmodel": "0.1.0-alpha.13",
37
- "@agentshouse/mdruntime": "0.1.0-alpha.20"
36
+ "@agentshouse/mdmodel": "0.1.0-alpha.14",
37
+ "@agentshouse/mdruntime": "0.1.0-alpha.24"
38
38
  }
39
39
  }