@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.
Files changed (60) hide show
  1. package/README.md +9 -7
  2. package/dist/calls.d.ts +747 -0
  3. package/dist/calls.js +1 -0
  4. package/dist/index.d.ts +44 -6
  5. package/dist/mdmodel/blocks.d.ts +10 -0
  6. package/dist/mdmodel/condition.d.ts +167 -0
  7. package/dist/mdmodel/definition.d.ts +81 -0
  8. package/dist/mdmodel/divide.d.ts +2 -0
  9. package/dist/mdmodel/document.d.ts +15 -0
  10. package/dist/mdmodel/fields.d.ts +5 -0
  11. package/dist/mdmodel/index.d.ts +20 -0
  12. package/dist/mdmodel/links.d.ts +28 -0
  13. package/dist/mdmodel/paths.d.ts +25 -0
  14. package/dist/mdmodel/profile.d.ts +5 -0
  15. package/dist/mdmodel/project.d.ts +21 -0
  16. package/dist/mdmodel/references.d.ts +3 -0
  17. package/dist/mdmodel/types.d.ts +167 -0
  18. package/dist/mdmodel/validate.d.ts +31 -0
  19. package/dist/mdmodel/version.d.ts +1 -0
  20. package/dist/mdmodel/yaml.d.ts +55 -0
  21. package/dist/mdruntime/adapter.d.ts +517 -0
  22. package/dist/mdruntime/binary.d.ts +17 -0
  23. package/dist/mdruntime/chain.d.ts +10 -0
  24. package/dist/mdruntime/change-set.d.ts +27 -0
  25. package/dist/mdruntime/change.d.ts +118 -0
  26. package/dist/mdruntime/client.d.ts +90 -0
  27. package/dist/mdruntime/collection.d.ts +27 -0
  28. package/dist/mdruntime/compile.d.ts +15 -0
  29. package/dist/mdruntime/connection.d.ts +152 -0
  30. package/dist/mdruntime/conversation.d.ts +113 -0
  31. package/dist/mdruntime/durability.d.ts +11 -0
  32. package/dist/mdruntime/failure.d.ts +12 -0
  33. package/dist/mdruntime/fulltext.d.ts +26 -0
  34. package/dist/mdruntime/identity.d.ts +6 -0
  35. package/dist/mdruntime/media.d.ts +7 -0
  36. package/dist/mdruntime/messages.d.ts +27 -0
  37. package/dist/mdruntime/model.d.ts +62 -0
  38. package/dist/mdruntime/observation.d.ts +44 -0
  39. package/dist/mdruntime/open.d.ts +1 -0
  40. package/dist/mdruntime/opened.d.ts +21 -0
  41. package/dist/mdruntime/outcome.d.ts +84 -0
  42. package/dist/mdruntime/overlay.d.ts +24 -0
  43. package/dist/mdruntime/query.d.ts +283 -0
  44. package/dist/mdruntime/reach.d.ts +53 -0
  45. package/dist/mdruntime/readiness.d.ts +51 -0
  46. package/dist/mdruntime/recovery.d.ts +25 -0
  47. package/dist/mdruntime/replica.d.ts +67 -0
  48. package/dist/mdruntime/room-draft.d.ts +173 -0
  49. package/dist/mdruntime/save.d.ts +102 -0
  50. package/dist/mdruntime/search.d.ts +72 -0
  51. package/dist/mdruntime/seed.d.ts +15 -0
  52. package/dist/mdruntime/status.d.ts +27 -0
  53. package/dist/mdruntime/store.d.ts +153 -0
  54. package/dist/mdruntime/stored.d.ts +129 -0
  55. package/dist/mdruntime/tables.d.ts +324 -0
  56. package/dist/mdruntime/wire.d.ts +238 -0
  57. package/dist/test-host.d.ts +8 -2
  58. package/dist/test-host.js +47 -11
  59. package/docs/families.md +55 -12
  60. package/package.json +8 -6
@@ -1,11 +1,17 @@
1
- import type { MdRuntimeClient } from '@agentshouse/mdruntime/client';
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 = 1000;
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
- const target = sameOriginPath(asked);
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.add(listener);
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.add(listener);
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 none.
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
- - **Site image read** - given a Published Room and an original attachment
47
- reference, it answers the web copy's path and metadata, or `null` when no
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, slot })`
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; naming an account slot places the key of the
65
- account the User connected to it, which the App never sees, and naming none
66
- sends no key. A Site's call names no slot, and the House panel names an
67
- `account` instead. `body_base64` replaces `body` for bytes.
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 KiB of JSON; House fills in the App and relays it only
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`, delivers each App
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-ccf413b4e709d",
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 App messages, with an accessor and an in-page test host.",
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
  }