@cabane/companion 0.6.197 → 0.6.199
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/README.md +2 -2
- package/dist/cli.js +5 -5
- package/dist/runtime.js +5 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ The Cabane Companion runs your Cabane agents on your own device. Install it, pas
|
|
|
4
4
|
|
|
5
5
|
It drives a **harness** you already have signed in: [Claude Code](https://www.npmjs.com/package/@anthropic-ai/claude-code), [Codex](https://developers.openai.com/codex/cli) or [OpenCode](https://opencode.ai). The Companion never installs a harness and never runs a sign-in; it finds the ones that are usable and reports them.
|
|
6
6
|
|
|
7
|
-
Step-by-step guides with screenshots are
|
|
7
|
+
Step-by-step guides with screenshots are at [cabane.ai/docs](https://cabane.ai/docs): [Connect your computer](https://cabane.ai/docs/connect-your-computer) to install and pair, [Create an agent](https://cabane.ai/docs/create-an-agent) to give an agent a device, and [When an agent doesn't answer](https://cabane.ai/docs/when-an-agent-doesnt-answer) when one stays silent. This README is the reference for the device side.
|
|
8
8
|
|
|
9
9
|
## The model
|
|
10
10
|
|
|
@@ -131,7 +131,7 @@ Cabane has no sandbox setting of its own. A harness's own sandbox settings restr
|
|
|
131
131
|
|
|
132
132
|
So where agents run is your choice, and there are two ways:
|
|
133
133
|
|
|
134
|
-
- **The Companion in a container or VM**, recommended for almost everyone: the Companion and the harness together in Docker, OrbStack or a VM, sharing only the folders and credentials they need. Agents keep a full shell to work and code in, still with no approvals, while the container or VM limits what they reach to what you put in, MCP servers, hooks and the harness process included. If you haven't set one up before, ask Claude to help;
|
|
134
|
+
- **The Companion in a container or VM**, recommended for almost everyone: the Companion and the harness together in Docker, OrbStack or a VM, sharing only the folders and credentials they need. Agents keep a full shell to work and code in, still with no approvals, while the container or VM limits what they reach to what you put in, MCP servers, hooks and the harness process included. If you haven't set one up before, ask Claude to help; [Common device patterns](https://cabane.ai/docs/common-device-patterns) walks through one with Docker.
|
|
135
135
|
- **Directly on your device**, with the harness's own sandbox set to taste. It restricts particular tools, and each harness draws a different line.
|
|
136
136
|
|
|
137
137
|
Running directly, confining agents is set in each harness's own file, and governs your own sessions there as well as every agent on the device:
|
package/dist/cli.js
CHANGED
|
@@ -2616,7 +2616,7 @@ var init_descriptions = __esm({
|
|
|
2616
2616
|
"withdraw_ask"
|
|
2617
2617
|
];
|
|
2618
2618
|
TURN_CONTROL_TOOL_DESCRIPTIONS = {
|
|
2619
|
-
ask: `Ask a person a structured question you need answered to continue, then end your turn; don't wait for the reply. \`targetUserId\` is a person on your roster, by their \`@handle\`; to bring in an agent, name
|
|
2619
|
+
ask: `Ask a person a structured question you need answered to continue, then end your turn; don't wait for the reply. \`targetUserId\` is a person on your roster, by their \`@handle\`; to bring in an agent, name them with \`@handle\` in your reply.
|
|
2620
2620
|
- Form: one question (\`headline\`, optional \`question\` body, \`options\`) or \`questions\`, 1\u2013${MAX_ASK_ITEMS} \`{ headline, body?, options? }\`; never both. Decisions that arise together go in ONE call, in the order you want them answered. A second \`ask\` is a separate item, never an edit; raise one only for a genuinely new question.
|
|
2621
2621
|
- \`headline\`: one sentence ending in \`?\`. Body (\`question\` or each item's \`body\`): a sentence or two of framing, not a report; inline Markdown only, no lists or headings. \`options\`: ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} one-click answers (always for a yes/no go-ahead), each a distinct course of action you can carry out without asking back.
|
|
2622
2622
|
- Voice, in headline, body and options: "I" for yourself, never your own name; name everyone else who decides or acts, as on your roster. Never "you", "your", "we", "us", "our" or their contractions, nor "he", "she" or "they" for a named actor. Each option reads correctly alone. A quotation stays accurate: say who said it.
|
|
@@ -12686,7 +12686,7 @@ function turnFailureCopy(reason, runtime) {
|
|
|
12686
12686
|
if (reason === "timeout_total")
|
|
12687
12687
|
return "The turn ran longer than expected and was stopped. Reply in Cabane to continue.";
|
|
12688
12688
|
if (reason === "result_error:error_max_turns")
|
|
12689
|
-
return "The agent reached
|
|
12689
|
+
return "The agent reached their step limit. Reply in Cabane to continue.";
|
|
12690
12690
|
if (reason === "no_result" || reason === "empty_result" || reason === "empty_result_unverified")
|
|
12691
12691
|
return "The agent finished without a response. Reply in Cabane to try again.";
|
|
12692
12692
|
if (reason === "session_start_failed")
|
|
@@ -12700,11 +12700,11 @@ function turnFailureCopy(reason, runtime) {
|
|
|
12700
12700
|
if (reason?.startsWith("seq_floor_unavailable:"))
|
|
12701
12701
|
return "The interrupted turn could not safely continue. Reply in Cabane to continue.";
|
|
12702
12702
|
if (reason === "result_error:error_max_budget_usd")
|
|
12703
|
-
return "The agent reached
|
|
12703
|
+
return "The agent reached their spending limit. Check their budget settings before trying again in Cabane.";
|
|
12704
12704
|
if (reason === "result_error:error_max_structured_output_retries")
|
|
12705
12705
|
return "The agent could not produce the requested response format. Check the requested format, then reply in Cabane to try again.";
|
|
12706
12706
|
if (reason?.startsWith("result_error:"))
|
|
12707
|
-
return "The agent stopped with an error while running. Check
|
|
12707
|
+
return "The agent stopped with an error while running. Check their transcript, then reply in Cabane to try again.";
|
|
12708
12708
|
if (reason === "setup_failed")
|
|
12709
12709
|
return "The turn could not be set up. Check the agent setup on this device, then reply in Cabane to try again.";
|
|
12710
12710
|
if (reason === "unexpected_role")
|
|
@@ -14586,7 +14586,7 @@ var CompanionSupervisor = class {
|
|
|
14586
14586
|
if (!credential) {
|
|
14587
14587
|
this.log.error(
|
|
14588
14588
|
{ workspaceId, agentId: it.agentId, username: it.agentUsername },
|
|
14589
|
-
`Cannot run ${it.agentDisplayName}:
|
|
14589
|
+
`Cannot run ${it.agentDisplayName}: their sign-in to Cabane is missing and Cabane didn't send a new one. Asking again on the next check.`
|
|
14590
14590
|
);
|
|
14591
14591
|
this.removeAgent(wr, it.agentId);
|
|
14592
14592
|
this.hub.setAgent(workspaceId, {
|
package/dist/runtime.js
CHANGED
|
@@ -1756,7 +1756,7 @@ function turnFailureCopy(reason, runtime) {
|
|
|
1756
1756
|
if (reason === "timeout_total")
|
|
1757
1757
|
return "The turn ran longer than expected and was stopped. Reply in Cabane to continue.";
|
|
1758
1758
|
if (reason === "result_error:error_max_turns")
|
|
1759
|
-
return "The agent reached
|
|
1759
|
+
return "The agent reached their step limit. Reply in Cabane to continue.";
|
|
1760
1760
|
if (reason === "no_result" || reason === "empty_result" || reason === "empty_result_unverified")
|
|
1761
1761
|
return "The agent finished without a response. Reply in Cabane to try again.";
|
|
1762
1762
|
if (reason === "session_start_failed")
|
|
@@ -1770,11 +1770,11 @@ function turnFailureCopy(reason, runtime) {
|
|
|
1770
1770
|
if (reason?.startsWith("seq_floor_unavailable:"))
|
|
1771
1771
|
return "The interrupted turn could not safely continue. Reply in Cabane to continue.";
|
|
1772
1772
|
if (reason === "result_error:error_max_budget_usd")
|
|
1773
|
-
return "The agent reached
|
|
1773
|
+
return "The agent reached their spending limit. Check their budget settings before trying again in Cabane.";
|
|
1774
1774
|
if (reason === "result_error:error_max_structured_output_retries")
|
|
1775
1775
|
return "The agent could not produce the requested response format. Check the requested format, then reply in Cabane to try again.";
|
|
1776
1776
|
if (reason?.startsWith("result_error:"))
|
|
1777
|
-
return "The agent stopped with an error while running. Check
|
|
1777
|
+
return "The agent stopped with an error while running. Check their transcript, then reply in Cabane to try again.";
|
|
1778
1778
|
if (reason === "setup_failed")
|
|
1779
1779
|
return "The turn could not be set up. Check the agent setup on this device, then reply in Cabane to try again.";
|
|
1780
1780
|
if (reason === "unexpected_role")
|
|
@@ -3079,7 +3079,7 @@ var TURN_CONTROL_TOOLS = [
|
|
|
3079
3079
|
"withdraw_ask"
|
|
3080
3080
|
];
|
|
3081
3081
|
var TURN_CONTROL_TOOL_DESCRIPTIONS = {
|
|
3082
|
-
ask: `Ask a person a structured question you need answered to continue, then end your turn; don't wait for the reply. \`targetUserId\` is a person on your roster, by their \`@handle\`; to bring in an agent, name
|
|
3082
|
+
ask: `Ask a person a structured question you need answered to continue, then end your turn; don't wait for the reply. \`targetUserId\` is a person on your roster, by their \`@handle\`; to bring in an agent, name them with \`@handle\` in your reply.
|
|
3083
3083
|
- Form: one question (\`headline\`, optional \`question\` body, \`options\`) or \`questions\`, 1\u2013${MAX_ASK_ITEMS} \`{ headline, body?, options? }\`; never both. Decisions that arise together go in ONE call, in the order you want them answered. A second \`ask\` is a separate item, never an edit; raise one only for a genuinely new question.
|
|
3084
3084
|
- \`headline\`: one sentence ending in \`?\`. Body (\`question\` or each item's \`body\`): a sentence or two of framing, not a report; inline Markdown only, no lists or headings. \`options\`: ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} one-click answers (always for a yes/no go-ahead), each a distinct course of action you can carry out without asking back.
|
|
3085
3085
|
- Voice, in headline, body and options: "I" for yourself, never your own name; name everyone else who decides or acts, as on your roster. Never "you", "your", "we", "us", "our" or their contractions, nor "he", "she" or "they" for a named actor. Each option reads correctly alone. A quotation stays accurate: say who said it.
|
|
@@ -10196,7 +10196,7 @@ var CompanionSupervisor = class {
|
|
|
10196
10196
|
if (!credential) {
|
|
10197
10197
|
this.log.error(
|
|
10198
10198
|
{ workspaceId, agentId: it.agentId, username: it.agentUsername },
|
|
10199
|
-
`Cannot run ${it.agentDisplayName}:
|
|
10199
|
+
`Cannot run ${it.agentDisplayName}: their sign-in to Cabane is missing and Cabane didn't send a new one. Asking again on the next check.`
|
|
10200
10200
|
);
|
|
10201
10201
|
this.removeAgent(wr, it.agentId);
|
|
10202
10202
|
this.hub.setAgent(workspaceId, {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cabane/companion",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.199",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "The Cabane Companion (headless): connect an agent on your machine to your Cabane workspace as a responder — drive work against your own codebase, files, and MCP servers without putting any of it in Cabane.",
|
|
6
6
|
"license": "UNLICENSED",
|