@agentshouse/app-bridge 0.1.0-ccf413b4e709d → 0.1.0-cd2d3edbf9805
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 +9 -7
- package/dist/calls.d.ts +747 -0
- package/dist/calls.js +1 -0
- package/dist/index.d.ts +44 -6
- package/dist/mdmodel/blocks.d.ts +10 -0
- package/dist/mdmodel/condition.d.ts +167 -0
- package/dist/mdmodel/definition.d.ts +81 -0
- package/dist/mdmodel/divide.d.ts +2 -0
- package/dist/mdmodel/document.d.ts +15 -0
- package/dist/mdmodel/fields.d.ts +5 -0
- package/dist/mdmodel/index.d.ts +20 -0
- package/dist/mdmodel/links.d.ts +28 -0
- package/dist/mdmodel/paths.d.ts +25 -0
- package/dist/mdmodel/profile.d.ts +5 -0
- package/dist/mdmodel/project.d.ts +21 -0
- package/dist/mdmodel/references.d.ts +3 -0
- package/dist/mdmodel/types.d.ts +167 -0
- package/dist/mdmodel/validate.d.ts +31 -0
- package/dist/mdmodel/version.d.ts +1 -0
- package/dist/mdmodel/yaml.d.ts +55 -0
- package/dist/mdruntime/adapter.d.ts +517 -0
- package/dist/mdruntime/binary.d.ts +17 -0
- package/dist/mdruntime/chain.d.ts +10 -0
- package/dist/mdruntime/change-set.d.ts +27 -0
- package/dist/mdruntime/change.d.ts +118 -0
- package/dist/mdruntime/client.d.ts +90 -0
- package/dist/mdruntime/collection.d.ts +27 -0
- package/dist/mdruntime/compile.d.ts +15 -0
- package/dist/mdruntime/connection.d.ts +152 -0
- package/dist/mdruntime/conversation.d.ts +113 -0
- package/dist/mdruntime/durability.d.ts +11 -0
- package/dist/mdruntime/failure.d.ts +12 -0
- package/dist/mdruntime/fulltext.d.ts +26 -0
- package/dist/mdruntime/identity.d.ts +6 -0
- package/dist/mdruntime/media.d.ts +7 -0
- package/dist/mdruntime/messages.d.ts +27 -0
- package/dist/mdruntime/model.d.ts +62 -0
- package/dist/mdruntime/observation.d.ts +44 -0
- package/dist/mdruntime/open.d.ts +1 -0
- package/dist/mdruntime/opened.d.ts +21 -0
- package/dist/mdruntime/outcome.d.ts +84 -0
- package/dist/mdruntime/overlay.d.ts +24 -0
- package/dist/mdruntime/query.d.ts +283 -0
- package/dist/mdruntime/reach.d.ts +53 -0
- package/dist/mdruntime/readiness.d.ts +51 -0
- package/dist/mdruntime/recovery.d.ts +25 -0
- package/dist/mdruntime/replica.d.ts +67 -0
- package/dist/mdruntime/room-draft.d.ts +173 -0
- package/dist/mdruntime/save.d.ts +102 -0
- package/dist/mdruntime/search.d.ts +72 -0
- package/dist/mdruntime/seed.d.ts +15 -0
- package/dist/mdruntime/status.d.ts +27 -0
- package/dist/mdruntime/store.d.ts +153 -0
- package/dist/mdruntime/stored.d.ts +129 -0
- package/dist/mdruntime/tables.d.ts +324 -0
- package/dist/mdruntime/wire.d.ts +238 -0
- package/dist/test-host.d.ts +8 -2
- package/dist/test-host.js +47 -11
- package/docs/families.md +55 -12
- package/package.json +8 -6
package/dist/test-host.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import type { MdRuntimeClient } from '
|
|
2
|
-
import type { HouseAnalyticsChoice, HouseAppMessage, HouseExternalAnswer, HouseExternalRequest, HouseNavigationMode, HouseRefusal, HouseSourceDownload, HouseSourceTop, HouseStatus, HouseTab } from './index.js';
|
|
1
|
+
import type { MdRuntimeClient } from './mdruntime/client.js';
|
|
2
|
+
import type { HouseAnalyticsChoice, HouseAppMessage, HouseChatOptions, HouseExternalAnswer, HouseExternalRequest, HouseNavigationMode, HouseRefusal, HouseSourceDownload, HouseSourceTop, HouseStatus, HouseTab } from './index.js';
|
|
3
3
|
export interface HouseBridgeNavigation {
|
|
4
4
|
readonly mode: HouseNavigationMode;
|
|
5
5
|
readonly address: string;
|
|
6
6
|
}
|
|
7
|
+
export interface HouseBridgeChat {
|
|
8
|
+
readonly element: object;
|
|
9
|
+
readonly options: HouseChatOptions;
|
|
10
|
+
readonly mounted: boolean;
|
|
11
|
+
}
|
|
7
12
|
export interface HouseBridgeTestHost {
|
|
8
13
|
readonly navigations: readonly HouseBridgeNavigation[];
|
|
14
|
+
readonly chats: readonly HouseBridgeChat[];
|
|
9
15
|
readonly ceremonies: readonly string[];
|
|
10
16
|
readonly consents: readonly HouseAnalyticsChoice[];
|
|
11
17
|
readonly tabs: readonly HouseTab[];
|
package/dist/test-host.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const HOST_ORIGIN = 'https://house.invalid';
|
|
2
|
-
const ADDRESS_MAX_CHARS =
|
|
2
|
+
const ADDRESS_MAX_CHARS = 64 * 1024;
|
|
3
3
|
function sameOriginPath(value) {
|
|
4
4
|
if (typeof value !== 'string')
|
|
5
5
|
return null;
|
|
@@ -29,12 +29,28 @@ function navigationRefused(address) {
|
|
|
29
29
|
address,
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
|
+
function followHeld(listeners, listener, held) {
|
|
33
|
+
let following = true;
|
|
34
|
+
queueMicrotask(() => {
|
|
35
|
+
if (!following)
|
|
36
|
+
return;
|
|
37
|
+
listeners.add(listener);
|
|
38
|
+
const value = held();
|
|
39
|
+
if (value !== null)
|
|
40
|
+
listener(value);
|
|
41
|
+
});
|
|
42
|
+
return () => {
|
|
43
|
+
following = false;
|
|
44
|
+
listeners.delete(listener);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
32
47
|
export function createHouseBridgeTestHost(options = {}) {
|
|
33
48
|
const navigations = [];
|
|
34
49
|
const ceremonies = [];
|
|
35
50
|
const consents = [];
|
|
36
51
|
const tabs = [];
|
|
37
52
|
const externalCalls = [];
|
|
53
|
+
const chats = [];
|
|
38
54
|
const addressListeners = new Set();
|
|
39
55
|
const statusListeners = new Set();
|
|
40
56
|
const messageListeners = new Set();
|
|
@@ -63,7 +79,17 @@ export function createHouseBridgeTestHost(options = {}) {
|
|
|
63
79
|
});
|
|
64
80
|
}
|
|
65
81
|
function navigate(mode, asked) {
|
|
66
|
-
|
|
82
|
+
let path = asked;
|
|
83
|
+
if (/^https?:\/\//i.test(asked)) {
|
|
84
|
+
try {
|
|
85
|
+
const target = new URL(asked);
|
|
86
|
+
path = target.origin === HOST_ORIGIN ? target.pathname + target.search + target.hash : '';
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
path = '';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const target = sameOriginPath(path);
|
|
67
93
|
if (target === null)
|
|
68
94
|
return Promise.reject(navigationRefused(asked));
|
|
69
95
|
navigations.push({ mode, address: target });
|
|
@@ -73,13 +99,24 @@ export function createHouseBridgeTestHost(options = {}) {
|
|
|
73
99
|
});
|
|
74
100
|
}
|
|
75
101
|
const bridge = {
|
|
76
|
-
runtime,
|
|
102
|
+
runtime: runtime,
|
|
103
|
+
chat: {
|
|
104
|
+
mount(element, options = {}) {
|
|
105
|
+
const chat = { element, options, mounted: true };
|
|
106
|
+
chats.push(chat);
|
|
107
|
+
return Promise.resolve({
|
|
108
|
+
update(next) {
|
|
109
|
+
chat.options = next;
|
|
110
|
+
},
|
|
111
|
+
unmount() {
|
|
112
|
+
chat.mounted = false;
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
},
|
|
77
117
|
address: () => shown,
|
|
78
118
|
onAddress(listener) {
|
|
79
|
-
addressListeners
|
|
80
|
-
return () => {
|
|
81
|
-
addressListeners.delete(listener);
|
|
82
|
-
};
|
|
119
|
+
return followHeld(addressListeners, listener, () => shown);
|
|
83
120
|
},
|
|
84
121
|
push: (asked) => navigate('push', asked),
|
|
85
122
|
replace: (asked) => navigate('replace', asked),
|
|
@@ -106,10 +143,7 @@ export function createHouseBridgeTestHost(options = {}) {
|
|
|
106
143
|
readSiteScreenshot: (site) => Promise.resolve(options.siteScreenshots?.[site] ?? null),
|
|
107
144
|
status: () => seen,
|
|
108
145
|
onStatus(listener) {
|
|
109
|
-
statusListeners
|
|
110
|
-
return () => {
|
|
111
|
-
statusListeners.delete(listener);
|
|
112
|
-
};
|
|
146
|
+
return followHeld(statusListeners, listener, () => seen);
|
|
113
147
|
},
|
|
114
148
|
messages(listener) {
|
|
115
149
|
messageListeners.add(listener);
|
|
@@ -125,6 +159,7 @@ export function createHouseBridgeTestHost(options = {}) {
|
|
|
125
159
|
consents.push(choice);
|
|
126
160
|
publish({ ...published, analytics: { measures: true, choice } });
|
|
127
161
|
},
|
|
162
|
+
cooperate: () => () => { },
|
|
128
163
|
};
|
|
129
164
|
Object.defineProperty(globalThis, 'houseBridge', { value: bridge, configurable: true });
|
|
130
165
|
if (published !== null)
|
|
@@ -132,6 +167,7 @@ export function createHouseBridgeTestHost(options = {}) {
|
|
|
132
167
|
arrive(current);
|
|
133
168
|
return {
|
|
134
169
|
navigations,
|
|
170
|
+
chats,
|
|
135
171
|
ceremonies,
|
|
136
172
|
consents,
|
|
137
173
|
tabs,
|
package/docs/families.md
CHANGED
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
purpose-bound authenticated pages. The shell navigates only to a same-origin
|
|
13
13
|
absolute path, carries its current address as the return target, and the page
|
|
14
14
|
returns there when it completes. An App names an address House gave it in a
|
|
15
|
-
reading and composes
|
|
15
|
+
reading and composes one only for `/bind/<app_ref>`, where the User binds
|
|
16
|
+
its Rooms, with `?slot=<name>` to open at one slot.
|
|
16
17
|
- **Installation** - `install()` offers the page as a Home-screen app. Where the
|
|
17
18
|
browser has an install prompt ready the shell shows it and the call resolves
|
|
18
19
|
`'accepted'` or `'dismissed'` with the User's choice, spending that prompt;
|
|
@@ -39,12 +40,27 @@
|
|
|
39
40
|
whether the page measures and the visitor's stored analytics choice, and
|
|
40
41
|
`serviceMode`: `open`, `write-halted` while House refuses writes, so the
|
|
41
42
|
App can stop retrying them, or `null` while the runtime holds no House
|
|
42
|
-
connection. Every status field is camelCase.
|
|
43
|
+
connection. Every status field is camelCase. `onStatus(listener)` and
|
|
44
|
+
`onAddress(listener)` hand a listener the status and the address the bridge
|
|
45
|
+
already holds, then each change.
|
|
43
46
|
The App reports the visitor's choice with `analyticsConsent('accept')` or
|
|
44
47
|
`analyticsConsent('decline')`; the shell hands it to House's analytics loader, and
|
|
45
48
|
the choice never reaches House.
|
|
46
|
-
- **
|
|
47
|
-
|
|
49
|
+
- **Releases and builds** - an open App keeps the release it loaded: a newer
|
|
50
|
+
release, or a newer House build, takes effect at the App's next load, offline
|
|
51
|
+
too once the browser stored it. When one tab loads a newer House build, the
|
|
52
|
+
other House tabs reload into it; Room Drafts, chat drafts and unsent changes
|
|
53
|
+
survive the reload.
|
|
54
|
+
- **A runtime that ends** - when the browser ends House's runtime under an open
|
|
55
|
+
App, the App keeps running, its `runtime` client and observations included:
|
|
56
|
+
each observation goes on with the next runtime's values, and the status and
|
|
57
|
+
the address arrive again. A runtime that ended before answering has its reads
|
|
58
|
+
answered by the next one; since it may have applied any other call, an act on
|
|
59
|
+
House is answered the outcome `transport-uncertainty`, and every other call,
|
|
60
|
+
a Save or a draft write among them, fails with the retryable code
|
|
61
|
+
`transport-uncertainty`.
|
|
62
|
+
- **Site image read** - given a Published Room and the Path of one of its
|
|
63
|
+
binary entries, it answers the web copy's path and metadata, or `null` when no
|
|
48
64
|
copy exists. The original bytes never cross this bridge at a Site.
|
|
49
65
|
- **App release code** - `sourceTop(app, release)` answers the top level of
|
|
50
66
|
the latest successful release of an App the User may use: its folders, its
|
|
@@ -56,21 +72,21 @@
|
|
|
56
72
|
refusal is House's `{ error: { code, retryable } }`, `app_release_not_found` for an
|
|
57
73
|
App with no release; a read House does not answer, or one that outlived
|
|
58
74
|
the browser's signed-in User, is `null`.
|
|
59
|
-
- **External calls** - `callExternal({ url, method, headers, body,
|
|
75
|
+
- **External calls** - `callExternal({ url, method, headers, body, room_ref })`
|
|
60
76
|
has House's server send an HTTPS request to one of the release's declared
|
|
61
77
|
external origins and resolves with the service's `status`, `headers` and its
|
|
62
78
|
body as `body` text or `body_base64`, or a refusal as House's
|
|
63
79
|
`{ error: { code, retryable } }`, or `null` when House does not answer. House fills in the
|
|
64
|
-
App and its running release
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
`
|
|
80
|
+
App and its running release. A `room_ref` names a Room the signed-in User binds to the App
|
|
81
|
+
in a `write` slot, and House adds that Room's Service key for the URL's origin, which App
|
|
82
|
+
code never sees; a call naming no Room carries no key, and a Site's call names no Room.
|
|
83
|
+
`body_base64` replaces `body` for bytes.
|
|
68
84
|
- **App messages** - `messages(listener)` hands the listener each message
|
|
69
85
|
another holder of this App sends to this User's running copies, as `from`,
|
|
70
86
|
the sender's User id, and `body`, the JSON value they sent, until the
|
|
71
87
|
function it returns is called. App code sends one through the Runtime's
|
|
72
88
|
`call('message.send', { to, body })` with the recipient's User id and
|
|
73
|
-
a body of at most 32
|
|
89
|
+
a body of at most 32 kB of JSON; House fills in the App and relays it only
|
|
74
90
|
to copies running now, storing nothing. The panel sends none.
|
|
75
91
|
- **App screenshot read** - given an App reference, `readScreenshot(app)`
|
|
76
92
|
answers the image this browser captured of that App's screen the first time
|
|
@@ -82,6 +98,30 @@
|
|
|
82
98
|
after its latest release, as a JPEG `Blob`, or `null` when House holds none
|
|
83
99
|
or does not answer. A Site's own renderer reads none.
|
|
84
100
|
|
|
101
|
+
- **Chat** - `chat.mount(element, options)` places House's Chat, the one chat
|
|
102
|
+
in which the User's Agent conversations show, in `element` over the page's
|
|
103
|
+
`runtime` client, and resolves to a handle: `update(options)` replaces its
|
|
104
|
+
options and `unmount()` removes it. House serves the Chat with the page and
|
|
105
|
+
keeps it current, so the App installs and bundles nothing for it. The
|
|
106
|
+
options: `conversation` opens one, `null` for a new chat, `agent` is the
|
|
107
|
+
Agent a new chat goes to, `showChats` adds its conversation list, `width` is
|
|
108
|
+
`full`, the element, or `3/4`, `1/2` or `1/3` of the window docked at its
|
|
109
|
+
right edge, `onOpen` hears each conversation it opens as
|
|
110
|
+
`{ conversation, agent }`, and `onLink` takes a link without a scheme in
|
|
111
|
+
place of the browser. CSS custom properties named `--chat-*` on the element
|
|
112
|
+
or an ancestor set its look. It shows conversations only to a release that
|
|
113
|
+
declares them. A Site and the House panel have none: their call rejects with
|
|
114
|
+
an error named and coded `NotSupportedError`, with `retryable` false.
|
|
115
|
+
|
|
116
|
+
- **First place** - `cooperate({ placed })` tells House when the page has
|
|
117
|
+
drawn the place it opened on; the function it returns withdraws it. Register
|
|
118
|
+
it in the entry script, before the first draw. `placed()` resolves once the
|
|
119
|
+
page has drawn that place with what it shows: House keeps its
|
|
120
|
+
first-preparation surface over a page registered by its first draw until
|
|
121
|
+
then, and lifts it at the first draw of a page that registered none, so the
|
|
122
|
+
User goes from the surface to a drawn place in one change. House asks the
|
|
123
|
+
page for nothing else.
|
|
124
|
+
|
|
85
125
|
## The test host
|
|
86
126
|
|
|
87
127
|
`createHouseBridgeTestHost(options)` plays House in one page: it installs a
|
|
@@ -102,6 +142,9 @@ records in `tabs` each `setTab`, answers a release code read from the
|
|
|
102
142
|
by App reference and `readSiteScreenshot` from the `siteScreenshots` it was
|
|
103
143
|
given by Site identifier, answers every `install()` `'manual'`, as a browser
|
|
104
144
|
with no install prompt does, answers every `notifications()` `'unavailable'`,
|
|
105
|
-
as a browser without push does, settles every `setBadge`,
|
|
145
|
+
as a browser without push does, settles every `setBadge`, records in `chats`
|
|
146
|
+
each Chat `chat.mount` places, with its `element`, the `options` it was last
|
|
147
|
+
given and whether it is still `mounted`, drawing nothing, delivers each App
|
|
106
148
|
message `message({ from, body })` plays, and hands `bridge.runtime` the MD
|
|
107
|
-
Runtime client `attachRuntime(client)` gives it.
|
|
149
|
+
Runtime client `attachRuntime(client)` gives it. It takes a `cooperate` and
|
|
150
|
+
never calls `placed()`.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentshouse/app-bridge",
|
|
3
|
-
"version": "0.1.0-
|
|
4
|
-
"description": "Types of the agents.house App bridge House hands every App: navigation, the tab title and icon, ceremonies, installation, notifications and the icon badge, status, Site image reads, App release code, App and Site screenshot reads, and
|
|
3
|
+
"version": "0.1.0-cd2d3edbf9805",
|
|
4
|
+
"description": "Types of the agents.house App bridge House hands every App: navigation, the tab title and icon, ceremonies, installation, notifications and the icon badge, status, Site image reads, App release code, App and Site screenshot reads, App messages and the Chat, with an accessor and an in-page test host.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"sideEffects": false,
|
|
@@ -18,13 +18,15 @@
|
|
|
18
18
|
"default": "./dist/test-host.js"
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"@agentshouse/mdruntime": "0.1.0-c2aaa9c0e3ca4"
|
|
23
|
-
},
|
|
24
21
|
"files": [
|
|
25
22
|
"dist",
|
|
26
23
|
"docs",
|
|
27
24
|
"README.md",
|
|
28
25
|
"LICENSE"
|
|
29
|
-
]
|
|
26
|
+
],
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/agentshouse/core.git",
|
|
30
|
+
"directory": "client"
|
|
31
|
+
}
|
|
30
32
|
}
|