palmier 0.7.6 → 0.7.8
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/agents/agent.d.ts +3 -0
- package/dist/agents/agent.js +1 -1
- package/dist/agents/aider.d.ts +1 -0
- package/dist/agents/aider.js +1 -0
- package/dist/agents/claude.d.ts +1 -0
- package/dist/agents/claude.js +1 -0
- package/dist/agents/cline.d.ts +1 -0
- package/dist/agents/cline.js +1 -0
- package/dist/agents/codex.d.ts +1 -0
- package/dist/agents/codex.js +1 -0
- package/dist/agents/copilot.d.ts +1 -0
- package/dist/agents/copilot.js +1 -0
- package/dist/agents/cursor.d.ts +1 -0
- package/dist/agents/cursor.js +1 -0
- package/dist/agents/deepagents.d.ts +1 -0
- package/dist/agents/deepagents.js +1 -0
- package/dist/agents/droid.d.ts +1 -0
- package/dist/agents/droid.js +1 -0
- package/dist/agents/gemini.d.ts +1 -0
- package/dist/agents/gemini.js +1 -0
- package/dist/agents/goose.d.ts +1 -0
- package/dist/agents/goose.js +1 -0
- package/dist/agents/hermes.d.ts +1 -0
- package/dist/agents/hermes.js +1 -0
- package/dist/agents/kimi.d.ts +1 -0
- package/dist/agents/kimi.js +1 -0
- package/dist/agents/kiro.d.ts +1 -0
- package/dist/agents/kiro.js +1 -0
- package/dist/agents/openclaw.d.ts +1 -0
- package/dist/agents/openclaw.js +2 -2
- package/dist/agents/opencode.d.ts +1 -0
- package/dist/agents/opencode.js +1 -0
- package/dist/agents/qoder.d.ts +1 -0
- package/dist/agents/qoder.js +1 -0
- package/dist/agents/qwen.d.ts +1 -0
- package/dist/agents/qwen.js +1 -0
- package/dist/agents/shared-prompt.js +1 -1
- package/dist/commands/init.js +3 -2
- package/dist/commands/pair.js +3 -3
- package/dist/commands/run.js +4 -4
- package/dist/commands/serve.js +1 -1
- package/dist/config.js +2 -2
- package/dist/device-capabilities.d.ts +1 -1
- package/dist/events.js +1 -1
- package/dist/mcp-tools.js +79 -7
- package/dist/nats-client.d.ts +1 -1
- package/dist/nats-client.js +6 -3
- package/dist/pending-requests.d.ts +30 -8
- package/dist/pending-requests.js +28 -15
- package/dist/pwa/assets/index-8cTctVnD.js +120 -0
- package/dist/pwa/assets/index-CSUkBBsQ.css +1 -0
- package/dist/pwa/assets/{web-DnuoxUd4.js → web-BNr628AV.js} +1 -1
- package/dist/pwa/assets/{web-7raT3zOZ.js → web-DyQPewAi.js} +1 -1
- package/dist/pwa/index.html +2 -2
- package/dist/pwa/service-worker.js +1 -1
- package/dist/rpc-handler.js +12 -16
- package/dist/transports/http-transport.js +6 -3
- package/dist/types.d.ts +4 -1
- package/package.json +1 -1
- package/palmier-server/PRODUCTION.md +31 -28
- package/palmier-server/README.md +35 -5
- package/palmier-server/nats.conf +9 -5
- package/palmier-server/package.json +2 -1
- package/palmier-server/pnpm-lock.yaml +6 -0
- package/palmier-server/pwa/src/App.css +66 -0
- package/palmier-server/pwa/src/App.tsx +1 -0
- package/palmier-server/pwa/src/components/HostMenu.tsx +65 -2
- package/palmier-server/pwa/src/components/RunsView.tsx +48 -22
- package/palmier-server/pwa/src/components/SessionComposer.tsx +137 -0
- package/palmier-server/pwa/src/components/TabBar.tsx +17 -10
- package/palmier-server/pwa/src/components/TaskForm.tsx +11 -66
- package/palmier-server/pwa/src/components/TaskListView.tsx +17 -283
- package/palmier-server/pwa/src/constants.ts +1 -1
- package/palmier-server/pwa/src/contexts/HostConnectionContext.tsx +9 -5
- package/palmier-server/pwa/src/draftGuard.ts +24 -0
- package/palmier-server/pwa/src/pages/Dashboard.tsx +335 -12
- package/palmier-server/pwa/src/pages/PairHost.tsx +6 -3
- package/palmier-server/pwa/src/types.ts +1 -6
- package/palmier-server/server/package.json +3 -1
- package/palmier-server/server/src/index.ts +83 -2
- package/palmier-server/server/src/nats-jwt.ts +299 -0
- package/palmier-server/server/src/nats-setup.ts +48 -0
- package/palmier-server/server/src/nats.ts +12 -4
- package/palmier-server/server/src/routes/device.ts +24 -0
- package/palmier-server/server/src/routes/hosts.ts +13 -2
- package/palmier-server/spec.md +28 -14
- package/src/agents/agent.ts +5 -1
- package/src/agents/aider.ts +1 -0
- package/src/agents/claude.ts +1 -0
- package/src/agents/cline.ts +1 -0
- package/src/agents/codex.ts +1 -0
- package/src/agents/copilot.ts +1 -0
- package/src/agents/cursor.ts +1 -0
- package/src/agents/deepagents.ts +1 -0
- package/src/agents/droid.ts +1 -0
- package/src/agents/gemini.ts +1 -0
- package/src/agents/goose.ts +1 -0
- package/src/agents/hermes.ts +1 -0
- package/src/agents/kimi.ts +1 -0
- package/src/agents/kiro.ts +1 -0
- package/src/agents/openclaw.ts +2 -2
- package/src/agents/opencode.ts +1 -0
- package/src/agents/qoder.ts +1 -0
- package/src/agents/qwen.ts +1 -0
- package/src/agents/shared-prompt.ts +1 -1
- package/src/commands/init.ts +7 -5
- package/src/commands/pair.ts +3 -3
- package/src/commands/run.ts +4 -4
- package/src/commands/serve.ts +1 -1
- package/src/config.ts +2 -2
- package/src/device-capabilities.ts +1 -0
- package/src/events.ts +1 -1
- package/src/mcp-tools.ts +83 -7
- package/src/nats-client.ts +10 -3
- package/src/pending-requests.ts +47 -15
- package/src/rpc-handler.ts +13 -16
- package/src/transports/http-transport.ts +6 -3
- package/src/types.ts +4 -3
- package/test/agent-instructions.test.ts +10 -10
- package/test/pairing.test.ts +2 -2
- package/dist/pwa/assets/index-B-ByUHPS.css +0 -1
- package/dist/pwa/assets/index-uSwkmHBs.js +0 -118
package/dist/agents/agent.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface AgentTool {
|
|
|
22
22
|
/** Whether this agent supports permission overrides (e.g. --allowedTools).
|
|
23
23
|
* If false, the permissions section is omitted from agent instructions. */
|
|
24
24
|
supportsPermissions: boolean;
|
|
25
|
+
/** Whether this agent supports yolo mode (auto-approve all tools). */
|
|
26
|
+
supportsYolo: boolean;
|
|
25
27
|
/** Detect whether the agent CLI is available and perform any agent-specific
|
|
26
28
|
* initialization. Returns true if the agent was detected and initialized successfully. */
|
|
27
29
|
init(): Promise<boolean>;
|
|
@@ -30,6 +32,7 @@ export interface DetectedAgent {
|
|
|
30
32
|
key: string;
|
|
31
33
|
label: string;
|
|
32
34
|
supportsPermissions: boolean;
|
|
35
|
+
supportsYolo: boolean;
|
|
33
36
|
}
|
|
34
37
|
export declare function detectAgents(): Promise<DetectedAgent[]>;
|
|
35
38
|
export declare function getAgent(name: string): AgentTool;
|
package/dist/agents/agent.js
CHANGED
|
@@ -59,7 +59,7 @@ export async function detectAgents() {
|
|
|
59
59
|
const label = agentLabels[key] ?? key;
|
|
60
60
|
const ok = await agent.init();
|
|
61
61
|
if (ok)
|
|
62
|
-
detected.push({ key, label, supportsPermissions: agent.supportsPermissions });
|
|
62
|
+
detected.push({ key, label, supportsPermissions: agent.supportsPermissions, supportsYolo: agent.supportsYolo });
|
|
63
63
|
}
|
|
64
64
|
return detected;
|
|
65
65
|
}
|
package/dist/agents/aider.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class Aider implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/aider.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class Aider {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "aider", args: ["--message", prompt] };
|
|
8
9
|
}
|
package/dist/agents/claude.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class ClaudeAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/claude.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class ClaudeAgent {
|
|
5
5
|
supportsPermissions = true;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "claude", args: ["-p", prompt] };
|
|
8
9
|
}
|
package/dist/agents/cline.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class Cline implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/cline.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class Cline {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "cline ", args: ["--yolo", "-p", prompt] };
|
|
8
9
|
}
|
package/dist/agents/codex.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class CodexAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/codex.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class CodexAgent {
|
|
5
5
|
supportsPermissions = true;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "codex", args: ["exec", "--skip-git-repo-check", prompt] };
|
|
8
9
|
}
|
package/dist/agents/copilot.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class CopilotAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/copilot.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class CopilotAgent {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "copilot", args: ["-p", prompt] };
|
|
8
9
|
}
|
package/dist/agents/cursor.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class Cursor implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/cursor.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class Cursor {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "cursor", args: ["-p", prompt] };
|
|
8
9
|
}
|
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class DeepAgents implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class DeepAgents {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "deepagents", args: ["--non-interactive", prompt] };
|
|
8
9
|
}
|
package/dist/agents/droid.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class DroidAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/droid.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class DroidAgent {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "droid", args: ["exec", prompt] };
|
|
8
9
|
}
|
package/dist/agents/gemini.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class GeminiAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/gemini.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class GeminiAgent {
|
|
5
5
|
supportsPermissions = true;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "gemini", args: ["--prompt", prompt] };
|
|
8
9
|
}
|
package/dist/agents/goose.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class GooseAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/goose.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class GooseAgent {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "goose", args: ["run", "--text", prompt] };
|
|
8
9
|
}
|
package/dist/agents/hermes.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class Hermes implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/hermes.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class Hermes {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "hermes", args: ["chat", "-q", prompt] };
|
|
8
9
|
}
|
package/dist/agents/kimi.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class KimiAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/kimi.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class KimiAgent {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "kimi", args: ["-p", prompt] };
|
|
8
9
|
}
|
package/dist/agents/kiro.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class Kiro implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/kiro.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class Kiro {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "kiro-cli", args: ["--no-interactive", prompt] };
|
|
8
9
|
}
|
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class OpenClawAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/openclaw.js
CHANGED
|
@@ -2,12 +2,12 @@ import { execSync } from "child_process";
|
|
|
2
2
|
import { getAgentInstructions } from "./shared-prompt.js";
|
|
3
3
|
export class OpenClawAgent {
|
|
4
4
|
supportsPermissions = false;
|
|
5
|
+
supportsYolo = false;
|
|
5
6
|
getPromptCommandLine(prompt) {
|
|
6
7
|
return { command: "openclaw", args: ["agent", "--local", "--agent", "main", "--message", prompt] };
|
|
7
8
|
}
|
|
8
9
|
getTaskRunCommandLine(task, followupPrompt, extraPermissions) {
|
|
9
|
-
const
|
|
10
|
-
const prompt = followupPrompt ?? getAgentInstructions(task, yolo || !this.supportsPermissions);
|
|
10
|
+
const prompt = followupPrompt ?? getAgentInstructions(task, true);
|
|
11
11
|
// OpenClaw does not support stdin as prompt.
|
|
12
12
|
const args = ["agent", "--local", "--session-id", task.frontmatter.id, "--message", prompt];
|
|
13
13
|
return { command: "openclaw", args };
|
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class OpenCodeAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/opencode.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class OpenCodeAgent {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "opencode", args: ["run", prompt] };
|
|
8
9
|
}
|
package/dist/agents/qoder.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class Qoder implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/qoder.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class Qoder {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "qodercli", args: ["-p", prompt] };
|
|
8
9
|
}
|
package/dist/agents/qwen.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ParsedTask, RequiredPermission } from "../types.js";
|
|
|
2
2
|
import type { AgentTool, CommandLine } from "./agent.js";
|
|
3
3
|
export declare class QwenAgent implements AgentTool {
|
|
4
4
|
supportsPermissions: boolean;
|
|
5
|
+
supportsYolo: boolean;
|
|
5
6
|
getPromptCommandLine(prompt: string): CommandLine;
|
|
6
7
|
getTaskRunCommandLine(task: ParsedTask, followupPrompt?: string, extraPermissions?: RequiredPermission[] | "yolo"): CommandLine;
|
|
7
8
|
init(): Promise<boolean>;
|
package/dist/agents/qwen.js
CHANGED
|
@@ -3,6 +3,7 @@ import { getAgentInstructions } from "./shared-prompt.js";
|
|
|
3
3
|
import { SHELL } from "../platform/index.js";
|
|
4
4
|
export class QwenAgent {
|
|
5
5
|
supportsPermissions = false;
|
|
6
|
+
supportsYolo = true;
|
|
6
7
|
getPromptCommandLine(prompt) {
|
|
7
8
|
return { command: "qwen", args: ["-p", prompt] };
|
|
8
9
|
}
|
|
@@ -9,7 +9,7 @@ const AGENT_INSTRUCTIONS_TEMPLATE = fs.readFileSync(path.join(__dirname, "agent-
|
|
|
9
9
|
* Build the full agent prompt: instructions + endpoint docs + task description.
|
|
10
10
|
*/
|
|
11
11
|
export function getAgentInstructions(task, skipPermissions) {
|
|
12
|
-
const port = loadConfig().httpPort ??
|
|
12
|
+
const port = loadConfig().httpPort ?? 7256;
|
|
13
13
|
const taskDescription = task.frontmatter.user_prompt;
|
|
14
14
|
let instructions = AGENT_INSTRUCTIONS_TEMPLATE
|
|
15
15
|
.replace(/\{\{ENDPOINT_DOCS\}\}/g, generateEndpointDocs(port, task.frontmatter.id))
|
package/dist/commands/init.js
CHANGED
|
@@ -34,7 +34,7 @@ export async function initCommand() {
|
|
|
34
34
|
// LAN mode
|
|
35
35
|
const lanAnswer = await ask("Enable LAN access (direct HTTP from local network)? (y/N): ");
|
|
36
36
|
const lanEnabled = lanAnswer.trim().toLowerCase() === "y";
|
|
37
|
-
let httpPort =
|
|
37
|
+
let httpPort = 7256;
|
|
38
38
|
const portLabel = lanEnabled ? "HTTP port for local and LAN access" : "HTTP port for local access";
|
|
39
39
|
const portAnswer = await ask(`${portLabel} (default ${httpPort}): `);
|
|
40
40
|
const parsed = parseInt(portAnswer.trim(), 10);
|
|
@@ -98,7 +98,8 @@ export async function initCommand() {
|
|
|
98
98
|
projectRoot: process.cwd(),
|
|
99
99
|
natsUrl: registerResponse.natsUrl,
|
|
100
100
|
natsWsUrl: registerResponse.natsWsUrl,
|
|
101
|
-
|
|
101
|
+
natsJwt: registerResponse.natsJwt,
|
|
102
|
+
natsNkeySeed: registerResponse.natsNkeySeed,
|
|
102
103
|
agents,
|
|
103
104
|
httpPort,
|
|
104
105
|
lanEnabled,
|
package/dist/commands/pair.js
CHANGED
|
@@ -5,7 +5,7 @@ import { connectNats } from "../nats-client.js";
|
|
|
5
5
|
import { addClient } from "../client-store.js";
|
|
6
6
|
const CODE_CHARS = "ABCDEFGHJKMNPQRSTUVWXYZ23456789"; // no O/0/I/1/L
|
|
7
7
|
const CODE_LENGTH = 6;
|
|
8
|
-
export const PAIRING_EXPIRY_MS =
|
|
8
|
+
export const PAIRING_EXPIRY_MS = 60 * 1000; // 1 minute
|
|
9
9
|
export function generatePairingCode() {
|
|
10
10
|
const bytes = new Uint8Array(CODE_LENGTH);
|
|
11
11
|
crypto.getRandomValues(bytes);
|
|
@@ -56,7 +56,7 @@ function httpPairRegister(port, code) {
|
|
|
56
56
|
export async function pairCommand() {
|
|
57
57
|
const config = loadConfig();
|
|
58
58
|
const code = generatePairingCode();
|
|
59
|
-
const httpPort = config.httpPort ??
|
|
59
|
+
const httpPort = config.httpPort ?? 7256;
|
|
60
60
|
let paired = false;
|
|
61
61
|
function onPaired() {
|
|
62
62
|
paired = true;
|
|
@@ -69,7 +69,7 @@ export async function pairCommand() {
|
|
|
69
69
|
console.log("");
|
|
70
70
|
console.log(` ${code}`);
|
|
71
71
|
console.log("");
|
|
72
|
-
console.log("Code expires in
|
|
72
|
+
console.log("Code expires in 1 minute.");
|
|
73
73
|
// NATS pairing (server mode)
|
|
74
74
|
const nc = await connectNats(config);
|
|
75
75
|
const sc = StringCodec();
|
package/dist/commands/run.js
CHANGED
|
@@ -36,7 +36,7 @@ async function invokeAgentWithRetries(ctx, invokeTask) {
|
|
|
36
36
|
const { command, args, stdin, env: agentEnv } = ctx.agent.getTaskRunCommandLine(invokeTask, undefined, ctx.task.frontmatter.yolo_mode ? "yolo" : ctx.transientPermissions);
|
|
37
37
|
const result = await spawnCommand(command, args, {
|
|
38
38
|
cwd: getRunDir(ctx.taskDir, ctx.runId),
|
|
39
|
-
env: { ...ctx.guiEnv, ...agentEnv, PALMIER_RUN_DIR: getRunDir(ctx.taskDir, ctx.runId), PALMIER_HTTP_PORT: String(ctx.config.httpPort ??
|
|
39
|
+
env: { ...ctx.guiEnv, ...agentEnv, PALMIER_RUN_DIR: getRunDir(ctx.taskDir, ctx.runId), PALMIER_HTTP_PORT: String(ctx.config.httpPort ?? 7256) },
|
|
40
40
|
echoStdout: true,
|
|
41
41
|
resolveOnFailure: true,
|
|
42
42
|
stdin,
|
|
@@ -258,7 +258,7 @@ async function runCommandTriggeredMode(ctx) {
|
|
|
258
258
|
await publishHostEvent(ctx.nc, ctx.config.hostId, ctx.taskId, { event_type: "result-updated", run_id: ctx.runId });
|
|
259
259
|
const child = spawnStreamingCommand(commandStr, {
|
|
260
260
|
cwd: getRunDir(ctx.taskDir, ctx.runId),
|
|
261
|
-
env: { ...ctx.guiEnv, PALMIER_RUN_DIR: getRunDir(ctx.taskDir, ctx.runId), PALMIER_HTTP_PORT: String(ctx.config.httpPort ??
|
|
261
|
+
env: { ...ctx.guiEnv, PALMIER_RUN_DIR: getRunDir(ctx.taskDir, ctx.runId), PALMIER_HTTP_PORT: String(ctx.config.httpPort ?? 7256) },
|
|
262
262
|
});
|
|
263
263
|
let linesProcessed = 0;
|
|
264
264
|
let invocationsSucceeded = 0;
|
|
@@ -394,7 +394,7 @@ async function publishTaskEvent(nc, config, taskDir, taskId, eventType, taskName
|
|
|
394
394
|
await publishHostEvent(nc, config.hostId, taskId, payload);
|
|
395
395
|
}
|
|
396
396
|
async function requestPermission(config, task, taskDir, requiredPermissions) {
|
|
397
|
-
const port = config.httpPort ??
|
|
397
|
+
const port = config.httpPort ?? 7256;
|
|
398
398
|
const res = await fetch(`http://localhost:${port}/request-permission`, {
|
|
399
399
|
method: "POST",
|
|
400
400
|
headers: { "Content-Type": "application/json" },
|
|
@@ -416,7 +416,7 @@ async function requestPermission(config, task, taskDir, requiredPermissions) {
|
|
|
416
416
|
return response;
|
|
417
417
|
}
|
|
418
418
|
async function requestConfirmation(config, task, taskDir) {
|
|
419
|
-
const port = config.httpPort ??
|
|
419
|
+
const port = config.httpPort ?? 7256;
|
|
420
420
|
const res = await fetch(`http://localhost:${port}/request-confirmation?taskId=${encodeURIComponent(task.frontmatter.id)}`, {
|
|
421
421
|
method: "POST",
|
|
422
422
|
headers: { "Content-Type": "application/json" },
|
package/dist/commands/serve.js
CHANGED
|
@@ -113,7 +113,7 @@ export async function serveCommand() {
|
|
|
113
113
|
});
|
|
114
114
|
}, POLL_INTERVAL_MS);
|
|
115
115
|
const handleRpc = createRpcHandler(config, nc);
|
|
116
|
-
const httpPort = config.httpPort ??
|
|
116
|
+
const httpPort = config.httpPort ?? 7256;
|
|
117
117
|
// Start NATS transport (loops forever, fire-and-forget)
|
|
118
118
|
if (nc) {
|
|
119
119
|
startNatsTransport(config, handleRpc, nc);
|
package/dist/config.js
CHANGED
|
@@ -17,8 +17,8 @@ export function loadConfig() {
|
|
|
17
17
|
if (!config.hostId) {
|
|
18
18
|
throw new Error("Invalid host config: missing hostId");
|
|
19
19
|
}
|
|
20
|
-
if (!config.natsUrl || !config.
|
|
21
|
-
throw new Error("Invalid host config: missing
|
|
20
|
+
if (!config.natsUrl || !config.natsJwt || !config.natsNkeySeed) {
|
|
21
|
+
throw new Error("Invalid host config: missing NATS JWT credentials. Re-run palmier init.");
|
|
22
22
|
}
|
|
23
23
|
return config;
|
|
24
24
|
}
|
|
@@ -2,7 +2,7 @@ export interface RegisteredDevice {
|
|
|
2
2
|
clientToken: string;
|
|
3
3
|
fcmToken: string;
|
|
4
4
|
}
|
|
5
|
-
export type DeviceCapability = "location" | "notifications" | "sms" | "contacts" | "calendar" | "alert" | "battery" | "dnd";
|
|
5
|
+
export type DeviceCapability = "location" | "notifications" | "sms" | "contacts" | "calendar" | "alert" | "battery" | "email" | "dnd";
|
|
6
6
|
export declare function getCapabilityDevice(capability: DeviceCapability): RegisteredDevice | null;
|
|
7
7
|
export declare function setCapabilityDevice(capability: DeviceCapability, clientToken: string, fcmToken: string): void;
|
|
8
8
|
export declare function clearCapabilityDevice(capability: DeviceCapability): void;
|
package/dist/events.js
CHANGED
|
@@ -14,7 +14,7 @@ export async function publishHostEvent(nc, hostId, taskId, payload) {
|
|
|
14
14
|
console.log(`[nats] ${subject} →`, payload);
|
|
15
15
|
}
|
|
16
16
|
const config = loadConfig();
|
|
17
|
-
const port = config.httpPort ??
|
|
17
|
+
const port = config.httpPort ?? 7256;
|
|
18
18
|
try {
|
|
19
19
|
await fetch(`http://localhost:${port}/event`, {
|
|
20
20
|
method: "POST",
|
package/dist/mcp-tools.js
CHANGED
|
@@ -50,7 +50,7 @@ const requestInputTool = {
|
|
|
50
50
|
"Request input from the user.",
|
|
51
51
|
"The request blocks until the user responds.",
|
|
52
52
|
'Response: `{"values": ["answer1", "answer2"]}` on success, or `{"aborted": true}` if the user declines.',
|
|
53
|
-
"When you need information from the user (credentials, answers to questions, preferences, clarifications, etc.), do not guess, fail, or prompt via stdout, even in a non-interactive environment — use this
|
|
53
|
+
"When you need information from the user (credentials, answers to questions, preferences, clarifications, etc.), do not guess, fail, or prompt via stdout, even in a non-interactive environment — use this instead.",
|
|
54
54
|
],
|
|
55
55
|
inputSchema: {
|
|
56
56
|
type: "object",
|
|
@@ -69,12 +69,17 @@ const requestInputTool = {
|
|
|
69
69
|
const { description, questions } = args;
|
|
70
70
|
if (!questions?.length)
|
|
71
71
|
throw new ToolError("questions is required", 400);
|
|
72
|
-
const pendingPromise = registerPending(ctx.sessionId, "input", questions
|
|
72
|
+
const pendingPromise = registerPending(ctx.sessionId, "input", questions, {
|
|
73
|
+
session_id: ctx.sessionId,
|
|
74
|
+
session_name: ctx.agentName,
|
|
75
|
+
description,
|
|
76
|
+
input_questions: questions,
|
|
77
|
+
});
|
|
73
78
|
await ctx.publishEvent("_input", {
|
|
74
79
|
event_type: "input-request",
|
|
75
80
|
host_id: ctx.config.hostId,
|
|
76
81
|
session_id: ctx.sessionId,
|
|
77
|
-
|
|
82
|
+
session_name: ctx.agentName,
|
|
78
83
|
description,
|
|
79
84
|
input_questions: questions,
|
|
80
85
|
});
|
|
@@ -111,12 +116,16 @@ const requestConfirmationTool = {
|
|
|
111
116
|
const { description } = args;
|
|
112
117
|
if (!description)
|
|
113
118
|
throw new ToolError("description is required", 400);
|
|
114
|
-
const pendingPromise = registerPending(ctx.sessionId, "confirmation"
|
|
119
|
+
const pendingPromise = registerPending(ctx.sessionId, "confirmation", undefined, {
|
|
120
|
+
session_id: ctx.sessionId,
|
|
121
|
+
session_name: ctx.agentName,
|
|
122
|
+
description,
|
|
123
|
+
});
|
|
115
124
|
await ctx.publishEvent("_confirm", {
|
|
116
125
|
event_type: "confirm-request",
|
|
117
126
|
host_id: ctx.config.hostId,
|
|
118
127
|
session_id: ctx.sessionId,
|
|
119
|
-
|
|
128
|
+
session_name: ctx.agentName,
|
|
120
129
|
description,
|
|
121
130
|
});
|
|
122
131
|
const response = await pendingPromise;
|
|
@@ -134,7 +143,7 @@ const deviceGeolocationTool = {
|
|
|
134
143
|
name: "device-geolocation",
|
|
135
144
|
description: [
|
|
136
145
|
"Get the GPS location of the user's mobile device.",
|
|
137
|
-
"When you need the user's real-time location, use this
|
|
146
|
+
"When you need the user's real-time location, use this.",
|
|
138
147
|
"Blocks until the device responds (up to 30 seconds).",
|
|
139
148
|
'Response: `{"latitude": ..., "longitude": ..., "accuracy": ..., "timestamp": ...}` on success, or `{"error": "..."}` on failure.',
|
|
140
149
|
],
|
|
@@ -567,7 +576,70 @@ const setRingerModeTool = {
|
|
|
567
576
|
return result;
|
|
568
577
|
},
|
|
569
578
|
};
|
|
570
|
-
|
|
579
|
+
const sendEmailTool = {
|
|
580
|
+
name: "send-email",
|
|
581
|
+
description: [
|
|
582
|
+
"Send an email from the user's mobile device.",
|
|
583
|
+
"When you need to send an email, use this. The email app opens on the device with the draft pre-filled for the user to review and send.",
|
|
584
|
+
'Response: `{"ok": true}` on success, or `{"error": "..."}` on failure.',
|
|
585
|
+
],
|
|
586
|
+
inputSchema: {
|
|
587
|
+
type: "object",
|
|
588
|
+
properties: {
|
|
589
|
+
to: { type: "string", description: "Recipient email address" },
|
|
590
|
+
subject: { type: "string", description: "Email subject" },
|
|
591
|
+
body: { type: "string", description: "Email body text" },
|
|
592
|
+
cc: { type: "string", description: "CC recipient(s)" },
|
|
593
|
+
bcc: { type: "string", description: "BCC recipient(s)" },
|
|
594
|
+
},
|
|
595
|
+
required: ["to"],
|
|
596
|
+
},
|
|
597
|
+
async handler(args, ctx) {
|
|
598
|
+
if (!ctx.nc)
|
|
599
|
+
throw new ToolError("Not connected to server (NATS unavailable)", 503);
|
|
600
|
+
const device = getCapabilityDevice("email");
|
|
601
|
+
if (!device)
|
|
602
|
+
throw new ToolError("No device has email access enabled", 400);
|
|
603
|
+
const { to, subject, body, cc, bcc } = args;
|
|
604
|
+
if (!to)
|
|
605
|
+
throw new ToolError("to is required", 400);
|
|
606
|
+
const sc = StringCodec();
|
|
607
|
+
const payload = {
|
|
608
|
+
hostId: ctx.config.hostId, requestId: ctx.sessionId, fcmToken: device.fcmToken,
|
|
609
|
+
to,
|
|
610
|
+
};
|
|
611
|
+
if (subject)
|
|
612
|
+
payload.subject = subject;
|
|
613
|
+
if (body)
|
|
614
|
+
payload.body = body;
|
|
615
|
+
if (cc)
|
|
616
|
+
payload.cc = cc;
|
|
617
|
+
if (bcc)
|
|
618
|
+
payload.bcc = bcc;
|
|
619
|
+
const ackReply = await ctx.nc.request(`host.${ctx.config.hostId}.fcm.email`, sc.encode(JSON.stringify(payload)), { timeout: 5_000 });
|
|
620
|
+
const ack = JSON.parse(sc.decode(ackReply.data));
|
|
621
|
+
if (ack.error)
|
|
622
|
+
throw new ToolError(ack.error, 502);
|
|
623
|
+
const responsePromise = new Promise((resolve, reject) => {
|
|
624
|
+
const sub = ctx.nc.subscribe(`host.${ctx.config.hostId}.email.${ctx.sessionId}`, { max: 1 });
|
|
625
|
+
const timer = setTimeout(() => {
|
|
626
|
+
sub.unsubscribe();
|
|
627
|
+
reject(new ToolError("Device did not respond within 30 seconds", 504));
|
|
628
|
+
}, 30_000);
|
|
629
|
+
(async () => {
|
|
630
|
+
for await (const msg of sub) {
|
|
631
|
+
clearTimeout(timer);
|
|
632
|
+
resolve(sc.decode(msg.data));
|
|
633
|
+
}
|
|
634
|
+
})();
|
|
635
|
+
});
|
|
636
|
+
const result = JSON.parse(await responsePromise);
|
|
637
|
+
if (result.error)
|
|
638
|
+
return { error: result.error };
|
|
639
|
+
return result;
|
|
640
|
+
},
|
|
641
|
+
};
|
|
642
|
+
export const agentTools = [notifyTool, requestInputTool, requestConfirmationTool, deviceGeolocationTool, readContactsTool, createContactTool, readCalendarTool, createCalendarEventTool, sendSmsTool, sendEmailTool, sendAlertTool, readBatteryTool, setRingerModeTool];
|
|
571
643
|
export const agentToolMap = new Map(agentTools.map((t) => [t.name, t]));
|
|
572
644
|
const deviceNotificationsResource = {
|
|
573
645
|
uri: "notifications://device",
|
package/dist/nats-client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type NatsConnection } from "nats";
|
|
2
2
|
import type { HostConfig } from "./types.js";
|
|
3
3
|
/**
|
|
4
|
-
* Connect to NATS using the host config's
|
|
4
|
+
* Connect to NATS using the host config's JWT credentials.
|
|
5
5
|
*/
|
|
6
6
|
export declare function connectNats(config: HostConfig): Promise<NatsConnection>;
|
|
7
7
|
//# sourceMappingURL=nats-client.d.ts.map
|