@ouro.bot/cli 0.1.0-alpha.168 → 0.1.0-alpha.169

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,14 @@
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.169",
6
+ "changes": [
7
+ "fix(outlook): desk prefs wiring \u2014 carrying block, constellations, starred friends now load in production",
8
+ "feat(outlook): obligation dismiss \u2014 agents can clear stale obligations from needs-me queue",
9
+ "fix: default minimax model updated to MiniMax-M2.7"
10
+ ]
11
+ },
4
12
  {
5
13
  "version": "0.1.0-alpha.168",
6
14
  "changes": [
@@ -60,7 +60,7 @@ const DEFAULT_SECRETS_TEMPLATE = {
60
60
  apiVersion: "2025-04-01-preview",
61
61
  },
62
62
  minimax: {
63
- model: "minimax-text-01",
63
+ model: "MiniMax-M2.7",
64
64
  apiKey: "",
65
65
  },
66
66
  anthropic: {
@@ -1404,7 +1404,7 @@ async function defaultRunAdoptionSpecialist() {
1404
1404
  // Default models per provider (used when entering new credentials)
1405
1405
  const defaultModels = {
1406
1406
  anthropic: "claude-opus-4-6",
1407
- minimax: "MiniMax-Text-01",
1407
+ minimax: "MiniMax-M2.7",
1408
1408
  "openai-codex": "gpt-5.4",
1409
1409
  "github-copilot": "claude-sonnet-4.6",
1410
1410
  azure: "",
@@ -299,6 +299,7 @@ class OuroDaemon {
299
299
  this.outlookServer = await (0, outlook_http_1.startOutlookHttpServer)({
300
300
  host: "127.0.0.1",
301
301
  port: outlook_types_1.OUTLOOK_DEFAULT_PORT,
302
+ bundlesRoot: this.bundlesRoot,
302
303
  readMachineState: () => (0, outlook_read_1.readOutlookMachineState)({ bundlesRoot: this.bundlesRoot }),
303
304
  readMachineView: ({ machine }) => {
304
305
  const overview = this.buildStatusPayload().overview;
@@ -306,7 +306,37 @@ async function startOutlookHttpServer(options = {}) {
306
306
  writeJson(response, 200, hooks.readAgentFriends(agent));
307
307
  return;
308
308
  }
309
- /* v8 ignore start — desk prefs + needs-me use direct reads */
309
+ /* v8 ignore start — desk prefs write + reads */
310
+ if (surface === "dismiss-obligation" && request.method === "POST") {
311
+ let body = "";
312
+ request.on("data", (chunk) => { body += chunk; });
313
+ request.on("end", () => {
314
+ try {
315
+ const { obligationId } = JSON.parse(body);
316
+ if (!obligationId) {
317
+ writeJson(response, 400, { ok: false, error: "obligationId required" });
318
+ return;
319
+ }
320
+ const prefsPath = path.join(agentRoot(agent), "state", "outlook-prefs.json");
321
+ let prefs = {};
322
+ try {
323
+ prefs = JSON.parse(fs.readFileSync(prefsPath, "utf-8"));
324
+ }
325
+ catch { /* new file */ }
326
+ const dismissed = Array.isArray(prefs.dismissedObligations) ? prefs.dismissedObligations : [];
327
+ if (!dismissed.includes(obligationId))
328
+ dismissed.push(obligationId);
329
+ prefs.dismissedObligations = dismissed;
330
+ fs.mkdirSync(path.dirname(prefsPath), { recursive: true });
331
+ fs.writeFileSync(prefsPath, JSON.stringify(prefs, null, 2) + "\n", "utf-8");
332
+ writeJson(response, 200, { ok: true, dismissed: dismissed.length });
333
+ }
334
+ catch (error) {
335
+ writeJson(response, 500, { ok: false, error: String(error) });
336
+ }
337
+ });
338
+ return;
339
+ }
310
340
  if (surface === "desk-prefs") {
311
341
  writeJson(response, 200, (0, outlook_read_1.readDeskPrefs)(agentRoot(agent)));
312
342
  return;
@@ -1157,6 +1157,9 @@ function readNeedsMeView(agentName, options = {}) {
1157
1157
  const now = options.now?.() ?? new Date();
1158
1158
  const agentRoot = path.join(bundlesRoot, `${agentName}.ouro`);
1159
1159
  const items = [];
1160
+ // Load dismissed obligations to filter them out
1161
+ const prefs = readDeskPrefs(agentRoot);
1162
+ const dismissed = new Set(prefs.dismissedObligations);
1160
1163
  // 1. Sessions that need a reply (last message is from user)
1161
1164
  const sessions = readSessionInventory(agentName, options);
1162
1165
  for (const s of sessions.items) {
@@ -1173,6 +1176,8 @@ function readNeedsMeView(agentName, options = {}) {
1173
1176
  // 2. Obligations that are blocking or stale
1174
1177
  const obligations = readObligationSummary(agentRoot);
1175
1178
  for (const o of obligations.items) {
1179
+ if (dismissed.has(o.id))
1180
+ continue;
1176
1181
  const ageMs = now.getTime() - Date.parse(o.updatedAt);
1177
1182
  const isStale = ageMs > 24 * 60 * 60 * 1000;
1178
1183
  if (o.status === "pending" || o.status === "investigating") {
@@ -1237,6 +1242,7 @@ function readDeskPrefs(agentRoot) {
1237
1242
  tabOrder: null,
1238
1243
  starredFriends: [],
1239
1244
  pinnedConstellations: [],
1245
+ dismissedObligations: [],
1240
1246
  };
1241
1247
  try {
1242
1248
  const raw = fs.readFileSync(prefsPath, "utf-8");
@@ -1255,6 +1261,7 @@ function readDeskPrefs(agentRoot) {
1255
1261
  codingIds: Array.isArray(c.codingIds) ? c.codingIds.filter((c2) => typeof c2 === "string") : [],
1256
1262
  }))
1257
1263
  : [],
1264
+ dismissedObligations: Array.isArray(parsed.dismissedObligations) ? parsed.dismissedObligations.filter((id) => typeof id === "string") : [],
1258
1265
  };
1259
1266
  }
1260
1267
  catch {
@@ -70,7 +70,7 @@ function createRuntimeForPing(provider, _config) {
70
70
  const DEFAULT_MODELS = {
71
71
  anthropic: "claude-haiku-4-5-20251001",
72
72
  azure: "gpt-4o",
73
- minimax: "minimax-text-01",
73
+ minimax: "MiniMax-M2.7",
74
74
  "openai-codex": "codex-mini-latest",
75
75
  "github-copilot": "gpt-4o",
76
76
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ouro.bot/cli",
3
- "version": "0.1.0-alpha.168",
3
+ "version": "0.1.0-alpha.169",
4
4
  "main": "dist/heart/daemon/ouro-entry.js",
5
5
  "bin": {
6
6
  "cli": "dist/heart/daemon/ouro-bot-entry.js",