@ouro.bot/cli 0.1.0-alpha.811 → 0.1.0-alpha.813

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,18 @@
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.813",
6
+ "changes": [
7
+ "Unrelated logs no longer block Sanctuary containment checks; identity and authenticated audit safeguards remain intact."
8
+ ]
9
+ },
10
+ {
11
+ "version": "0.1.0-alpha.812",
12
+ "changes": [
13
+ "Accept Sanctuary's existing private frontend socket during deployment audits while retaining exact listener and ownership checks."
14
+ ]
15
+ },
4
16
  {
5
17
  "version": "0.1.0-alpha.811",
6
18
  "changes": [
@@ -2787,12 +2787,9 @@ Packaged deployment-target containment gates:
2787
2787
  closed after eight attempts. It always makes bounded exact-ID unpause attempts,
2788
2788
  verifies the same ID and PID resumed their original running, unpaused state,
2789
2789
  and only then performs the final full-profile topology capture. It
2790
- rejects every owned UDP listener and every externally reachable owned TCP listener. Only loopback
2791
- Mailbox port 6876 plus stream-listening endpoints at the fixed daemon and
2792
- acceptance Unix control paths are permitted; all other named Unix endpoint
2793
- types (including datagrams) fail closed. Inherited descriptors for the same
2794
- socket inode are deduplicated, while unknown loopback ports, wildcard/host-address
2795
- listeners, process/socket/listener drift, or ambiguous ownership fail closed.
2790
+ rejects every owned UDP listener and every externally reachable owned TCP listener.
2791
+ Only loopback Mailbox port 6876 plus stream-listening endpoints at /tmp/ouroboros-daemon.sock, /tmp/ouroboros-daemon.sock.frontend, and /home/ouro/AgentBundles/sanctuary.ouro/state/acceptance/telegram-control.sock are permitted; all other named Unix endpoint types (including datagrams) fail closed.
2792
+ Inherited descriptors for the same socket inode are deduplicated, while unknown loopback ports, wildcard/host-address listeners, process/socket/listener drift, or ambiguous ownership fail closed.
2796
2793
  Unit 18 uses the separately packaged fixed final command after activation.
2797
2794
  It accepts either the legacy-adoption topology with no canonical rollback or
2798
2795
  exactly one stopped, non-autostarted rollback; running/autostarted rollback,
@@ -16,6 +16,7 @@ const PROFILES = Object.freeze({
16
16
  })
17
17
  const DOCUMENTED_UNIX_CONTROLS = [
18
18
  "/tmp/ouroboros-daemon.sock",
19
+ "/tmp/ouroboros-daemon.sock.frontend",
19
20
  "/home/ouro/AgentBundles/sanctuary.ouro/state/acceptance/telegram-control.sock",
20
21
  ]
21
22
  const DOCUMENTED_LOOPBACK_TCP_CONTROLS = new Set([6876])
@@ -1,5 +1,5 @@
1
1
  {
2
- "runtimeVersion": "0.1.0-alpha.811",
2
+ "runtimeVersion": "0.1.0-alpha.813",
3
3
  "bundleSchemaVersion": 3,
4
4
  "lastUpdated": "2026-09-03T00:00:00.000Z"
5
5
  }
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0"?>
2
2
  <Container version="2">
3
3
  <Name>ouro-butler</Name>
4
- <Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.811</Repository>
4
+ <Repository>ghcr.io/ourostack/ouroboros-butler:0.1.0-alpha.813</Repository>
5
5
  <Registry>https://github.com/ourostack/ouroboros/pkgs/container/ouroboros-butler</Registry>
6
6
  <Network>host</Network>
7
7
  <Shell>sh</Shell>
@@ -1372,59 +1372,62 @@ async function readDefaultSanctuaryScenarioFacts(label, scenarioHandleDigest, de
1372
1372
  throw new Error("Telegram approval evidence MAC is invalid");
1373
1373
  }
1374
1374
  }
1375
- const expectedSubject = (0, telegram_1.opaqueTelegramSubject)(identityKey, credentials.botToken, credentials.authorizedUserId, credentials.authorizedChatId);
1376
- const observedSubjects = auditEntries.flatMap((entry) => typeof entry.meta.subject === "string" ? [entry.meta.subject] : []);
1377
- const approvalSubjects = approvalRecords.map((projection) => projection.approval).filter((record) => record.transport === "telegram").map((record) => record.requesterId);
1378
- const rawValues = [...new Set([credentials.botToken, credentials.authorizedUserId, credentials.authorizedChatId])];
1379
- const persistedIdentitySurfaces = readBoundedIdentitySurfaces(agentRoot);
1380
- const surfacePairs = Array.from({ length: Math.floor(persistedIdentitySurfaces.length / 2) }, (_, index) => ({
1381
- relativePath: persistedIdentitySurfaces[index * 2],
1382
- raw: persistedIdentitySurfaces[index * 2 + 1],
1383
- }));
1384
- const canonicalSessionPath = path.join("state", "sessions", `telegram-user:${expectedSubject}`, "telegram", `telegram_${expectedSubject}.json`);
1385
- const canonicalSessionCount = surfacePairs.filter(({ relativePath, raw }) => {
1386
- if (relativePath !== canonicalSessionPath)
1387
- return false;
1388
- object(JSON.parse(raw), "canonical Telegram session");
1389
- return true;
1390
- }).length;
1391
- const sessionSurfaceDigest = (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(surfacePairs.filter(({ relativePath }) => relativePath === path.join("state", "senses", "telegram", "identity-subjects.json")
1392
- || relativePath.startsWith(`state${path.sep}sessions${path.sep}`)
1393
- || relativePath.startsWith(`state${path.sep}pending${path.sep}`)
1394
- || relativePath.startsWith(`state${path.sep}pending-returns${path.sep}`)))).digest("hex");
1395
- const friendSurfaceDigest = (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(surfacePairs.filter(({ relativePath }) => relativePath.startsWith(`friends${path.sep}`)))).digest("hex");
1396
- const canonicalFriendCount = surfacePairs.reduce((count, { relativePath, raw }) => {
1397
- if (!relativePath.startsWith(`friends${path.sep}`) || !relativePath.endsWith(".json"))
1398
- return count;
1399
- const record = object(JSON.parse(raw), "Telegram Friend identity");
1400
- if (!Array.isArray(record.externalIds))
1401
- return count;
1402
- return count + record.externalIds.filter((value) => {
1403
- const identity = object(value, "Telegram Friend external identity");
1404
- return identity.provider === "telegram-user" && identity.externalId === expectedSubject;
1375
+ // Unknown admission needs the same surfaces for its zero-work digest.
1376
+ if (sanctuary_acceptance_harness_1.SANCTUARY_SCENARIO_SOURCES[label].includes("identity-surface-audit") || label === "unit-16d-2-unknown-admission") {
1377
+ const expectedSubject = (0, telegram_1.opaqueTelegramSubject)(identityKey, credentials.botToken, credentials.authorizedUserId, credentials.authorizedChatId);
1378
+ const observedSubjects = auditEntries.flatMap((entry) => typeof entry.meta.subject === "string" ? [entry.meta.subject] : []);
1379
+ const approvalSubjects = approvalRecords.map((projection) => projection.approval).filter((record) => record.transport === "telegram").map((record) => record.requesterId);
1380
+ const rawValues = [...new Set([credentials.botToken, credentials.authorizedUserId, credentials.authorizedChatId])];
1381
+ const persistedIdentitySurfaces = readBoundedIdentitySurfaces(agentRoot);
1382
+ const surfacePairs = Array.from({ length: Math.floor(persistedIdentitySurfaces.length / 2) }, (_, index) => ({
1383
+ relativePath: persistedIdentitySurfaces[index * 2],
1384
+ raw: persistedIdentitySurfaces[index * 2 + 1],
1385
+ }));
1386
+ const canonicalSessionPath = path.join("state", "sessions", `telegram-user:${expectedSubject}`, "telegram", `telegram_${expectedSubject}.json`);
1387
+ const canonicalSessionCount = surfacePairs.filter(({ relativePath, raw }) => {
1388
+ if (relativePath !== canonicalSessionPath)
1389
+ return false;
1390
+ object(JSON.parse(raw), "canonical Telegram session");
1391
+ return true;
1405
1392
  }).length;
1406
- }, 0);
1407
- const surfaceRecords = [...persistedIdentitySurfaces, auditRaw ?? "", auditHeadRaw ?? "", JSON.stringify(approvalRecords)];
1408
- const surfaceSubjects = surfaceRecords.flatMap((raw) => raw.match(/tg_[A-Za-z0-9_-]{43}/gu) ?? []);
1409
- const structuredRawId = /"(?:authorizedUserId|authorizedChatId|transportUserId|transportChatId|userId|chatId|updateId|messageId)"\s*:\s*"?\d{1,20}"?/gu;
1410
- const rawLeakCount = surfaceRecords.reduce((count, raw) => count + rawValues.filter((value) => raw.includes(value)).length + (raw.match(structuredRawId)?.length ?? 0), 0);
1411
- const mismatchCount = [...surfaceSubjects, ...observedSubjects, ...approvalSubjects].filter((subject) => subject !== expectedSubject).length;
1412
- identity = {
1413
- keyPresent: true,
1414
- subjectOpaque: /^tg_[A-Za-z0-9_-]{43}$/u.test(expectedSubject)
1415
- && mismatchCount === 0,
1416
- rawIdentityAbsent: rawLeakCount === 0,
1417
- liveSubjectObserved: observedSubjects.includes(expectedSubject) && telegramTurns.some((turn) => turn.status === "success"),
1418
- inspectedRecordCount: surfaceRecords.length,
1419
- opaqueSubjectCount: [...surfaceSubjects, ...observedSubjects, ...approvalSubjects].filter((subject) => subject === expectedSubject).length,
1420
- mismatchCount,
1421
- rawLeakCount,
1422
- canonicalSessionCount,
1423
- canonicalFriendCount,
1424
- sessionSurfaceDigest,
1425
- friendSurfaceDigest,
1426
- surfaceDigest: (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(surfaceRecords)).digest("hex"),
1427
- };
1393
+ const sessionSurfaceDigest = (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(surfacePairs.filter(({ relativePath }) => relativePath === path.join("state", "senses", "telegram", "identity-subjects.json")
1394
+ || relativePath.startsWith(`state${path.sep}sessions${path.sep}`)
1395
+ || relativePath.startsWith(`state${path.sep}pending${path.sep}`)
1396
+ || relativePath.startsWith(`state${path.sep}pending-returns${path.sep}`)))).digest("hex");
1397
+ const friendSurfaceDigest = (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(surfacePairs.filter(({ relativePath }) => relativePath.startsWith(`friends${path.sep}`)))).digest("hex");
1398
+ const canonicalFriendCount = surfacePairs.reduce((count, { relativePath, raw }) => {
1399
+ if (!relativePath.startsWith(`friends${path.sep}`) || !relativePath.endsWith(".json"))
1400
+ return count;
1401
+ const record = object(JSON.parse(raw), "Telegram Friend identity");
1402
+ if (!Array.isArray(record.externalIds))
1403
+ return count;
1404
+ return count + record.externalIds.filter((value) => {
1405
+ const identity = object(value, "Telegram Friend external identity");
1406
+ return identity.provider === "telegram-user" && identity.externalId === expectedSubject;
1407
+ }).length;
1408
+ }, 0);
1409
+ const surfaceRecords = [...persistedIdentitySurfaces, auditRaw ?? "", auditHeadRaw ?? "", JSON.stringify(approvalRecords)];
1410
+ const surfaceSubjects = surfaceRecords.flatMap((raw) => raw.match(/tg_[A-Za-z0-9_-]{43}/gu) ?? []);
1411
+ const structuredRawId = /"(?:authorizedUserId|authorizedChatId|transportUserId|transportChatId|userId|chatId|updateId|messageId)"\s*:\s*"?\d{1,20}"?/gu;
1412
+ const rawLeakCount = surfaceRecords.reduce((count, raw) => count + rawValues.filter((value) => raw.includes(value)).length + (raw.match(structuredRawId)?.length ?? 0), 0);
1413
+ const mismatchCount = [...surfaceSubjects, ...observedSubjects, ...approvalSubjects].filter((subject) => subject !== expectedSubject).length;
1414
+ identity = {
1415
+ keyPresent: true,
1416
+ subjectOpaque: /^tg_[A-Za-z0-9_-]{43}$/u.test(expectedSubject)
1417
+ && mismatchCount === 0,
1418
+ rawIdentityAbsent: rawLeakCount === 0,
1419
+ liveSubjectObserved: observedSubjects.includes(expectedSubject) && telegramTurns.some((turn) => turn.status === "success"),
1420
+ inspectedRecordCount: surfaceRecords.length,
1421
+ opaqueSubjectCount: [...surfaceSubjects, ...observedSubjects, ...approvalSubjects].filter((subject) => subject === expectedSubject).length,
1422
+ mismatchCount,
1423
+ rawLeakCount,
1424
+ canonicalSessionCount,
1425
+ canonicalFriendCount,
1426
+ sessionSurfaceDigest,
1427
+ friendSurfaceDigest,
1428
+ surfaceDigest: (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(surfaceRecords)).digest("hex"),
1429
+ };
1430
+ }
1428
1431
  }
1429
1432
  const container = options.skipContainerSnapshot === true
1430
1433
  ? null
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.811",
3
+ "version": "0.1.0-alpha.813",
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.811",
9
+ "version": "0.1.0-alpha.813",
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.811",
3
+ "version": "0.1.0-alpha.813",
4
4
  "engines": {
5
5
  "node": ">=22"
6
6
  },