very-happy-cli 0.2.123 → 0.2.125
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/{AcpBackend-hM-qHLN3.mjs → AcpBackend-DOQGItcS.mjs} +2 -1
- package/dist/{AcpBackend-DzIvpTxZ.cjs → AcpBackend-ssQpTLks.cjs} +30 -29
- package/dist/{AcpSessionManager-CRPZPHPa.mjs → AcpSessionManager-D4WkNsRs.mjs} +1 -1
- package/dist/{AcpSessionManager-DyU3Ikgj.cjs → AcpSessionManager-DHLc-D50.cjs} +9 -9
- package/dist/agentGuidance-Cg9ZG1pP.cjs +236 -0
- package/dist/agentGuidance-QpYwykb9.mjs +224 -0
- package/dist/codex/happyMcpStdioBridge.cjs +29 -6
- package/dist/codex/happyMcpStdioBridge.mjs +25 -2
- package/dist/{config-4RaHrVSV.cjs → config-BxHOGtEK.cjs} +11 -11
- package/dist/{config-alG86PDN.mjs → config-CZNIz3W0.mjs} +11 -11
- package/dist/{index-Beh0UZf8.cjs → index-CBj99SO6.cjs} +53 -19
- package/dist/{index-36AkXNF2.mjs → index-CrSifgJM.mjs} +2046 -1719
- package/dist/{index-vyYHKKk6.mjs → index-D-BgvQi5.mjs} +8 -8
- package/dist/{index-DWBKJ5zy.cjs → index-D_Rm9dw9.cjs} +8 -8
- package/dist/{index-5b9YhV-1.cjs → index-Do-kjc30.cjs} +2191 -1864
- package/dist/{index-Cg3Vfc00.mjs → index-Jrk6ud3g.mjs} +49 -15
- package/dist/index.cjs +5 -5
- package/dist/index.mjs +5 -5
- package/dist/{installTerminalHooks-DWCa5j7u.cjs → installTerminalHooks-CPsdeOM4.cjs} +9 -9
- package/dist/{installTerminalHooks-DqUPkh0l.mjs → installTerminalHooks-Z1Jb6yjb.mjs} +8 -8
- package/dist/lib.cjs +12 -12
- package/dist/lib.d.cts +3 -0
- package/dist/lib.d.mts +3 -0
- package/dist/lib.mjs +9 -9
- package/dist/limits-DViGHwSj.cjs +1198 -0
- package/dist/limits-FjbPJPsF.mjs +1129 -0
- package/dist/{mcp-BBya5dsZ.cjs → mcp-BbQ5FWcQ.cjs} +11 -10
- package/dist/{mcp-DZIdcsJp.mjs → mcp-zqPJ94Bk.mjs} +7 -6
- package/dist/resources-CVl7NdOB.cjs +83 -0
- package/dist/resources-D-mn7ptO.mjs +80 -0
- package/dist/{runGemini-DmWxHIwS.cjs → runGemini-BnHGYX-H.cjs} +30 -30
- package/dist/{runGemini-BQa2eF3i.mjs → runGemini-Bu49s_bN.mjs} +13 -13
- package/dist/{runOpenClaw-boyJtPBq.cjs → runOpenClaw-3Ld1eoWV.cjs} +24 -24
- package/dist/{runOpenClaw-362eg04u.mjs → runOpenClaw-CznAYPCh.mjs} +9 -9
- package/dist/{send-CT22-8Tp.mjs → send-BevgS1mf.mjs} +10 -10
- package/dist/{send-BINA__Ke.cjs → send-DCzyBxLl.cjs} +10 -10
- package/dist/{sessions-DemgtCkr.mjs → sessions-Ba2oRTmw.mjs} +10 -10
- package/dist/{sessions-DXYxV6Np.cjs → sessions-DSoaBHwA.cjs} +11 -11
- package/dist/{spawn-BtV9dU1i.cjs → spawn-CqMLY6dE.cjs} +21 -21
- package/dist/{spawn-D2egvPgO.mjs → spawn-j9KBfj4e.mjs} +21 -21
- package/dist/teams-C0ggJTJ-.mjs +164 -0
- package/dist/teams-CmU3K9vB.cjs +166 -0
- package/dist/{types-Cd_tUN3U.cjs → types-BGHnQXl5.cjs} +585 -1577
- package/dist/{types-BqW7nEN_.mjs → types-DLDkfrTC.mjs} +198 -1153
- package/package.json +7 -7
- package/dist/agentGuidance-BifkGXdE.cjs +0 -46
- package/dist/agentGuidance-C2_pkgRI.mjs +0 -37
- package/dist/limits-CwFb5S2b.mjs +0 -22
- package/dist/limits-KdWKmwtH.cjs +0 -28
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "very-happy-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.125",
|
|
4
4
|
"description": "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.",
|
|
5
5
|
"author": "Kirill Dubovitskiy",
|
|
6
6
|
"contributors": [
|
|
@@ -113,12 +113,12 @@
|
|
|
113
113
|
"zod": "^4.0.0"
|
|
114
114
|
},
|
|
115
115
|
"optionalDependencies": {
|
|
116
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
117
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
118
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
119
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
120
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
121
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
116
|
+
"very-happy-tools-arm64-darwin": "0.2.125",
|
|
117
|
+
"very-happy-tools-x64-darwin": "0.2.125",
|
|
118
|
+
"very-happy-tools-arm64-linux": "0.2.125",
|
|
119
|
+
"very-happy-tools-x64-linux": "0.2.125",
|
|
120
|
+
"very-happy-tools-arm64-win32": "0.2.125",
|
|
121
|
+
"very-happy-tools-x64-win32": "0.2.125"
|
|
122
122
|
},
|
|
123
123
|
"devDependencies": {
|
|
124
124
|
"@slopus/happy-wire": "workspace:*",
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
function trimIdent(text) {
|
|
4
|
-
const lines = text.split("\n");
|
|
5
|
-
while (lines.length > 0 && lines[0].trim() === "") {
|
|
6
|
-
lines.shift();
|
|
7
|
-
}
|
|
8
|
-
while (lines.length > 0 && lines[lines.length - 1].trim() === "") {
|
|
9
|
-
lines.pop();
|
|
10
|
-
}
|
|
11
|
-
const minSpaces = lines.reduce((min, line) => {
|
|
12
|
-
if (line.trim() === "") {
|
|
13
|
-
return min;
|
|
14
|
-
}
|
|
15
|
-
const leadingSpaces = line.match(/^\s*/)[0].length;
|
|
16
|
-
return Math.min(min, leadingSpaces);
|
|
17
|
-
}, Infinity);
|
|
18
|
-
const trimmedLines = lines.map((line) => line.slice(minSpaces));
|
|
19
|
-
return trimmedLines.join("\n");
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const AGENT_GUIDANCE = (() => trimIdent(`
|
|
23
|
-
You are running inside Happy: the user is reading this session in a web client (often a phone), NOT in the terminal where you run. Two consequences:
|
|
24
|
-
|
|
25
|
-
- Terminal output is not a good delivery channel. When the user asks for a piece of text ("copy that", "give me X", "\u590D\u5236\u7ED9\u6211", "\u53D1\u6211"), hand it over with mcp__happy__copy_to_clipboard instead of printing it for them to select by hand.
|
|
26
|
-
- When you produce or want to show a FILE (a document you wrote, a report, an image, a PDF, a diff), call mcp__happy__open_preview with its path instead of cat-ing it. Their client opens the rendered file.
|
|
27
|
-
|
|
28
|
-
Judgement, not reflex: use these when the user's goal is to RECEIVE something. If they are asking a question you can just answer, answer it. Do not preview a file you only read for your own reasoning, and do not preview the same file repeatedly within a turn.
|
|
29
|
-
|
|
30
|
-
If you are working on a task the user is tracking, call mcp__happy__report_progress at meaningful milestones (started / blocked / needs review / done) so their board reflects reality. Do not report every tool call.
|
|
31
|
-
`))();
|
|
32
|
-
const PREVIEW_TOOL_NAME = "open_preview";
|
|
33
|
-
const PREVIEW_TOOL_TITLE = "Open File Preview for the User";
|
|
34
|
-
const PREVIEW_TOOL_DESCRIPTION = 'Open a file in the preview panel of every web client the user currently has open. Use this whenever you produce or want to show the user a file: a document or report you just wrote, a generated image or diagram, a PDF, a data file, or a source file you want them to look at. Trigger phrases include: "write me a doc", "show me that file", "let me see it", "\u5199\u4E2A\u6587\u6863", "\u7ED9\u6211\u770B\u770B\u8FD9\u4E2A\u6587\u4EF6", "\u6253\u5F00\u770B\u4E0B". Pass an absolute path (or one starting with ~). The file is read on this machine and rendered in their browser \u2014 markdown is rendered, images and PDFs are displayed, other text is syntax-highlighted. Prefer this over printing file contents to the terminal, which the user is probably not looking at. NOTE: this only requests that their client open the file; it cannot confirm the user actually looked at it, so do not assume they have seen it.';
|
|
35
|
-
const REPORT_PROGRESS_TOOL_NAME = "report_progress";
|
|
36
|
-
const REPORT_PROGRESS_TOOL_TITLE = "Report Progress to the Task Board";
|
|
37
|
-
const REPORT_PROGRESS_TOOL_DESCRIPTION = `Report what you are doing to the user's task board, so they can see the state of this session at a glance without reading the transcript. Call it at meaningful milestones only: when you start substantive work, when you get blocked and need the user, when something is ready for their review, and when you are done. Do NOT call it after every tool call or every file edit \u2014 it is a status line, not a log. Set attention to "blocked" when you cannot proceed without the user, "review" when you want them to look at something, and "none" for ordinary progress. Keep progress to one short line describing the current state (the user reads it on a card).`;
|
|
38
|
-
|
|
39
|
-
exports.AGENT_GUIDANCE = AGENT_GUIDANCE;
|
|
40
|
-
exports.PREVIEW_TOOL_DESCRIPTION = PREVIEW_TOOL_DESCRIPTION;
|
|
41
|
-
exports.PREVIEW_TOOL_NAME = PREVIEW_TOOL_NAME;
|
|
42
|
-
exports.PREVIEW_TOOL_TITLE = PREVIEW_TOOL_TITLE;
|
|
43
|
-
exports.REPORT_PROGRESS_TOOL_DESCRIPTION = REPORT_PROGRESS_TOOL_DESCRIPTION;
|
|
44
|
-
exports.REPORT_PROGRESS_TOOL_NAME = REPORT_PROGRESS_TOOL_NAME;
|
|
45
|
-
exports.REPORT_PROGRESS_TOOL_TITLE = REPORT_PROGRESS_TOOL_TITLE;
|
|
46
|
-
exports.trimIdent = trimIdent;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
function trimIdent(text) {
|
|
2
|
-
const lines = text.split("\n");
|
|
3
|
-
while (lines.length > 0 && lines[0].trim() === "") {
|
|
4
|
-
lines.shift();
|
|
5
|
-
}
|
|
6
|
-
while (lines.length > 0 && lines[lines.length - 1].trim() === "") {
|
|
7
|
-
lines.pop();
|
|
8
|
-
}
|
|
9
|
-
const minSpaces = lines.reduce((min, line) => {
|
|
10
|
-
if (line.trim() === "") {
|
|
11
|
-
return min;
|
|
12
|
-
}
|
|
13
|
-
const leadingSpaces = line.match(/^\s*/)[0].length;
|
|
14
|
-
return Math.min(min, leadingSpaces);
|
|
15
|
-
}, Infinity);
|
|
16
|
-
const trimmedLines = lines.map((line) => line.slice(minSpaces));
|
|
17
|
-
return trimmedLines.join("\n");
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const AGENT_GUIDANCE = (() => trimIdent(`
|
|
21
|
-
You are running inside Happy: the user is reading this session in a web client (often a phone), NOT in the terminal where you run. Two consequences:
|
|
22
|
-
|
|
23
|
-
- Terminal output is not a good delivery channel. When the user asks for a piece of text ("copy that", "give me X", "\u590D\u5236\u7ED9\u6211", "\u53D1\u6211"), hand it over with mcp__happy__copy_to_clipboard instead of printing it for them to select by hand.
|
|
24
|
-
- When you produce or want to show a FILE (a document you wrote, a report, an image, a PDF, a diff), call mcp__happy__open_preview with its path instead of cat-ing it. Their client opens the rendered file.
|
|
25
|
-
|
|
26
|
-
Judgement, not reflex: use these when the user's goal is to RECEIVE something. If they are asking a question you can just answer, answer it. Do not preview a file you only read for your own reasoning, and do not preview the same file repeatedly within a turn.
|
|
27
|
-
|
|
28
|
-
If you are working on a task the user is tracking, call mcp__happy__report_progress at meaningful milestones (started / blocked / needs review / done) so their board reflects reality. Do not report every tool call.
|
|
29
|
-
`))();
|
|
30
|
-
const PREVIEW_TOOL_NAME = "open_preview";
|
|
31
|
-
const PREVIEW_TOOL_TITLE = "Open File Preview for the User";
|
|
32
|
-
const PREVIEW_TOOL_DESCRIPTION = 'Open a file in the preview panel of every web client the user currently has open. Use this whenever you produce or want to show the user a file: a document or report you just wrote, a generated image or diagram, a PDF, a data file, or a source file you want them to look at. Trigger phrases include: "write me a doc", "show me that file", "let me see it", "\u5199\u4E2A\u6587\u6863", "\u7ED9\u6211\u770B\u770B\u8FD9\u4E2A\u6587\u4EF6", "\u6253\u5F00\u770B\u4E0B". Pass an absolute path (or one starting with ~). The file is read on this machine and rendered in their browser \u2014 markdown is rendered, images and PDFs are displayed, other text is syntax-highlighted. Prefer this over printing file contents to the terminal, which the user is probably not looking at. NOTE: this only requests that their client open the file; it cannot confirm the user actually looked at it, so do not assume they have seen it.';
|
|
33
|
-
const REPORT_PROGRESS_TOOL_NAME = "report_progress";
|
|
34
|
-
const REPORT_PROGRESS_TOOL_TITLE = "Report Progress to the Task Board";
|
|
35
|
-
const REPORT_PROGRESS_TOOL_DESCRIPTION = `Report what you are doing to the user's task board, so they can see the state of this session at a glance without reading the transcript. Call it at meaningful milestones only: when you start substantive work, when you get blocked and need the user, when something is ready for their review, and when you are done. Do NOT call it after every tool call or every file edit \u2014 it is a status line, not a log. Set attention to "blocked" when you cannot proceed without the user, "review" when you want them to look at something, and "none" for ordinary progress. Keep progress to one short line describing the current state (the user reads it on a card).`;
|
|
36
|
-
|
|
37
|
-
export { AGENT_GUIDANCE as A, PREVIEW_TOOL_NAME as P, REPORT_PROGRESS_TOOL_NAME as R, PREVIEW_TOOL_TITLE as a, PREVIEW_TOOL_DESCRIPTION as b, REPORT_PROGRESS_TOOL_TITLE as c, REPORT_PROGRESS_TOOL_DESCRIPTION as d, trimIdent as t };
|
package/dist/limits-CwFb5S2b.mjs
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
const CLIPBOARD_MAX_BYTES = 256 * 1024;
|
|
2
|
-
const CLIPBOARD_TOOL_NAME = "copy_to_clipboard";
|
|
3
|
-
const CLIPBOARD_TOOL_TITLE = "Copy to User Clipboard";
|
|
4
|
-
const CLIPBOARD_TOOL_DESCRIPTION = `Copy text to the clipboard of the device the user is currently viewing this session from (their web browser, possibly a phone). Use this whenever the user wants a piece of text handed to them \u2014 not only when they literally say "clipboard". Trigger phrases include: "copy X", "copy that for me", "give me X", "send me X", "I need X on my phone", "\u590D\u5236\u7ED9\u6211", "\u628A X \u590D\u5236\u4E00\u4E0B", "\u53D1\u6211", "\u7ED9\u6211\u4E00\u4EFD", "\u590D\u5236\u5230\u526A\u5207\u677F/\u526A\u8D34\u677F". Typical payloads: command output, code snippets, tokens/keys, URLs, file contents, commit messages. The text is delivered to every device where the user has the web client open. Payloads larger than ${CLIPBOARD_MAX_BYTES / 1024}KB are truncated.`;
|
|
5
|
-
function prepareClipboardText(input) {
|
|
6
|
-
const totalBytes = Buffer.byteLength(input, "utf8");
|
|
7
|
-
if (totalBytes <= CLIPBOARD_MAX_BYTES) {
|
|
8
|
-
return { text: input, truncated: false, totalBytes };
|
|
9
|
-
}
|
|
10
|
-
const sliced = Buffer.from(input, "utf8").subarray(0, CLIPBOARD_MAX_BYTES).toString("utf8");
|
|
11
|
-
let text = sliced;
|
|
12
|
-
if (text.endsWith("\uFFFD")) {
|
|
13
|
-
text = text.slice(0, -1);
|
|
14
|
-
}
|
|
15
|
-
const lastCode = text.charCodeAt(text.length - 1);
|
|
16
|
-
if (lastCode >= 55296 && lastCode <= 56319) {
|
|
17
|
-
text = text.slice(0, -1);
|
|
18
|
-
}
|
|
19
|
-
return { text, truncated: true, totalBytes };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export { CLIPBOARD_TOOL_NAME as C, CLIPBOARD_TOOL_TITLE as a, CLIPBOARD_TOOL_DESCRIPTION as b, CLIPBOARD_MAX_BYTES as c, prepareClipboardText as p };
|
package/dist/limits-KdWKmwtH.cjs
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const CLIPBOARD_MAX_BYTES = 256 * 1024;
|
|
4
|
-
const CLIPBOARD_TOOL_NAME = "copy_to_clipboard";
|
|
5
|
-
const CLIPBOARD_TOOL_TITLE = "Copy to User Clipboard";
|
|
6
|
-
const CLIPBOARD_TOOL_DESCRIPTION = `Copy text to the clipboard of the device the user is currently viewing this session from (their web browser, possibly a phone). Use this whenever the user wants a piece of text handed to them \u2014 not only when they literally say "clipboard". Trigger phrases include: "copy X", "copy that for me", "give me X", "send me X", "I need X on my phone", "\u590D\u5236\u7ED9\u6211", "\u628A X \u590D\u5236\u4E00\u4E0B", "\u53D1\u6211", "\u7ED9\u6211\u4E00\u4EFD", "\u590D\u5236\u5230\u526A\u5207\u677F/\u526A\u8D34\u677F". Typical payloads: command output, code snippets, tokens/keys, URLs, file contents, commit messages. The text is delivered to every device where the user has the web client open. Payloads larger than ${CLIPBOARD_MAX_BYTES / 1024}KB are truncated.`;
|
|
7
|
-
function prepareClipboardText(input) {
|
|
8
|
-
const totalBytes = Buffer.byteLength(input, "utf8");
|
|
9
|
-
if (totalBytes <= CLIPBOARD_MAX_BYTES) {
|
|
10
|
-
return { text: input, truncated: false, totalBytes };
|
|
11
|
-
}
|
|
12
|
-
const sliced = Buffer.from(input, "utf8").subarray(0, CLIPBOARD_MAX_BYTES).toString("utf8");
|
|
13
|
-
let text = sliced;
|
|
14
|
-
if (text.endsWith("\uFFFD")) {
|
|
15
|
-
text = text.slice(0, -1);
|
|
16
|
-
}
|
|
17
|
-
const lastCode = text.charCodeAt(text.length - 1);
|
|
18
|
-
if (lastCode >= 55296 && lastCode <= 56319) {
|
|
19
|
-
text = text.slice(0, -1);
|
|
20
|
-
}
|
|
21
|
-
return { text, truncated: true, totalBytes };
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
exports.CLIPBOARD_MAX_BYTES = CLIPBOARD_MAX_BYTES;
|
|
25
|
-
exports.CLIPBOARD_TOOL_DESCRIPTION = CLIPBOARD_TOOL_DESCRIPTION;
|
|
26
|
-
exports.CLIPBOARD_TOOL_NAME = CLIPBOARD_TOOL_NAME;
|
|
27
|
-
exports.CLIPBOARD_TOOL_TITLE = CLIPBOARD_TOOL_TITLE;
|
|
28
|
-
exports.prepareClipboardText = prepareClipboardText;
|