@frockbot/plugin-shell 0.3.18 → 0.3.20

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frockbot/plugin-shell",
3
- "version": "0.3.18",
3
+ "version": "0.3.20",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "exports": {
@@ -52,42 +52,42 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@cordisjs/plugin-webui": "0.8.2",
55
- "@frockbot/agent-runtime": "0.3.18",
56
- "@frockbot/application-foundation": "0.3.18",
57
- "@frockbot/catalog-core": "0.3.18",
58
- "@frockbot/client-core": "0.3.18",
59
- "@frockbot/client-ui": "0.3.18",
60
- "@frockbot/computer-core": "0.3.18",
61
- "@frockbot/computer-host-protocol": "0.3.18",
62
- "@frockbot/configuration-core": "0.3.18",
63
- "@frockbot/connection-core": "0.3.18",
64
- "@frockbot/kernel-agent-loop": "0.3.18",
65
- "@frockbot/kernel-composition": "0.3.18",
66
- "@frockbot/kernel-contracts": "0.3.18",
67
- "@frockbot/kernel-do": "0.3.18",
68
- "@frockbot/machine-protocol": "0.3.18",
69
- "@frockbot/plugin-applets": "0.3.18",
70
- "@frockbot/plugin-authoring": "0.3.18",
71
- "@frockbot/plugin-bot-template": "0.3.18",
72
- "@frockbot/plugin-computer": "0.3.18",
73
- "@frockbot/plugin-flock": "0.3.18",
74
- "@frockbot/plugin-image": "0.3.18",
75
- "@frockbot/plugin-machine-messages": "0.3.18",
76
- "@frockbot/plugin-mcp": "0.3.18",
77
- "@frockbot/plugin-memory": "0.3.18",
78
- "@frockbot/plugin-package-catalog": "0.3.18",
79
- "@frockbot/plugin-routines": "0.3.18",
80
- "@frockbot/plugin-skills": "0.3.18",
81
- "@frockbot/plugin-subagents": "0.3.18",
82
- "@frockbot/plugin-user-machine": "0.3.18",
83
- "@frockbot/protocol": "0.3.18",
55
+ "@frockbot/agent-runtime": "0.3.20",
56
+ "@frockbot/application-foundation": "0.3.20",
57
+ "@frockbot/catalog-core": "0.3.20",
58
+ "@frockbot/client-core": "0.3.20",
59
+ "@frockbot/client-ui": "0.3.20",
60
+ "@frockbot/computer-core": "0.3.20",
61
+ "@frockbot/computer-host-protocol": "0.3.20",
62
+ "@frockbot/configuration-core": "0.3.20",
63
+ "@frockbot/connection-core": "0.3.20",
64
+ "@frockbot/kernel-agent-loop": "0.3.20",
65
+ "@frockbot/kernel-composition": "0.3.20",
66
+ "@frockbot/kernel-contracts": "0.3.20",
67
+ "@frockbot/kernel-do": "0.3.20",
68
+ "@frockbot/machine-protocol": "0.3.20",
69
+ "@frockbot/plugin-applets": "0.3.20",
70
+ "@frockbot/plugin-authoring": "0.3.20",
71
+ "@frockbot/plugin-bot-template": "0.3.20",
72
+ "@frockbot/plugin-computer": "0.3.20",
73
+ "@frockbot/plugin-flock": "0.3.20",
74
+ "@frockbot/plugin-image": "0.3.20",
75
+ "@frockbot/plugin-machine-messages": "0.3.20",
76
+ "@frockbot/plugin-mcp": "0.3.20",
77
+ "@frockbot/plugin-memory": "0.3.20",
78
+ "@frockbot/plugin-package-catalog": "0.3.20",
79
+ "@frockbot/plugin-routines": "0.3.20",
80
+ "@frockbot/plugin-skills": "0.3.20",
81
+ "@frockbot/plugin-subagents": "0.3.20",
82
+ "@frockbot/plugin-user-machine": "0.3.20",
83
+ "@frockbot/protocol": "0.3.20",
84
84
  "cordis": "4.0.0-rc.8",
85
85
  "vue": "3.5.41"
86
86
  },
87
87
  "devDependencies": {
88
88
  "@cloudflare/workers-types": "latest",
89
- "@frockbot/plugin-prompt": "0.3.18",
90
- "@frockbot/plugin-tools": "0.3.18",
89
+ "@frockbot/plugin-prompt": "0.3.20",
90
+ "@frockbot/plugin-tools": "0.3.20",
91
91
  "@types/bun": "1.3.6",
92
92
  "@types/node": "26.2.0",
93
93
  "@vitejs/plugin-vue": "6.0.8",
package/src/backend.ts CHANGED
@@ -60,6 +60,7 @@ import {
60
60
  type BotDurableAuthorityOptions,
61
61
  type BotTurnExecutionInput,
62
62
  type OwnedBotTurnCommand,
63
+ type StoredRunOriginV1,
63
64
  } from "@frockbot/kernel-do";
64
65
  import type {
65
66
  FoundationAgentPackage,
@@ -681,6 +682,15 @@ export interface ShellBotBackendHost {
681
682
  turn: number;
682
683
  events: readonly SessionEvent[];
683
684
  }): Promise<void>;
685
+ /** A Package-neutral hook for an agent Turn's durable terminal projection. */
686
+ recordSettledAgentOutcome?(input: {
687
+ userId: string;
688
+ botId: string;
689
+ runId: string;
690
+ turn: number;
691
+ origin?: StoredRunOriginV1;
692
+ events: readonly SessionEvent[];
693
+ }): Promise<void>;
684
694
  }
685
695
 
686
696
  /** The narrow storage seam the Bot's announcement log is written through. */
@@ -784,6 +794,7 @@ export class ShellBotBackendContribution {
784
794
  private readonly hostDeferScheduledWork?: ShellBotBackendHost["deferScheduledWork"];
785
795
  private readonly hostSettleScheduledWork?: ShellBotBackendHost["settleScheduledWork"];
786
796
  private readonly recordSettledUsage?: ShellBotBackendHost["recordSettledUsage"];
797
+ private readonly recordSettledAgentOutcome?: ShellBotBackendHost["recordSettledAgentOutcome"];
787
798
 
788
799
  constructor(host: ShellBotBackendHost) {
789
800
  this.ctx = host.state;
@@ -800,6 +811,7 @@ export class ShellBotBackendContribution {
800
811
  this.hostDeferScheduledWork = host.deferScheduledWork;
801
812
  this.hostSettleScheduledWork = host.settleScheduledWork;
802
813
  this.recordSettledUsage = host.recordSettledUsage;
814
+ this.recordSettledAgentOutcome = host.recordSettledAgentOutcome;
803
815
  const routines = createBotRoutines(
804
816
  host.state.storage,
805
817
  createBotRoutineHookMinter(
@@ -1759,14 +1771,34 @@ export class ShellBotBackendContribution {
1759
1771
  input.command.sessionId,
1760
1772
  effect,
1761
1773
  ),
1762
- ...(this.recordSettledUsage
1774
+ ...(this.recordSettledUsage || this.recordSettledAgentOutcome
1763
1775
  ? {
1764
- onTurnStopping: (settled) =>
1765
- this.recordSettledUsage!({
1766
- botId: input.identity.botId,
1767
- runId: input.command.runId,
1768
- ...settled,
1769
- }),
1776
+ onTurnStopping: async (settled) => {
1777
+ await Promise.allSettled([
1778
+ ...(this.recordSettledUsage
1779
+ ? [
1780
+ this.recordSettledUsage({
1781
+ botId: input.identity.botId,
1782
+ runId: input.command.runId,
1783
+ ...settled,
1784
+ }),
1785
+ ]
1786
+ : []),
1787
+ ...(this.recordSettledAgentOutcome
1788
+ ? [
1789
+ this.recordSettledAgentOutcome({
1790
+ userId: input.identity.userId,
1791
+ botId: input.identity.botId,
1792
+ runId: input.command.runId,
1793
+ ...(input.command.origin
1794
+ ? { origin: input.command.origin }
1795
+ : {}),
1796
+ ...settled,
1797
+ }),
1798
+ ]
1799
+ : []),
1800
+ ]);
1801
+ },
1770
1802
  }
1771
1803
  : {}),
1772
1804
  ...(isolate ? { isolate } : {}),
@@ -499,9 +499,19 @@
499
499
  background: var(--frock-action-primary);
500
500
  }
501
501
 
502
+ /*
503
+ * The User's bubble and its "via" line share a column anchored at the end.
504
+ * It spans the whole thread: the bubble's max-width is a percentage, and
505
+ * against a wrapper that shrink-wraps the bubble that percentage resolves to
506
+ * less than the bubble itself, which is how "Hi" came out one letter per
507
+ * line (2026-09-05).
508
+ */
502
509
  .message-user-column {
503
- display: grid;
504
- justify-items: end;
510
+ display: flex;
511
+ width: 100%;
512
+ min-width: 0;
513
+ flex-direction: column;
514
+ align-items: flex-end;
505
515
  gap: 4px;
506
516
  }
507
517