hiloop-openclaw 0.1.0 → 0.3.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/index.d.ts +29 -31
- package/dist/index.js +31 -37
- package/dist/index.js.map +1 -1
- package/dist/src/api-client.d.ts +2 -2
- package/dist/src/api-client.js.map +1 -1
- package/dist/src/channel.d.ts +18 -49
- package/dist/src/channel.js +79 -158
- package/dist/src/channel.js.map +1 -1
- package/dist/src/config.d.ts +5 -5
- package/dist/src/config.js +2 -4
- package/dist/src/config.js.map +1 -1
- package/dist/src/tools.d.ts +7 -10
- package/dist/src/tools.js +154 -185
- package/dist/src/tools.js.map +1 -1
- package/openclaw.plugin.json +18 -0
- package/package.json +12 -8
package/dist/index.d.ts
CHANGED
|
@@ -1,32 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
config: {
|
|
10
|
-
channels: {
|
|
11
|
-
hiloop?: Record<string, unknown>;
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
|
-
gateway: Gateway & ToolRegistrar;
|
|
15
|
-
logger: {
|
|
16
|
-
info(msg: string, ...args: unknown[]): void;
|
|
17
|
-
warn(msg: string, ...args: unknown[]): void;
|
|
18
|
-
error(msg: string, ...args: unknown[]): void;
|
|
1
|
+
import { HiloopChannelConfig } from "./src/config.js";
|
|
2
|
+
import { outbound, inbound, login } from "./src/channel.js";
|
|
3
|
+
import { createTools } from "./src/tools.js";
|
|
4
|
+
declare function registerChannel(channel: {
|
|
5
|
+
id: string;
|
|
6
|
+
meta: {
|
|
7
|
+
label: string;
|
|
8
|
+
description: string;
|
|
19
9
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
};
|
|
10
|
+
capabilities: string[];
|
|
11
|
+
config: typeof HiloopChannelConfig;
|
|
12
|
+
outbound: typeof outbound;
|
|
13
|
+
inbound: typeof inbound;
|
|
14
|
+
login: typeof login;
|
|
15
|
+
tools?: ReturnType<typeof createTools>;
|
|
16
|
+
}): void;
|
|
17
|
+
declare function registerTool(tool: {
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
parameters: unknown;
|
|
21
|
+
execute: (params: Record<string, unknown>, ctx: unknown) => Promise<unknown>;
|
|
22
|
+
}): void;
|
|
23
|
+
export { HiloopChannelConfig } from "./src/config.js";
|
|
24
|
+
export { HiloopApiClient } from "./src/api-client.js";
|
|
25
|
+
export { outbound, inbound, login } from "./src/channel.js";
|
|
26
|
+
export { createTools } from "./src/tools.js";
|
|
27
|
+
export default function setup(api: {
|
|
28
|
+
registerChannel: typeof registerChannel;
|
|
29
|
+
registerTool: typeof registerTool;
|
|
30
|
+
}): void;
|
package/dist/index.js
CHANGED
|
@@ -1,41 +1,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
export {
|
|
1
|
+
import { HiloopChannelConfig } from "./src/config.js";
|
|
2
|
+
import { outbound, inbound, login } from "./src/channel.js";
|
|
3
|
+
import { createTools } from "./src/tools.js";
|
|
4
|
+
// Re-export for programmatic use
|
|
5
|
+
export { HiloopChannelConfig } from "./src/config.js";
|
|
6
6
|
export { HiloopApiClient } from "./src/api-client.js";
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const rawConfig = context.config.channels.hiloop;
|
|
18
|
-
if (!rawConfig) {
|
|
19
|
-
throw new Error("[hiloop] Missing channel config. Add channels.hiloop to your openclaw.json.");
|
|
20
|
-
}
|
|
21
|
-
const config = HiloopConfigSchema.parse(rawConfig);
|
|
22
|
-
const client = new HiloopApiClient(config);
|
|
23
|
-
// Set up channel monitor (human -> OpenClaw)
|
|
24
|
-
const monitor = new HiloopChannelMonitor(client, config, context.gateway);
|
|
25
|
-
// Set up channel sender (OpenClaw -> human)
|
|
26
|
-
const sender = new HiloopChannelSender(client, config);
|
|
27
|
-
// Register Hiloop-specific tools
|
|
28
|
-
registerHiloopTools(context.gateway, client, config);
|
|
29
|
-
// Start polling for inbound messages
|
|
30
|
-
monitor.start();
|
|
31
|
-
context.logger.info(`[hiloop] Channel active, polling every ${config.pollIntervalMs}ms`);
|
|
32
|
-
return {
|
|
33
|
-
monitor,
|
|
34
|
-
sender,
|
|
35
|
-
shutdown: () => {
|
|
36
|
-
monitor.stop();
|
|
37
|
-
context.logger.info("[hiloop] Channel stopped");
|
|
7
|
+
export { outbound, inbound, login } from "./src/channel.js";
|
|
8
|
+
export { createTools } from "./src/tools.js";
|
|
9
|
+
// OpenClaw plugin entry point
|
|
10
|
+
// Called by OpenClaw gateway when the plugin is loaded
|
|
11
|
+
export default function setup(api) {
|
|
12
|
+
api.registerChannel({
|
|
13
|
+
id: "hiloop",
|
|
14
|
+
meta: {
|
|
15
|
+
label: "Hiloop",
|
|
16
|
+
description: "Human-in-the-loop: approvals, chat, reviews, forms, live sessions, voice.",
|
|
38
17
|
},
|
|
39
|
-
|
|
18
|
+
capabilities: ["dm"],
|
|
19
|
+
config: HiloopChannelConfig,
|
|
20
|
+
outbound,
|
|
21
|
+
inbound,
|
|
22
|
+
login,
|
|
23
|
+
});
|
|
24
|
+
// Register all Hiloop tools so the agent can use them directly
|
|
25
|
+
// Config is resolved at runtime from channels.hiloop
|
|
26
|
+
const defaultCfg = HiloopChannelConfig.parse({
|
|
27
|
+
apiKey: "hlp_placeholder",
|
|
28
|
+
});
|
|
29
|
+
// Tools are registered lazily -- OpenClaw injects resolved config at call time
|
|
30
|
+
const tools = createTools(defaultCfg);
|
|
31
|
+
for (const tool of tools) {
|
|
32
|
+
api.registerTool(tool);
|
|
33
|
+
}
|
|
40
34
|
}
|
|
41
35
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAqB7C,iCAAiC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,8BAA8B;AAC9B,uDAAuD;AACvD,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,GAG7B;IACC,GAAG,CAAC,eAAe,CAAC;QAClB,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE;YACJ,KAAK,EAAE,QAAQ;YACf,WAAW,EACT,2EAA2E;SAC9E;QACD,YAAY,EAAE,CAAC,IAAI,CAAC;QACpB,MAAM,EAAE,mBAAmB;QAC3B,QAAQ;QACR,OAAO;QACP,KAAK;KACN,CAAC,CAAC;IAEH,+DAA+D;IAC/D,qDAAqD;IACrD,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC;QAC3C,MAAM,EAAE,iBAAiB;KAC1B,CAAC,CAAC;IAEH,+EAA+E;IAC/E,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
|
package/dist/src/api-client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HiloopChannelConfig } from "./config.js";
|
|
2
2
|
export interface CreateInteractionParams {
|
|
3
3
|
type: "approval" | "chat" | "review" | "form" | "notification" | "live_session" | "voice_call" | "payment" | "scheduled_call";
|
|
4
4
|
encryptedTitle: string;
|
|
@@ -52,7 +52,7 @@ export interface QuotaResponse {
|
|
|
52
52
|
export declare class HiloopApiClient {
|
|
53
53
|
private baseUrl;
|
|
54
54
|
private apiKey;
|
|
55
|
-
constructor(config:
|
|
55
|
+
constructor(config: HiloopChannelConfig);
|
|
56
56
|
private apiFetch;
|
|
57
57
|
createInteraction(params: CreateInteractionParams): Promise<Interaction>;
|
|
58
58
|
getInteraction(id: string): Promise<Interaction>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/api-client.ts"],"names":[],"mappings":"AAmEA,MAAM,OAAO,eAAe;IAClB,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB,YAAY,
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/src/channel.d.ts
CHANGED
|
@@ -1,52 +1,21 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
chatType: "dm" | "group";
|
|
6
|
-
sender: {
|
|
7
|
-
id: string;
|
|
8
|
-
name: string;
|
|
9
|
-
};
|
|
10
|
-
content: string;
|
|
11
|
-
threadId: string;
|
|
12
|
-
timestamp: string;
|
|
1
|
+
import type { HiloopChannelConfig } from "./config.js";
|
|
2
|
+
export interface OutboundMessage {
|
|
3
|
+
text: string;
|
|
4
|
+
threadId?: string;
|
|
13
5
|
metadata?: Record<string, unknown>;
|
|
14
6
|
}
|
|
15
|
-
export interface
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
export interface Gateway {
|
|
24
|
-
handleChannelMessage(envelope: MessageEnvelope): Promise<void>;
|
|
25
|
-
}
|
|
26
|
-
export declare class HiloopChannelMonitor {
|
|
27
|
-
private client;
|
|
28
|
-
private config;
|
|
29
|
-
private gateway;
|
|
30
|
-
private deliveredInteractions;
|
|
31
|
-
private lastMessageIds;
|
|
32
|
-
private pollTimer;
|
|
33
|
-
constructor(client: HiloopApiClient, config: HiloopConfig, gateway: Gateway);
|
|
34
|
-
start(): void;
|
|
35
|
-
stop(): void;
|
|
36
|
-
private poll;
|
|
37
|
-
private deliverInteraction;
|
|
38
|
-
private checkNewMessages;
|
|
39
|
-
private filterNewMessages;
|
|
40
|
-
}
|
|
41
|
-
export declare class HiloopChannelSender {
|
|
42
|
-
private client;
|
|
43
|
-
private config;
|
|
44
|
-
private threadToInteraction;
|
|
45
|
-
constructor(client: HiloopApiClient, config: HiloopConfig);
|
|
46
|
-
/** Map an existing thread to a Hiloop interaction */
|
|
47
|
-
trackThread(threadId: string, interactionId: string): void;
|
|
48
|
-
send(threadId: string, content: string): Promise<{
|
|
49
|
-
interactionId: string;
|
|
50
|
-
}>;
|
|
51
|
-
getStatus(): Promise<ChannelStatusReport>;
|
|
7
|
+
export interface MessageEnvelope {
|
|
8
|
+
channelId: string;
|
|
9
|
+
senderId: string;
|
|
10
|
+
senderName?: string;
|
|
11
|
+
text: string;
|
|
12
|
+
threadId?: string;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
metadata?: Record<string, unknown>;
|
|
52
15
|
}
|
|
16
|
+
type EmitFn = (msg: MessageEnvelope) => void;
|
|
17
|
+
type UnsubscribeFn = () => void;
|
|
18
|
+
export declare function outbound(msg: OutboundMessage, cfg: HiloopChannelConfig): Promise<void>;
|
|
19
|
+
export declare function inbound(cfg: HiloopChannelConfig, emit: EmitFn): Promise<UnsubscribeFn>;
|
|
20
|
+
export declare function login(cfg: HiloopChannelConfig): Promise<void>;
|
|
21
|
+
export {};
|
package/dist/src/channel.js
CHANGED
|
@@ -1,168 +1,89 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { HiloopApiClient } from "./api-client.js";
|
|
2
|
+
// Track threadId -> interactionId mapping
|
|
3
|
+
const threadMap = new Map();
|
|
4
|
+
// Track delivered message IDs to avoid duplicates
|
|
5
|
+
const deliveredMessages = new Set();
|
|
6
|
+
const deliveredInteractions = new Set();
|
|
7
|
+
export async function outbound(msg, cfg) {
|
|
8
|
+
const client = new HiloopApiClient(cfg);
|
|
9
|
+
const threadId = msg.threadId || `oc_${Date.now()}`;
|
|
10
|
+
const existingId = threadMap.get(threadId);
|
|
11
|
+
if (existingId) {
|
|
12
|
+
await client.sendMessage(existingId, msg.text);
|
|
12
13
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (this.pollTimer) {
|
|
22
|
-
clearInterval(this.pollTimer);
|
|
23
|
-
this.pollTimer = null;
|
|
24
|
-
}
|
|
14
|
+
else {
|
|
15
|
+
const interaction = await client.createInteraction({
|
|
16
|
+
type: "chat",
|
|
17
|
+
encryptedTitle: msg.text.slice(0, 100),
|
|
18
|
+
encryptedDescription: msg.text,
|
|
19
|
+
priority: cfg.defaultPriority,
|
|
20
|
+
});
|
|
21
|
+
threadMap.set(threadId, interaction.id);
|
|
25
22
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
23
|
+
}
|
|
24
|
+
export async function inbound(cfg, emit) {
|
|
25
|
+
const client = new HiloopApiClient(cfg);
|
|
26
|
+
let running = true;
|
|
27
|
+
const poll = async () => {
|
|
28
|
+
while (running) {
|
|
29
|
+
try {
|
|
30
|
+
// Check responded interactions (approvals, reviews, etc.)
|
|
31
|
+
const { interactions } = await client.listInteractions({
|
|
32
|
+
status: "responded",
|
|
33
|
+
});
|
|
34
|
+
for (const ix of interactions) {
|
|
35
|
+
if (!deliveredInteractions.has(ix.id)) {
|
|
36
|
+
deliveredInteractions.add(ix.id);
|
|
37
|
+
emit({
|
|
38
|
+
channelId: "hiloop",
|
|
39
|
+
senderId: ix.respondedBy || "human",
|
|
40
|
+
text: ix.encryptedResponse || `[${ix.type} responded]`,
|
|
41
|
+
threadId: ix.id,
|
|
42
|
+
timestamp: Date.parse(ix.respondedAt || ix.updatedAt),
|
|
43
|
+
metadata: {
|
|
44
|
+
interactionType: ix.type,
|
|
45
|
+
status: ix.status,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
36
49
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const envelope = {
|
|
59
|
-
channel: "hiloop",
|
|
60
|
-
chatType: "dm",
|
|
61
|
-
sender: {
|
|
62
|
-
id: interaction.respondedBy || "unknown",
|
|
63
|
-
name: interaction.respondedBy || "Human",
|
|
64
|
-
},
|
|
65
|
-
content: interaction.encryptedResponse || "[responded]",
|
|
66
|
-
threadId: interaction.id,
|
|
67
|
-
timestamp: interaction.respondedAt || interaction.updatedAt,
|
|
68
|
-
metadata: {
|
|
69
|
-
interactionType: interaction.type,
|
|
70
|
-
status: interaction.status,
|
|
71
|
-
priority: interaction.priority,
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
await this.gateway.handleChannelMessage(envelope);
|
|
75
|
-
}
|
|
76
|
-
async checkNewMessages(interaction) {
|
|
77
|
-
try {
|
|
78
|
-
const { messages } = await this.client.listMessages(interaction.id);
|
|
79
|
-
const lastKnown = this.lastMessageIds.get(interaction.id);
|
|
80
|
-
const newMessages = this.filterNewMessages(messages, lastKnown);
|
|
81
|
-
for (const msg of newMessages) {
|
|
82
|
-
if (msg.sender === "human") {
|
|
83
|
-
const envelope = {
|
|
84
|
-
channel: "hiloop",
|
|
85
|
-
chatType: "dm",
|
|
86
|
-
sender: {
|
|
87
|
-
id: msg.senderId || "unknown",
|
|
88
|
-
name: msg.senderName || "Human",
|
|
89
|
-
},
|
|
90
|
-
content: msg.encryptedContent,
|
|
91
|
-
threadId: interaction.id,
|
|
92
|
-
timestamp: msg.createdAt,
|
|
93
|
-
metadata: {
|
|
94
|
-
messageId: msg.id,
|
|
95
|
-
interactionType: interaction.type,
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
await this.gateway.handleChannelMessage(envelope);
|
|
50
|
+
// Check new messages on active chat interactions
|
|
51
|
+
const chats = await client.listInteractions({
|
|
52
|
+
status: "assigned",
|
|
53
|
+
type: "chat",
|
|
54
|
+
});
|
|
55
|
+
for (const chat of chats.interactions) {
|
|
56
|
+
const { messages } = await client.listMessages(chat.id);
|
|
57
|
+
for (const msg of messages) {
|
|
58
|
+
if (msg.sender === "human" && !deliveredMessages.has(msg.id)) {
|
|
59
|
+
deliveredMessages.add(msg.id);
|
|
60
|
+
emit({
|
|
61
|
+
channelId: "hiloop",
|
|
62
|
+
senderId: msg.senderId || "human",
|
|
63
|
+
senderName: msg.senderName,
|
|
64
|
+
text: msg.encryptedContent,
|
|
65
|
+
threadId: chat.id,
|
|
66
|
+
timestamp: Date.parse(msg.createdAt),
|
|
67
|
+
metadata: { messageId: msg.id },
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
99
71
|
}
|
|
100
72
|
}
|
|
101
|
-
|
|
102
|
-
|
|
73
|
+
catch (err) {
|
|
74
|
+
console.error("[hiloop] poll error:", err);
|
|
103
75
|
}
|
|
76
|
+
await new Promise((r) => setTimeout(r, cfg.pollIntervalMs));
|
|
104
77
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
return messages;
|
|
112
|
-
const idx = messages.findIndex((m) => m.id === lastKnownId);
|
|
113
|
-
if (idx === -1)
|
|
114
|
-
return messages;
|
|
115
|
-
return messages.slice(idx + 1);
|
|
116
|
-
}
|
|
78
|
+
};
|
|
79
|
+
// Start polling in background
|
|
80
|
+
poll();
|
|
81
|
+
return () => {
|
|
82
|
+
running = false;
|
|
83
|
+
};
|
|
117
84
|
}
|
|
118
|
-
export
|
|
119
|
-
client;
|
|
120
|
-
|
|
121
|
-
// Maps OpenClaw threadId -> Hiloop interactionId
|
|
122
|
-
threadToInteraction = new Map();
|
|
123
|
-
constructor(client, config) {
|
|
124
|
-
this.client = client;
|
|
125
|
-
this.config = config;
|
|
126
|
-
}
|
|
127
|
-
/** Map an existing thread to a Hiloop interaction */
|
|
128
|
-
trackThread(threadId, interactionId) {
|
|
129
|
-
this.threadToInteraction.set(threadId, interactionId);
|
|
130
|
-
}
|
|
131
|
-
async send(threadId, content) {
|
|
132
|
-
const existingId = this.threadToInteraction.get(threadId);
|
|
133
|
-
if (existingId) {
|
|
134
|
-
// Send a message on the existing interaction
|
|
135
|
-
await this.client.sendMessage(existingId, content);
|
|
136
|
-
return { interactionId: existingId };
|
|
137
|
-
}
|
|
138
|
-
// Create a new chat interaction
|
|
139
|
-
const interaction = await this.client.createInteraction({
|
|
140
|
-
type: "chat",
|
|
141
|
-
encryptedTitle: content.slice(0, 100),
|
|
142
|
-
encryptedDescription: content,
|
|
143
|
-
priority: this.config.defaultPriority,
|
|
144
|
-
});
|
|
145
|
-
this.threadToInteraction.set(threadId, interaction.id);
|
|
146
|
-
return { interactionId: interaction.id };
|
|
147
|
-
}
|
|
148
|
-
async getStatus() {
|
|
149
|
-
try {
|
|
150
|
-
const quota = await this.client.checkQuota();
|
|
151
|
-
return {
|
|
152
|
-
connected: true,
|
|
153
|
-
channel: "hiloop",
|
|
154
|
-
account: quota.plan,
|
|
155
|
-
quotaUsed: quota.used,
|
|
156
|
-
quotaLimit: quota.limit,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
catch (err) {
|
|
160
|
-
return {
|
|
161
|
-
connected: false,
|
|
162
|
-
channel: "hiloop",
|
|
163
|
-
error: err instanceof Error ? err.message : String(err),
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
}
|
|
85
|
+
export async function login(cfg) {
|
|
86
|
+
const client = new HiloopApiClient(cfg);
|
|
87
|
+
await client.checkQuota(); // validates credentials
|
|
167
88
|
}
|
|
168
89
|
//# sourceMappingURL=channel.js.map
|
package/dist/src/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/channel.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const HiloopChannelConfig: z.ZodObject<{
|
|
3
3
|
apiKey: z.ZodString;
|
|
4
4
|
baseUrl: z.ZodDefault<z.ZodString>;
|
|
5
5
|
pollIntervalMs: z.ZodDefault<z.ZodNumber>;
|
|
6
6
|
defaultPriority: z.ZodDefault<z.ZodEnum<["critical", "high", "normal", "low"]>>;
|
|
7
|
-
|
|
7
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
8
8
|
}, "strip", z.ZodTypeAny, {
|
|
9
9
|
apiKey: string;
|
|
10
10
|
baseUrl: string;
|
|
11
11
|
pollIntervalMs: number;
|
|
12
12
|
defaultPriority: "critical" | "high" | "normal" | "low";
|
|
13
|
-
|
|
13
|
+
enabled: boolean;
|
|
14
14
|
}, {
|
|
15
15
|
apiKey: string;
|
|
16
16
|
baseUrl?: string | undefined;
|
|
17
17
|
pollIntervalMs?: number | undefined;
|
|
18
18
|
defaultPriority?: "critical" | "high" | "normal" | "low" | undefined;
|
|
19
|
-
|
|
19
|
+
enabled?: boolean | undefined;
|
|
20
20
|
}>;
|
|
21
|
-
export type
|
|
21
|
+
export type HiloopChannelConfig = z.infer<typeof HiloopChannelConfig>;
|
package/dist/src/config.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export const
|
|
2
|
+
export const HiloopChannelConfig = z.object({
|
|
3
3
|
apiKey: z
|
|
4
4
|
.string()
|
|
5
5
|
.startsWith("hlp_", "API key must start with hlp_"),
|
|
@@ -16,8 +16,6 @@ export const HiloopConfigSchema = z.object({
|
|
|
16
16
|
defaultPriority: z
|
|
17
17
|
.enum(["critical", "high", "normal", "low"])
|
|
18
18
|
.default("normal"),
|
|
19
|
-
|
|
20
|
-
.enum(["pairing", "allowlist", "open"])
|
|
21
|
-
.default("pairing"),
|
|
19
|
+
enabled: z.boolean().default(true),
|
|
22
20
|
});
|
|
23
21
|
//# sourceMappingURL=config.js.map
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,UAAU,CAAC,MAAM,EAAE,8BAA8B,CAAC;IACrD,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,OAAO,CAAC,yBAAyB,CAAC;IACrC,cAAc,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,GAAG,CAAC;SACR,GAAG,CAAC,MAAM,CAAC;SACX,OAAO,CAAC,IAAI,CAAC;IAChB,eAAe,EAAE,CAAC;SACf,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;SAC3C,OAAO,CAAC,QAAQ,CAAC;IACpB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CACnC,CAAC,CAAC"}
|
package/dist/src/tools.d.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
schema: z.ZodObject<z.ZodRawShape>;
|
|
9
|
-
handler: (params: Record<string, unknown>) => Promise<unknown>;
|
|
10
|
-
}): void;
|
|
2
|
+
import type { HiloopChannelConfig } from "./config.js";
|
|
3
|
+
export interface ToolDefinition {
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
parameters: z.ZodType;
|
|
7
|
+
execute: (params: Record<string, unknown>, ctx: unknown) => Promise<unknown>;
|
|
11
8
|
}
|
|
12
|
-
export declare function
|
|
9
|
+
export declare function createTools(cfg: HiloopChannelConfig): ToolDefinition[];
|
package/dist/src/tools.js
CHANGED
|
@@ -1,197 +1,166 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
.optional()
|
|
20
|
-
.describe("
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
deadlineMinutes: params.deadlineMinutes,
|
|
34
|
-
});
|
|
35
|
-
return { interactionId: interaction.id, status: interaction.status };
|
|
2
|
+
import { HiloopApiClient } from "./api-client.js";
|
|
3
|
+
export function createTools(cfg) {
|
|
4
|
+
const client = new HiloopApiClient(cfg);
|
|
5
|
+
return [
|
|
6
|
+
{
|
|
7
|
+
name: "hiloop_request_approval",
|
|
8
|
+
description: "Request approval from a human via Hiloop. Use when you need permission " +
|
|
9
|
+
"to proceed with a dangerous or irreversible action.",
|
|
10
|
+
parameters: z.object({
|
|
11
|
+
title: z.string().describe("What you need approved"),
|
|
12
|
+
options: z
|
|
13
|
+
.array(z.string())
|
|
14
|
+
.default(["Approve", "Deny"])
|
|
15
|
+
.describe("Choices for the human"),
|
|
16
|
+
priority: z
|
|
17
|
+
.enum(["critical", "high", "normal", "low"])
|
|
18
|
+
.default(cfg.defaultPriority),
|
|
19
|
+
deadlineMinutes: z.number().optional().describe("Deadline in minutes"),
|
|
20
|
+
description: z.string().optional().describe("Additional context"),
|
|
21
|
+
}),
|
|
22
|
+
execute: async (params) => {
|
|
23
|
+
const ix = await client.createInteraction({
|
|
24
|
+
type: "approval",
|
|
25
|
+
encryptedTitle: params.title,
|
|
26
|
+
encryptedDescription: params.description,
|
|
27
|
+
encryptedOptions: JSON.stringify(params.options),
|
|
28
|
+
priority: params.priority,
|
|
29
|
+
deadlineMinutes: params.deadlineMinutes,
|
|
30
|
+
});
|
|
31
|
+
return { interactionId: ix.id, status: ix.status };
|
|
32
|
+
},
|
|
36
33
|
},
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
encryptedDescription: params.description,
|
|
57
|
-
priority: params.priority || config.defaultPriority,
|
|
58
|
-
deadlineMinutes: params.deadlineMinutes,
|
|
59
|
-
});
|
|
60
|
-
return { interactionId: interaction.id, status: interaction.status };
|
|
34
|
+
{
|
|
35
|
+
name: "hiloop_request_review",
|
|
36
|
+
description: "Request a human review of content, code, or a document.",
|
|
37
|
+
parameters: z.object({
|
|
38
|
+
title: z.string().describe("What needs reviewing"),
|
|
39
|
+
description: z.string().optional().describe("Content to review"),
|
|
40
|
+
priority: z.enum(["critical", "high", "normal", "low"]).default(cfg.defaultPriority),
|
|
41
|
+
deadlineMinutes: z.number().optional(),
|
|
42
|
+
}),
|
|
43
|
+
execute: async (params) => {
|
|
44
|
+
const ix = await client.createInteraction({
|
|
45
|
+
type: "review",
|
|
46
|
+
encryptedTitle: params.title,
|
|
47
|
+
encryptedDescription: params.description,
|
|
48
|
+
priority: params.priority,
|
|
49
|
+
deadlineMinutes: params.deadlineMinutes,
|
|
50
|
+
});
|
|
51
|
+
return { interactionId: ix.id, status: ix.status };
|
|
52
|
+
},
|
|
61
53
|
},
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
priority: params.priority || config.defaultPriority,
|
|
82
|
-
deadlineMinutes: params.deadlineMinutes,
|
|
83
|
-
});
|
|
84
|
-
return { interactionId: interaction.id, status: interaction.status };
|
|
54
|
+
{
|
|
55
|
+
name: "hiloop_request_form",
|
|
56
|
+
description: "Send a form to a human to collect structured data.",
|
|
57
|
+
parameters: z.object({
|
|
58
|
+
title: z.string().describe("Form title"),
|
|
59
|
+
formSchema: z.string().describe("JSON schema for the form fields"),
|
|
60
|
+
priority: z.enum(["critical", "high", "normal", "low"]).default(cfg.defaultPriority),
|
|
61
|
+
deadlineMinutes: z.number().optional(),
|
|
62
|
+
}),
|
|
63
|
+
execute: async (params) => {
|
|
64
|
+
const ix = await client.createInteraction({
|
|
65
|
+
type: "form",
|
|
66
|
+
encryptedTitle: params.title,
|
|
67
|
+
encryptedFormSchema: params.formSchema,
|
|
68
|
+
priority: params.priority,
|
|
69
|
+
deadlineMinutes: params.deadlineMinutes,
|
|
70
|
+
});
|
|
71
|
+
return { interactionId: ix.id, status: ix.status };
|
|
72
|
+
},
|
|
85
73
|
},
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
encryptedTitle: params.title,
|
|
104
|
-
encryptedDescription: params.description,
|
|
105
|
-
priority: params.priority || config.defaultPriority,
|
|
106
|
-
});
|
|
107
|
-
return { interactionId: interaction.id, status: interaction.status };
|
|
74
|
+
{
|
|
75
|
+
name: "hiloop_send_notification",
|
|
76
|
+
description: "Send a fire-and-forget notification to a human.",
|
|
77
|
+
parameters: z.object({
|
|
78
|
+
title: z.string().describe("Notification title"),
|
|
79
|
+
description: z.string().optional().describe("Notification body"),
|
|
80
|
+
priority: z.enum(["critical", "high", "normal", "low"]).default(cfg.defaultPriority),
|
|
81
|
+
}),
|
|
82
|
+
execute: async (params) => {
|
|
83
|
+
const ix = await client.createInteraction({
|
|
84
|
+
type: "notification",
|
|
85
|
+
encryptedTitle: params.title,
|
|
86
|
+
encryptedDescription: params.description,
|
|
87
|
+
priority: params.priority,
|
|
88
|
+
});
|
|
89
|
+
return { interactionId: ix.id, status: ix.status };
|
|
90
|
+
},
|
|
108
91
|
},
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
encryptedTitle: params.title,
|
|
127
|
-
encryptedDescription: params.description,
|
|
128
|
-
priority: params.priority || config.defaultPriority,
|
|
129
|
-
});
|
|
130
|
-
return { interactionId: interaction.id, status: interaction.status };
|
|
92
|
+
{
|
|
93
|
+
name: "hiloop_start_live_session",
|
|
94
|
+
description: "Start a live session for real-time screen sharing or collaboration.",
|
|
95
|
+
parameters: z.object({
|
|
96
|
+
title: z.string().describe("Session title"),
|
|
97
|
+
description: z.string().optional(),
|
|
98
|
+
priority: z.enum(["critical", "high", "normal", "low"]).default(cfg.defaultPriority),
|
|
99
|
+
}),
|
|
100
|
+
execute: async (params) => {
|
|
101
|
+
const ix = await client.createInteraction({
|
|
102
|
+
type: "live_session",
|
|
103
|
+
encryptedTitle: params.title,
|
|
104
|
+
encryptedDescription: params.description,
|
|
105
|
+
priority: params.priority,
|
|
106
|
+
});
|
|
107
|
+
return { interactionId: ix.id, status: ix.status };
|
|
108
|
+
},
|
|
131
109
|
},
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
};
|
|
110
|
+
{
|
|
111
|
+
name: "hiloop_check_status",
|
|
112
|
+
description: "Check the current status of a Hiloop interaction.",
|
|
113
|
+
parameters: z.object({
|
|
114
|
+
interactionId: z.string().describe("The interaction ID"),
|
|
115
|
+
}),
|
|
116
|
+
execute: async (params) => {
|
|
117
|
+
const ix = await client.getInteraction(params.interactionId);
|
|
118
|
+
return {
|
|
119
|
+
id: ix.id,
|
|
120
|
+
type: ix.type,
|
|
121
|
+
status: ix.status,
|
|
122
|
+
priority: ix.priority,
|
|
123
|
+
respondedBy: ix.respondedBy,
|
|
124
|
+
encryptedResponse: ix.encryptedResponse,
|
|
125
|
+
};
|
|
126
|
+
},
|
|
150
127
|
},
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
id: interaction.id,
|
|
168
|
-
status: interaction.status,
|
|
169
|
-
encryptedResponse: interaction.encryptedResponse,
|
|
170
|
-
respondedBy: interaction.respondedBy,
|
|
171
|
-
respondedAt: interaction.respondedAt,
|
|
172
|
-
};
|
|
128
|
+
{
|
|
129
|
+
name: "hiloop_await_response",
|
|
130
|
+
description: "Wait for a human to respond to a Hiloop interaction (up to 30s).",
|
|
131
|
+
parameters: z.object({
|
|
132
|
+
interactionId: z.string().describe("The interaction ID"),
|
|
133
|
+
timeout: z.number().min(1).max(30).default(30).describe("Timeout in seconds"),
|
|
134
|
+
}),
|
|
135
|
+
execute: async (params) => {
|
|
136
|
+
const ix = await client.awaitResponse(params.interactionId, params.timeout);
|
|
137
|
+
return {
|
|
138
|
+
id: ix.id,
|
|
139
|
+
status: ix.status,
|
|
140
|
+
encryptedResponse: ix.encryptedResponse,
|
|
141
|
+
respondedBy: ix.respondedBy,
|
|
142
|
+
};
|
|
143
|
+
},
|
|
173
144
|
},
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
const interaction = await client.cancelInteraction(params.interactionId);
|
|
185
|
-
return { id: interaction.id, status: interaction.status };
|
|
145
|
+
{
|
|
146
|
+
name: "hiloop_cancel_request",
|
|
147
|
+
description: "Cancel a pending Hiloop interaction.",
|
|
148
|
+
parameters: z.object({
|
|
149
|
+
interactionId: z.string().describe("The interaction ID to cancel"),
|
|
150
|
+
}),
|
|
151
|
+
execute: async (params) => {
|
|
152
|
+
const ix = await client.cancelInteraction(params.interactionId);
|
|
153
|
+
return { id: ix.id, status: ix.status };
|
|
154
|
+
},
|
|
186
155
|
},
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
156
|
+
{
|
|
157
|
+
name: "hiloop_check_quota",
|
|
158
|
+
description: "Check your Hiloop usage quota.",
|
|
159
|
+
parameters: z.object({}),
|
|
160
|
+
execute: async () => {
|
|
161
|
+
return await client.checkQuota();
|
|
162
|
+
},
|
|
194
163
|
},
|
|
195
|
-
|
|
164
|
+
];
|
|
196
165
|
}
|
|
197
166
|
//# sourceMappingURL=tools.js.map
|
package/dist/src/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hiloop-openclaw",
|
|
3
|
+
"openclaw": {
|
|
4
|
+
"extensions": ["./dist/index.js"],
|
|
5
|
+
"channel": {
|
|
6
|
+
"id": "hiloop",
|
|
7
|
+
"label": "Hiloop",
|
|
8
|
+
"selectionLabel": "Hiloop (Human-in-the-loop)",
|
|
9
|
+
"docsPath": "/channels/hiloop",
|
|
10
|
+
"blurb": "Human-in-the-loop: approvals, chat, reviews, forms, live sessions, voice.",
|
|
11
|
+
"order": 80,
|
|
12
|
+
"aliases": ["hi-loop"]
|
|
13
|
+
},
|
|
14
|
+
"install": {
|
|
15
|
+
"npmSpec": "hiloop-openclaw@^0.2.0"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
package/package.json
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hiloop-openclaw",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Hiloop channel plugin for OpenClaw - human-in-the-loop for AI agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
8
|
"files": [
|
|
9
9
|
"dist",
|
|
10
|
-
"src/skill.md"
|
|
10
|
+
"src/skill.md",
|
|
11
|
+
"openclaw.plugin.json"
|
|
11
12
|
],
|
|
12
13
|
"scripts": {
|
|
13
14
|
"build": "tsc",
|
|
@@ -15,11 +16,17 @@
|
|
|
15
16
|
"dev": "tsc --watch"
|
|
16
17
|
},
|
|
17
18
|
"openclaw": {
|
|
18
|
-
"extensions": ["
|
|
19
|
+
"extensions": ["./dist/index.js"],
|
|
19
20
|
"channel": {
|
|
20
21
|
"id": "hiloop",
|
|
21
22
|
"label": "Hiloop",
|
|
22
|
-
"
|
|
23
|
+
"docsPath": "/channels/hiloop",
|
|
24
|
+
"blurb": "Human-in-the-loop: approvals, chat, reviews, forms, live sessions, voice.",
|
|
25
|
+
"order": 80,
|
|
26
|
+
"aliases": ["hi-loop"]
|
|
27
|
+
},
|
|
28
|
+
"install": {
|
|
29
|
+
"npmSpec": "hiloop-openclaw@^0.2.0"
|
|
23
30
|
}
|
|
24
31
|
},
|
|
25
32
|
"repository": {
|
|
@@ -37,10 +44,7 @@
|
|
|
37
44
|
"openclaw-channel",
|
|
38
45
|
"hiloop",
|
|
39
46
|
"human-in-the-loop",
|
|
40
|
-
"ai-agents"
|
|
41
|
-
"approval",
|
|
42
|
-
"review",
|
|
43
|
-
"chat"
|
|
47
|
+
"ai-agents"
|
|
44
48
|
],
|
|
45
49
|
"license": "MIT",
|
|
46
50
|
"engines": {
|