@cabane/companion 0.6.16 → 0.6.18

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 CHANGED
@@ -7199,7 +7199,12 @@ var Dispatcher = class {
7199
7199
  // clear is durable (CT93 outbox, last-writer-wins per pair), so a terminal
7200
7200
  // failure here just logs and the server age-sweep backstops it.
7201
7201
  async concludeBeforeRun(payload, turnLog, startedAt, reason, errorReason) {
7202
- const body = { activeRunStartedAt: null };
7202
+ const body = {
7203
+ activeRunStartedAt: null,
7204
+ // CT1046: this dispatch is over before it ran — retire its evidence so it
7205
+ // can't authorize a turn-token mint afterwards.
7206
+ settledMessageId: payload.messageId
7207
+ };
7203
7208
  if (errorReason) body.errorReason = errorReason.slice(0, 200);
7204
7209
  try {
7205
7210
  await this.opts.api.setActiveRun(
@@ -7959,7 +7964,12 @@ ${reason}`,
7959
7964
  // CT277: the server keys the turn-end metadata UPDATE (ended_at + tokens)
7960
7965
  // off this turn id, so the settle PATCH must carry it — the start PATCH
7961
7966
  // isn't enough. Always sent (every settle closes a real turn).
7962
- turnId
7967
+ turnId,
7968
+ // CT1046: and the trigger this turn answered, so the server retires the
7969
+ // dispatch that authorized it. Always sent, unlike `lastSeenMessageId`
7970
+ // below (which is a success-only catch-up advance): a failed or cancelled
7971
+ // turn is just as over, and its evidence must die with it.
7972
+ settledMessageId: payload.messageId
7963
7973
  };
7964
7974
  if (turnUsage) {
7965
7975
  body.usage = turnUsage;
package/dist/runtime.js CHANGED
@@ -6852,7 +6852,12 @@ var Dispatcher = class {
6852
6852
  // clear is durable (CT93 outbox, last-writer-wins per pair), so a terminal
6853
6853
  // failure here just logs and the server age-sweep backstops it.
6854
6854
  async concludeBeforeRun(payload, turnLog, startedAt, reason, errorReason) {
6855
- const body = { activeRunStartedAt: null };
6855
+ const body = {
6856
+ activeRunStartedAt: null,
6857
+ // CT1046: this dispatch is over before it ran — retire its evidence so it
6858
+ // can't authorize a turn-token mint afterwards.
6859
+ settledMessageId: payload.messageId
6860
+ };
6856
6861
  if (errorReason) body.errorReason = errorReason.slice(0, 200);
6857
6862
  try {
6858
6863
  await this.opts.api.setActiveRun(
@@ -7612,7 +7617,12 @@ ${reason}`,
7612
7617
  // CT277: the server keys the turn-end metadata UPDATE (ended_at + tokens)
7613
7618
  // off this turn id, so the settle PATCH must carry it — the start PATCH
7614
7619
  // isn't enough. Always sent (every settle closes a real turn).
7615
- turnId
7620
+ turnId,
7621
+ // CT1046: and the trigger this turn answered, so the server retires the
7622
+ // dispatch that authorized it. Always sent, unlike `lastSeenMessageId`
7623
+ // below (which is a success-only catch-up advance): a failed or cancelled
7624
+ // turn is just as over, and its evidence must die with it.
7625
+ settledMessageId: payload.messageId
7616
7626
  };
7617
7627
  if (turnUsage) {
7618
7628
  body.usage = turnUsage;
@@ -17,8 +17,18 @@
17
17
  <header class="topbar">
18
18
  <div class="brand">
19
19
  <svg class="logo" viewBox="0 0 24 18" fill="none" aria-hidden="true">
20
- <path d="M 1.26 16.74 L 12 1.26" stroke="currentColor" stroke-width="2.52" stroke-linecap="round" />
21
- <path d="M 12 1.26 L 22.74 16.74" stroke="currentColor" stroke-width="2.52" stroke-linecap="round" />
20
+ <path
21
+ d="M 1.26 16.74 L 12 1.26"
22
+ stroke="currentColor"
23
+ stroke-width="2.52"
24
+ stroke-linecap="round"
25
+ />
26
+ <path
27
+ d="M 12 1.26 L 22.74 16.74"
28
+ stroke="currentColor"
29
+ stroke-width="2.52"
30
+ stroke-linecap="round"
31
+ />
22
32
  </svg>
23
33
  <span id="status-dot" class="dot dot--unknown" aria-hidden="true"></span>
24
34
  <h1 id="status-title">Cabane Companion</h1>
@@ -39,9 +49,8 @@
39
49
  <div id="harness-empty" class="harness-empty" hidden>
40
50
  <p class="harness-empty-title">Cabane can’t run anything on this device yet.</p>
41
51
  <p class="harness-empty-body">
42
- Install and sign in to a harness — Claude Code, Codex, or opencode —
43
- then it’ll appear here as ready. Until then, agents assigned to this
44
- device have nothing to run on.
52
+ Install and sign in to a harness — Claude Code, Codex, or opencode — then it’ll appear
53
+ here as ready. Until then, agents assigned to this device have nothing to run on.
45
54
  </p>
46
55
  </div>
47
56
  <ul id="harness-list" class="harness-list"></ul>
@@ -52,8 +61,8 @@
52
61
  <h2>Connected workspaces <span id="connected-count" class="count"></span></h2>
53
62
  <ul id="connected-list" class="ws-list"></ul>
54
63
  <p id="connected-empty" class="empty" hidden>
55
- No agents assigned yet. In a workspace, open Settings → Agents and assign
56
- an agent to a connector on this device.
64
+ No agents assigned yet. In a workspace, open Settings → Agents and assign an agent to a
65
+ connector on this device.
57
66
  </p>
58
67
  </section>
59
68
 
@@ -104,9 +113,7 @@
104
113
  </div>
105
114
  </section>
106
115
 
107
- <p class="version">
108
- companion <span id="ver-companion">—</span>
109
- </p>
116
+ <p class="version">companion <span id="ver-companion">—</span></p>
110
117
  </main>
111
118
 
112
119
  <div id="toast" class="toast" hidden></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cabane/companion",
3
- "version": "0.6.16",
3
+ "version": "0.6.18",
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",