@ouro.bot/cli 0.1.0-alpha.763 → 0.1.0-alpha.765

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/changelog.json CHANGED
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
3
3
  "versions": [
4
+ {
5
+ "version": "0.1.0-alpha.765",
6
+ "changes": [
7
+ "Require configured turn-local reads before accepting either tool-based or plain-text terminal responses, and fail closed at the bounded provider-turn cap when those reads never run.",
8
+ "Give Telegram concise phone-native plain-text response guidance instead of Teams Markdown guidance."
9
+ ]
10
+ },
11
+ {
12
+ "version": "0.1.0-alpha.764",
13
+ "changes": [
14
+ "Allow the Sanctuary Telegram bootstrap acceptance command to persist merged runtime credentials while preserving read-only containment for every other acceptance path."
15
+ ]
16
+ },
4
17
  {
5
18
  "version": "0.1.0-alpha.763",
6
19
  "changes": [
@@ -411,7 +411,7 @@ run_harness() {
411
411
  --user 10001:10001 --read-only --cap-drop ALL --security-opt no-new-privileges \
412
412
  --mount "type=bind,src=$CONFIG_PATH,dst=/run/ouro-acceptance/config.json,readonly" \
413
413
  --mount "type=bind,src=$EVIDENCE_ROOT,dst=/evidence" \
414
- --mount "type=bind,src=$RUNTIME_ROOT,dst=/home/ouro/.ouro-cli,readonly" \
414
+ --mount "type=bind,src=$RUNTIME_ROOT,dst=/home/ouro/.ouro-cli" \
415
415
  --mount "type=bind,src=$BUNDLE_ROOT,dst=/home/ouro/AgentBundles/sanctuary.ouro$BUNDLE_SUFFIX" \
416
416
  --mount "type=bind,src=$POLLER_FACT,dst=/run/ouro-acceptance/telegram-poller-count.json,readonly" \
417
417
  --mount "type=bind,src=$IMAGE_FACT,dst=/run/ouro-acceptance/image-digest,readonly" \
@@ -1,5 +1,5 @@
1
1
  {
2
- "runtimeVersion": "0.1.0-alpha.763",
2
+ "runtimeVersion": "0.1.0-alpha.765",
3
3
  "bundleSchemaVersion": 3,
4
4
  "lastUpdated": "2026-08-30T00:00:00.000Z"
5
5
  }
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0"?>
2
2
  <Container version="2">
3
3
  <Name>Mendelow Cloud Butler</Name>
4
- <Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.763</Repository>
4
+ <Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.765</Repository>
5
5
  <Registry>https://github.com/ourostack/ouroboros/pkgs/container/ouroboros-butler</Registry>
6
6
  <Network>host</Network>
7
7
  <Shell>sh</Shell>
@@ -1122,6 +1122,12 @@ async function runAgent(messages, callbacks, channel, signal, options) {
1122
1122
  let providerIterations = 0;
1123
1123
  const requiredToolCallNames = [...new Set(options?.requiredToolCalls?.names ?? [])];
1124
1124
  const dispatchedRequiredToolCalls = new Set();
1125
+ const pendingRequiredToolCalls = () => {
1126
+ const missing = requiredToolCallNames.filter((name) => !dispatchedRequiredToolCalls.has(name));
1127
+ return missing.length > 0
1128
+ ? { missing, message: `${options.requiredToolCalls.retryMessage} Missing required tool calls: ${missing.join(", ")}.` }
1129
+ : null;
1130
+ };
1125
1131
  const toolLoopState = (0, tool_loop_1.createToolLoopState)();
1126
1132
  const toolFrictionLedger = (0, tool_friction_1.createToolFrictionLedger)();
1127
1133
  const finishTerminalProviderError = (error, classification) => {
@@ -1520,6 +1526,24 @@ async function runAgent(messages, callbacks, channel, signal, options) {
1520
1526
  });
1521
1527
  continue;
1522
1528
  }
1529
+ const requiredToolCallsGate = pendingRequiredToolCalls();
1530
+ if (requiredToolCallsGate) {
1531
+ streamCallbackBuffer?.discard();
1532
+ callbacks.onClearText?.();
1533
+ if (providerIterations >= exports.MAX_PROVIDER_ITERATIONS) {
1534
+ throw new Error(`provider iteration limit exhausted at response ${exports.MAX_PROVIDER_ITERATIONS} before required tool calls completed`);
1535
+ }
1536
+ pushGenerated(msg);
1537
+ messages.push({ role: "user", content: requiredToolCallsGate.message });
1538
+ (0, runtime_1.emitNervesEvent)({
1539
+ level: "warn",
1540
+ component: "engine",
1541
+ event: "engine.required_tool_calls_pending",
1542
+ message: "terminal response rejected until required tool handlers dispatch",
1543
+ meta: { missingToolNames: requiredToolCallsGate.missing },
1544
+ });
1545
+ continue;
1546
+ }
1523
1547
  if (privateReturnTextAckRetryError) {
1524
1548
  streamCallbackBuffer?.discard();
1525
1549
  callbacks.onClearText?.();
@@ -1722,21 +1746,20 @@ async function runAgent(messages, callbacks, channel, signal, options) {
1722
1746
  if (isSoleSettle) {
1723
1747
  const settleArgs = validatedCallArguments.get(result.toolCalls[0]);
1724
1748
  callbacks.onToolStart("settle", settleArgs);
1725
- const missingRequiredToolCalls = requiredToolCallNames.filter((name) => !dispatchedRequiredToolCalls.has(name));
1726
- if (missingRequiredToolCalls.length > 0) {
1749
+ const requiredToolCallsGate = pendingRequiredToolCalls();
1750
+ if (requiredToolCallsGate) {
1727
1751
  streamCallbackBuffer?.discard();
1728
1752
  callbacks.onToolEnd("settle", (0, tools_1.summarizeArgs)("settle", settleArgs), false);
1729
1753
  callbacks.onClearText?.();
1730
1754
  pushGenerated(msg);
1731
- const gateMessage = `${options.requiredToolCalls.retryMessage} Missing required tool calls: ${missingRequiredToolCalls.join(", ")}.`;
1732
- pushGenerated({ role: "tool", tool_call_id: result.toolCalls[0].id, content: gateMessage });
1733
- providerRuntime.appendToolOutput(result.toolCalls[0].id, gateMessage);
1755
+ pushGenerated({ role: "tool", tool_call_id: result.toolCalls[0].id, content: requiredToolCallsGate.message });
1756
+ providerRuntime.appendToolOutput(result.toolCalls[0].id, requiredToolCallsGate.message);
1734
1757
  (0, runtime_1.emitNervesEvent)({
1735
1758
  level: "warn",
1736
1759
  component: "engine",
1737
1760
  event: "engine.required_tool_calls_pending",
1738
1761
  message: "settle rejected until required tool handlers dispatch",
1739
- meta: { missingToolNames: missingRequiredToolCalls },
1762
+ meta: { missingToolNames: requiredToolCallsGate.missing },
1740
1763
  });
1741
1764
  continue;
1742
1765
  }
@@ -410,6 +410,9 @@ function runtimeInfoSection(channel, options) {
410
410
  else if (channel === "mcp") {
411
411
  lines.push("this message arrived via a dev tool (e.g. claude code, codex) on behalf of a friend in a sense session. the user can see our conversation. if the dev-tool user asks a direct question, requests stop/pause/confirmation, or the work is complete, i answer with settle. during an active browser/tool/task flow, process comments are feedback to absorb; i keep using tools instead of settling for status. if friction appears, i first look for ad-hoc repairs with the tools i already have. if the friction reveals a harness gap, i create or revise a ponder packet and keep working. ponder does not create an outward deferral by itself.");
412
412
  }
413
+ else if (channel === "telegram") {
414
+ lines.push("i am responding in Telegram. i keep replies concise and phone-native. i do not use markdown. i do not introduce myself on boot.");
415
+ }
413
416
  else if (channel === "bluebubbles") {
414
417
  lines.push("i am responding in iMessage through BlueBubbles. i keep replies short and phone-native. i do not use markdown. i do not introduce myself on boot.");
415
418
  lines.push("during an active browser/tool/task flow, process comments from my friend are feedback to absorb, not a reason to settle. i speak once if useful, then keep working until complete, blocked, asked to stop/pause, or confirmation is required. timeout/recovery state is internal, not iMessage copy.");
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.763",
3
+ "version": "0.1.0-alpha.765",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@ouro.bot/cli",
9
- "version": "0.1.0-alpha.763",
9
+ "version": "0.1.0-alpha.765",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.78.0",
12
12
  "@azure/identity": "^4.13.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.763",
3
+ "version": "0.1.0-alpha.765",
4
4
  "engines": {
5
5
  "node": ">=22"
6
6
  },