@agentshouse/mdruntime 0.1.0-cbe358f60d1d3 → 0.1.0-cc00e9289ddf4
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 +18 -16
- 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 +68 -72
- 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/bootstrap.d.ts +9 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +204 -86
- 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 +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +4 -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 +23 -20
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +34 -19
- package/dist/collection.d.ts +22 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +12 -2
- package/dist/compile.d.ts +7 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +216 -78
- package/dist/connection.d.ts +5 -143
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +110 -5026
- 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 +35 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +55 -0
- package/dist/conversation.d.ts +56 -41
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +981 -881
- 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 +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +150 -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 +5 -3
- 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.map +1 -1
- package/dist/file.js +2 -1
- 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 +62 -19
- package/dist/index.d.ts +30 -11
- 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 +278 -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/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 +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +10 -13
- package/dist/memory.d.ts +9 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +97 -27
- package/dist/messages.d.ts +33 -3
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +95 -22
- package/dist/model.d.ts +1 -8
- 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 +11 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +26 -2
- package/dist/overlay.d.ts +6 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +47 -21
- 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 +233 -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 +29 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +115 -0
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +450 -0
- package/dist/reach.d.ts +9 -8
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +223 -111
- package/dist/react.d.ts +14 -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 +9 -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 +10 -16
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +63 -30
- 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 +4 -6
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +48 -59
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +217 -0
- package/dist/rows.d.ts +15 -4
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +54 -55
- 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 +339 -166
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +410 -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 +33 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +309 -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 +54 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -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 +217 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +464 -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 +113 -142
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +171 -360
- package/dist/stored.d.ts +72 -34
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +316 -106
- package/dist/surface.d.ts +89 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +222 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +535 -0
- package/dist/tables.d.ts +116 -25
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +222 -51
- 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 +5 -5
- package/dist/wire.d.ts +52 -8
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +18 -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,6 +1,7 @@
|
|
|
1
|
-
import type { 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
|
-
export type { TypedPath };
|
|
4
|
+
export type { SavedFacts, TypedPath };
|
|
4
5
|
import type { Open } from './open.js';
|
|
5
6
|
import type { ChangeBatch } from './change.js';
|
|
6
7
|
export type Authorization = object;
|
|
@@ -13,22 +14,25 @@ export type TypedSelection = {
|
|
|
13
14
|
};
|
|
14
15
|
export type OperationScopes = {
|
|
15
16
|
write: readonly string[];
|
|
16
|
-
|
|
17
|
+
erase: readonly string[];
|
|
17
18
|
};
|
|
18
19
|
export type ReplicaAdmission = {
|
|
19
20
|
selection: string;
|
|
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,39 @@ 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
|
+
};
|
|
203
186
|
export type ListedAgent = {
|
|
204
|
-
|
|
187
|
+
id: string;
|
|
205
188
|
name: string;
|
|
206
|
-
|
|
189
|
+
revision: number;
|
|
190
|
+
environment: string;
|
|
191
|
+
environment_name: string;
|
|
192
|
+
environment_connected: boolean;
|
|
193
|
+
launch_directory: string;
|
|
194
|
+
cli: string;
|
|
195
|
+
model: string | null;
|
|
196
|
+
effort: string | null;
|
|
197
|
+
mode: string | null;
|
|
198
|
+
base_instructions: string;
|
|
199
|
+
in_telegram: boolean;
|
|
200
|
+
created: string;
|
|
201
|
+
retired_at: string | null;
|
|
207
202
|
};
|
|
208
203
|
export type ConversationStream = {
|
|
209
204
|
replicate(conversations: readonly string[]): void;
|
|
210
205
|
hold(cursor: string | null): void;
|
|
211
206
|
observe(notify: (event: ConversationEvent) => void): () => void;
|
|
212
|
-
agents?(): Promise<readonly ListedAgent[] | null>;
|
|
213
207
|
history?(request: ConversationHistoryRequest): Promise<ActionResult>;
|
|
214
208
|
};
|
|
215
209
|
export type ActionDeclaration = {
|
|
@@ -242,6 +236,7 @@ export type Discovery = {
|
|
|
242
236
|
};
|
|
243
237
|
export type TransportUncertainty = {
|
|
244
238
|
kind: 'transport-uncertainty';
|
|
239
|
+
failure?: unknown;
|
|
245
240
|
};
|
|
246
241
|
export type RoomNotReadable = {
|
|
247
242
|
kind: 'room-not-readable';
|
|
@@ -285,25 +280,17 @@ export type BinaryFile = {
|
|
|
285
280
|
mediaType: string;
|
|
286
281
|
sha256: string;
|
|
287
282
|
};
|
|
288
|
-
export type HeldFile = {
|
|
289
|
-
readonly path: string;
|
|
290
|
-
readonly revision: string;
|
|
291
|
-
};
|
|
292
|
-
export type HeldContent = {
|
|
293
|
-
files(after: string | null, limit: number): Promise<readonly HeldFile[]>;
|
|
294
|
-
contents(paths: readonly string[]): Promise<ReadonlyMap<string, {
|
|
295
|
-
readonly content: string;
|
|
296
|
-
readonly revision: string;
|
|
297
|
-
}>>;
|
|
298
|
-
};
|
|
299
283
|
export type BootstrapRequest = {
|
|
300
284
|
locator: string;
|
|
301
285
|
selection: string;
|
|
302
286
|
pageToken?: PageToken;
|
|
303
|
-
held?: HeldContent;
|
|
304
287
|
arriving?: (bytes: number) => void;
|
|
305
288
|
signal?: AbortSignal;
|
|
306
289
|
};
|
|
290
|
+
export type BootstrapPart = {
|
|
291
|
+
readonly id: string;
|
|
292
|
+
readonly bytes: number;
|
|
293
|
+
};
|
|
307
294
|
export type BootstrapInventory = {
|
|
308
295
|
readonly bytes: number;
|
|
309
296
|
};
|
|
@@ -315,17 +302,23 @@ export type BootstrapPage = {
|
|
|
315
302
|
roomVersion: string;
|
|
316
303
|
models?: RoomModels;
|
|
317
304
|
documents: Readonly<Record<string, string>>;
|
|
305
|
+
facts: Readonly<Record<string, SavedFacts>>;
|
|
318
306
|
revisions: Readonly<Record<string, string>>;
|
|
319
307
|
fileIds?: Readonly<Record<string, string>>;
|
|
308
|
+
created?: Readonly<Record<string, string>>;
|
|
320
309
|
changes: Readonly<Record<string, HeadChange>>;
|
|
321
310
|
binaryFiles: Readonly<Record<string, BinaryFile>>;
|
|
322
311
|
folders?: readonly string[];
|
|
323
312
|
pageToken?: PageToken;
|
|
313
|
+
parts?: readonly BootstrapPart[];
|
|
324
314
|
bytes?: number;
|
|
325
315
|
};
|
|
316
|
+
export type NotReady = {
|
|
317
|
+
kind: 'not-ready';
|
|
318
|
+
};
|
|
326
319
|
export type BootstrapResult = BootstrapPage | {
|
|
327
320
|
kind: 'beyond-horizon';
|
|
328
|
-
} | AdapterFailure;
|
|
321
|
+
} | NotReady | AdapterFailure;
|
|
329
322
|
export type RefreshRequest = {
|
|
330
323
|
locator: string;
|
|
331
324
|
selection: string;
|
|
@@ -337,8 +330,10 @@ export type RefreshPage = {
|
|
|
337
330
|
roomVersion: string;
|
|
338
331
|
models?: RoomModels;
|
|
339
332
|
documents: Readonly<Record<string, string>>;
|
|
333
|
+
facts: Readonly<Record<string, SavedFacts>>;
|
|
340
334
|
revisions: Readonly<Record<string, string>>;
|
|
341
335
|
fileIds?: Readonly<Record<string, string>>;
|
|
336
|
+
created?: Readonly<Record<string, string>>;
|
|
342
337
|
changes: Readonly<Record<string, HeadChange>>;
|
|
343
338
|
binaryFiles: Readonly<Record<string, BinaryFile>>;
|
|
344
339
|
removals: readonly string[];
|
|
@@ -376,12 +371,9 @@ export type AcceptedRoom = {
|
|
|
376
371
|
};
|
|
377
372
|
export type MutationResult = (AcceptedRoom & {
|
|
378
373
|
kind: 'accepted';
|
|
379
|
-
author?: string;
|
|
380
|
-
time?: string;
|
|
381
374
|
destination?: AcceptedRoom;
|
|
382
375
|
}) | (ProviderRefusal & {
|
|
383
376
|
kind: 'conflicted';
|
|
384
|
-
roomVersion?: string;
|
|
385
377
|
affected: Readonly<Record<string, string>>;
|
|
386
378
|
}) | (ProviderRefusal & {
|
|
387
379
|
kind: 'rejected';
|
|
@@ -468,6 +460,7 @@ export type ActionResult = {
|
|
|
468
460
|
at?: RoomVersionAt;
|
|
469
461
|
} | (ProviderRefusal & {
|
|
470
462
|
kind: 'rejected';
|
|
463
|
+
reset?: string;
|
|
471
464
|
}) | AdapterFailure;
|
|
472
465
|
export type SearchHit = {
|
|
473
466
|
room: string;
|
|
@@ -487,12 +480,12 @@ export type SearchAnswer = {
|
|
|
487
480
|
}) | AdapterFailure;
|
|
488
481
|
export type HeldRoom = {
|
|
489
482
|
locator: string;
|
|
490
|
-
roomVersion: string;
|
|
483
|
+
roomVersion: string | null;
|
|
491
484
|
};
|
|
492
485
|
export type RoomChange = {
|
|
493
486
|
kind: 'room-change';
|
|
494
487
|
locator: string;
|
|
495
|
-
from: string;
|
|
488
|
+
from: string | null;
|
|
496
489
|
roomVersion: string;
|
|
497
490
|
read(): Promise<RefreshPage>;
|
|
498
491
|
};
|
|
@@ -520,11 +513,14 @@ export type RoomStream = {
|
|
|
520
513
|
hold(rooms: readonly HeldRoom[]): void;
|
|
521
514
|
observe(notify: (event: RoomStreamEvent) => void): () => void;
|
|
522
515
|
};
|
|
516
|
+
export type PathRule = (path: string) => boolean;
|
|
523
517
|
export type Adapter = {
|
|
524
518
|
readonly localSaves?: true;
|
|
525
|
-
readonly roomTypes?:
|
|
526
|
-
readonly nameableRoomTypes?: readonly string[];
|
|
519
|
+
readonly roomTypes?: VerifiedModel;
|
|
527
520
|
readonly typedPaths?: readonly TypedPath[];
|
|
521
|
+
readonly pathRule?: PathRule;
|
|
522
|
+
readonly unkeptReads?: readonly string[];
|
|
523
|
+
readonly leadingReads?: readonly string[];
|
|
528
524
|
authorize(): Promise<Authorization>;
|
|
529
525
|
discover?(authorization: Authorization): Promise<DiscoverResult>;
|
|
530
526
|
bootstrap(authorization: Authorization, request: BootstrapRequest): Promise<BootstrapResult>;
|