@cabane/companion 0.6.107 → 0.6.109
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/cli.js +53 -9
- package/dist/runtime.js +53 -9
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -3083,7 +3083,7 @@ var CabaneApi = class {
|
|
|
3083
3083
|
// see whether a prior run is still flagged in-flight.
|
|
3084
3084
|
// SJ383: recovery-path read for a participant row — the `agentSessionId` a
|
|
3085
3085
|
// freshly-reconnected companion resumes on. CT262: the per-turn piggybacks this
|
|
3086
|
-
// fetch grew (
|
|
3086
|
+
// fetch grew (the ABOUT charters / visionBlocks / channel / members / conversationContext)
|
|
3087
3087
|
// are gone — `getTurnContext` composes the whole turn now — so this is back to
|
|
3088
3088
|
// the plain recovery read, with no `messageId` param.
|
|
3089
3089
|
getParticipantAgent(workspaceId, conversationId, agentId) {
|
|
@@ -4391,6 +4391,15 @@ var MAX_ASK_QUESTION_BYTES = 400;
|
|
|
4391
4391
|
var MAX_ASK_HEADLINE_BYTES = 120;
|
|
4392
4392
|
var MAX_ASK_ITEMS = 20;
|
|
4393
4393
|
var MAX_ASK_OPTION_BYTES = 200;
|
|
4394
|
+
var TASK_STAGES = [
|
|
4395
|
+
"proposed",
|
|
4396
|
+
"todo",
|
|
4397
|
+
"in_progress",
|
|
4398
|
+
"in_review",
|
|
4399
|
+
"done",
|
|
4400
|
+
"dropped",
|
|
4401
|
+
"deferred"
|
|
4402
|
+
];
|
|
4394
4403
|
var MIN_ASK_OPTIONS = 2;
|
|
4395
4404
|
var MAX_ASK_OPTIONS = 4;
|
|
4396
4405
|
var MAX_WAKE_NOTE_BYTES = 2e3;
|
|
@@ -4415,11 +4424,19 @@ var TURN_CONTROL_FIELD_DESCRIPTIONS = {
|
|
|
4415
4424
|
targetUserId: "The workspace member (human) to ask \u2014 a user id, from your turn context's roster.",
|
|
4416
4425
|
question: `SINGLE-question form: a short body \u2014 one or two sentences of framing the headline can't hold. NOT a report (up to ${MAX_ASK_QUESTION_BYTES} characters, inline markdown only). Provide EITHER this or \`questions\`, not both. Put the crisp one-sentence question in \`headline\`. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
4417
4426
|
headline: `SINGLE-question form: the question itself as ONE clear, capitalized sentence ending in \`?\` ("Should Ledger deploy once Mia approves?"), up to ${MAX_ASK_HEADLINE_BYTES} characters. What the human reads first in the inbox and the chip \u2014 one scannable question, no elaboration (that goes in \`question\`). Strongly encouraged. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
4418
|
-
options: `SINGLE-question form: optional ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} suggested one-click answers, up to ${MAX_ASK_OPTION_BYTES} characters each. Each option must stand alone: "I" for yourself, anyone else responsible for its action by name \u2014 never "you", "we" or "they".`,
|
|
4427
|
+
options: `SINGLE-question form: optional ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} suggested one-click answers, up to ${MAX_ASK_OPTION_BYTES} characters each. Each option must stand alone: "I" for yourself, anyone else responsible for its action by name \u2014 never "you", "we" or "they". An option may instead be \`{ label, move: { task, status } }\` \u2014 a MOVE of a task: clicking it is the person making that move, and the task's next stage owner is told for you. A wrapper carrying a move is ONE question about ONE task, and you are NOT woken when the move applies.`,
|
|
4419
4428
|
questions: `MULTI-question form: 1\u2013${MAX_ASK_ITEMS} questions to ask at once, when a plan ends with several bounded decisions. Provide EITHER this or \`question\`/\`headline\`/\`options\`, not both.`,
|
|
4420
4429
|
"questions.headline": `The one-sentence question ("Should Ledger deploy once Mia approves?") \u2014 required for each item, up to ${MAX_ASK_HEADLINE_BYTES} characters. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
4421
4430
|
"questions.body": `Optional short framing beneath the headline, up to ${MAX_ASK_QUESTION_BYTES} characters. NOT a report. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
4422
|
-
"
|
|
4431
|
+
"options.label": `What the option SAYS. The destination stage is drawn beside it as a pill, so the label is the decision (\`Accept\`), not a restatement of the move.`,
|
|
4432
|
+
"options.move": `Makes this option a MOVE of a task: clicking it is the person making that move, recorded as theirs. The next stage's owner is told for you, and you are not woken.`,
|
|
4433
|
+
"options.move.task": `The task the move applies to \u2014 its reference (\`CT12\`) or its uuid. Every move in one ask names the SAME task.`,
|
|
4434
|
+
"options.move.status": `The stage the task goes to when the person clicks this option. A move the task cannot make from where it is now is refused when you raise the ask, by name.`,
|
|
4435
|
+
"questions.options.label": `What the option SAYS. The destination stage is drawn beside it as a pill, so the label is the decision (\`Accept\`), not a restatement of the move.`,
|
|
4436
|
+
"questions.options.move": `See \`options.move\`. An ask carrying a move has exactly one question.`,
|
|
4437
|
+
"questions.options.move.task": `The task the move applies to \u2014 its reference (\`CT12\`) or its uuid. Every move in one ask names the SAME task.`,
|
|
4438
|
+
"questions.options.move.status": `The stage the task goes to when the person clicks this option. A move the task cannot make from where it is now is refused when you raise the ask, by name.`,
|
|
4439
|
+
"questions.options": `Optional ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} one-click answers for this question, up to ${MAX_ASK_OPTION_BYTES} characters each. Each option must stand alone: "I" for yourself, anyone else responsible for its action by name \u2014 never "you", "we" or "they". An option may instead be \`{ label, move: { task, status } }\` \u2014 see the single-question form; an ask carrying a move has exactly one question.`,
|
|
4423
4440
|
replaces: "Withdraw a stale ask in this conversation as part of raising this one. Both land in a single write, so the person goes from the old question to the new one and never sees neither or both.",
|
|
4424
4441
|
"replaces.askId": "The id of the open ask to withdraw.",
|
|
4425
4442
|
"replaces.reason": `Why the old question is no longer the question \u2014 shown to the person on their Done row. Up to ${MAX_WITHDRAW_REASON_BYTES} characters.`
|
|
@@ -6657,10 +6674,15 @@ var CODEX_ADDENDUM = [
|
|
|
6657
6674
|
"absent without attempting discovery and invocation, and if a call fails, report the recorded",
|
|
6658
6675
|
"error.",
|
|
6659
6676
|
turnControlPromptGuidance("mcp__cabane_companion__"),
|
|
6660
|
-
|
|
6661
|
-
|
|
6662
|
-
|
|
6663
|
-
|
|
6677
|
+
// CT1552: every ancillary tool is written the way Codex's own tool list shows
|
|
6678
|
+
// it — qualified. The bare `read_binary` / `upload` / … this list used to mix
|
|
6679
|
+
// in sat two lines under the instruction to invoke the exact qualified names,
|
|
6680
|
+
// so the sentence contradicted itself. The bare `query` / `mutate` below stay:
|
|
6681
|
+
// that sentence is about operation names, after the qualified forms are given.
|
|
6682
|
+
"The ancillary tools are `mcp__cabane__list_workspaces`, `mcp__cabane__read_binary`,",
|
|
6683
|
+
"`mcp__cabane__upload`, `mcp__cabane__begin_upload`, `mcp__cabane__finalize_upload` and",
|
|
6684
|
+
"`mcp__cabane__mint_render_token` \u2014 all possibly deferred too.",
|
|
6685
|
+
"There is no Cabane `read`/`write`/`search` tool \u2014 those are",
|
|
6664
6686
|
"operation NAMES you pass to `query` / `mutate`. One more harness fact: you can interleave",
|
|
6665
6687
|
"narration",
|
|
6666
6688
|
"with tool calls, but your final message is the turn's answer \u2014 write your",
|
|
@@ -8396,12 +8418,34 @@ function createTurnControlMcpServer(acts, skipState) {
|
|
|
8396
8418
|
targetUserId: z13.string().uuid().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.targetUserId),
|
|
8397
8419
|
question: z13.string().min(1).max(MAX_ASK_QUESTION_BYTES).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.question),
|
|
8398
8420
|
headline: z13.string().min(1).max(MAX_ASK_HEADLINE_BYTES).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.headline),
|
|
8399
|
-
options: z13.array(
|
|
8421
|
+
options: z13.array(
|
|
8422
|
+
z13.union([
|
|
8423
|
+
z13.string().min(1).max(MAX_ASK_OPTION_BYTES),
|
|
8424
|
+
z13.object({
|
|
8425
|
+
label: z13.string().min(1).max(MAX_ASK_OPTION_BYTES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.label"]),
|
|
8426
|
+
move: z13.object({
|
|
8427
|
+
task: z13.string().min(1).max(200).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.move.task"]),
|
|
8428
|
+
status: z13.enum(TASK_STAGES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.move.status"])
|
|
8429
|
+
}).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.move"])
|
|
8430
|
+
})
|
|
8431
|
+
])
|
|
8432
|
+
).min(MIN_ASK_OPTIONS).max(MAX_ASK_OPTIONS).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.options),
|
|
8400
8433
|
questions: z13.array(
|
|
8401
8434
|
z13.object({
|
|
8402
8435
|
headline: z13.string().min(1).max(MAX_ASK_HEADLINE_BYTES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.headline"]),
|
|
8403
8436
|
body: z13.string().min(1).max(MAX_ASK_QUESTION_BYTES).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.body"]),
|
|
8404
|
-
options: z13.array(
|
|
8437
|
+
options: z13.array(
|
|
8438
|
+
z13.union([
|
|
8439
|
+
z13.string().min(1).max(MAX_ASK_OPTION_BYTES),
|
|
8440
|
+
z13.object({
|
|
8441
|
+
label: z13.string().min(1).max(MAX_ASK_OPTION_BYTES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.label"]),
|
|
8442
|
+
move: z13.object({
|
|
8443
|
+
task: z13.string().min(1).max(200).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.move.task"]),
|
|
8444
|
+
status: z13.enum(TASK_STAGES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.move.status"])
|
|
8445
|
+
}).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.move"])
|
|
8446
|
+
})
|
|
8447
|
+
])
|
|
8448
|
+
).min(MIN_ASK_OPTIONS).max(MAX_ASK_OPTIONS).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options"])
|
|
8405
8449
|
})
|
|
8406
8450
|
).min(1).max(MAX_ASK_ITEMS).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.questions),
|
|
8407
8451
|
replaces: z13.object({
|
package/dist/runtime.js
CHANGED
|
@@ -2417,7 +2417,7 @@ var CabaneApi = class {
|
|
|
2417
2417
|
// see whether a prior run is still flagged in-flight.
|
|
2418
2418
|
// SJ383: recovery-path read for a participant row — the `agentSessionId` a
|
|
2419
2419
|
// freshly-reconnected companion resumes on. CT262: the per-turn piggybacks this
|
|
2420
|
-
// fetch grew (
|
|
2420
|
+
// fetch grew (the ABOUT charters / visionBlocks / channel / members / conversationContext)
|
|
2421
2421
|
// are gone — `getTurnContext` composes the whole turn now — so this is back to
|
|
2422
2422
|
// the plain recovery read, with no `messageId` param.
|
|
2423
2423
|
getParticipantAgent(workspaceId, conversationId, agentId) {
|
|
@@ -3804,6 +3804,15 @@ var MAX_ASK_QUESTION_BYTES = 400;
|
|
|
3804
3804
|
var MAX_ASK_HEADLINE_BYTES = 120;
|
|
3805
3805
|
var MAX_ASK_ITEMS = 20;
|
|
3806
3806
|
var MAX_ASK_OPTION_BYTES = 200;
|
|
3807
|
+
var TASK_STAGES = [
|
|
3808
|
+
"proposed",
|
|
3809
|
+
"todo",
|
|
3810
|
+
"in_progress",
|
|
3811
|
+
"in_review",
|
|
3812
|
+
"done",
|
|
3813
|
+
"dropped",
|
|
3814
|
+
"deferred"
|
|
3815
|
+
];
|
|
3807
3816
|
var MIN_ASK_OPTIONS = 2;
|
|
3808
3817
|
var MAX_ASK_OPTIONS = 4;
|
|
3809
3818
|
var MAX_WAKE_NOTE_BYTES = 2e3;
|
|
@@ -3828,11 +3837,19 @@ var TURN_CONTROL_FIELD_DESCRIPTIONS = {
|
|
|
3828
3837
|
targetUserId: "The workspace member (human) to ask \u2014 a user id, from your turn context's roster.",
|
|
3829
3838
|
question: `SINGLE-question form: a short body \u2014 one or two sentences of framing the headline can't hold. NOT a report (up to ${MAX_ASK_QUESTION_BYTES} characters, inline markdown only). Provide EITHER this or \`questions\`, not both. Put the crisp one-sentence question in \`headline\`. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
3830
3839
|
headline: `SINGLE-question form: the question itself as ONE clear, capitalized sentence ending in \`?\` ("Should Ledger deploy once Mia approves?"), up to ${MAX_ASK_HEADLINE_BYTES} characters. What the human reads first in the inbox and the chip \u2014 one scannable question, no elaboration (that goes in \`question\`). Strongly encouraged. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
3831
|
-
options: `SINGLE-question form: optional ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} suggested one-click answers, up to ${MAX_ASK_OPTION_BYTES} characters each. Each option must stand alone: "I" for yourself, anyone else responsible for its action by name \u2014 never "you", "we" or "they".`,
|
|
3840
|
+
options: `SINGLE-question form: optional ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} suggested one-click answers, up to ${MAX_ASK_OPTION_BYTES} characters each. Each option must stand alone: "I" for yourself, anyone else responsible for its action by name \u2014 never "you", "we" or "they". An option may instead be \`{ label, move: { task, status } }\` \u2014 a MOVE of a task: clicking it is the person making that move, and the task's next stage owner is told for you. A wrapper carrying a move is ONE question about ONE task, and you are NOT woken when the move applies.`,
|
|
3832
3841
|
questions: `MULTI-question form: 1\u2013${MAX_ASK_ITEMS} questions to ask at once, when a plan ends with several bounded decisions. Provide EITHER this or \`question\`/\`headline\`/\`options\`, not both.`,
|
|
3833
3842
|
"questions.headline": `The one-sentence question ("Should Ledger deploy once Mia approves?") \u2014 required for each item, up to ${MAX_ASK_HEADLINE_BYTES} characters. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
3834
3843
|
"questions.body": `Optional short framing beneath the headline, up to ${MAX_ASK_QUESTION_BYTES} characters. NOT a report. Say "I" for yourself; name anyone else described, never "you", "we" or "they".`,
|
|
3835
|
-
"
|
|
3844
|
+
"options.label": `What the option SAYS. The destination stage is drawn beside it as a pill, so the label is the decision (\`Accept\`), not a restatement of the move.`,
|
|
3845
|
+
"options.move": `Makes this option a MOVE of a task: clicking it is the person making that move, recorded as theirs. The next stage's owner is told for you, and you are not woken.`,
|
|
3846
|
+
"options.move.task": `The task the move applies to \u2014 its reference (\`CT12\`) or its uuid. Every move in one ask names the SAME task.`,
|
|
3847
|
+
"options.move.status": `The stage the task goes to when the person clicks this option. A move the task cannot make from where it is now is refused when you raise the ask, by name.`,
|
|
3848
|
+
"questions.options.label": `What the option SAYS. The destination stage is drawn beside it as a pill, so the label is the decision (\`Accept\`), not a restatement of the move.`,
|
|
3849
|
+
"questions.options.move": `See \`options.move\`. An ask carrying a move has exactly one question.`,
|
|
3850
|
+
"questions.options.move.task": `The task the move applies to \u2014 its reference (\`CT12\`) or its uuid. Every move in one ask names the SAME task.`,
|
|
3851
|
+
"questions.options.move.status": `The stage the task goes to when the person clicks this option. A move the task cannot make from where it is now is refused when you raise the ask, by name.`,
|
|
3852
|
+
"questions.options": `Optional ${MIN_ASK_OPTIONS}\u2013${MAX_ASK_OPTIONS} one-click answers for this question, up to ${MAX_ASK_OPTION_BYTES} characters each. Each option must stand alone: "I" for yourself, anyone else responsible for its action by name \u2014 never "you", "we" or "they". An option may instead be \`{ label, move: { task, status } }\` \u2014 see the single-question form; an ask carrying a move has exactly one question.`,
|
|
3836
3853
|
replaces: "Withdraw a stale ask in this conversation as part of raising this one. Both land in a single write, so the person goes from the old question to the new one and never sees neither or both.",
|
|
3837
3854
|
"replaces.askId": "The id of the open ask to withdraw.",
|
|
3838
3855
|
"replaces.reason": `Why the old question is no longer the question \u2014 shown to the person on their Done row. Up to ${MAX_WITHDRAW_REASON_BYTES} characters.`
|
|
@@ -6070,10 +6087,15 @@ var CODEX_ADDENDUM = [
|
|
|
6070
6087
|
"absent without attempting discovery and invocation, and if a call fails, report the recorded",
|
|
6071
6088
|
"error.",
|
|
6072
6089
|
turnControlPromptGuidance("mcp__cabane_companion__"),
|
|
6073
|
-
|
|
6074
|
-
|
|
6075
|
-
|
|
6076
|
-
|
|
6090
|
+
// CT1552: every ancillary tool is written the way Codex's own tool list shows
|
|
6091
|
+
// it — qualified. The bare `read_binary` / `upload` / … this list used to mix
|
|
6092
|
+
// in sat two lines under the instruction to invoke the exact qualified names,
|
|
6093
|
+
// so the sentence contradicted itself. The bare `query` / `mutate` below stay:
|
|
6094
|
+
// that sentence is about operation names, after the qualified forms are given.
|
|
6095
|
+
"The ancillary tools are `mcp__cabane__list_workspaces`, `mcp__cabane__read_binary`,",
|
|
6096
|
+
"`mcp__cabane__upload`, `mcp__cabane__begin_upload`, `mcp__cabane__finalize_upload` and",
|
|
6097
|
+
"`mcp__cabane__mint_render_token` \u2014 all possibly deferred too.",
|
|
6098
|
+
"There is no Cabane `read`/`write`/`search` tool \u2014 those are",
|
|
6077
6099
|
"operation NAMES you pass to `query` / `mutate`. One more harness fact: you can interleave",
|
|
6078
6100
|
"narration",
|
|
6079
6101
|
"with tool calls, but your final message is the turn's answer \u2014 write your",
|
|
@@ -7819,12 +7841,34 @@ function createTurnControlMcpServer(acts, skipState) {
|
|
|
7819
7841
|
targetUserId: z13.string().uuid().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.targetUserId),
|
|
7820
7842
|
question: z13.string().min(1).max(MAX_ASK_QUESTION_BYTES).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.question),
|
|
7821
7843
|
headline: z13.string().min(1).max(MAX_ASK_HEADLINE_BYTES).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.headline),
|
|
7822
|
-
options: z13.array(
|
|
7844
|
+
options: z13.array(
|
|
7845
|
+
z13.union([
|
|
7846
|
+
z13.string().min(1).max(MAX_ASK_OPTION_BYTES),
|
|
7847
|
+
z13.object({
|
|
7848
|
+
label: z13.string().min(1).max(MAX_ASK_OPTION_BYTES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.label"]),
|
|
7849
|
+
move: z13.object({
|
|
7850
|
+
task: z13.string().min(1).max(200).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.move.task"]),
|
|
7851
|
+
status: z13.enum(TASK_STAGES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.move.status"])
|
|
7852
|
+
}).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["options.move"])
|
|
7853
|
+
})
|
|
7854
|
+
])
|
|
7855
|
+
).min(MIN_ASK_OPTIONS).max(MAX_ASK_OPTIONS).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.options),
|
|
7823
7856
|
questions: z13.array(
|
|
7824
7857
|
z13.object({
|
|
7825
7858
|
headline: z13.string().min(1).max(MAX_ASK_HEADLINE_BYTES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.headline"]),
|
|
7826
7859
|
body: z13.string().min(1).max(MAX_ASK_QUESTION_BYTES).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.body"]),
|
|
7827
|
-
options: z13.array(
|
|
7860
|
+
options: z13.array(
|
|
7861
|
+
z13.union([
|
|
7862
|
+
z13.string().min(1).max(MAX_ASK_OPTION_BYTES),
|
|
7863
|
+
z13.object({
|
|
7864
|
+
label: z13.string().min(1).max(MAX_ASK_OPTION_BYTES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.label"]),
|
|
7865
|
+
move: z13.object({
|
|
7866
|
+
task: z13.string().min(1).max(200).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.move.task"]),
|
|
7867
|
+
status: z13.enum(TASK_STAGES).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.move.status"])
|
|
7868
|
+
}).describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options.move"])
|
|
7869
|
+
})
|
|
7870
|
+
])
|
|
7871
|
+
).min(MIN_ASK_OPTIONS).max(MAX_ASK_OPTIONS).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask["questions.options"])
|
|
7828
7872
|
})
|
|
7829
7873
|
).min(1).max(MAX_ASK_ITEMS).optional().describe(TURN_CONTROL_FIELD_DESCRIPTIONS.ask.questions),
|
|
7830
7874
|
replaces: z13.object({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cabane/companion",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.109",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "The Cabane Companion (headless): connect a coding 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",
|