@agentshouse/mdruntime 0.1.0-c37ed9e81aef7 → 0.1.0-c382b65c660e7
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 +99 -57
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +0 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +0 -5
- 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 +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +6 -18
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- 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 +26 -21
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +40 -55
- package/dist/collection.d.ts +25 -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 +7 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +215 -78
- package/dist/connection.d.ts +5 -143
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -5122
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -1
- 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 +62 -42
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +985 -882
- 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 +13 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +4 -0
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +2 -1
- 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 +19 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +66 -19
- package/dist/index.d.ts +32 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -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 +8 -6
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +110 -31
- 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 +10 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +101 -32
- package/dist/messages.d.ts +33 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +96 -25
- package/dist/model.d.ts +0 -3
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -11
- 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 +27 -12
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +184 -85
- 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 +10 -1
- package/dist/query.d.ts.map +1 -1
- 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 +9 -8
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +231 -112
- package/dist/react.d.ts +16 -2
- 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 -4
- 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 +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +6 -2
- 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 +5 -13
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +40 -24
- 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 +31 -8
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +273 -66
- 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 +2 -1
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +9 -10
- 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 +328 -226
- package/dist/saves.d.ts +34 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +437 -0
- 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 +124 -154
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +171 -379
- package/dist/stored.d.ts +56 -27
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +192 -68
- package/dist/surface.d.ts +91 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +227 -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 +102 -52
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +184 -272
- 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 +4 -10
- package/dist/wire.d.ts +62 -8
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +22 -4
- 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/job.d.ts +0 -14
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -28
- package/dist/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
package/dist/actions.js
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import { roomTarget, target } from '@agentshouse/mdmodel';
|
|
2
|
+
import { CATCHING_UP, holdsSubmission, resendConversations } from './conversation.js';
|
|
3
|
+
import { listingNow } from './listing.js';
|
|
4
|
+
import { locked, lockedRooms } from './locks.js';
|
|
5
|
+
import { scoped } from './models.js';
|
|
6
|
+
import { ABSENT_TARGET, failure, historyAnswer, LOCKED_UNREADABLE, lockedRoom, handedOutcome, UNANSWERED, undeclared, UNCERTAIN, UNREADABLE, } from './outcome.js';
|
|
7
|
+
import { refuse } from './refusal.js';
|
|
8
|
+
function operationOf(input) {
|
|
9
|
+
const operation = input?.operation_id;
|
|
10
|
+
return typeof operation === 'string' ? operation : null;
|
|
11
|
+
}
|
|
12
|
+
export async function readHistory(runtime, locator, path, query = {}) {
|
|
13
|
+
const { store, socket, presence } = runtime;
|
|
14
|
+
const { session } = socket;
|
|
15
|
+
if (socket.closed() || session.now().refusal !== null)
|
|
16
|
+
return UNCERTAIN;
|
|
17
|
+
await socket.firstDiscovery;
|
|
18
|
+
if (!session.now().roomsNamed)
|
|
19
|
+
return UNCERTAIN;
|
|
20
|
+
try {
|
|
21
|
+
await socket.authorize();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return UNCERTAIN;
|
|
25
|
+
}
|
|
26
|
+
const { closed, authorization, refusal } = session.now();
|
|
27
|
+
if (closed || authorization === undefined || refusal !== null)
|
|
28
|
+
return UNCERTAIN;
|
|
29
|
+
const since = presence.losses();
|
|
30
|
+
try {
|
|
31
|
+
const result = await socket.history(authorization, {
|
|
32
|
+
locator,
|
|
33
|
+
path,
|
|
34
|
+
...(query.revision === undefined ? {} : { revision: query.revision }),
|
|
35
|
+
...(query.pageToken === undefined ? {} : { pageToken: query.pageToken }),
|
|
36
|
+
});
|
|
37
|
+
if (presence.lostSince(locator, since))
|
|
38
|
+
return failure({ kind: 'room-not-readable', locator });
|
|
39
|
+
if (result.kind === 'scoped-refusal') {
|
|
40
|
+
const room = await store.record(result.locator);
|
|
41
|
+
if (room !== undefined)
|
|
42
|
+
await scoped(runtime, result, room.locator, room.declaration);
|
|
43
|
+
}
|
|
44
|
+
if (result.kind === 'revoked-authorization')
|
|
45
|
+
await refuse(runtime, 'revoked-authorization');
|
|
46
|
+
return historyAnswer(result);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return UNCERTAIN;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function located(runtime, room, path, destination) {
|
|
53
|
+
const crossing = roomTarget(destination);
|
|
54
|
+
const listing = await listingNow(runtime);
|
|
55
|
+
if (crossing === null) {
|
|
56
|
+
const named = target(path, destination);
|
|
57
|
+
return named === null || !listing.has(room) ? null : { room, path: named };
|
|
58
|
+
}
|
|
59
|
+
const held = [...listing.values()].find((listed) => listed.handle === crossing.handle);
|
|
60
|
+
return held === undefined ? null : { room: held.locator, path: crossing.path };
|
|
61
|
+
}
|
|
62
|
+
export async function resolveReference(runtime, room, path, destination) {
|
|
63
|
+
const { store } = runtime;
|
|
64
|
+
if (roomTarget(destination) === null && target(path, destination) === null) {
|
|
65
|
+
return ABSENT_TARGET;
|
|
66
|
+
}
|
|
67
|
+
const at = await located(runtime, room, path, destination);
|
|
68
|
+
if (at === null)
|
|
69
|
+
return UNREADABLE;
|
|
70
|
+
if (await locked(runtime, at.room))
|
|
71
|
+
return LOCKED_UNREADABLE;
|
|
72
|
+
const held = await store.record(at.room);
|
|
73
|
+
if (held !== undefined &&
|
|
74
|
+
(await (await store.open()).entries(held.key, 'visible', [at.path])).length > 0) {
|
|
75
|
+
return { kind: 'document', ...at };
|
|
76
|
+
}
|
|
77
|
+
const history = await readHistory(runtime, at.room, at.path);
|
|
78
|
+
if (history.kind === 'no-history' || history.kind === 'revision')
|
|
79
|
+
return ABSENT_TARGET;
|
|
80
|
+
if (history.kind !== 'history')
|
|
81
|
+
return history;
|
|
82
|
+
const [last] = history.revisions;
|
|
83
|
+
if (last === undefined)
|
|
84
|
+
return ABSENT_TARGET;
|
|
85
|
+
return history.deleted === true
|
|
86
|
+
? { kind: 'deleted', ...at, revision: last }
|
|
87
|
+
: { kind: 'document', ...at };
|
|
88
|
+
}
|
|
89
|
+
async function declaredAction({ store }, name) {
|
|
90
|
+
for (const capability of (await (await store.open()).facts()).capabilities) {
|
|
91
|
+
for (const action of capability.actions ?? []) {
|
|
92
|
+
if (action.name === name)
|
|
93
|
+
return action;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
async function calledRooms(runtime, name, input) {
|
|
99
|
+
const member = (await declaredAction(runtime, name))?.room;
|
|
100
|
+
if (member === undefined || input === null || typeof input !== 'object')
|
|
101
|
+
return [];
|
|
102
|
+
const named = input[member];
|
|
103
|
+
return (Array.isArray(named) ? named : [named]).filter((room) => typeof room === 'string');
|
|
104
|
+
}
|
|
105
|
+
export async function invokeAction(runtime, name, input, { dispatching, attempt } = {}) {
|
|
106
|
+
const { store, socket, retries } = runtime;
|
|
107
|
+
const { session } = socket;
|
|
108
|
+
await socket.ready;
|
|
109
|
+
if (socket.closed() || session.now().refusal !== null) {
|
|
110
|
+
return handedOutcome(retries, attempt, UNANSWERED);
|
|
111
|
+
}
|
|
112
|
+
if ((await declaredAction(runtime, name)) === undefined)
|
|
113
|
+
return undeclared(name);
|
|
114
|
+
try {
|
|
115
|
+
await socket.authorize();
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return handedOutcome(retries, attempt, UNANSWERED);
|
|
119
|
+
}
|
|
120
|
+
const { closed, authorization, refusal } = session.now();
|
|
121
|
+
if (closed || authorization === undefined || refusal !== null) {
|
|
122
|
+
return handedOutcome(retries, attempt, UNANSWERED);
|
|
123
|
+
}
|
|
124
|
+
await dispatching?.();
|
|
125
|
+
try {
|
|
126
|
+
const result = await socket.action(authorization, { name, input });
|
|
127
|
+
if (result.kind === 'scoped-refusal') {
|
|
128
|
+
const room = await store.record(result.locator);
|
|
129
|
+
if (room !== undefined)
|
|
130
|
+
await scoped(runtime, result, room.locator, room.declaration);
|
|
131
|
+
}
|
|
132
|
+
if (result.kind === 'revoked-authorization')
|
|
133
|
+
await refuse(runtime, 'revoked-authorization');
|
|
134
|
+
return handedOutcome(retries, attempt, result);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return handedOutcome(retries, attempt, { kind: 'transport-uncertainty', failure: error });
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export async function readConversationHistory(runtime, request) {
|
|
141
|
+
const { socket, retries } = runtime;
|
|
142
|
+
const caught = { step: 'conversations', instance: CATCHING_UP };
|
|
143
|
+
await socket.ready;
|
|
144
|
+
const stream = socket.conversations();
|
|
145
|
+
if (socket.closed() || socket.session.now().refusal !== null || stream?.history === undefined) {
|
|
146
|
+
return handedOutcome(retries, caught, UNANSWERED);
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const result = await stream.history(request);
|
|
150
|
+
if (result.kind === 'revoked-authorization')
|
|
151
|
+
await refuse(runtime, 'revoked-authorization');
|
|
152
|
+
return handedOutcome(retries, caught, result);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return handedOutcome(retries, caught, { kind: 'transport-uncertainty', failure: error });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function unsettled(result) {
|
|
159
|
+
if (result.kind === 'action')
|
|
160
|
+
return false;
|
|
161
|
+
return result.retryable && (result.kind !== 'rejected' || result.reset === undefined);
|
|
162
|
+
}
|
|
163
|
+
function numberedCall(runtime, name, input, operation, dispatching) {
|
|
164
|
+
return invokeAction(runtime, name, input, {
|
|
165
|
+
dispatching,
|
|
166
|
+
attempt: { step: 'sending', instance: `action ${operation}` },
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
function keptSender(runtime, name, input, operation, resent = false) {
|
|
170
|
+
const { store, socket } = runtime;
|
|
171
|
+
const { lanes } = socket;
|
|
172
|
+
const dispatching = async () => (await store.open()).keepCall({ operation, name, input });
|
|
173
|
+
let waiting = [];
|
|
174
|
+
let last = UNCERTAIN;
|
|
175
|
+
let lost = resent;
|
|
176
|
+
const tell = (result) => {
|
|
177
|
+
last = result;
|
|
178
|
+
const told = waiting;
|
|
179
|
+
waiting = [];
|
|
180
|
+
for (const answer of told)
|
|
181
|
+
answer(result);
|
|
182
|
+
};
|
|
183
|
+
const sender = {
|
|
184
|
+
next: () => new Promise((answer) => waiting.push(answer)),
|
|
185
|
+
async send() {
|
|
186
|
+
let result;
|
|
187
|
+
try {
|
|
188
|
+
result = await numberedCall(runtime, name, input, operation, dispatching);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
tell(last);
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
if (unsettled(result))
|
|
195
|
+
lost = true;
|
|
196
|
+
else {
|
|
197
|
+
await (await store.open()).dropCall(operation);
|
|
198
|
+
lanes.settle(operation, lost);
|
|
199
|
+
}
|
|
200
|
+
tell(result);
|
|
201
|
+
return result;
|
|
202
|
+
},
|
|
203
|
+
release() {
|
|
204
|
+
lanes.sent(operation, sender);
|
|
205
|
+
tell(last);
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
lanes.sending(operation, sender);
|
|
209
|
+
return sender;
|
|
210
|
+
}
|
|
211
|
+
async function recoveredAction(runtime, name, input, attempt) {
|
|
212
|
+
const { socket, recovery } = runtime;
|
|
213
|
+
const operation = operationOf(input);
|
|
214
|
+
if (operation === null)
|
|
215
|
+
return invokeAction(runtime, name, input, { attempt });
|
|
216
|
+
const held = socket.lanes.sender(operation);
|
|
217
|
+
if (held !== undefined)
|
|
218
|
+
return held.next();
|
|
219
|
+
const sender = keptSender(runtime, name, input, operation);
|
|
220
|
+
let first;
|
|
221
|
+
try {
|
|
222
|
+
first = await sender.send();
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
sender.release();
|
|
226
|
+
throw error;
|
|
227
|
+
}
|
|
228
|
+
if (!unsettled(first)) {
|
|
229
|
+
sender.release();
|
|
230
|
+
return first;
|
|
231
|
+
}
|
|
232
|
+
void recovery
|
|
233
|
+
.attempt(`action ${operation}`, async () => {
|
|
234
|
+
if (socket.closed() || socket.session.now().refusal !== null)
|
|
235
|
+
return 'done';
|
|
236
|
+
if (!socket.isOpen())
|
|
237
|
+
return 'again';
|
|
238
|
+
return unsettled(await sender.send()) ? 'again' : 'done';
|
|
239
|
+
}, { again: true })
|
|
240
|
+
.finally(() => sender.release());
|
|
241
|
+
return first;
|
|
242
|
+
}
|
|
243
|
+
export async function called(runtime, name, input, attempt) {
|
|
244
|
+
await runtime.socket.ready;
|
|
245
|
+
const lockedNow = await lockedRooms(runtime);
|
|
246
|
+
const room = (await calledRooms(runtime, name, input)).find((one) => lockedNow.includes(one));
|
|
247
|
+
return room === undefined ? recoveredAction(runtime, name, input, attempt) : lockedRoom(room);
|
|
248
|
+
}
|
|
249
|
+
export async function answeredCall(runtime, operation) {
|
|
250
|
+
const { store, socket } = runtime;
|
|
251
|
+
const { lanes } = socket;
|
|
252
|
+
const held = () => lanes.sender(operation) !== undefined || lanes.unclaimed(operation);
|
|
253
|
+
if (!held()) {
|
|
254
|
+
const calls = await (await store.open()).calls();
|
|
255
|
+
const kept = calls.some((one) => one.operation === operation) ||
|
|
256
|
+
(await holdsSubmission(runtime.conversations, operation));
|
|
257
|
+
if (!held() && !kept)
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
await lanes.settled(operation);
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
export async function resendCalls(runtime, signal) {
|
|
264
|
+
const { store, socket } = runtime;
|
|
265
|
+
if (!socket.isOpen() || socket.closed() || socket.stopping())
|
|
266
|
+
return 'done';
|
|
267
|
+
const local = await store.open();
|
|
268
|
+
for (const held of await local.calls()) {
|
|
269
|
+
if (socket.lanes.sender(held.operation) !== undefined)
|
|
270
|
+
continue;
|
|
271
|
+
if (socket.closed() || signal.aborted)
|
|
272
|
+
return 'done';
|
|
273
|
+
const sender = keptSender(runtime, held.name, held.input, held.operation, true);
|
|
274
|
+
try {
|
|
275
|
+
if (unsettled(await sender.send()))
|
|
276
|
+
return 'again';
|
|
277
|
+
}
|
|
278
|
+
finally {
|
|
279
|
+
sender.release();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return 'done';
|
|
283
|
+
}
|
|
284
|
+
async function resendPass({ socket, conversations }, signal) {
|
|
285
|
+
if (!socket.continuing() || !socket.isOpen() || socket.stopping())
|
|
286
|
+
return 'done';
|
|
287
|
+
const reading = { complete: true, reachable: true };
|
|
288
|
+
try {
|
|
289
|
+
await resendConversations(conversations, reading);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
reading.reachable = false;
|
|
293
|
+
}
|
|
294
|
+
if (signal.aborted)
|
|
295
|
+
return 'done';
|
|
296
|
+
return reading.reachable && reading.complete ? 'done' : 'again';
|
|
297
|
+
}
|
|
298
|
+
export function resendLater(runtime) {
|
|
299
|
+
if (!runtime.socket.isOpen())
|
|
300
|
+
return;
|
|
301
|
+
void runtime.recovery.attempt('resend', (signal) => resendPass(runtime, signal), { again: true });
|
|
302
|
+
}
|
package/dist/adapter.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { SavedFacts, TypedPath } from '@agentshouse/mdmodel';
|
|
1
|
+
import type { SavedFacts, TypedPath, VerifiedModel } from '@agentshouse/mdmodel';
|
|
2
|
+
import type { Operation, SessionState } from '@agentshouse/session-content';
|
|
2
3
|
import type { ModelResult } from './model.js';
|
|
3
4
|
export type { SavedFacts, TypedPath };
|
|
4
5
|
import type { Open } from './open.js';
|
|
@@ -20,15 +21,18 @@ export type ReplicaAdmission = {
|
|
|
20
21
|
admission: Open<'admitted' | 'unavailable'>;
|
|
21
22
|
offline: Open<'locked' | 'open'>;
|
|
22
23
|
};
|
|
23
|
-
export type
|
|
24
|
-
name: string;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
export type RoomDeclaration = {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
readonly handle: string;
|
|
27
|
+
readonly operations: OperationScopes;
|
|
28
|
+
readonly replica: ReplicaAdmission;
|
|
29
|
+
readonly typedSelection: TypedSelection | null;
|
|
30
|
+
readonly providerOwnedPaths: readonly string[];
|
|
31
|
+
readonly authoredPaths: readonly string[];
|
|
32
|
+
};
|
|
33
|
+
export type DiscoveredRoom = RoomDeclaration & {
|
|
34
|
+
readonly locator: string;
|
|
35
|
+
readonly roomVersion: string;
|
|
32
36
|
};
|
|
33
37
|
export type Capability = {
|
|
34
38
|
name: string;
|
|
@@ -38,8 +42,6 @@ export type Capability = {
|
|
|
38
42
|
export type ListedConversation = {
|
|
39
43
|
conversation: string;
|
|
40
44
|
agent: string;
|
|
41
|
-
agentName: string;
|
|
42
|
-
agentRetired: boolean;
|
|
43
45
|
name: string;
|
|
44
46
|
created: string;
|
|
45
47
|
finished: string | null;
|
|
@@ -47,8 +49,9 @@ export type ListedConversation = {
|
|
|
47
49
|
waiting: boolean;
|
|
48
50
|
newest: string | null;
|
|
49
51
|
processEnded: string | null;
|
|
52
|
+
subject: string | null;
|
|
50
53
|
};
|
|
51
|
-
export type ConversationAction = 'conversations/create' | 'conversations/send' | 'conversations/interaction/answer' | 'conversations/interrupt' | 'conversations/kill' | 'conversations/delete';
|
|
54
|
+
export type ConversationAction = 'conversations/create' | 'conversations/send' | 'conversations/interaction/answer' | 'conversations/interrupt' | 'conversations/kill' | 'conversations/delete' | 'conversations/take-out' | 'conversations/rename' | 'conversations/option/set' | 'conversations/retry' | 'agent-functions/decide';
|
|
52
55
|
export type ConversationMessage = {
|
|
53
56
|
identity: string;
|
|
54
57
|
turn: string;
|
|
@@ -57,6 +60,7 @@ export type ConversationMessage = {
|
|
|
57
60
|
};
|
|
58
61
|
export type AcceptedMessage = ConversationMessage & {
|
|
59
62
|
position: string;
|
|
63
|
+
change: string;
|
|
60
64
|
};
|
|
61
65
|
export type ConversationHistoryRequest = {
|
|
62
66
|
conversations: readonly {
|
|
@@ -72,37 +76,10 @@ export type ConversationHistoryPage = {
|
|
|
72
76
|
export type ConversationHistories = {
|
|
73
77
|
histories: readonly ConversationHistoryPage[];
|
|
74
78
|
};
|
|
75
|
-
export type TurnContext = {
|
|
76
|
-
used: number;
|
|
77
|
-
window: number;
|
|
78
|
-
};
|
|
79
79
|
export type TurnOperation = {
|
|
80
80
|
op: 'begin';
|
|
81
81
|
at: string;
|
|
82
|
-
} |
|
|
83
|
-
op: 'start';
|
|
84
|
-
index: number;
|
|
85
|
-
part: unknown;
|
|
86
|
-
} | {
|
|
87
|
-
op: 'append';
|
|
88
|
-
index: number;
|
|
89
|
-
text: string;
|
|
90
|
-
} | {
|
|
91
|
-
op: 'status';
|
|
92
|
-
index: number;
|
|
93
|
-
status: string;
|
|
94
|
-
result: unknown;
|
|
95
|
-
} | {
|
|
96
|
-
op: 'count';
|
|
97
|
-
index: number;
|
|
98
|
-
count: number;
|
|
99
|
-
} | {
|
|
100
|
-
op: 'plan';
|
|
101
|
-
index: number;
|
|
102
|
-
entries: readonly unknown[];
|
|
103
|
-
} | ({
|
|
104
|
-
op: 'context';
|
|
105
|
-
} & TurnContext);
|
|
82
|
+
} | Operation;
|
|
106
83
|
export type ProcessCommand = {
|
|
107
84
|
[field: string]: unknown;
|
|
108
85
|
name: string;
|
|
@@ -139,10 +116,6 @@ export type SessionOption = (SessionOptionNaming & {
|
|
|
139
116
|
type: 'boolean';
|
|
140
117
|
currentValue: boolean;
|
|
141
118
|
});
|
|
142
|
-
export type RunningSubagent = {
|
|
143
|
-
description: string;
|
|
144
|
-
activity: string | null;
|
|
145
|
-
};
|
|
146
119
|
export type ConversationEvent = {
|
|
147
120
|
kind: 'turn';
|
|
148
121
|
conversation: string;
|
|
@@ -169,9 +142,9 @@ export type ConversationEvent = {
|
|
|
169
142
|
conversation: string;
|
|
170
143
|
step: string | null;
|
|
171
144
|
} | {
|
|
172
|
-
kind: '
|
|
145
|
+
kind: 'state';
|
|
173
146
|
conversation: string;
|
|
174
|
-
|
|
147
|
+
state: SessionState | null;
|
|
175
148
|
} | {
|
|
176
149
|
kind: 'link';
|
|
177
150
|
conversation: string;
|
|
@@ -179,6 +152,7 @@ export type ConversationEvent = {
|
|
|
179
152
|
} | {
|
|
180
153
|
kind: 'deliveries';
|
|
181
154
|
conversation: string;
|
|
155
|
+
waiting: readonly string[];
|
|
182
156
|
unknown: readonly string[];
|
|
183
157
|
} | {
|
|
184
158
|
kind: 'accepted-message';
|
|
@@ -189,6 +163,7 @@ export type ConversationEvent = {
|
|
|
189
163
|
conversation: string;
|
|
190
164
|
} | {
|
|
191
165
|
kind: 'list';
|
|
166
|
+
agents: readonly ListedAgent[];
|
|
192
167
|
entries: readonly ListedConversation[];
|
|
193
168
|
whole: boolean;
|
|
194
169
|
more: boolean;
|
|
@@ -196,20 +171,68 @@ export type ConversationEvent = {
|
|
|
196
171
|
} | {
|
|
197
172
|
kind: 'listed';
|
|
198
173
|
entry: ListedConversation;
|
|
174
|
+
} | {
|
|
175
|
+
kind: 'agent';
|
|
176
|
+
agent: ListedAgent;
|
|
199
177
|
} | {
|
|
200
178
|
kind: 'unlisted';
|
|
201
179
|
conversation: string;
|
|
202
180
|
};
|
|
181
|
+
export type AgentEnvironment = {
|
|
182
|
+
identity: string;
|
|
183
|
+
name: string;
|
|
184
|
+
state: 'online' | 'offline';
|
|
185
|
+
};
|
|
186
|
+
export type ListedOwner = {
|
|
187
|
+
readonly user: string;
|
|
188
|
+
readonly name: string;
|
|
189
|
+
};
|
|
190
|
+
export type ListedSpaceRef = {
|
|
191
|
+
readonly space_ref: string;
|
|
192
|
+
readonly name: string;
|
|
193
|
+
};
|
|
194
|
+
export type RoomListEntry = {
|
|
195
|
+
readonly room_ref: string;
|
|
196
|
+
readonly room_handle: string;
|
|
197
|
+
readonly name: string;
|
|
198
|
+
readonly level: 'search' | 'open' | 'keep';
|
|
199
|
+
readonly access: 'owner' | 'manage' | 'write' | 'read' | 'public';
|
|
200
|
+
readonly owner: ListedOwner;
|
|
201
|
+
readonly created: string;
|
|
202
|
+
readonly archived?: string;
|
|
203
|
+
readonly exportable?: true;
|
|
204
|
+
readonly space?: ListedSpaceRef;
|
|
205
|
+
};
|
|
206
|
+
export type SpaceListEntry = ListedSpaceRef & {
|
|
207
|
+
readonly owner: ListedOwner;
|
|
208
|
+
readonly created: string;
|
|
209
|
+
readonly manages?: true;
|
|
210
|
+
};
|
|
211
|
+
export type RoomList = {
|
|
212
|
+
readonly rooms: readonly RoomListEntry[];
|
|
213
|
+
readonly spaces: readonly SpaceListEntry[];
|
|
214
|
+
};
|
|
203
215
|
export type ListedAgent = {
|
|
204
|
-
|
|
216
|
+
id: string;
|
|
205
217
|
name: string;
|
|
206
|
-
|
|
218
|
+
revision: number;
|
|
219
|
+
environment: string;
|
|
220
|
+
environment_name: string;
|
|
221
|
+
environment_connected: boolean;
|
|
222
|
+
launch_directory: string;
|
|
223
|
+
cli: string;
|
|
224
|
+
model: string | null;
|
|
225
|
+
effort: string | null;
|
|
226
|
+
mode: string | null;
|
|
227
|
+
base_instructions: string;
|
|
228
|
+
in_telegram: boolean;
|
|
229
|
+
created: string;
|
|
230
|
+
retired_at: string | null;
|
|
207
231
|
};
|
|
208
232
|
export type ConversationStream = {
|
|
209
233
|
replicate(conversations: readonly string[]): void;
|
|
210
234
|
hold(cursor: string | null): void;
|
|
211
235
|
observe(notify: (event: ConversationEvent) => void): () => void;
|
|
212
|
-
agents?(): Promise<readonly ListedAgent[] | null>;
|
|
213
236
|
history?(request: ConversationHistoryRequest): Promise<ActionResult>;
|
|
214
237
|
};
|
|
215
238
|
export type ActionDeclaration = {
|
|
@@ -239,9 +262,12 @@ export type Discovery = {
|
|
|
239
262
|
providerLimits: readonly ProviderLimit[];
|
|
240
263
|
retention: Retention;
|
|
241
264
|
member?: Member;
|
|
265
|
+
timeZone?: string | null;
|
|
266
|
+
roomList?: RoomList;
|
|
242
267
|
};
|
|
243
268
|
export type TransportUncertainty = {
|
|
244
269
|
kind: 'transport-uncertainty';
|
|
270
|
+
failure?: unknown;
|
|
245
271
|
};
|
|
246
272
|
export type RoomNotReadable = {
|
|
247
273
|
kind: 'room-not-readable';
|
|
@@ -310,6 +336,7 @@ export type BootstrapPage = {
|
|
|
310
336
|
facts: Readonly<Record<string, SavedFacts>>;
|
|
311
337
|
revisions: Readonly<Record<string, string>>;
|
|
312
338
|
fileIds?: Readonly<Record<string, string>>;
|
|
339
|
+
created?: Readonly<Record<string, string>>;
|
|
313
340
|
changes: Readonly<Record<string, HeadChange>>;
|
|
314
341
|
binaryFiles: Readonly<Record<string, BinaryFile>>;
|
|
315
342
|
folders?: readonly string[];
|
|
@@ -337,6 +364,7 @@ export type RefreshPage = {
|
|
|
337
364
|
facts: Readonly<Record<string, SavedFacts>>;
|
|
338
365
|
revisions: Readonly<Record<string, string>>;
|
|
339
366
|
fileIds?: Readonly<Record<string, string>>;
|
|
367
|
+
created?: Readonly<Record<string, string>>;
|
|
340
368
|
changes: Readonly<Record<string, HeadChange>>;
|
|
341
369
|
binaryFiles: Readonly<Record<string, BinaryFile>>;
|
|
342
370
|
removals: readonly string[];
|
|
@@ -374,12 +402,9 @@ export type AcceptedRoom = {
|
|
|
374
402
|
};
|
|
375
403
|
export type MutationResult = (AcceptedRoom & {
|
|
376
404
|
kind: 'accepted';
|
|
377
|
-
author?: string;
|
|
378
|
-
time?: string;
|
|
379
405
|
destination?: AcceptedRoom;
|
|
380
406
|
}) | (ProviderRefusal & {
|
|
381
407
|
kind: 'conflicted';
|
|
382
|
-
roomVersion?: string;
|
|
383
408
|
affected: Readonly<Record<string, string>>;
|
|
384
409
|
}) | (ProviderRefusal & {
|
|
385
410
|
kind: 'rejected';
|
|
@@ -421,6 +446,10 @@ export type BinaryRequest = {
|
|
|
421
446
|
path: string;
|
|
422
447
|
revision: string;
|
|
423
448
|
};
|
|
449
|
+
export type KeyedRequest = {
|
|
450
|
+
kind: 'key';
|
|
451
|
+
link: string;
|
|
452
|
+
};
|
|
424
453
|
export type BinaryResult = {
|
|
425
454
|
kind: 'binary';
|
|
426
455
|
body: ReadableStream<Uint8Array>;
|
|
@@ -438,7 +467,7 @@ export type BinaryLinkResult = {
|
|
|
438
467
|
kind: 'rejected';
|
|
439
468
|
}) | AdapterFailure;
|
|
440
469
|
export type AttachRequest = {
|
|
441
|
-
locator
|
|
470
|
+
locator?: string;
|
|
442
471
|
name: string;
|
|
443
472
|
mediaType: string;
|
|
444
473
|
byteLength: number;
|
|
@@ -449,6 +478,9 @@ export type AttachResult = {
|
|
|
449
478
|
kind: 'attached';
|
|
450
479
|
path: string;
|
|
451
480
|
revision: string;
|
|
481
|
+
} | {
|
|
482
|
+
kind: 'linked';
|
|
483
|
+
link: string;
|
|
452
484
|
} | (ProviderRefusal & {
|
|
453
485
|
kind: 'rejected';
|
|
454
486
|
}) | AdapterFailure;
|
|
@@ -466,6 +498,7 @@ export type ActionResult = {
|
|
|
466
498
|
at?: RoomVersionAt;
|
|
467
499
|
} | (ProviderRefusal & {
|
|
468
500
|
kind: 'rejected';
|
|
501
|
+
reset?: string;
|
|
469
502
|
}) | AdapterFailure;
|
|
470
503
|
export type SearchHit = {
|
|
471
504
|
room: string;
|
|
@@ -499,6 +532,10 @@ export type AuthorityChange = {
|
|
|
499
532
|
rooms: readonly DiscoveredRoom[];
|
|
500
533
|
left: readonly string[];
|
|
501
534
|
member?: Member;
|
|
535
|
+
timeZone?: string | null;
|
|
536
|
+
roomList?: RoomList & {
|
|
537
|
+
readonly left: readonly string[];
|
|
538
|
+
};
|
|
502
539
|
};
|
|
503
540
|
export type RoomStreamEvent = {
|
|
504
541
|
kind: 'opened';
|
|
@@ -513,16 +550,21 @@ export type RoomStreamEvent = {
|
|
|
513
550
|
} | {
|
|
514
551
|
kind: 'caught-up';
|
|
515
552
|
expired: readonly string[];
|
|
553
|
+
} | {
|
|
554
|
+
kind: 'reported';
|
|
516
555
|
} | AuthorityChange | RoomChange;
|
|
517
556
|
export type RoomStream = {
|
|
518
557
|
hold(rooms: readonly HeldRoom[]): void;
|
|
519
558
|
observe(notify: (event: RoomStreamEvent) => void): () => void;
|
|
520
559
|
};
|
|
560
|
+
export type PathRule = (path: string) => boolean;
|
|
521
561
|
export type Adapter = {
|
|
522
562
|
readonly localSaves?: true;
|
|
523
|
-
readonly roomTypes?:
|
|
524
|
-
readonly nameableRoomTypes?: readonly string[];
|
|
563
|
+
readonly roomTypes?: VerifiedModel;
|
|
525
564
|
readonly typedPaths?: readonly TypedPath[];
|
|
565
|
+
readonly pathRule?: PathRule;
|
|
566
|
+
readonly unkeptReads?: readonly string[];
|
|
567
|
+
readonly leadingReads?: readonly string[];
|
|
526
568
|
authorize(): Promise<Authorization>;
|
|
527
569
|
discover?(authorization: Authorization): Promise<DiscoverResult>;
|
|
528
570
|
bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
|
|
@@ -530,7 +572,7 @@ export type Adapter = {
|
|
|
530
572
|
mutate(authorization: Authorization, request: MutationRequest, keep: (upload: unknown) => Promise<void>): Promise<MutationResult>;
|
|
531
573
|
history(authorization: Authorization, request: HistoryRequest): Promise<HistoryResult>;
|
|
532
574
|
binary(authorization: Authorization, request: BinaryRequest): Promise<BinaryResult>;
|
|
533
|
-
link(authorization: Authorization, request: BinaryRequest): Promise<BinaryLinkResult>;
|
|
575
|
+
link(authorization: Authorization, request: BinaryRequest | KeyedRequest): Promise<BinaryLinkResult>;
|
|
534
576
|
attach(authorization: Authorization, request: AttachRequest): Promise<AttachResult>;
|
|
535
577
|
action(authorization: Authorization, request: ActionRequest): Promise<ActionResult>;
|
|
536
578
|
search?(authorization: Authorization, request: SearchAsk): Promise<SearchAnswer>;
|