@agentshouse/mdruntime 0.1.0-cdf82f77fae68 → 0.1.0-ce131cb435f8b
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/AGENTS.md +271 -290
- package/README.md +8 -8
- package/dist/adapter.d.ts +51 -9
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attempt.d.ts.map +1 -1
- package/dist/attempt.js +14 -1
- package/dist/bootstrap.d.ts +3 -2
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +33 -7
- package/dist/change-set.d.ts +2 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +36 -10
- package/dist/chat/acts.d.ts +3 -4
- package/dist/chat/acts.d.ts.map +1 -1
- package/dist/chat/acts.js +10 -10
- package/dist/chat/earlier.d.ts +10 -0
- package/dist/chat/earlier.d.ts.map +1 -0
- package/dist/chat/earlier.js +54 -0
- package/dist/chat/kit.d.ts +2 -1
- package/dist/chat/kit.d.ts.map +1 -1
- package/dist/chat/kit.js +3 -3
- package/dist/chat/list.d.ts +8 -1
- package/dist/chat/list.d.ts.map +1 -1
- package/dist/chat/list.js +48 -8
- package/dist/chat/markdown.d.ts +2 -1
- package/dist/chat/markdown.d.ts.map +1 -1
- package/dist/chat/markdown.js +7 -6
- package/dist/chat/message.d.ts.map +1 -1
- package/dist/chat/message.js +2 -2
- package/dist/chat/messages.d.ts +1 -0
- package/dist/chat/messages.d.ts.map +1 -1
- package/dist/chat/messages.js +4 -0
- package/dist/chat/provider.d.ts +1 -1
- package/dist/chat/provider.d.ts.map +1 -1
- package/dist/chat/provider.js +62 -79
- package/dist/chat/question.d.ts +1 -1
- package/dist/chat/question.d.ts.map +1 -1
- package/dist/chat/question.js +7 -18
- package/dist/chat/ready.d.ts +1 -0
- package/dist/chat/ready.d.ts.map +1 -1
- package/dist/chat/ready.js +4 -4
- package/dist/chat/style.js +4 -4
- package/dist/client.d.ts +17 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +19 -6
- package/dist/collection.d.ts +20 -5
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +309 -33
- package/dist/connection.d.ts +31 -9
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1573 -372
- package/dist/conversation.d.ts +20 -7
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +474 -163
- package/dist/durability.d.ts +7 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +17 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +157 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/host.d.ts +15 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +94 -12
- package/dist/identity.d.ts +2 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +6 -0
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/memory.d.ts +8 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +33 -6
- package/dist/model.d.ts +4 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -1
- package/dist/observation.d.ts +7 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +29 -12
- package/dist/outcome.d.ts +12 -2
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +4 -0
- package/dist/overlay.d.ts +3 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +62 -55
- package/dist/query.d.ts +56 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +36 -7
- package/dist/reach.d.ts +6 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +30 -5
- package/dist/react.d.ts +8 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- package/dist/read-side.d.ts +16 -7
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +484 -100
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +33 -0
- package/dist/reads.d.ts +11 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +98 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +197 -0
- package/dist/refresh.d.ts +4 -4
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +18 -11
- package/dist/replica.d.ts +10 -5
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +95 -32
- package/dist/room-draft.d.ts +13 -1
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +2 -2
- package/dist/rows.d.ts +6 -13
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +10 -13
- package/dist/save.d.ts +9 -3
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +68 -22
- package/dist/search.d.ts +49 -6
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +192 -47
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +14 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +394 -0
- package/dist/status.d.ts +4 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/store.d.ts +59 -12
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +350 -86
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +64 -0
- package/dist/windows.d.ts +26 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +93 -0
- package/dist/wire.d.ts +152 -32
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +52 -31
- package/package.json +12 -8
package/dist/chat/kit.d.ts
CHANGED
|
@@ -48,7 +48,8 @@ export declare function ItemRow({ lead, title, sub, trailing, }: {
|
|
|
48
48
|
sub: ReactNode;
|
|
49
49
|
trailing: ReactNode;
|
|
50
50
|
}): ReactElement;
|
|
51
|
-
export declare function Working({ step }: {
|
|
51
|
+
export declare function Working({ label, step, }: {
|
|
52
|
+
label?: string;
|
|
52
53
|
step?: string | undefined;
|
|
53
54
|
}): ReactElement;
|
|
54
55
|
export type ChatNoteProps = {
|
package/dist/chat/kit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../../src/chat/kit.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAEhF,eAAO,MAAM,MAAM,6CAA0C,CAAC;AAE9D,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAQf;AAED,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,YAAY,CAa1E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CASrF;AAED,KAAK,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;AA0BjE,wBAAgB,MAAM,CAAC,EACrB,OAAiB,EACjB,OAAe,EACf,IAAe,EACf,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,YAAY,CAMlE;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,OAAiB,EACjB,OAAe,EACf,IAAe,EACf,GAAG,IAAI,EACR,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,YAAY,CASjF;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAM5F;AAED,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAqBf;AAED,wBAAgB,OAAO,IAAI,YAAY,CAEtC;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,MAAc,EACd,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAYf;AAED,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,IAAI,EACJ,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,GAAG,YAAY,CAsDf;AAED,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,KAAK,EACL,GAAG,EACH,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAWf;AAMD,wBAAgB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"kit.d.ts","sourceRoot":"","sources":["../../src/chat/kit.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAEhF,eAAO,MAAM,MAAM,6CAA0C,CAAC;AAE9D,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAQf;AAED,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,YAAY,CAa1E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CASrF;AAED,KAAK,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;AA0BjE,wBAAgB,MAAM,CAAC,EACrB,OAAiB,EACjB,OAAe,EACf,IAAe,EACf,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,MAAM,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,YAAY,CAMlE;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,OAAiB,EACjB,OAAe,EACf,IAAe,EACf,GAAG,IAAI,EACR,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,YAAY,CASjF;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAM5F;AAED,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAqBf;AAED,wBAAgB,OAAO,IAAI,YAAY,CAEtC;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,MAAc,EACd,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAYf;AAED,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,IAAI,EACJ,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,GAAG,YAAY,CAsDf;AAED,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,KAAK,EACL,GAAG,EACH,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,SAAS,CAAC;IACf,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,YAAY,CAWf;AAMD,wBAAgB,OAAO,CAAC,EACtB,KAAiB,EACjB,IAAI,GACL,EAAE;IACD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,GAAG,YAAY,CAiBf;AASD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAuB/E"}
|
package/dist/chat/kit.js
CHANGED
|
@@ -94,7 +94,7 @@ export function ItemRow({ lead, title, sub, trailing, }) {
|
|
|
94
94
|
function elapsed(seconds) {
|
|
95
95
|
return seconds >= 60 ? `${Math.floor(seconds / 60)}m ${seconds % 60}s` : `${seconds}s`;
|
|
96
96
|
}
|
|
97
|
-
export function Working({ step }) {
|
|
97
|
+
export function Working({ label = 'Working', step, }) {
|
|
98
98
|
const [from] = useState(() => Date.now());
|
|
99
99
|
const [now, setNow] = useState(from);
|
|
100
100
|
useEffect(() => {
|
|
@@ -102,11 +102,11 @@ export function Working({ step }) {
|
|
|
102
102
|
const tick = setInterval(() => setNow(Date.now()), 1000);
|
|
103
103
|
return () => clearInterval(tick);
|
|
104
104
|
}, []);
|
|
105
|
-
return (_jsxs("div", { className: "ahc-toolline ahc-working", role: "status", children: [_jsx("span", { className: "ahc-shimmer", children:
|
|
105
|
+
return (_jsxs("div", { className: "ahc-toolline ahc-working", role: "status", children: [_jsx("span", { className: "ahc-shimmer", children: label }), _jsx("span", { className: "ahc-figure", "aria-hidden": "true", children: elapsed(Math.floor((now - from) / 1000)) }), step === undefined ? null : _jsx("span", { children: step })] }));
|
|
106
106
|
}
|
|
107
107
|
const SAID = {
|
|
108
108
|
sending: 'Sending…',
|
|
109
|
-
offline: '
|
|
109
|
+
offline: 'House can’t be reached. Nothing was sent.',
|
|
110
110
|
};
|
|
111
111
|
const UNANSWERED = 'House did not answer.';
|
|
112
112
|
export function ChatNote({ outcome, again }) {
|
package/dist/chat/list.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { type ComponentType, type ReactElement, type ReactNode } from 'react';
|
|
2
2
|
export type AgentLook = {
|
|
3
|
+
readonly AgentLink?: ComponentType<{
|
|
4
|
+
agent: string;
|
|
5
|
+
className: string;
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
'aria-current': 'true' | undefined;
|
|
8
|
+
}> | undefined;
|
|
3
9
|
readonly agentMark?: ((agent: string, size: number) => ReactNode) | undefined;
|
|
4
10
|
readonly agentDetail?: ((agent: string) => string) | undefined;
|
|
5
11
|
};
|
|
@@ -11,9 +17,10 @@ export type ChatMessageListProps = {
|
|
|
11
17
|
};
|
|
12
18
|
readonly onLink?: (href: string) => void;
|
|
13
19
|
readonly footer?: ReactNode;
|
|
20
|
+
readonly waiting?: string | null;
|
|
14
21
|
readonly children?: ReactNode;
|
|
15
22
|
};
|
|
16
|
-
export declare function ChatMessageList({ components, onLink, footer, children, }: ChatMessageListProps): ReactElement;
|
|
23
|
+
export declare function ChatMessageList({ components, onLink, footer, waiting, children, }: ChatMessageListProps): ReactElement;
|
|
17
24
|
export declare function ChatList({ onChoose }: {
|
|
18
25
|
onChoose: () => void;
|
|
19
26
|
}): ReactElement;
|
package/dist/chat/list.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/chat/list.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/chat/list.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAaf,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,SAAS,CAAC,EACf,aAAa,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,SAAS,CAAC;QACpB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;KACpC,CAAC,GACF,SAAS,CAAC;IACd,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;IAC9E,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;CAChE,CAAC;AAEF,eAAO,MAAM,SAAS,oCAA+B,CAAC;AAkEtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC;QACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,aAAa,CAAC;KAC3C,CAAC;IACF,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,UAAe,EACf,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,GACT,EAAE,oBAAoB,GAAG,YAAY,CAsErC;AAoBD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,YAAY,CAkD7E"}
|
package/dist/chat/list.js
CHANGED
|
@@ -1,33 +1,73 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useContext, } from 'react';
|
|
3
|
-
import { ThreadPrimitive } from '@assistant-ui/react';
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useRef, } from 'react';
|
|
3
|
+
import { ThreadPrimitive, useAui } from '@assistant-ui/react';
|
|
4
4
|
import Check from 'lucide-react/dist/esm/icons/check.mjs';
|
|
5
5
|
import MessageSquare from 'lucide-react/dist/esm/icons/message-square.mjs';
|
|
6
6
|
import SquarePen from 'lucide-react/dist/esm/icons/square-pen.mjs';
|
|
7
|
-
import { Name, Scoped } from './kit.js';
|
|
7
|
+
import { Name, Scoped, Working } from './kit.js';
|
|
8
8
|
import { AssistantMessage, Linked, UserMessage } from './message.js';
|
|
9
|
+
import { awaitsTurn } from './messages.js';
|
|
9
10
|
import { ChatName } from './name.js';
|
|
10
11
|
import { useOpened } from './opened.js';
|
|
11
12
|
import { ChatQuestionCard } from './question.js';
|
|
12
13
|
export const Described = createContext({});
|
|
14
|
+
const EARLIER_MARGIN = 240;
|
|
13
15
|
function Chip({ agent, name, on, start, }) {
|
|
14
|
-
const { agentMark, agentDetail } = useContext(Described);
|
|
15
|
-
|
|
16
|
+
const { agentMark, agentDetail, AgentLink } = useContext(Described);
|
|
17
|
+
const content = (_jsxs(_Fragment, { children: [agentMark?.(agent, 16), _jsx(Name, { text: name }), agentDetail === undefined ? null : _jsx(Name, { text: agentDetail(agent), className: "ahc-meta" })] }));
|
|
18
|
+
if (AgentLink !== undefined)
|
|
19
|
+
return (_jsx(AgentLink, { agent: agent, className: "ahc-btn ahc-agent", "aria-current": on ? 'true' : undefined, children: content }));
|
|
20
|
+
return (_jsx("button", { type: "button", className: "ahc-btn ahc-agent", "aria-pressed": on, onClick: () => start(agent), children: content }));
|
|
16
21
|
}
|
|
17
22
|
function Empty() {
|
|
18
23
|
const chat = useOpened();
|
|
19
24
|
return (_jsxs("div", { className: "ahc-empty", children: [_jsx("h2", { className: "ahc-empty__title", children: "What should we work on?" }), chat.conversation === null &&
|
|
20
25
|
(chat.agents.length > 1 || !chat.agents.some((one) => one.identity === chat.by)) ? (_jsx("div", { role: "group", "aria-label": "Agent", className: "ahc-agents", children: chat.agents.map((one) => (_jsx(Chip, { agent: one.identity, name: one.name, on: one.identity === chat.by, start: chat.start }, one.identity))) })) : null] }));
|
|
21
26
|
}
|
|
22
|
-
export function ChatMessageList({ components = {}, onLink, footer, children, }) {
|
|
27
|
+
export function ChatMessageList({ components = {}, onLink, footer, waiting, children, }) {
|
|
23
28
|
const chat = useOpened();
|
|
24
29
|
const linked = useContext(Linked);
|
|
30
|
+
const aui = useAui();
|
|
31
|
+
const viewport = useRef(null);
|
|
32
|
+
const content = useRef(null);
|
|
33
|
+
const anchor = useRef(null);
|
|
34
|
+
const first = chat.view?.messages[0]?.identity;
|
|
35
|
+
const shownFirst = useRef(first);
|
|
36
|
+
shownFirst.current = first;
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
const element = viewport.current;
|
|
39
|
+
const inner = content.current;
|
|
40
|
+
if (element === null || inner === null)
|
|
41
|
+
return;
|
|
42
|
+
const kept = new ResizeObserver(() => {
|
|
43
|
+
const held = anchor.current;
|
|
44
|
+
if (held === null || held.first === shownFirst.current)
|
|
45
|
+
return;
|
|
46
|
+
if (element.scrollHeight === held.height)
|
|
47
|
+
return;
|
|
48
|
+
anchor.current = null;
|
|
49
|
+
element.scrollTop += element.scrollHeight - held.height;
|
|
50
|
+
});
|
|
51
|
+
kept.observe(inner);
|
|
52
|
+
return () => kept.disconnect();
|
|
53
|
+
}, []);
|
|
54
|
+
const earlier = () => {
|
|
55
|
+
const element = viewport.current;
|
|
56
|
+
if (element === null || element.scrollTop > EARLIER_MARGIN)
|
|
57
|
+
return;
|
|
58
|
+
const thread = aui.thread();
|
|
59
|
+
const state = thread.getState();
|
|
60
|
+
if (!state.hasEarlier || state.isLoadingEarlier)
|
|
61
|
+
return;
|
|
62
|
+
anchor.current = { height: element.scrollHeight, first };
|
|
63
|
+
void thread.loadEarlier();
|
|
64
|
+
};
|
|
25
65
|
const User = components.UserMessage ?? UserMessage;
|
|
26
66
|
const Assistant = components.AssistantMessage ?? AssistantMessage;
|
|
27
67
|
const silent = chat.view === null
|
|
28
68
|
? chat.conversation === null
|
|
29
69
|
: chat.view.messages.length === 0 && chat.view.turn === null;
|
|
30
|
-
return (_jsx(Scoped, { children: _jsx(Linked.Provider, { value: onLink ?? linked, children: _jsx(ThreadPrimitive.Root, { className: "ahc-thread", children: _jsxs(ThreadPrimitive.Viewport, { className: "ahc-viewport", children: [_jsxs("div", { className: "ahc-column ahc-messages", children: [silent ? _jsx(Empty, {}) : null, _jsx(ThreadPrimitive.Messages, { children: ({ message }) => (message.role === 'user' ? _jsx(User, {}) : _jsx(Assistant, {})) }), children === undefined
|
|
70
|
+
return (_jsx(Scoped, { children: _jsx(Linked.Provider, { value: onLink ?? linked, children: _jsx(ThreadPrimitive.Root, { className: "ahc-thread", children: _jsxs(ThreadPrimitive.Viewport, { className: "ahc-viewport", ref: viewport, onScroll: earlier, children: [_jsxs("div", { className: "ahc-column ahc-messages", ref: content, children: [silent ? _jsx(Empty, {}) : null, _jsx(ThreadPrimitive.Messages, { children: ({ message }) => (message.role === 'user' ? _jsx(User, {}) : _jsx(Assistant, {})) }), waiting == null || !awaitsTurn(chat.view) ? null : (_jsx("div", { className: "ahc-turn", children: _jsx(Working, { label: waiting }) })), children === undefined
|
|
31
71
|
? chat.questions.map((question) => (_jsx(ChatQuestionCard, { question: question }, question.interaction)))
|
|
32
72
|
: children] }), footer === undefined ? null : (_jsx(ThreadPrimitive.ViewportFooter, { className: "ahc-column ahc-footer", children: footer }))] }) }) }) }));
|
|
33
73
|
}
|
package/dist/chat/markdown.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type ReactElement, type ReactNode } from 'react';
|
|
2
2
|
export interface FileReference {
|
|
3
3
|
readonly pattern: RegExp;
|
|
4
|
-
readonly
|
|
4
|
+
readonly names?: (destination: string) => boolean;
|
|
5
|
+
readonly draw: (reference: string, label: string, image: boolean) => ReactNode;
|
|
5
6
|
}
|
|
6
7
|
interface MarkdownOptions {
|
|
7
8
|
readonly className?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/chat/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/chat/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,SAAS,CAAC;CAChF;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;CAC/B;AAYD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAoND,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,EAAE,aAAa,GAAG,YAAY,CAOrF"}
|
package/dist/chat/markdown.js
CHANGED
|
@@ -23,7 +23,8 @@ function headingId(slugs, text) {
|
|
|
23
23
|
return anchorOf(seen === 0 ? slug : `${slug}-${seen}`);
|
|
24
24
|
}
|
|
25
25
|
function whole(file, text) {
|
|
26
|
-
return file !== undefined &&
|
|
26
|
+
return (file !== undefined &&
|
|
27
|
+
([...text.matchAll(file.pattern)].some((one) => one[0] === text) || file.names?.(text) === true));
|
|
27
28
|
}
|
|
28
29
|
function referenced(file, text, key) {
|
|
29
30
|
const parts = [];
|
|
@@ -32,7 +33,7 @@ function referenced(file, text, key) {
|
|
|
32
33
|
const at = found.index;
|
|
33
34
|
if (at > from)
|
|
34
35
|
parts.push(text.slice(from, at));
|
|
35
|
-
parts.push(createElement(Fragment, { key: at }, file.draw(found[0], found[0])));
|
|
36
|
+
parts.push(createElement(Fragment, { key: at }, file.draw(found[0], found[0], false)));
|
|
36
37
|
from = at + found[0].length;
|
|
37
38
|
}
|
|
38
39
|
if (from === 0)
|
|
@@ -73,8 +74,8 @@ function definitionsOf(node, found = new Map()) {
|
|
|
73
74
|
return found;
|
|
74
75
|
}
|
|
75
76
|
function link(url, node, key, options) {
|
|
76
|
-
if (
|
|
77
|
-
return createElement(Fragment, { key }, options.file.draw(url, textOf(node) || url));
|
|
77
|
+
if (whole(options.file, url)) {
|
|
78
|
+
return createElement(Fragment, { key }, options.file.draw(url, textOf(node) || url, false));
|
|
78
79
|
}
|
|
79
80
|
const inside = node.children.map((child, at) => render(child, at, unfiled(options)));
|
|
80
81
|
const href = safeHref(url);
|
|
@@ -139,8 +140,8 @@ function render(node, key, options, header = false) {
|
|
|
139
140
|
case 'linkReference':
|
|
140
141
|
return link(options.definitions.get(node.identifier) ?? '', node, key, options);
|
|
141
142
|
case 'image':
|
|
142
|
-
return
|
|
143
|
-
? createElement(Fragment, { key }, options.file.draw(node.url, node.alt || node.url))
|
|
143
|
+
return whole(options.file, node.url)
|
|
144
|
+
? createElement(Fragment, { key }, options.file.draw(node.url, node.alt || node.url, true))
|
|
144
145
|
: (node.alt ?? '');
|
|
145
146
|
case 'html':
|
|
146
147
|
return node.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/chat/message.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/chat/message.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AAmCf,eAAO,MAAM,MAAM,kCAAyB,MAAM,KAAK,IAAI,SAAe,CAAC;AA0O3E,wBAAgB,WAAW,IAAI,YAAY,CA4B1C;AAED,wBAAgB,WAAW,IAAI,YAAY,CAE1C;AAED,wBAAgB,gBAAgB,IAAI,YAAY,CA0F/C"}
|
package/dist/chat/message.js
CHANGED
|
@@ -20,6 +20,7 @@ import RotateCw from 'lucide-react/dist/esm/icons/rotate-cw.mjs';
|
|
|
20
20
|
import Send from 'lucide-react/dist/esm/icons/send.mjs';
|
|
21
21
|
import SlidersHorizontal from 'lucide-react/dist/esm/icons/sliders-horizontal.mjs';
|
|
22
22
|
import Terminal from 'lucide-react/dist/esm/icons/terminal.mjs';
|
|
23
|
+
import { SESSION_STARTED } from '../conversation.js';
|
|
23
24
|
import { buttonClass, Name, Working } from './kit.js';
|
|
24
25
|
import { StillRunning } from './lasting.js';
|
|
25
26
|
import { list, record, text } from './read.js';
|
|
@@ -29,7 +30,6 @@ const groupBy = groupPartByType({
|
|
|
29
30
|
'tool-call': ['group-thought'],
|
|
30
31
|
});
|
|
31
32
|
const GFM = [remarkGfm];
|
|
32
|
-
const STARTED = 'Session started';
|
|
33
33
|
const SENT = {
|
|
34
34
|
send_routine_request: 'Sent a request',
|
|
35
35
|
cancel_routine_request: 'Cancelled a request',
|
|
@@ -184,7 +184,7 @@ export function AssistantMessage() {
|
|
|
184
184
|
case 'file':
|
|
185
185
|
return (_jsxs("div", { className: "ahc-toolline ahc-quiet", children: [_jsx(ImageGlyph, { "aria-hidden": "true" }), _jsx("span", { className: "ahc-clipped", children: part.filename })] }));
|
|
186
186
|
case 'indicator':
|
|
187
|
-
return _jsx(Working, { step: started ?
|
|
187
|
+
return _jsx(Working, { step: started ? SESSION_STARTED : undefined });
|
|
188
188
|
default:
|
|
189
189
|
return null;
|
|
190
190
|
}
|
package/dist/chat/messages.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export type Said = {
|
|
|
14
14
|
readonly files: readonly string[];
|
|
15
15
|
};
|
|
16
16
|
export declare function saidOf(entry: Entry): Said;
|
|
17
|
+
export declare function awaitsTurn(view: ConversationView | null): boolean;
|
|
17
18
|
export declare function askedBefore(view: ConversationView | null, id: string | null): string | null;
|
|
18
19
|
export declare function chatMessages(view: ConversationView | null): ThreadMessageLike[];
|
|
19
20
|
export declare function contextOf(view: ConversationView | null): TurnContext | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/chat/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAA0D,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAO/F,KAAK,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;AAEF,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAYzC;AAkED,wBAAgB,WAAW,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAO3F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,iBAAiB,EAAE,CAsD/E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAS3E"}
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/chat/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAA0D,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAO/F,KAAK,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;AAEF,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAYzC;AAkED,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAGjE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAO3F;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,iBAAiB,EAAE,CAsD/E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,GAAG,WAAW,GAAG,IAAI,CAS3E"}
|
package/dist/chat/messages.js
CHANGED
|
@@ -73,6 +73,10 @@ function leftRunning(view) {
|
|
|
73
73
|
? turns
|
|
74
74
|
: [...turns, { turn: view.turn.turn, parts: partsOf(view.turn.parts), ended: false }]);
|
|
75
75
|
}
|
|
76
|
+
export function awaitsTurn(view) {
|
|
77
|
+
const newest = view?.messages.at(-1);
|
|
78
|
+
return view?.turn === null && newest !== undefined && saidOf(newest).user;
|
|
79
|
+
}
|
|
76
80
|
export function askedBefore(view, id) {
|
|
77
81
|
const said = (view?.messages ?? []).map((entry) => ({ ...saidOf(entry), id: entry.identity }));
|
|
78
82
|
const asked = said
|
package/dist/chat/provider.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type ReactElement, type ReactNode } from 'react';
|
|
2
2
|
import type { TurnContext } from '../adapter.js';
|
|
3
3
|
import type { MdRuntimeClient } from '../client.js';
|
|
4
|
-
import type
|
|
4
|
+
import { type ChatDraft, type ConversationAgent, type ConversationEntry, type ConversationView } from '../conversation.js';
|
|
5
5
|
import { type ChatOutcome } from './acts.js';
|
|
6
6
|
import { type ChatCommand, type ChatOption } from './process.js';
|
|
7
7
|
import { type ChatLone, type ChatQuestion } from './questions.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/chat/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAWL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAaf,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/chat/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/chat/provider.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { createContext, createElement, useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore, } from 'react';
|
|
2
2
|
import { AssistantRuntimeProvider, createMessageQueue, generateId, useExternalStoreRuntime, } from '@assistant-ui/react';
|
|
3
3
|
import { attempts } from '../attempt.js';
|
|
4
|
+
import { newChat, } from '../conversation.js';
|
|
4
5
|
import { expectedList } from '../expectation.js';
|
|
5
6
|
import { chatDraftRevision } from '../identity.js';
|
|
6
7
|
import { useObserve } from '../react.js';
|
|
7
8
|
import { accepted, answeredOf, outcomeOf, sender, unanswered, } from './acts.js';
|
|
9
|
+
import { CHAT_WINDOW, useEarlier } from './earlier.js';
|
|
8
10
|
import { askedBefore, chatMessages, contextOf } from './messages.js';
|
|
9
11
|
import { conversationChanged, conversationGone, conversationListed, optionChosen, overlay, questionAnswered, sentMessage, } from './overlay.js';
|
|
10
12
|
import { commandIn, commandsOf, optionsOf } from './process.js';
|
|
11
13
|
import { loneOf, questionsOf } from './questions.js';
|
|
12
14
|
import { record, text } from './read.js';
|
|
13
15
|
const SHARED = new WeakMap();
|
|
16
|
+
const LATEST = { limit: CHAT_WINDOW };
|
|
14
17
|
function sharedOf(client) {
|
|
15
18
|
const held = SHARED.get(client);
|
|
16
19
|
if (held !== undefined)
|
|
@@ -19,53 +22,18 @@ function sharedOf(client) {
|
|
|
19
22
|
SHARED.set(client, fresh);
|
|
20
23
|
return fresh;
|
|
21
24
|
}
|
|
22
|
-
function newChat(agent) {
|
|
23
|
-
return `new:${agent}`;
|
|
24
|
-
}
|
|
25
25
|
function ready(observed) {
|
|
26
26
|
return observed.state === 'ready' ? observed.value : null;
|
|
27
27
|
}
|
|
28
|
-
async function alike(one, other) {
|
|
29
|
-
if (one.type !== other.type || one.size !== other.size)
|
|
30
|
-
return false;
|
|
31
|
-
const [mine, theirs] = await Promise.all([one.arrayBuffer(), other.arrayBuffer()]);
|
|
32
|
-
const bytes = new Uint8Array(theirs);
|
|
33
|
-
return new Uint8Array(mine).every((byte, at) => byte === bytes[at]);
|
|
34
|
-
}
|
|
35
|
-
async function same(one, other) {
|
|
36
|
-
if (one.text !== other.text || one.files.length !== other.files.length)
|
|
37
|
-
return false;
|
|
38
|
-
const files = await Promise.all(one.files.map(async (file, at) => {
|
|
39
|
-
const twin = other.files[at];
|
|
40
|
-
return twin !== undefined && file.name === twin.name && (await alike(file.blob, twin.blob));
|
|
41
|
-
}));
|
|
42
|
-
return files.every(Boolean);
|
|
43
|
-
}
|
|
44
28
|
function turnOf(result) {
|
|
45
29
|
return accepted(result) ? text(record(result.result), 'turn') : null;
|
|
46
30
|
}
|
|
47
|
-
async function deliver(client, send, conversation, said, key,
|
|
48
|
-
const
|
|
49
|
-
const kept = chatDraftRevision();
|
|
50
|
-
noted(conversation, kept);
|
|
51
|
-
await client.chatDraft.write(conversation, said, kept);
|
|
52
|
-
const result = await send.carried('conversation.send', { conversation, key }, () => {
|
|
53
|
-
noted(conversation, null);
|
|
54
|
-
noted(conversation, kept);
|
|
55
|
-
return client.conversation.send(conversation);
|
|
56
|
-
});
|
|
57
|
-
if (typed !== null && !(await same(typed, said))) {
|
|
58
|
-
const now = (await client.conversation.read(conversation)).chatDraft;
|
|
59
|
-
if (now === null || now.revision === kept) {
|
|
60
|
-
const back = chatDraftRevision();
|
|
61
|
-
noted(conversation, back);
|
|
62
|
-
await client.chatDraft.write(conversation, typed, back);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
31
|
+
async function deliver(client, send, conversation, said, key, idle) {
|
|
32
|
+
const result = await send.numbered('conversation.send', { conversation, key }, (operation) => client.conversation.send(conversation, operation, said));
|
|
65
33
|
if (accepted(result))
|
|
66
34
|
send.expect(sentMessage(key, [conversation], said, turnOf(result)));
|
|
67
35
|
else if (!unanswered(result))
|
|
68
|
-
|
|
36
|
+
idle();
|
|
69
37
|
return result;
|
|
70
38
|
}
|
|
71
39
|
const IDLE = { busy: false, outcome: null };
|
|
@@ -206,11 +174,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
206
174
|
}, []);
|
|
207
175
|
const listedHeld = ready(useObserve(client, 'conversations'));
|
|
208
176
|
const agentsHeld = ready(useObserve(client, 'agents'));
|
|
209
|
-
const
|
|
177
|
+
const readiness = ready(useObserve(client, 'readiness'));
|
|
210
178
|
const refusal = ready(useObserve(client, 'connection-refusal'));
|
|
211
|
-
const online =
|
|
212
|
-
const thread = open.conversation ??
|
|
213
|
-
|
|
179
|
+
const online = readiness?.connection !== 'unreachable' && refusal === null;
|
|
180
|
+
const thread = open.conversation ??
|
|
181
|
+
(open.agent === null ? null : (shared.created.get(open.agent) ?? newChat(open.agent)));
|
|
182
|
+
const observed = ready(useObserve(thread === null ? null : client, 'conversation', thread ?? '', LATEST));
|
|
183
|
+
const held = observed !== null && observed.conversation === thread ? observed : null;
|
|
184
|
+
const paged = useEarlier(client, thread, held);
|
|
214
185
|
const version = useSyncExternalStore(shared.overlay.subscribe, shared.overlay.version);
|
|
215
186
|
useEffect(() => {
|
|
216
187
|
if (listedHeld !== null)
|
|
@@ -221,7 +192,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
221
192
|
shared.overlay.heard(held);
|
|
222
193
|
}, [shared, held, version]);
|
|
223
194
|
const conversations = useMemo(() => shared.overlay.conversations(listedHeld ?? []), [shared, listedHeld, version]);
|
|
224
|
-
const view = useMemo(() =>
|
|
195
|
+
const view = useMemo(() => (paged.view === null ? null : shared.overlay.conversation(paged.view)), [shared, paged.view, version]);
|
|
225
196
|
const agents = agentsHeld ?? [];
|
|
226
197
|
const known = useRef(agents);
|
|
227
198
|
known.current = agents;
|
|
@@ -238,6 +209,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
238
209
|
const current = useRef(thread);
|
|
239
210
|
current.current = thread;
|
|
240
211
|
const seeding = useRef(false);
|
|
212
|
+
const mounted = useRef(true);
|
|
213
|
+
useEffect(() => {
|
|
214
|
+
mounted.current = true;
|
|
215
|
+
return () => {
|
|
216
|
+
mounted.current = false;
|
|
217
|
+
};
|
|
218
|
+
}, []);
|
|
219
|
+
const was = useRef(null);
|
|
241
220
|
const heard = useRef('');
|
|
242
221
|
const shown = useRef('');
|
|
243
222
|
const own = useRef([]);
|
|
@@ -255,21 +234,26 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
255
234
|
heard.current = '';
|
|
256
235
|
shown.current = '';
|
|
257
236
|
own.current = own.current.filter((one) => one.startsWith(`${thread}\u0000`));
|
|
237
|
+
const created = was.current === open;
|
|
238
|
+
was.current = open;
|
|
239
|
+
if (created)
|
|
240
|
+
return;
|
|
258
241
|
sending.clear();
|
|
259
242
|
acting.clear();
|
|
260
243
|
setAgain(null);
|
|
261
244
|
}, [thread, sending.clear, acting.clear]);
|
|
262
|
-
const sendTo = (to, said, key,
|
|
263
|
-
const first = (to, said, key,
|
|
245
|
+
const sendTo = (to, said, key, idle, acts = sending) => acts.call((send) => deliver(client, send, to, said, key, idle), sentMessage(key, [to], said, null));
|
|
246
|
+
const first = (to, said, key, returning, idle) => {
|
|
264
247
|
const drafted = [newChat(to)];
|
|
265
|
-
let made = null;
|
|
266
248
|
return sending.call(async (send) => {
|
|
267
249
|
let conversation = shared.created.get(to);
|
|
268
250
|
if (conversation === undefined) {
|
|
269
251
|
const answer = await send.carried('conversation.create', { agent: to }, (operation) => client.conversation.create({ agent_id: to, operation_id: operation }));
|
|
270
252
|
if (!accepted(answer)) {
|
|
271
|
-
if (!unanswered(answer))
|
|
272
|
-
|
|
253
|
+
if (!unanswered(answer)) {
|
|
254
|
+
returning();
|
|
255
|
+
idle();
|
|
256
|
+
}
|
|
273
257
|
return answer;
|
|
274
258
|
}
|
|
275
259
|
const named = text(record(answer.result), 'conversation');
|
|
@@ -289,39 +273,29 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
289
273
|
started: null,
|
|
290
274
|
}));
|
|
291
275
|
}
|
|
292
|
-
made = conversation;
|
|
293
276
|
send.draw(sentMessage(key, [...drafted, conversation], said, null));
|
|
294
|
-
const result = await deliver(client, send, conversation, said, key,
|
|
295
|
-
if (accepted(result))
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}, sentMessage(key, drafted, said, null), () => {
|
|
299
|
-
if (made === null)
|
|
300
|
-
return;
|
|
301
|
-
void client.chatDraft.discard(newChat(to));
|
|
277
|
+
const result = await deliver(client, send, conversation, said, key, idle);
|
|
278
|
+
if (!accepted(result))
|
|
279
|
+
return result;
|
|
280
|
+
shared.created.delete(to);
|
|
302
281
|
const now = opened.current;
|
|
303
|
-
if (now.conversation === null && now.agent === to)
|
|
304
|
-
go({ conversation
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
const now = (await client.conversation.read(to)).chatDraft;
|
|
309
|
-
await client.chatDraft.write(to, {
|
|
310
|
-
text: now === null || now.text === '' ? one.text : `${one.text}\n${now.text}`,
|
|
311
|
-
files: [...one.files, ...(now?.files ?? [])],
|
|
312
|
-
});
|
|
282
|
+
if (mounted.current && now.conversation === null && now.agent === to) {
|
|
283
|
+
go({ conversation, agent: to });
|
|
284
|
+
}
|
|
285
|
+
return result;
|
|
286
|
+
}, sentMessage(key, drafted, said, null));
|
|
313
287
|
};
|
|
314
288
|
const sent = () => {
|
|
315
289
|
shared.sends += 1;
|
|
316
290
|
return `sent ${shared.sends}`;
|
|
317
291
|
};
|
|
318
|
-
const deliverDraft = (said,
|
|
292
|
+
const deliverDraft = (said, returning, idle) => {
|
|
319
293
|
const key = sent();
|
|
320
294
|
const { conversation: to, agent: by } = opened.current;
|
|
321
295
|
const attempt = to !== null
|
|
322
|
-
? () => void sendTo(to, said, key,
|
|
296
|
+
? () => void sendTo(to, said, key, idle)
|
|
323
297
|
: by !== null
|
|
324
|
-
? () => void first(by, said, key,
|
|
298
|
+
? () => void first(by, said, key, returning, idle)
|
|
325
299
|
: null;
|
|
326
300
|
if (attempt === null)
|
|
327
301
|
return;
|
|
@@ -424,6 +398,8 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
424
398
|
const aui = useExternalStoreRuntime({
|
|
425
399
|
messages,
|
|
426
400
|
isRunning: running,
|
|
401
|
+
hasEarlier: paged.hasEarlier,
|
|
402
|
+
onLoadEarlier: paged.loadEarlier,
|
|
427
403
|
convertMessage: (message) => message,
|
|
428
404
|
queue: lined(),
|
|
429
405
|
onNew: async (message) => lined().enqueue(message),
|
|
@@ -438,7 +414,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
438
414
|
return;
|
|
439
415
|
const draft = { text: said, files: [] };
|
|
440
416
|
const into = thread;
|
|
441
|
-
deliverDraft(draft, () => back(draft, into));
|
|
417
|
+
deliverDraft(draft, () => back(draft, into), () => undefined);
|
|
442
418
|
},
|
|
443
419
|
adapters: {
|
|
444
420
|
attachments: ATTACHMENTS,
|
|
@@ -466,7 +442,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
466
442
|
});
|
|
467
443
|
function back(one, into) {
|
|
468
444
|
if (current.current !== into) {
|
|
469
|
-
void
|
|
445
|
+
void client.chatDraft.prepend(into, one);
|
|
470
446
|
return;
|
|
471
447
|
}
|
|
472
448
|
const composer = aui.thread.composer;
|
|
@@ -486,6 +462,15 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
486
462
|
const holding = (put) => (message) => {
|
|
487
463
|
if (taken(message))
|
|
488
464
|
return;
|
|
465
|
+
if (!online) {
|
|
466
|
+
const draft = draftOf(message);
|
|
467
|
+
const at = current.current;
|
|
468
|
+
deliverDraft(draft, () => {
|
|
469
|
+
if (at !== null)
|
|
470
|
+
back(draft, at);
|
|
471
|
+
}, () => undefined);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
489
474
|
const known = new Set(lanes().map((one) => one.id));
|
|
490
475
|
if (!lane.running)
|
|
491
476
|
queue.notifyIdle();
|
|
@@ -513,18 +498,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
513
498
|
const draft = draftOf(message);
|
|
514
499
|
const idle = () => queues.current.get(key)?.queue.notifyIdle();
|
|
515
500
|
if (key !== (current.current ?? '')) {
|
|
516
|
-
void sendTo(key, draft, sent(),
|
|
517
|
-
back(draft, key);
|
|
518
|
-
idle();
|
|
519
|
-
}, behind);
|
|
501
|
+
void sendTo(key, draft, sent(), idle, behind);
|
|
520
502
|
return;
|
|
521
503
|
}
|
|
522
504
|
const into = current.current;
|
|
523
505
|
deliverDraft(draft, () => {
|
|
524
506
|
if (into !== null)
|
|
525
507
|
back(draft, into);
|
|
526
|
-
|
|
527
|
-
});
|
|
508
|
+
}, idle);
|
|
528
509
|
};
|
|
529
510
|
const unqueue = (id) => {
|
|
530
511
|
const message = waiting.current.get(id);
|
|
@@ -584,8 +565,10 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
584
565
|
.then(() => Promise.all((draft?.files ?? []).map((file) => composer.addAttachment(fileOf(file)))))
|
|
585
566
|
.finally(() => {
|
|
586
567
|
seeding.current = false;
|
|
587
|
-
if (current.current !== thread)
|
|
568
|
+
if (current.current !== thread) {
|
|
569
|
+
reconcile.current();
|
|
588
570
|
return;
|
|
571
|
+
}
|
|
589
572
|
const seeded = composer.getState();
|
|
590
573
|
shown.current = `${at}${composed(seeded)}`;
|
|
591
574
|
if (kept)
|
package/dist/chat/question.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReactElement } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import type { MdRuntimeClient } from '../client.js';
|
|
3
3
|
import type { ChatQuestion } from './questions.js';
|
|
4
4
|
export declare function forgetAnswers(client: MdRuntimeClient, conversation: string, interaction?: string): Promise<void>;
|
|
5
5
|
export type ChatQuestionCardProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../src/chat/question.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,
|
|
1
|
+
{"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../src/chat/question.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9D,wBAAsB,aAAa,CACjC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAeD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,GAAG,YAAY,CAmHlF"}
|