@ouro.bot/cli 0.1.0-alpha.14 → 0.1.0-alpha.141
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/AdoptionSpecialist.ouro/psyche/SOUL.md +2 -2
- package/AdoptionSpecialist.ouro/psyche/identities/monty.md +2 -2
- package/README.md +151 -205
- package/changelog.json +913 -0
- package/dist/heart/active-work.js +633 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -0
- package/dist/heart/commitments.js +105 -0
- package/dist/heart/config.js +66 -21
- package/dist/heart/core.js +645 -112
- package/dist/heart/cross-chat-delivery.js +146 -0
- package/dist/heart/daemon/agent-discovery.js +81 -0
- package/dist/heart/daemon/agent-service.js +467 -0
- package/dist/heart/daemon/auth-flow.js +457 -0
- package/dist/heart/daemon/daemon-cli.js +1840 -196
- package/dist/heart/daemon/daemon-entry.js +80 -3
- package/dist/heart/daemon/daemon-runtime-sync.js +212 -0
- package/dist/heart/daemon/daemon.js +301 -1
- package/dist/heart/daemon/hatch-animation.js +10 -3
- package/dist/heart/daemon/hatch-flow.js +15 -80
- package/dist/heart/daemon/heartbeat-timer.js +131 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +92 -0
- package/dist/heart/daemon/launchd.js +159 -0
- package/dist/heart/daemon/log-tailer.js +4 -3
- package/dist/heart/daemon/mcp-server.js +464 -0
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/ouro-bot-global-installer.js +128 -0
- package/dist/heart/daemon/ouro-path-installer.js +67 -34
- package/dist/heart/daemon/ouro-version-manager.js +171 -0
- package/dist/heart/daemon/process-manager.js +13 -0
- package/dist/heart/daemon/run-hooks.js +37 -0
- package/dist/heart/daemon/runtime-logging.js +58 -15
- package/dist/heart/daemon/runtime-metadata.js +219 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/sense-manager.js +50 -2
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +202 -0
- package/dist/heart/daemon/specialist-orchestrator.js +2 -2
- package/dist/heart/daemon/specialist-prompt.js +10 -7
- package/dist/heart/daemon/specialist-tools.js +52 -3
- package/dist/heart/daemon/staged-restart.js +114 -0
- package/dist/heart/daemon/thoughts.js +507 -0
- package/dist/heart/daemon/update-checker.js +111 -0
- package/dist/heart/daemon/update-hooks.js +138 -0
- package/dist/heart/daemon/wrapper-publish-guard.js +86 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/identity.js +64 -21
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/model-capabilities.js +48 -0
- package/dist/heart/obligations.js +197 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-failover.js +88 -0
- package/dist/heart/provider-ping.js +159 -0
- package/dist/heart/providers/anthropic-token.js +163 -0
- package/dist/heart/providers/anthropic.js +195 -34
- package/dist/heart/providers/azure.js +115 -9
- package/dist/heart/providers/github-copilot.js +157 -0
- package/dist/heart/providers/minimax.js +33 -3
- package/dist/heart/providers/openai-codex.js +49 -14
- package/dist/heart/session-activity.js +173 -0
- package/dist/heart/session-recall.js +216 -0
- package/dist/heart/streaming.js +117 -33
- package/dist/heart/target-resolution.js +123 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/mind/associative-recall.js +122 -32
- package/dist/mind/bundle-manifest.js +14 -0
- package/dist/mind/context.js +125 -14
- package/dist/mind/{memory.js → diary.js} +70 -56
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +35 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/store-file.js +19 -0
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +8 -0
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/obligations.js +134 -0
- package/dist/mind/pending.js +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt.js +554 -88
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +15 -2
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/index.js +12 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +4 -2
- package/dist/repertoire/ado-semantic.js +6 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +254 -0
- package/dist/repertoire/coding/feedback.js +301 -0
- package/dist/repertoire/coding/index.js +4 -1
- package/dist/repertoire/coding/manager.js +210 -4
- package/dist/repertoire/coding/spawner.js +59 -12
- package/dist/repertoire/coding/tools.js +176 -4
- package/dist/repertoire/data/ado-endpoints.json +188 -0
- package/dist/repertoire/guardrails.js +290 -0
- package/dist/repertoire/mcp-client.js +254 -0
- package/dist/repertoire/mcp-manager.js +198 -0
- package/dist/repertoire/skills.js +14 -23
- package/dist/repertoire/tasks/board.js +12 -0
- package/dist/repertoire/tasks/index.js +23 -9
- package/dist/repertoire/tasks/transitions.js +1 -2
- package/dist/repertoire/tools-base.js +980 -271
- package/dist/repertoire/tools-bluebubbles.js +94 -0
- package/dist/repertoire/tools-github.js +1 -6
- package/dist/repertoire/tools-teams.js +65 -59
- package/dist/repertoire/tools.js +266 -91
- package/dist/senses/attention-queue.js +97 -0
- package/dist/senses/bluebubbles-client.js +210 -5
- package/dist/senses/bluebubbles-entry.js +2 -0
- package/dist/senses/bluebubbles-inbound-log.js +109 -0
- package/dist/senses/bluebubbles-media.js +339 -0
- package/dist/senses/bluebubbles-model.js +12 -4
- package/dist/senses/bluebubbles-mutation-log.js +45 -5
- package/dist/senses/bluebubbles-runtime-state.js +109 -0
- package/dist/senses/bluebubbles-session-cleanup.js +72 -0
- package/dist/senses/bluebubbles.js +944 -45
- package/dist/senses/cli-entry.js +1 -1
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +374 -131
- package/dist/senses/contextual-heartbeat.js +102 -0
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/debug-activity.js +154 -0
- package/dist/senses/inner-dialog-worker.js +47 -18
- package/dist/senses/inner-dialog.js +500 -84
- package/dist/senses/pipeline.js +454 -0
- package/dist/senses/surface-tool.js +82 -0
- package/dist/senses/teams.js +607 -129
- package/dist/senses/trust-gate.js +112 -2
- package/package.json +12 -4
- package/skills/configure-dev-tools.md +109 -0
- package/subagents/README.md +4 -70
- package/dist/heart/daemon/subagent-installer.js +0 -134
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getObligationsDir = getObligationsDir;
|
|
37
|
+
exports.generateObligationId = generateObligationId;
|
|
38
|
+
exports.createObligation = createObligation;
|
|
39
|
+
exports.readObligation = readObligation;
|
|
40
|
+
exports.advanceObligation = advanceObligation;
|
|
41
|
+
exports.listActiveObligations = listActiveObligations;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const identity_1 = require("../heart/identity");
|
|
45
|
+
const runtime_1 = require("../nerves/runtime");
|
|
46
|
+
// ── Paths ────────────────────────────────────────────────────────
|
|
47
|
+
function getObligationsDir(agentName) {
|
|
48
|
+
return path.join((0, identity_1.getAgentRoot)(agentName), "state", "obligations", "inner");
|
|
49
|
+
}
|
|
50
|
+
// ── ID generation ────────────────────────────────────────────────
|
|
51
|
+
function generateObligationId(timestamp) {
|
|
52
|
+
return `${timestamp}-${Math.random().toString(36).slice(2, 10)}`;
|
|
53
|
+
}
|
|
54
|
+
// ── Store operations ─────────────────────────────────────────────
|
|
55
|
+
function createObligation(agentName, obligation) {
|
|
56
|
+
const dir = getObligationsDir(agentName);
|
|
57
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
58
|
+
const filePath = path.join(dir, `${obligation.id}.json`);
|
|
59
|
+
fs.writeFileSync(filePath, JSON.stringify(obligation, null, 2), "utf8");
|
|
60
|
+
(0, runtime_1.emitNervesEvent)({
|
|
61
|
+
event: "mind.obligation_created",
|
|
62
|
+
component: "mind",
|
|
63
|
+
message: "return obligation created",
|
|
64
|
+
meta: {
|
|
65
|
+
obligationId: obligation.id,
|
|
66
|
+
origin: `${obligation.origin.friendId}/${obligation.origin.channel}/${obligation.origin.key}`,
|
|
67
|
+
status: obligation.status,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
return filePath;
|
|
71
|
+
}
|
|
72
|
+
function readObligation(agentName, obligationId) {
|
|
73
|
+
const dir = getObligationsDir(agentName);
|
|
74
|
+
try {
|
|
75
|
+
const raw = fs.readFileSync(path.join(dir, `${obligationId}.json`), "utf-8");
|
|
76
|
+
return JSON.parse(raw);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function advanceObligation(agentName, obligationId, update) {
|
|
83
|
+
const existing = readObligation(agentName, obligationId);
|
|
84
|
+
if (!existing)
|
|
85
|
+
return null;
|
|
86
|
+
const updated = {
|
|
87
|
+
...existing,
|
|
88
|
+
status: update.status,
|
|
89
|
+
...(update.startedAt !== undefined ? { startedAt: update.startedAt } : {}),
|
|
90
|
+
...(update.returnedAt !== undefined ? { returnedAt: update.returnedAt } : {}),
|
|
91
|
+
...(update.returnTarget !== undefined ? { returnTarget: update.returnTarget } : {}),
|
|
92
|
+
};
|
|
93
|
+
const dir = getObligationsDir(agentName);
|
|
94
|
+
fs.writeFileSync(path.join(dir, `${obligationId}.json`), JSON.stringify(updated, null, 2), "utf8");
|
|
95
|
+
(0, runtime_1.emitNervesEvent)({
|
|
96
|
+
event: "mind.obligation_advanced",
|
|
97
|
+
component: "mind",
|
|
98
|
+
message: `obligation advanced to ${update.status}`,
|
|
99
|
+
meta: {
|
|
100
|
+
obligationId,
|
|
101
|
+
status: update.status,
|
|
102
|
+
...(update.returnTarget ? { returnTarget: update.returnTarget } : {}),
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
return updated;
|
|
106
|
+
}
|
|
107
|
+
function listActiveObligations(agentName) {
|
|
108
|
+
const dir = getObligationsDir(agentName);
|
|
109
|
+
if (!fs.existsSync(dir))
|
|
110
|
+
return [];
|
|
111
|
+
let entries;
|
|
112
|
+
try {
|
|
113
|
+
entries = fs.readdirSync(dir);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
const obligations = [];
|
|
119
|
+
for (const file of entries) {
|
|
120
|
+
if (!file.endsWith(".json"))
|
|
121
|
+
continue;
|
|
122
|
+
try {
|
|
123
|
+
const raw = fs.readFileSync(path.join(dir, file), "utf-8");
|
|
124
|
+
const parsed = JSON.parse(raw);
|
|
125
|
+
if (parsed.status === "queued" || parsed.status === "running") {
|
|
126
|
+
obligations.push(parsed);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// skip unparseable
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return obligations.sort((a, b) => a.createdAt - b.createdAt);
|
|
134
|
+
}
|
package/dist/mind/pending.js
CHANGED
|
@@ -33,24 +33,60 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.INNER_DIALOG_PENDING = void 0;
|
|
36
37
|
exports.getPendingDir = getPendingDir;
|
|
38
|
+
exports.getDeferredReturnDir = getDeferredReturnDir;
|
|
39
|
+
exports.getInnerDialogPendingDir = getInnerDialogPendingDir;
|
|
40
|
+
exports.hasPendingMessages = hasPendingMessages;
|
|
41
|
+
exports.queuePendingMessage = queuePendingMessage;
|
|
42
|
+
exports.enqueueDeferredReturn = enqueueDeferredReturn;
|
|
43
|
+
exports.drainDeferredReturns = drainDeferredReturns;
|
|
37
44
|
exports.drainPending = drainPending;
|
|
38
45
|
const fs = __importStar(require("fs"));
|
|
39
46
|
const path = __importStar(require("path"));
|
|
40
|
-
const
|
|
47
|
+
const identity_1 = require("../heart/identity");
|
|
41
48
|
const runtime_1 = require("../nerves/runtime");
|
|
42
49
|
function getPendingDir(agentName, friendId, channel, key) {
|
|
43
|
-
return path.join(
|
|
50
|
+
return path.join((0, identity_1.getAgentRoot)(agentName), "state", "pending", friendId, channel, key);
|
|
44
51
|
}
|
|
45
|
-
function
|
|
52
|
+
function getDeferredReturnDir(agentName, friendId) {
|
|
53
|
+
return path.join((0, identity_1.getAgentRoot)(agentName), "state", "pending-returns", friendId);
|
|
54
|
+
}
|
|
55
|
+
/** Canonical inner-dialog pending path segments. */
|
|
56
|
+
exports.INNER_DIALOG_PENDING = { friendId: "self", channel: "inner", key: "dialog" };
|
|
57
|
+
/** Returns the pending dir for this agent's inner dialog. */
|
|
58
|
+
function getInnerDialogPendingDir(agentName) {
|
|
59
|
+
return getPendingDir(agentName, exports.INNER_DIALOG_PENDING.friendId, exports.INNER_DIALOG_PENDING.channel, exports.INNER_DIALOG_PENDING.key);
|
|
60
|
+
}
|
|
61
|
+
function hasPendingMessages(pendingDir) {
|
|
46
62
|
if (!fs.existsSync(pendingDir))
|
|
47
|
-
return
|
|
63
|
+
return false;
|
|
64
|
+
try {
|
|
65
|
+
return fs.readdirSync(pendingDir).some((entry) => entry.endsWith(".json") || entry.endsWith(".json.processing"));
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function writeQueueFile(queueDir, message) {
|
|
72
|
+
fs.mkdirSync(queueDir, { recursive: true });
|
|
73
|
+
const fileName = `${message.timestamp}-${Math.random().toString(36).slice(2, 10)}.json`;
|
|
74
|
+
const filePath = path.join(queueDir, fileName);
|
|
75
|
+
fs.writeFileSync(filePath, JSON.stringify(message, null, 2));
|
|
76
|
+
return filePath;
|
|
77
|
+
}
|
|
78
|
+
function queuePendingMessage(pendingDir, message) {
|
|
79
|
+
writeQueueFile(pendingDir, message);
|
|
80
|
+
}
|
|
81
|
+
function drainQueue(queueDir) {
|
|
82
|
+
if (!fs.existsSync(queueDir))
|
|
83
|
+
return { messages: [], recovered: 0 };
|
|
48
84
|
let entries;
|
|
49
85
|
try {
|
|
50
|
-
entries = fs.readdirSync(
|
|
86
|
+
entries = fs.readdirSync(queueDir);
|
|
51
87
|
}
|
|
52
88
|
catch {
|
|
53
|
-
return [];
|
|
89
|
+
return { messages: [], recovered: 0 };
|
|
54
90
|
}
|
|
55
91
|
// Collect both .json (new) and .processing (crash recovery)
|
|
56
92
|
const jsonFiles = entries.filter(f => f.endsWith(".json") && !f.endsWith(".processing"));
|
|
@@ -62,9 +98,9 @@ function drainPending(pendingDir) {
|
|
|
62
98
|
].sort((a, b) => a.file.localeCompare(b.file));
|
|
63
99
|
const messages = [];
|
|
64
100
|
for (const { file, needsRename } of allFiles) {
|
|
65
|
-
const srcPath = path.join(
|
|
101
|
+
const srcPath = path.join(queueDir, file);
|
|
66
102
|
const processingPath = needsRename
|
|
67
|
-
? path.join(
|
|
103
|
+
? path.join(queueDir, file + ".processing")
|
|
68
104
|
: srcPath;
|
|
69
105
|
try {
|
|
70
106
|
if (needsRename) {
|
|
@@ -83,11 +119,42 @@ function drainPending(pendingDir) {
|
|
|
83
119
|
catch { /* ignore */ }
|
|
84
120
|
}
|
|
85
121
|
}
|
|
122
|
+
return {
|
|
123
|
+
messages,
|
|
124
|
+
recovered: processingFiles.length,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function enqueueDeferredReturn(agentName, friendId, message) {
|
|
128
|
+
const queueDir = getDeferredReturnDir(agentName, friendId);
|
|
129
|
+
const filePath = writeQueueFile(queueDir, message);
|
|
130
|
+
(0, runtime_1.emitNervesEvent)({
|
|
131
|
+
event: "mind.deferred_return_enqueued",
|
|
132
|
+
component: "mind",
|
|
133
|
+
message: "deferred return queued for later friend delivery",
|
|
134
|
+
meta: { friendId, queueDir },
|
|
135
|
+
});
|
|
136
|
+
return filePath;
|
|
137
|
+
}
|
|
138
|
+
function drainDeferredReturns(agentName, friendId) {
|
|
139
|
+
const queueDir = getDeferredReturnDir(agentName, friendId);
|
|
140
|
+
const { messages } = drainQueue(queueDir);
|
|
141
|
+
(0, runtime_1.emitNervesEvent)({
|
|
142
|
+
event: "mind.deferred_returns_drained",
|
|
143
|
+
component: "mind",
|
|
144
|
+
message: "deferred friend returns drained",
|
|
145
|
+
meta: { friendId, queueDir, count: messages.length },
|
|
146
|
+
});
|
|
147
|
+
return messages;
|
|
148
|
+
}
|
|
149
|
+
function drainPending(pendingDir) {
|
|
150
|
+
if (!fs.existsSync(pendingDir))
|
|
151
|
+
return [];
|
|
152
|
+
const { messages, recovered } = drainQueue(pendingDir);
|
|
86
153
|
(0, runtime_1.emitNervesEvent)({
|
|
87
154
|
event: "mind.pending_drained",
|
|
88
155
|
component: "mind",
|
|
89
156
|
message: "pending queue drained",
|
|
90
|
-
meta: { pendingDir, count: messages.length, recovered
|
|
157
|
+
meta: { pendingDir, count: messages.length, recovered },
|
|
91
158
|
});
|
|
92
159
|
return messages;
|
|
93
160
|
}
|
package/dist/mind/phrases.js
CHANGED