@peers-app/peers-ui 0.22.0 → 0.23.0
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/dist/components/access-level-field.d.ts +10 -0
- package/dist/components/access-level-field.js +28 -0
- package/dist/components/access-level-field.test.d.ts +1 -0
- package/dist/components/access-level-field.test.js +28 -0
- package/dist/components/message-logs/message-logs.d.ts +2 -1
- package/dist/components/message-logs/message-logs.js +44 -2
- package/dist/components/message-logs/tool-access-approval-card.d.ts +13 -0
- package/dist/components/message-logs/tool-access-approval-card.js +81 -0
- package/dist/components/message-logs/tool-access-approval-card.test.d.ts +1 -0
- package/dist/components/message-logs/tool-access-approval-card.test.js +102 -0
- package/dist/screens/assistants/assistant-info.d.ts +1 -0
- package/dist/screens/assistants/assistant-info.js +3 -1
- package/dist/screens/assistants/assistant-list.d.ts +1 -0
- package/dist/screens/assistants/assistant-list.js +8 -1
- package/dist/screens/tools/tool-access-ipc.d.ts +5 -0
- package/dist/screens/tools/tool-access-ipc.js +65 -0
- package/dist/screens/tools/tool-access-ipc.test.d.ts +1 -0
- package/dist/screens/tools/tool-access-ipc.test.js +40 -0
- package/dist/screens/tools/tool-info.d.ts +1 -0
- package/dist/screens/tools/tool-info.js +3 -1
- package/package.json +3 -3
- package/src/components/access-level-field.test.tsx +32 -0
- package/src/components/access-level-field.tsx +68 -0
- package/src/components/message-logs/message-logs.tsx +58 -1
- package/src/components/message-logs/tool-access-approval-card.test.tsx +127 -0
- package/src/components/message-logs/tool-access-approval-card.tsx +178 -0
- package/src/screens/assistants/assistant-info.tsx +4 -0
- package/src/screens/assistants/assistant-list.tsx +29 -2
- package/src/screens/tools/tool-access-ipc.test.ts +55 -0
- package/src/screens/tools/tool-access-ipc.ts +88 -0
- package/src/screens/tools/tool-info.tsx +4 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContractConsumer,
|
|
3
|
+
getHostContractTransport,
|
|
4
|
+
getToolAccessControlContractDefinition,
|
|
5
|
+
type IContractTransport,
|
|
6
|
+
type IToolAccessControlConsumer,
|
|
7
|
+
subscribeHostContractTransport,
|
|
8
|
+
waitForHostContractTransport,
|
|
9
|
+
} from "@peers-app/peers-sdk";
|
|
10
|
+
|
|
11
|
+
const HOST_TRANSPORT_TIMEOUT_MS = 10_000;
|
|
12
|
+
|
|
13
|
+
type CachedConsumer = {
|
|
14
|
+
transport: IContractTransport;
|
|
15
|
+
consumer: IToolAccessControlConsumer;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const cachedByContext = new Map<string, CachedConsumer>();
|
|
19
|
+
const pendingByContext = new Map<string, Promise<IToolAccessControlConsumer>>();
|
|
20
|
+
|
|
21
|
+
function disposeCachedConsumers(): void {
|
|
22
|
+
for (const cached of cachedByContext.values()) {
|
|
23
|
+
cached.consumer.dispose();
|
|
24
|
+
}
|
|
25
|
+
cachedByContext.clear();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
subscribeHostContractTransport(
|
|
29
|
+
(transport) => {
|
|
30
|
+
if ([...cachedByContext.values()].some((cached) => cached.transport !== transport)) {
|
|
31
|
+
disposeCachedConsumers();
|
|
32
|
+
pendingByContext.clear();
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{ emitCurrent: false },
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
async function loadConsumer(
|
|
39
|
+
transport: IContractTransport,
|
|
40
|
+
dataContextId: string,
|
|
41
|
+
): Promise<IToolAccessControlConsumer> {
|
|
42
|
+
cachedByContext.get(dataContextId)?.consumer.dispose();
|
|
43
|
+
cachedByContext.delete(dataContextId);
|
|
44
|
+
const consumer = createContractConsumer(getToolAccessControlContractDefinition(), transport, {
|
|
45
|
+
dataContextId,
|
|
46
|
+
}) as unknown as IToolAccessControlConsumer;
|
|
47
|
+
try {
|
|
48
|
+
await consumer.loadingPromise;
|
|
49
|
+
if (getHostContractTransport() !== transport) {
|
|
50
|
+
consumer.dispose();
|
|
51
|
+
pendingByContext.delete(dataContextId);
|
|
52
|
+
return getToolAccessControlConsumer(dataContextId);
|
|
53
|
+
}
|
|
54
|
+
cachedByContext.set(dataContextId, { transport, consumer });
|
|
55
|
+
return consumer;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
consumer.dispose();
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Return a typed local-host consumer for Tool Access Control in `dataContextId`.
|
|
64
|
+
*/
|
|
65
|
+
export async function getToolAccessControlConsumer(
|
|
66
|
+
dataContextId: string,
|
|
67
|
+
): Promise<IToolAccessControlConsumer> {
|
|
68
|
+
const transport =
|
|
69
|
+
getHostContractTransport() ??
|
|
70
|
+
(await waitForHostContractTransport({ timeoutMs: HOST_TRANSPORT_TIMEOUT_MS }));
|
|
71
|
+
const cached = cachedByContext.get(dataContextId);
|
|
72
|
+
if (cached?.transport === transport) {
|
|
73
|
+
return cached.consumer;
|
|
74
|
+
}
|
|
75
|
+
const pending = pendingByContext.get(dataContextId);
|
|
76
|
+
if (pending) {
|
|
77
|
+
return pending;
|
|
78
|
+
}
|
|
79
|
+
const loadPromise = loadConsumer(transport, dataContextId);
|
|
80
|
+
pendingByContext.set(dataContextId, loadPromise);
|
|
81
|
+
try {
|
|
82
|
+
return await loadPromise;
|
|
83
|
+
} finally {
|
|
84
|
+
if (pendingByContext.get(dataContextId) === loadPromise) {
|
|
85
|
+
pendingByContext.delete(dataContextId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { type IDoc, type ITool, observable } from "@peers-app/peers-sdk";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
|
+
import { AccessLevelField } from "../../components/access-level-field";
|
|
3
4
|
import { Checkbox } from "../../components/checkbox";
|
|
4
5
|
import { Input } from "../../components/input";
|
|
5
6
|
import { MarkdownEditorInline } from "../../components/markdown-editor/editor-inline";
|
|
6
7
|
|
|
8
|
+
/** Info tab for a tool, including its required access level. */
|
|
7
9
|
export const ToolInfo = (props: { tool: IDoc<ITool> }) => {
|
|
8
10
|
const { tool } = props;
|
|
9
11
|
|
|
@@ -40,6 +42,8 @@ export const ToolInfo = (props: { tool: IDoc<ITool> }) => {
|
|
|
40
42
|
title="Tool name"
|
|
41
43
|
/>
|
|
42
44
|
|
|
45
|
+
<AccessLevelField value={tool.qs.accessLevel} />
|
|
46
|
+
|
|
43
47
|
<div>
|
|
44
48
|
<label className="form-label small mt-2 me-2">Is Assistant Runner:</label>
|
|
45
49
|
<Checkbox className="form-check-input mt-2" checked={tool.qs.isAssistantRunner} />
|