@ouro.bot/cli 0.1.0-alpha.452 → 0.1.0-alpha.454

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,22 @@
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.454",
6
+ "changes": [
7
+ "The agent system prompt now carries an explicit Agent Mail setup runbook: Mailroom provisioning uses `ouro connect mail`, HEY archive bootstrap uses human-exported MBOX plus `ouro mail import-mbox`, and verification uses status, doctor, bounded mail tools, and the read-only Outlook mailbox.",
8
+ "Mail setup guidance now forbids invented paths such as HEY OAuth/IMAP, `ouro auth verify --provider mail`, `ouro mcp call mail ...`, ad hoc policy flags, autonomous sending, destructive mail actions, and production MX/DNS/forwarding changes without explicit human confirmation.",
9
+ "`docs/agent-mail-setup.md` now names the non-implementation paths directly so future agents can distinguish the shipped Mailroom flow from plausible-but-false mail-provider guesses."
10
+ ]
11
+ },
12
+ {
13
+ "version": "0.1.0-alpha.453",
14
+ "changes": [
15
+ "`ouro logs prune` now rotates oversized active launchd `.log` streams alongside `.ndjson` daemon streams, so doctor's bundle-local log-size remediation can compact the legacy stderr/stdout files it counts.",
16
+ "Log pruning still skips compressed and historical generation files, keeping rotation safe and idempotent while letting `rotateIfNeeded` handle generation shifting.",
17
+ "Regression coverage now locks `.log` pruning and the historical-file skip behavior for daemon logs."
18
+ ]
19
+ },
4
20
  {
5
21
  "version": "0.1.0-alpha.452",
6
22
  "changes": [
@@ -7,6 +7,15 @@ const crypto_1 = require("crypto");
7
7
  const nerves_1 = require("../../nerves");
8
8
  const runtime_1 = require("../../nerves/runtime");
9
9
  const identity_1 = require("../identity");
10
+ function isActiveLogStream(name) {
11
+ if (name.endsWith(".ndjson")) {
12
+ return !/\.\d+\.ndjson$/.test(name);
13
+ }
14
+ if (name.endsWith(".log")) {
15
+ return !/\.\d+\.log$/.test(name);
16
+ }
17
+ return false;
18
+ }
10
19
  function pruneDaemonLogs(options = {}) {
11
20
  /* v8 ignore next -- defensive: tests always pass logsDir to avoid prod paths @preserve */
12
21
  const logsDir = options.logsDir ?? (0, identity_1.getAgentDaemonLogsDir)(options.agentName);
@@ -35,17 +44,13 @@ function pruneDaemonLogs(options = {}) {
35
44
  }
36
45
  let filesCompacted = 0;
37
46
  let bytesFreed = 0;
38
- // Enumerate and rotate each active .ndjson stream. We explicitly skip
39
- // .gz and other files — only the active stream can be a rotation
40
- // candidate. Legacy .N.ndjson uncompressed files are handled inside
41
- // rotateIfNeeded's generation-shift step, so we skip them here to
47
+ // Enumerate and rotate each active structured stream plus legacy launchd
48
+ // .log streams. We explicitly skip .gz and other files — only the active
49
+ // stream can be a rotation candidate. Legacy generation files are handled
50
+ // inside rotateIfNeeded's generation-shift step, so we skip them here to
42
51
  // avoid double-rotating.
43
52
  for (const name of (0, fs_1.readdirSync)(logsDir)) {
44
- if (!name.endsWith(".ndjson"))
45
- continue;
46
- // Skip legacy generation files like daemon.1.ndjson; rotateIfNeeded
47
- // will migrate them on the next rotation of their parent stream.
48
- if (/\.\d+\.ndjson$/.test(name))
53
+ if (!isActiveLogStream(name))
49
54
  continue;
50
55
  const filePath = (0, path_1.join)(logsDir, name);
51
56
  let sizeBefore;
@@ -464,7 +464,10 @@ function senseRuntimeGuidance(channel, preReadStatusLines) {
464
464
  lines.push("If asked how to enable another sense, I explain the relevant agent.json senses entry and required agent-vault runtime/config fields instead of guessing.");
465
465
  lines.push("teams setup truth: run `ouro connect teams --agent <agent>` from the connect bay; it stores Teams runtime/config fields and enables `senses.teams.enabled`.");
466
466
  lines.push("bluebubbles setup truth: run `ouro connect bluebubbles --agent <agent>` from the connect bay; it stores this machine's BlueBubbles URL/password/listener config in the agent vault machine runtime item.");
467
- lines.push("mail setup truth: run `ouro connect mail --agent <agent>` from the connect bay; it provisions Mailroom coordinates, stores private mail keys in the agent vault runtime/config item, and enables `senses.mail.enabled`. For HEY bootstrap, ask the human for the browser-exported MBOX path and run `ouro mail import-mbox --file <path> --owner-email <email> --source hey --agent <agent>`; HEY forwarding/DNS/MX remain human-confirmed steps.");
467
+ lines.push("mail setup truth: Agent Mail uses Mailroom, not HEY OAuth/IMAP. To provision, run `ouro connect mail --agent <agent>`; use the human's owner email when asked so Mailroom creates the delegated source alias.");
468
+ lines.push("mail setup truth: HEY archive bootstrap is human-exported MBOX only. Ask for the browser-downloaded MBOX path, then run `ouro mail import-mbox --file <path> --owner-email <email> --source hey --agent <agent>`.");
469
+ lines.push("mail setup truth: verify with `ouro status`, `ouro doctor --agent <agent>`, bounded mail tools (`mail_recent`, `mail_search`, `mail_thread`, `mail_access_log`), and the read-only Outlook Mailbox tab.");
470
+ lines.push("mail setup boundaries: do not invent `ouro auth verify --provider mail`, HEY OAuth, HEY IMAP, `ouro mcp call mail ...`, policy flags, autonomous sending, destructive mail actions, or production MX/DNS/forwarding changes. HEY export, HEY forwarding, DNS, MX cutover, sending, and destructive actions require explicit human confirmation.");
468
471
  if (channel === "cli") {
469
472
  lines.push("cli is interactive: it is available when the user opens it, not something `ouro up` daemonizes.");
470
473
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.452",
3
+ "version": "0.1.0-alpha.454",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",