@agentshouse/mdruntime 0.1.0-c5fe3b2cddda7 → 0.1.0-c6197367d5fad
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -19
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +299 -0
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +26 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +302 -0
- package/dist/adapter.d.ts +156 -89
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -11
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +20 -60
- package/dist/authored.d.ts +88 -0
- package/dist/authored.d.ts.map +1 -0
- package/dist/authored.js +345 -0
- package/dist/bootstrap.d.ts +9 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +204 -85
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/change-set.d.ts +4 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +6 -0
- package/dist/change.d.ts +5 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +7 -2
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +33 -23
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +43 -56
- package/dist/collection.d.ts +26 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +19 -2
- package/dist/column.d.ts +5 -0
- package/dist/column.d.ts.map +1 -0
- package/dist/column.js +9 -0
- package/dist/compile.d.ts +8 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +286 -336
- package/dist/connection.d.ts +5 -142
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -4993
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-live.d.ts +150 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +259 -0
- package/dist/conversation-row.d.ts +40 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +66 -0
- package/dist/conversation.d.ts +72 -51
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1001 -926
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/discovery.d.ts +11 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +157 -0
- package/dist/download.d.ts +6 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +42 -0
- package/dist/durability.d.ts +20 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +7 -0
- package/dist/entry.d.ts +2 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +18 -8
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +199 -0
- package/dist/file.d.ts +1 -1
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +3 -2
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +21 -7
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +83 -41
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +37 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -5
- package/dist/install.d.ts +60 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +537 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +282 -0
- package/dist/listing.d.ts +52 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +152 -0
- package/dist/live.d.ts +9 -6
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +118 -36
- package/dist/loaded.d.ts +5 -0
- package/dist/loaded.d.ts.map +1 -0
- package/dist/loaded.js +40 -0
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +32 -0
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +49 -0
- package/dist/media.d.ts +19 -2
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +105 -27
- package/dist/memory.d.ts +18 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +214 -91
- package/dist/messages.d.ts +35 -5
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +109 -39
- package/dist/model.d.ts +2 -10
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -14
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +153 -0
- package/dist/observation.d.ts +28 -13
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +185 -81
- package/dist/opened.d.ts +1 -1
- package/dist/opened.d.ts.map +1 -1
- package/dist/opened.js +5 -5
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +53 -0
- package/dist/outcome.d.ts +17 -2
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +35 -2
- package/dist/overlay.d.ts +7 -2
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +48 -24
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +4 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +13 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +22 -0
- package/dist/preparation.d.ts +41 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +314 -0
- package/dist/presence.d.ts +58 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +231 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +308 -0
- package/dist/query.d.ts +14 -210
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -505
- package/dist/questions.d.ts +30 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +116 -0
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +480 -0
- package/dist/reach.d.ts +16 -15
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +257 -148
- package/dist/react.d.ts +19 -3
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +9 -6
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +3 -5
- package/dist/reads.d.ts +39 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +178 -0
- package/dist/recovery.d.ts +3 -1
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +38 -8
- package/dist/refresh.d.ts +2 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +31 -3
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +11 -16
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +66 -32
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +34 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +331 -111
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +220 -0
- package/dist/room-list.d.ts +10 -0
- package/dist/room-list.d.ts.map +1 -0
- package/dist/room-list.js +45 -0
- package/dist/rows.d.ts +16 -22
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +49 -186
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +42 -86
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +332 -228
- package/dist/saves.d.ts +34 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +437 -0
- package/dist/search.d.ts +12 -63
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +9 -52
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -1
- package/dist/shared.d.ts +1 -6
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +13 -95
- package/dist/shown.d.ts +35 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +313 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +59 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +93 -0
- package/dist/status.d.ts +0 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -6
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +40 -0
- package/dist/store/readiness.d.ts +11 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +68 -0
- package/dist/store/records.d.ts +224 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +466 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/rooms-shown.d.ts +8 -0
- package/dist/store/rooms-shown.d.ts.map +1 -0
- package/dist/store/rooms-shown.js +13 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +115 -143
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +171 -364
- package/dist/stored.d.ts +72 -35
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +337 -197
- package/dist/surface.d.ts +92 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +251 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +538 -0
- package/dist/tables.d.ts +118 -67
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +199 -278
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +128 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +9 -12
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +72 -9
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +26 -5
- package/package.json +3 -2
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/fulltext.d.ts +0 -27
- package/dist/fulltext.d.ts.map +0 -1
- package/dist/fulltext.js +0 -370
- package/dist/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- package/dist/words.js +0 -156
package/dist/memory.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
|
+
import { type VerifiedModel } from '@agentshouse/mdmodel';
|
|
1
2
|
import type { ModelResult } from './model.js';
|
|
2
|
-
import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type
|
|
3
|
-
export type MemoryRoom = DiscoveredRoom & {
|
|
3
|
+
import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type SavedFacts, type HeadChange, type ListedAgent, type ListedConversation, type Member, type ProviderLimit, type Retention, type ServiceMode, type TypedPath, type TypedSelection } from './adapter.js';
|
|
4
|
+
export type MemoryRoom = Omit<DiscoveredRoom, 'typedSelection' | 'authoredPaths'> & {
|
|
5
|
+
typedSelection?: TypedSelection | null;
|
|
6
|
+
authoredPaths?: readonly string[];
|
|
4
7
|
model?: ModelResult;
|
|
5
8
|
documents?: Readonly<Record<string, string>>;
|
|
9
|
+
facts?: Readonly<Record<string, SavedFacts>>;
|
|
6
10
|
revisions?: Readonly<Record<string, string>>;
|
|
7
11
|
fileIds?: Readonly<Record<string, string>>;
|
|
12
|
+
created?: Readonly<Record<string, string>>;
|
|
8
13
|
changes?: Readonly<Record<string, HeadChange>>;
|
|
9
14
|
binaryFiles?: Readonly<Record<string, BinaryFile>>;
|
|
10
15
|
folders?: readonly string[];
|
|
@@ -14,41 +19,48 @@ export type MemoryConversation = {
|
|
|
14
19
|
conversation: string;
|
|
15
20
|
listed?: Omit<ListedConversation, 'conversation' | 'newest'>;
|
|
16
21
|
messages?: readonly AcceptedMessage[];
|
|
17
|
-
outcomes?: Partial<Record<ConversationAction, ActionResult>>;
|
|
22
|
+
outcomes?: Partial<Record<ConversationAction | 'history', ActionResult>>;
|
|
18
23
|
};
|
|
19
24
|
export type MemoryAdapterOptions = {
|
|
20
25
|
rooms?: readonly MemoryRoom[];
|
|
21
26
|
conversations?: readonly MemoryConversation[];
|
|
27
|
+
agents?: readonly ListedAgent[];
|
|
22
28
|
historyPageSize?: number;
|
|
23
29
|
pageSize?: number;
|
|
24
30
|
capabilities?: readonly Capability[];
|
|
25
31
|
providerLimits?: readonly ProviderLimit[];
|
|
26
32
|
retention?: Retention;
|
|
27
33
|
member?: Member;
|
|
34
|
+
timeZone?: string | null;
|
|
28
35
|
unopened?: boolean;
|
|
29
|
-
|
|
30
|
-
|
|
36
|
+
roomTypes?: VerifiedModel;
|
|
37
|
+
typedPaths?: readonly TypedPath[];
|
|
38
|
+
privateRoom?: string;
|
|
31
39
|
};
|
|
32
40
|
export type MemoryAdapter = Adapter & {
|
|
41
|
+
discover: NonNullable<Adapter['discover']>;
|
|
33
42
|
refresh: NonNullable<Adapter['refresh']>;
|
|
34
43
|
setRooms(rooms: readonly MemoryRoom[]): void;
|
|
35
44
|
setConversations(conversations: readonly MemoryConversation[]): void;
|
|
45
|
+
setAgents(agents: readonly ListedAgent[]): void;
|
|
36
46
|
script(operation: keyof Adapter, answer: unknown): void;
|
|
37
47
|
open(): void;
|
|
38
48
|
close(closing?: {
|
|
39
49
|
revoked?: boolean;
|
|
40
50
|
lost?: boolean;
|
|
51
|
+
authorityChanged?: boolean;
|
|
41
52
|
}): void;
|
|
42
53
|
expire(locators: readonly string[]): void;
|
|
43
54
|
notifyRoomVersion(notification: {
|
|
44
55
|
locator: string;
|
|
45
56
|
roomVersion: string;
|
|
46
57
|
}): void;
|
|
47
|
-
notifyAuthorityChanged(
|
|
58
|
+
notifyAuthorityChanged(locators?: readonly string[]): void;
|
|
48
59
|
notifyConversation(event: ConversationEvent): void;
|
|
49
60
|
notifyServiceMode(mode: ServiceMode): void;
|
|
50
61
|
heldRooms(): readonly string[];
|
|
51
62
|
replicatedConversations(): readonly string[];
|
|
63
|
+
heldConversationCursor(): string | null;
|
|
52
64
|
};
|
|
53
65
|
export declare function createMemoryAdapter(options?: MemoryAdapterOptions): MemoryAdapter;
|
|
54
66
|
//# sourceMappingURL=memory.d.ts.map
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
|
+
import { definitionAt, documentFacts, keyedDestination, keyedLink, parse, } from '@agentshouse/mdmodel';
|
|
2
|
+
import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
|
|
3
|
+
import { selected } from './collection.js';
|
|
4
|
+
import { declaredType } from './outcome.js';
|
|
1
5
|
import { sameChange } from './overlay.js';
|
|
2
6
|
const ATTACHMENTS = 'attachments';
|
|
7
|
+
const UNFOUND = {
|
|
8
|
+
kind: 'rejected',
|
|
9
|
+
code: 'not_found',
|
|
10
|
+
fields: {},
|
|
11
|
+
retryable: false,
|
|
12
|
+
};
|
|
3
13
|
function lastName(path) {
|
|
4
14
|
return path.slice(path.lastIndexOf('/') + 1);
|
|
5
15
|
}
|
|
6
16
|
const FIXTURE_RETENTION = {
|
|
7
17
|
history: { kind: 'duration', seconds: 1 },
|
|
8
|
-
outcome: 604_800,
|
|
9
18
|
refreshHorizon: 1,
|
|
10
19
|
};
|
|
11
20
|
function declaredRetention(value) {
|
|
@@ -52,15 +61,18 @@ export function createMemoryAdapter(options = {}) {
|
|
|
52
61
|
const listeners = new Set();
|
|
53
62
|
const modeObservers = new Set();
|
|
54
63
|
const scripted = new Map();
|
|
55
|
-
const
|
|
56
|
-
const sealed = new Set();
|
|
57
|
-
const sentTurns = new Map();
|
|
64
|
+
const repeats = new Map();
|
|
58
65
|
const historyPageSize = options.historyPageSize;
|
|
59
66
|
const attached = new Map();
|
|
67
|
+
const keyed = new Map();
|
|
60
68
|
const linked = new WeakMap();
|
|
61
69
|
const carried = new Map();
|
|
62
70
|
let expiring = [];
|
|
71
|
+
let openings = 0;
|
|
72
|
+
const declaredRooms = new Set();
|
|
63
73
|
let replicated = [];
|
|
74
|
+
let heldCursor = null;
|
|
75
|
+
let agents = structuredClone(options.agents ?? []);
|
|
64
76
|
let issued = 0;
|
|
65
77
|
function scriptConversations(entries) {
|
|
66
78
|
scripted.clear();
|
|
@@ -91,6 +103,25 @@ export function createMemoryAdapter(options = {}) {
|
|
|
91
103
|
function heldBlob(room, path) {
|
|
92
104
|
return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
|
|
93
105
|
}
|
|
106
|
+
function linkTo(room, path) {
|
|
107
|
+
const blob = room === undefined ? undefined : heldBlob(room, path);
|
|
108
|
+
if (blob === undefined)
|
|
109
|
+
return UNFOUND;
|
|
110
|
+
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
111
|
+
linked.set(blob, url);
|
|
112
|
+
return { kind: 'link', url, name: lastName(path), mediaType: declaredType(blob) };
|
|
113
|
+
}
|
|
114
|
+
function attachedKeyed(request) {
|
|
115
|
+
const room = rooms.find((entry) => entry.locator === options.privateRoom);
|
|
116
|
+
if (room === undefined) {
|
|
117
|
+
return { kind: 'rejected', code: 'room_not_found', fields: {}, retryable: false };
|
|
118
|
+
}
|
|
119
|
+
const path = freePath(room, request.name);
|
|
120
|
+
attached.set(`${room.locator}\u0000${path}`, request.blob);
|
|
121
|
+
const key = `memory-${keyed.size + 1}`;
|
|
122
|
+
keyed.set(key, { locator: room.locator, path });
|
|
123
|
+
return { kind: 'linked', link: keyedDestination(`/rooms/${room.handle}/${path}`, key) };
|
|
124
|
+
}
|
|
94
125
|
function freePath(room, name) {
|
|
95
126
|
const dot = name.lastIndexOf('.');
|
|
96
127
|
const stem = dot > 0 ? name.slice(0, dot) : name;
|
|
@@ -101,8 +132,40 @@ export function createMemoryAdapter(options = {}) {
|
|
|
101
132
|
return path;
|
|
102
133
|
}
|
|
103
134
|
}
|
|
135
|
+
const saved = new WeakMap();
|
|
136
|
+
const roomTypes = options.roomTypes ?? NO_ROOM_TYPES;
|
|
137
|
+
function factsAt(room, path, content) {
|
|
138
|
+
const types = selected({ selection: room.typedSelection ?? null }, path)
|
|
139
|
+
? roomTypes.types
|
|
140
|
+
: schemaTypes(room.model?.kind === 'model' ? room.model.snapshot.schema : null, roomTypes);
|
|
141
|
+
let held = saved.get(types);
|
|
142
|
+
if (held === undefined) {
|
|
143
|
+
held = new Map();
|
|
144
|
+
saved.set(types, held);
|
|
145
|
+
}
|
|
146
|
+
const key = `${path}\u0000${content}`;
|
|
147
|
+
if (!held.has(key)) {
|
|
148
|
+
const facts = documentFacts(path, parse(content, path, definitionAt({ types }, path, options.typedPaths)), {
|
|
149
|
+
types,
|
|
150
|
+
});
|
|
151
|
+
held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
|
|
152
|
+
}
|
|
153
|
+
return held.get(key);
|
|
154
|
+
}
|
|
155
|
+
function factsIn(room, paths) {
|
|
156
|
+
const facts = {};
|
|
157
|
+
for (const path of paths) {
|
|
158
|
+
const content = room.documents?.[path];
|
|
159
|
+
const held = room.facts?.[path] ?? (content === undefined ? null : factsAt(room, path, content));
|
|
160
|
+
if (held !== null)
|
|
161
|
+
facts[path] = held;
|
|
162
|
+
}
|
|
163
|
+
return facts;
|
|
164
|
+
}
|
|
104
165
|
function retain(entries) {
|
|
105
166
|
for (const room of entries) {
|
|
167
|
+
for (const [path, content] of Object.entries(room.documents ?? {}))
|
|
168
|
+
factsAt(room, path, content);
|
|
106
169
|
note(room.locator, room);
|
|
107
170
|
const versions = served.get(room.locator) ?? new Map();
|
|
108
171
|
versions.set(room.roomVersion, room);
|
|
@@ -118,8 +181,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
118
181
|
roomVersion: room.roomVersion,
|
|
119
182
|
operations: room.operations,
|
|
120
183
|
replica: room.replica,
|
|
121
|
-
|
|
184
|
+
typedSelection: room.typedSelection ?? null,
|
|
122
185
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
186
|
+
authoredPaths: room.authoredPaths ?? ['**'],
|
|
123
187
|
};
|
|
124
188
|
}
|
|
125
189
|
function page(room, after) {
|
|
@@ -135,10 +199,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
135
199
|
roomVersion: room.roomVersion,
|
|
136
200
|
...(opening ? { models: modelsOf(room) } : {}),
|
|
137
201
|
documents: named(room.documents ?? {}, taken),
|
|
202
|
+
facts: factsIn(room, taken),
|
|
138
203
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
139
204
|
...(room.fileIds === undefined
|
|
140
205
|
? {}
|
|
141
206
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
207
|
+
...(room.created === undefined
|
|
208
|
+
? {}
|
|
209
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
142
210
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
143
211
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
144
212
|
...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
|
|
@@ -162,6 +230,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
162
230
|
const previousTargets = new Set(Object.keys(from.binaryFiles ?? {}));
|
|
163
231
|
const headMoved = (path) => room.revisions?.[path] !== from.revisions?.[path] ||
|
|
164
232
|
room.fileIds?.[path] !== from.fileIds?.[path] ||
|
|
233
|
+
room.created?.[path] !== from.created?.[path] ||
|
|
165
234
|
!sameChange(room.changes?.[path], from.changes?.[path]);
|
|
166
235
|
const changed = Object.keys(current)
|
|
167
236
|
.filter((path) => current[path] !== previous[path] || headMoved(path))
|
|
@@ -182,10 +251,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
182
251
|
roomVersion: room.roomVersion,
|
|
183
252
|
...(models === undefined ? {} : { models }),
|
|
184
253
|
documents: named(current, taken),
|
|
254
|
+
facts: factsIn(room, taken),
|
|
185
255
|
revisions: named(room.revisions ?? {}, [...taken, ...targets]),
|
|
186
256
|
...(room.fileIds === undefined
|
|
187
257
|
? {}
|
|
188
258
|
: { fileIds: named(room.fileIds, [...taken, ...targets]) }),
|
|
259
|
+
...(room.created === undefined
|
|
260
|
+
? {}
|
|
261
|
+
: { created: named(room.created, [...taken, ...targets]) }),
|
|
189
262
|
changes: named(room.changes ?? {}, [...taken, ...targets]),
|
|
190
263
|
binaryFiles: named(room.binaryFiles ?? {}, targets),
|
|
191
264
|
...(opening ? foldersMoved(room, from) : {}),
|
|
@@ -220,28 +293,23 @@ export function createMemoryAdapter(options = {}) {
|
|
|
220
293
|
}
|
|
221
294
|
function pageOf(conversation, after) {
|
|
222
295
|
const messages = conversation.messages ?? [];
|
|
223
|
-
const first = typeof after === 'string' ? messages.findIndex((message) => message.
|
|
296
|
+
const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
|
|
224
297
|
const from = first === -1 ? messages.length : first;
|
|
225
298
|
const page = messages.slice(from, from + (historyPageSize ?? messages.length));
|
|
226
299
|
const last = page.at(-1);
|
|
227
300
|
return {
|
|
228
301
|
conversation: conversation.conversation,
|
|
229
302
|
messages: page,
|
|
230
|
-
...(last !== undefined && from + page.length < messages.length
|
|
231
|
-
? { next: last.position }
|
|
232
|
-
: {}),
|
|
303
|
+
...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
|
|
233
304
|
};
|
|
234
305
|
}
|
|
235
|
-
function historiesOf(
|
|
236
|
-
const asked = input?.conversations;
|
|
237
|
-
if (!Array.isArray(asked))
|
|
238
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
306
|
+
function historiesOf(request) {
|
|
239
307
|
const histories = [];
|
|
240
|
-
for (const entry of
|
|
241
|
-
const conversation =
|
|
308
|
+
for (const entry of request.conversations) {
|
|
309
|
+
const conversation = scripted.get(entry.conversation);
|
|
242
310
|
if (conversation === undefined)
|
|
243
311
|
continue;
|
|
244
|
-
const outcome = conversation.outcomes?.
|
|
312
|
+
const outcome = conversation.outcomes?.history;
|
|
245
313
|
if (outcome !== undefined)
|
|
246
314
|
return outcome;
|
|
247
315
|
histories.push(pageOf(conversation, entry.after));
|
|
@@ -252,15 +320,22 @@ export function createMemoryAdapter(options = {}) {
|
|
|
252
320
|
function conversationAction(request) {
|
|
253
321
|
const name = request.name;
|
|
254
322
|
const input = (request.input ?? {});
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
323
|
+
const operation = typeof input.operation_id === 'string' ? `${name}\u0000${input.operation_id}` : null;
|
|
324
|
+
const first = (answer) => {
|
|
325
|
+
if (operation !== null)
|
|
326
|
+
repeats.set(operation, answer);
|
|
327
|
+
return answer;
|
|
328
|
+
};
|
|
329
|
+
const repeated = operation === null ? undefined : repeats.get(operation);
|
|
330
|
+
if (name === 'conversations/create') {
|
|
331
|
+
if (repeated !== undefined)
|
|
332
|
+
return repeated;
|
|
258
333
|
issued += 1;
|
|
259
334
|
const conversation = `conversation-${issued}`;
|
|
260
335
|
scripted.set(conversation, { conversation });
|
|
261
|
-
return { kind: 'action', result: { conversation } };
|
|
336
|
+
return first({ kind: 'action', result: { conversation_id: conversation } });
|
|
262
337
|
}
|
|
263
|
-
const named = typeof input.
|
|
338
|
+
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
264
339
|
const conversation = scripted.get(named);
|
|
265
340
|
if (conversation === undefined) {
|
|
266
341
|
return {
|
|
@@ -273,36 +348,41 @@ export function createMemoryAdapter(options = {}) {
|
|
|
273
348
|
const outcome = conversation.outcomes?.[name];
|
|
274
349
|
if (outcome !== undefined)
|
|
275
350
|
return outcome;
|
|
276
|
-
if (name === '
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
if (answered !== undefined)
|
|
280
|
-
return { kind: 'action', result: { turn: answered } };
|
|
351
|
+
if (name === 'conversations/send') {
|
|
352
|
+
if (repeated !== undefined)
|
|
353
|
+
return repeated;
|
|
281
354
|
issued += 1;
|
|
282
|
-
|
|
283
|
-
unsealed.set(turn, named);
|
|
284
|
-
if (operation !== null)
|
|
285
|
-
sentTurns.set(operation, turn);
|
|
286
|
-
return { kind: 'action', result: { turn } };
|
|
287
|
-
}
|
|
288
|
-
if (name === 'conversation.cancel') {
|
|
289
|
-
const turn = typeof input.turn === 'string' ? input.turn : '';
|
|
290
|
-
if (sealed.has(turn) || !unsealed.has(turn)) {
|
|
291
|
-
return { kind: 'rejected', code: 'turn-sealed', fields: { turn }, retryable: false };
|
|
292
|
-
}
|
|
293
|
-
unsealed.delete(turn);
|
|
294
|
-
return { kind: 'action', result: { turn, cancelled: true } };
|
|
355
|
+
return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
|
|
295
356
|
}
|
|
296
|
-
if (name === '
|
|
357
|
+
if (name === 'conversations/delete')
|
|
297
358
|
scripted.delete(named);
|
|
298
|
-
return { kind: 'action', result: {
|
|
359
|
+
return { kind: 'action', result: { conversation_id: named } };
|
|
360
|
+
}
|
|
361
|
+
function decided(request) {
|
|
362
|
+
const { request: asked, message, decision, } = (request.input ?? {});
|
|
363
|
+
return {
|
|
364
|
+
kind: 'action',
|
|
365
|
+
result: {
|
|
366
|
+
request: asked,
|
|
367
|
+
...(message === undefined ? {} : { message }),
|
|
368
|
+
state: decision === 'approve' ? 'started' : 'declined',
|
|
369
|
+
},
|
|
370
|
+
};
|
|
299
371
|
}
|
|
300
372
|
function announceList() {
|
|
301
373
|
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
302
374
|
? []
|
|
303
|
-
: [{ conversation, ...listed, newest: messages.at(-1)?.
|
|
304
|
-
for (const listener of listeners)
|
|
305
|
-
listener({
|
|
375
|
+
: [{ conversation, ...listed, newest: messages.at(-1)?.change ?? null }]);
|
|
376
|
+
for (const listener of listeners) {
|
|
377
|
+
listener({
|
|
378
|
+
kind: 'list',
|
|
379
|
+
agents: structuredClone(agents),
|
|
380
|
+
entries,
|
|
381
|
+
whole: true,
|
|
382
|
+
more: false,
|
|
383
|
+
cursor: null,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
306
386
|
}
|
|
307
387
|
function discovery() {
|
|
308
388
|
return {
|
|
@@ -312,11 +392,45 @@ export function createMemoryAdapter(options = {}) {
|
|
|
312
392
|
providerLimits,
|
|
313
393
|
retention,
|
|
314
394
|
...(options.member === undefined ? {} : { member: options.member }),
|
|
395
|
+
...(options.timeZone === undefined ? {} : { timeZone: options.timeZone }),
|
|
315
396
|
};
|
|
316
397
|
}
|
|
398
|
+
function discovered() {
|
|
399
|
+
return resolveScript(scripts.discover, discovery, undefined).then((answer) => {
|
|
400
|
+
if (answer.kind === 'discovery')
|
|
401
|
+
for (const room of answer.rooms)
|
|
402
|
+
note(room.locator, room);
|
|
403
|
+
return answer;
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
function opened(notify) {
|
|
407
|
+
const opening = ++openings;
|
|
408
|
+
notify({ kind: 'opened' });
|
|
409
|
+
void discovered()
|
|
410
|
+
.catch(() => ({ kind: 'transport-uncertainty' }))
|
|
411
|
+
.then((answer) => {
|
|
412
|
+
if (opening !== openings)
|
|
413
|
+
return;
|
|
414
|
+
if (answer.kind !== 'discovery') {
|
|
415
|
+
openings += 1;
|
|
416
|
+
carried.clear();
|
|
417
|
+
const revoked = answer.kind === 'revoked-authorization';
|
|
418
|
+
notify({ kind: 'closed', revoked, lost: !revoked, authorityChanged: false });
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
declaredRooms.clear();
|
|
422
|
+
for (const room of answer.rooms)
|
|
423
|
+
declaredRooms.add(room.locator);
|
|
424
|
+
notify({ kind: 'discovered', discovery: answer });
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
function emitAll(event) {
|
|
428
|
+
for (const observer of observers)
|
|
429
|
+
observer(event);
|
|
430
|
+
}
|
|
317
431
|
return {
|
|
318
|
-
...(options.exhaustiveDiscovery === undefined ? {} : { exhaustiveDiscovery: true }),
|
|
319
432
|
...(options.roomTypes === undefined ? {} : { roomTypes: options.roomTypes }),
|
|
433
|
+
...(options.typedPaths === undefined ? {} : { typedPaths: options.typedPaths }),
|
|
320
434
|
setRooms(next) {
|
|
321
435
|
rooms = [...next];
|
|
322
436
|
retain(rooms);
|
|
@@ -324,16 +438,18 @@ export function createMemoryAdapter(options = {}) {
|
|
|
324
438
|
setConversations(next) {
|
|
325
439
|
scriptConversations(next);
|
|
326
440
|
},
|
|
441
|
+
setAgents(next) {
|
|
442
|
+
agents = structuredClone(next);
|
|
443
|
+
},
|
|
327
444
|
open() {
|
|
328
445
|
carried.clear();
|
|
329
446
|
announceList();
|
|
330
|
-
|
|
331
|
-
observer({ kind: 'opened' });
|
|
447
|
+
opened(emitAll);
|
|
332
448
|
},
|
|
333
|
-
close({ revoked = false, lost = !revoked } = {}) {
|
|
449
|
+
close({ revoked = false, lost = !revoked, authorityChanged = false } = {}) {
|
|
450
|
+
openings += 1;
|
|
334
451
|
carried.clear();
|
|
335
|
-
|
|
336
|
-
observer({ kind: 'closed', revoked, lost });
|
|
452
|
+
emitAll({ kind: 'closed', revoked, lost, authorityChanged });
|
|
337
453
|
},
|
|
338
454
|
expire(locators) {
|
|
339
455
|
expiring = [...locators];
|
|
@@ -341,18 +457,23 @@ export function createMemoryAdapter(options = {}) {
|
|
|
341
457
|
notifyRoomVersion({ locator }) {
|
|
342
458
|
carry(locator);
|
|
343
459
|
},
|
|
344
|
-
notifyAuthorityChanged(
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
460
|
+
notifyAuthorityChanged(locators) {
|
|
461
|
+
const named = new Set(locators ?? [...declaredRooms, ...rooms.map((room) => room.locator)]);
|
|
462
|
+
const listed = rooms.filter((room) => named.has(room.locator));
|
|
463
|
+
const left = [...named].filter((locator) => !listed.some((room) => room.locator === locator));
|
|
464
|
+
for (const room of listed)
|
|
465
|
+
declaredRooms.add(room.locator);
|
|
466
|
+
for (const locator of left)
|
|
467
|
+
declaredRooms.delete(locator);
|
|
468
|
+
emitAll({
|
|
469
|
+
kind: 'authority-changed',
|
|
470
|
+
rooms: listed.map(declared),
|
|
471
|
+
left,
|
|
472
|
+
...(options.member === undefined ? {} : { member: options.member }),
|
|
473
|
+
...(options.timeZone === undefined ? {} : { timeZone: options.timeZone }),
|
|
474
|
+
});
|
|
350
475
|
},
|
|
351
476
|
notifyConversation(event) {
|
|
352
|
-
if (event.kind === 'accepted-message') {
|
|
353
|
-
sealed.add(event.message.turn);
|
|
354
|
-
unsealed.delete(event.message.turn);
|
|
355
|
-
}
|
|
356
477
|
for (const listener of listeners)
|
|
357
478
|
listener(event);
|
|
358
479
|
},
|
|
@@ -366,16 +487,23 @@ export function createMemoryAdapter(options = {}) {
|
|
|
366
487
|
replicatedConversations() {
|
|
367
488
|
return replicated;
|
|
368
489
|
},
|
|
490
|
+
heldConversationCursor() {
|
|
491
|
+
return heldCursor;
|
|
492
|
+
},
|
|
369
493
|
conversations: {
|
|
370
494
|
replicate(next) {
|
|
371
495
|
replicated = [...next];
|
|
372
496
|
},
|
|
497
|
+
hold(cursor) {
|
|
498
|
+
heldCursor = cursor;
|
|
499
|
+
},
|
|
373
500
|
observe(notify) {
|
|
374
501
|
listeners.add(notify);
|
|
375
502
|
return () => {
|
|
376
503
|
listeners.delete(notify);
|
|
377
504
|
};
|
|
378
505
|
},
|
|
506
|
+
history: (request) => Promise.resolve(historiesOf(request)),
|
|
379
507
|
},
|
|
380
508
|
serviceMode: {
|
|
381
509
|
observe(notify) {
|
|
@@ -390,9 +518,10 @@ export function createMemoryAdapter(options = {}) {
|
|
|
390
518
|
const named = asked.map((room) => room.locator);
|
|
391
519
|
const unknown = asked.flatMap((room) => {
|
|
392
520
|
const current = rooms.find((entry) => entry.locator === room.locator);
|
|
521
|
+
const version = room.roomVersion;
|
|
393
522
|
return current === undefined ||
|
|
394
|
-
|
|
395
|
-
|
|
523
|
+
(version !== null &&
|
|
524
|
+
(current.roomVersion === version || served.get(room.locator)?.has(version) === true))
|
|
396
525
|
? []
|
|
397
526
|
: [room.locator];
|
|
398
527
|
});
|
|
@@ -402,23 +531,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
402
531
|
expiring = expiring.filter((locator) => !named.includes(locator));
|
|
403
532
|
queueMicrotask(() => {
|
|
404
533
|
for (const room of asked) {
|
|
405
|
-
if (expired.includes(room.locator))
|
|
534
|
+
if (expired.includes(room.locator) || room.roomVersion === null)
|
|
406
535
|
carried.delete(room.locator);
|
|
407
536
|
else {
|
|
408
537
|
carried.set(room.locator, room.roomVersion);
|
|
409
538
|
carry(room.locator);
|
|
410
539
|
}
|
|
411
540
|
}
|
|
412
|
-
|
|
413
|
-
observer({ kind: 'opening', expired });
|
|
414
|
-
});
|
|
415
|
-
},
|
|
416
|
-
reopen() {
|
|
417
|
-
queueMicrotask(() => {
|
|
418
|
-
carried.clear();
|
|
419
|
-
for (const observer of observers) {
|
|
420
|
-
observer({ kind: 'closed', revoked: false, lost: false });
|
|
421
|
-
}
|
|
541
|
+
emitAll({ kind: 'caught-up', expired });
|
|
422
542
|
});
|
|
423
543
|
},
|
|
424
544
|
observe(notify) {
|
|
@@ -427,11 +547,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
427
547
|
if (!observers.has(notify))
|
|
428
548
|
return;
|
|
429
549
|
if (options.unopened === true) {
|
|
430
|
-
notify({ kind: 'closed', revoked: false, lost: true });
|
|
550
|
+
notify({ kind: 'closed', revoked: false, lost: true, authorityChanged: false });
|
|
431
551
|
return;
|
|
432
552
|
}
|
|
433
553
|
announceList();
|
|
434
|
-
|
|
554
|
+
opened((event) => {
|
|
555
|
+
if (observers.has(notify))
|
|
556
|
+
notify(event);
|
|
557
|
+
});
|
|
435
558
|
});
|
|
436
559
|
return () => {
|
|
437
560
|
observers.delete(notify);
|
|
@@ -448,12 +571,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
448
571
|
return resolveScript(scripts.authorize, () => ({}), undefined);
|
|
449
572
|
},
|
|
450
573
|
async discover(_authorization) {
|
|
451
|
-
return
|
|
452
|
-
if (answer.kind === 'discovery')
|
|
453
|
-
for (const room of answer.rooms)
|
|
454
|
-
note(room.locator, room);
|
|
455
|
-
return answer;
|
|
456
|
-
});
|
|
574
|
+
return discovered();
|
|
457
575
|
},
|
|
458
576
|
reached,
|
|
459
577
|
follows(locator, roomVersion, next) {
|
|
@@ -537,26 +655,29 @@ export function createMemoryAdapter(options = {}) {
|
|
|
537
655
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
538
656
|
const blob = heldBlob(room, request.path);
|
|
539
657
|
return blob === undefined
|
|
540
|
-
? { kind: 'rejected', code: '
|
|
541
|
-
: { kind: 'binary', body: blob.stream(), mediaType: blob
|
|
658
|
+
? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
|
|
659
|
+
: { kind: 'binary', body: blob.stream(), mediaType: declaredType(blob) };
|
|
542
660
|
}, request);
|
|
543
661
|
},
|
|
544
662
|
async link(_authorization, request) {
|
|
545
663
|
return resolveScript(scripts.link, () => {
|
|
664
|
+
if (request.kind === 'key') {
|
|
665
|
+
const key = keyedLink(request.link)?.key;
|
|
666
|
+
const named = key === undefined ? undefined : keyed.get(key);
|
|
667
|
+
if (named === undefined)
|
|
668
|
+
return UNFOUND;
|
|
669
|
+
return linkTo(rooms.find((entry) => entry.locator === named.locator), named.path);
|
|
670
|
+
}
|
|
546
671
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
547
672
|
if (room === undefined)
|
|
548
673
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
549
|
-
|
|
550
|
-
if (blob === undefined) {
|
|
551
|
-
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
552
|
-
}
|
|
553
|
-
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
554
|
-
linked.set(blob, url);
|
|
555
|
-
return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
|
|
674
|
+
return linkTo(room, request.path);
|
|
556
675
|
}, request);
|
|
557
676
|
},
|
|
558
677
|
async attach(_authorization, request) {
|
|
559
678
|
return resolveScript(scripts.attach, () => {
|
|
679
|
+
if (request.locator === undefined)
|
|
680
|
+
return attachedKeyed(request);
|
|
560
681
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
561
682
|
if (room === undefined)
|
|
562
683
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
@@ -567,8 +688,10 @@ export function createMemoryAdapter(options = {}) {
|
|
|
567
688
|
},
|
|
568
689
|
async action(_authorization, request) {
|
|
569
690
|
return resolveScript(scripts.action, () => {
|
|
570
|
-
if (request.name.startsWith('
|
|
691
|
+
if (request.name.startsWith('conversations/'))
|
|
571
692
|
return conversationAction(request);
|
|
693
|
+
if (request.name === 'agent-functions/decide')
|
|
694
|
+
return decided(request);
|
|
572
695
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
573
696
|
}, request).then((answer) => {
|
|
574
697
|
if (answer.kind === 'action' && answer.at !== undefined)
|