@ouro.bot/cli 0.1.0-alpha.21 → 0.1.0-alpha.211
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/README.md +187 -191
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
- package/changelog.json +1318 -0
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +119 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +120 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/presence.js +185 -0
- package/dist/heart/active-work.js +832 -0
- package/dist/heart/agent-entry.js +37 -2
- package/dist/heart/auth/auth-flow.js +444 -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 +111 -0
- package/dist/heart/config-registry.js +305 -0
- package/dist/heart/config.js +59 -30
- package/dist/heart/core.js +606 -131
- package/dist/heart/cross-chat-delivery.js +146 -0
- package/dist/heart/daemon/agent-config-check.js +149 -0
- package/dist/heart/daemon/agent-discovery.js +81 -0
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +557 -0
- package/dist/heart/daemon/cli-exec.js +1847 -0
- package/dist/heart/daemon/cli-parse.js +759 -0
- package/dist/heart/daemon/cli-render.js +316 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/daemon-cli.js +29 -1163
- package/dist/heart/daemon/daemon-entry.js +182 -4
- package/dist/heart/daemon/daemon-health.js +136 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +153 -12
- package/dist/heart/daemon/daemon-tombstone.js +123 -0
- package/dist/heart/daemon/daemon.js +491 -18
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/launchd.js +165 -0
- package/dist/heart/daemon/log-tailer.js +4 -3
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- package/dist/heart/daemon/ouro-bot-entry.js +1 -1
- package/dist/heart/daemon/process-manager.js +123 -0
- package/dist/heart/daemon/run-hooks.js +39 -0
- package/dist/heart/daemon/runtime-logging.js +58 -15
- package/dist/heart/daemon/runtime-metadata.js +101 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +71 -2
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +202 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/thoughts.js +507 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/habits/habit-migration.js +181 -0
- package/dist/heart/habits/habit-parser.js +119 -0
- package/dist/heart/habits/habit-scheduler.js +369 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +29 -119
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
- package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
- package/dist/heart/identity.js +144 -55
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/mcp/mcp-server.js +608 -0
- package/dist/heart/migrate-config.js +127 -0
- package/dist/heart/model-capabilities.js +48 -0
- package/dist/heart/outlook/outlook-http.js +439 -0
- package/dist/heart/outlook/outlook-read.js +1618 -0
- package/dist/heart/outlook/outlook-render.js +1032 -0
- package/dist/heart/outlook/outlook-types.js +7 -0
- package/dist/heart/outlook/outlook-view.js +194 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-failover.js +88 -0
- package/dist/heart/provider-ping.js +162 -0
- package/dist/heart/providers/anthropic-token.js +163 -0
- package/dist/heart/providers/anthropic.js +187 -41
- package/dist/heart/providers/azure.js +116 -10
- package/dist/heart/providers/github-copilot.js +157 -0
- package/dist/heart/providers/minimax.js +33 -3
- package/dist/heart/providers/openai-codex.js +51 -16
- package/dist/heart/session-activity.js +172 -0
- package/dist/heart/session-recall.js +216 -0
- package/dist/heart/start-of-turn-packet.js +330 -0
- package/dist/heart/streaming.js +36 -27
- package/dist/heart/sync.js +217 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/tool-activity-callbacks.js +36 -0
- package/dist/heart/tool-description.js +135 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +358 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/{daemon → versioning}/ouro-path-installer.js +78 -35
- package/dist/heart/versioning/ouro-version-manager.js +171 -0
- package/dist/heart/versioning/staged-restart.js +138 -0
- package/dist/heart/versioning/update-checker.js +111 -0
- package/dist/heart/versioning/update-hooks.js +138 -0
- package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +41 -3
- package/dist/mind/associative-recall.js +126 -66
- package/dist/mind/bundle-manifest.js +19 -1
- package/dist/mind/context.js +125 -14
- package/dist/mind/{memory.js → diary.js} +73 -96
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +56 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/store-file.js +36 -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/pending.js +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt.js +795 -108
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/coverage/audit.js +1 -1
- package/dist/nerves/coverage/file-completeness.js +47 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +63 -3
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/outlook-ui/assets/index-Ck8agNeO.js +61 -0
- package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
- package/dist/outlook-ui/index.html +15 -0
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +11 -5
- package/dist/repertoire/api-client.js +71 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +330 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +149 -2
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +291 -0
- package/dist/repertoire/mcp-client.js +254 -0
- package/dist/repertoire/mcp-manager.js +251 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +14 -23
- package/dist/repertoire/tasks/board.js +43 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +28 -10
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +11 -28
- package/dist/repertoire/tools-base.js +31 -771
- package/dist/repertoire/tools-bluebubbles.js +94 -0
- package/dist/repertoire/tools-bridge.js +141 -0
- package/dist/repertoire/tools-config.js +266 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flow.js +62 -0
- package/dist/repertoire/tools-github.js +1 -6
- package/dist/repertoire/tools-memory.js +347 -0
- package/dist/repertoire/tools-session.js +682 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-surface.js +228 -0
- package/dist/repertoire/tools-teams.js +12 -59
- package/dist/repertoire/tools.js +132 -124
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +97 -0
- package/dist/senses/bluebubbles-client.js +102 -3
- package/dist/senses/bluebubbles-entry.js +2 -0
- package/dist/senses/bluebubbles-inbound-log.js +109 -0
- package/dist/senses/bluebubbles-media.js +118 -23
- 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 +1008 -102
- package/dist/senses/cli/adapter.js +274 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +358 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +83 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +198 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +1 -1
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +508 -243
- package/dist/senses/commands.js +65 -1
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +112 -19
- package/dist/senses/inner-dialog.js +591 -84
- package/dist/senses/pipeline.js +559 -0
- package/dist/senses/shared-turn.js +196 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams.js +667 -120
- package/dist/senses/trust-gate.js +112 -2
- package/package.json +16 -6
- package/skills/configure-dev-tools.md +81 -0
- package/subagents/README.md +4 -70
- package/dist/heart/daemon/subagent-installer.js +0 -134
- package/dist/senses/debug-activity.js +0 -107
- package/subagents/work-doer.md +0 -235
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -382
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
|
@@ -0,0 +1,138 @@
|
|
|
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.registerUpdateHook = registerUpdateHook;
|
|
37
|
+
exports.getRegisteredHooks = getRegisteredHooks;
|
|
38
|
+
exports.clearRegisteredHooks = clearRegisteredHooks;
|
|
39
|
+
exports.applyPendingUpdates = applyPendingUpdates;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const semver = __importStar(require("semver"));
|
|
43
|
+
const runtime_1 = require("../../nerves/runtime");
|
|
44
|
+
const _hooks = [];
|
|
45
|
+
function registerUpdateHook(hook) {
|
|
46
|
+
_hooks.push(hook);
|
|
47
|
+
(0, runtime_1.emitNervesEvent)({
|
|
48
|
+
component: "daemon",
|
|
49
|
+
event: "daemon.update_hook_registered",
|
|
50
|
+
message: "registered update hook",
|
|
51
|
+
meta: {},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function getRegisteredHooks() {
|
|
55
|
+
return _hooks;
|
|
56
|
+
}
|
|
57
|
+
function clearRegisteredHooks() {
|
|
58
|
+
_hooks.length = 0;
|
|
59
|
+
}
|
|
60
|
+
async function applyPendingUpdates(bundlesRoot, currentVersion) {
|
|
61
|
+
const summary = { updated: [] };
|
|
62
|
+
(0, runtime_1.emitNervesEvent)({
|
|
63
|
+
component: "daemon",
|
|
64
|
+
event: "daemon.apply_pending_updates_start",
|
|
65
|
+
message: "applying pending updates",
|
|
66
|
+
meta: { bundlesRoot, currentVersion },
|
|
67
|
+
});
|
|
68
|
+
if (!fs.existsSync(bundlesRoot)) {
|
|
69
|
+
return summary;
|
|
70
|
+
}
|
|
71
|
+
let entries;
|
|
72
|
+
try {
|
|
73
|
+
entries = fs.readdirSync(bundlesRoot, { withFileTypes: true });
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return summary;
|
|
77
|
+
}
|
|
78
|
+
for (const entry of entries) {
|
|
79
|
+
if (!entry.isDirectory() || !entry.name.endsWith(".ouro"))
|
|
80
|
+
continue;
|
|
81
|
+
const agentRoot = path.join(bundlesRoot, entry.name);
|
|
82
|
+
let previousVersion;
|
|
83
|
+
const metaPath = path.join(agentRoot, "bundle-meta.json");
|
|
84
|
+
try {
|
|
85
|
+
if (fs.existsSync(metaPath)) {
|
|
86
|
+
const raw = fs.readFileSync(metaPath, "utf-8");
|
|
87
|
+
const meta = JSON.parse(raw);
|
|
88
|
+
previousVersion = meta.runtimeVersion;
|
|
89
|
+
if (previousVersion === currentVersion) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// Skip downgrades — only update forward
|
|
93
|
+
if (semver.valid(previousVersion) && semver.valid(currentVersion) && semver.gte(previousVersion, currentVersion)) {
|
|
94
|
+
(0, runtime_1.emitNervesEvent)({
|
|
95
|
+
component: "daemon",
|
|
96
|
+
event: "daemon.update_hook_skip_downgrade",
|
|
97
|
+
message: "skipping downgrade",
|
|
98
|
+
meta: { agentRoot, previousVersion, currentVersion },
|
|
99
|
+
});
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Malformed or unreadable bundle-meta.json -- treat as needing update
|
|
106
|
+
previousVersion = undefined;
|
|
107
|
+
}
|
|
108
|
+
const ctx = { agentRoot, currentVersion, previousVersion };
|
|
109
|
+
for (const hook of _hooks) {
|
|
110
|
+
try {
|
|
111
|
+
await hook(ctx);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
(0, runtime_1.emitNervesEvent)({
|
|
115
|
+
component: "daemon",
|
|
116
|
+
event: "daemon.update_hook_error",
|
|
117
|
+
message: "update hook threw",
|
|
118
|
+
meta: {
|
|
119
|
+
agentRoot,
|
|
120
|
+
error: err instanceof Error ? err.message : /* v8 ignore next -- defensive: non-Error catch branch @preserve */ String(err),
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
summary.updated.push({
|
|
126
|
+
agent: entry.name.replace(/\.ouro$/, ""),
|
|
127
|
+
from: previousVersion,
|
|
128
|
+
to: currentVersion,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
(0, runtime_1.emitNervesEvent)({
|
|
132
|
+
component: "daemon",
|
|
133
|
+
event: "daemon.apply_pending_updates_end",
|
|
134
|
+
message: "pending updates applied",
|
|
135
|
+
meta: { bundlesRoot },
|
|
136
|
+
});
|
|
137
|
+
return summary;
|
|
138
|
+
}
|
|
@@ -7,6 +7,26 @@ function wrapperPackageChanged(changedFiles) {
|
|
|
7
7
|
}
|
|
8
8
|
function assessWrapperPublishSync(input) {
|
|
9
9
|
let result;
|
|
10
|
+
if (input.localVersion !== input.cliVersion) {
|
|
11
|
+
result = {
|
|
12
|
+
ok: false,
|
|
13
|
+
message: `ouro.bot wrapper version ${input.localVersion} must match @ouro.bot/cli version ${input.cliVersion}`,
|
|
14
|
+
};
|
|
15
|
+
(0, runtime_1.emitNervesEvent)({
|
|
16
|
+
level: "warn",
|
|
17
|
+
component: "daemon",
|
|
18
|
+
event: "daemon.wrapper_publish_guard_checked",
|
|
19
|
+
message: "evaluated wrapper publish sync",
|
|
20
|
+
meta: {
|
|
21
|
+
changed: wrapperPackageChanged(input.changedFiles),
|
|
22
|
+
localVersion: input.localVersion,
|
|
23
|
+
cliVersion: input.cliVersion,
|
|
24
|
+
publishedVersion: input.publishedVersion,
|
|
25
|
+
ok: result.ok,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
10
30
|
if (!wrapperPackageChanged(input.changedFiles)) {
|
|
11
31
|
result = {
|
|
12
32
|
ok: true,
|
|
@@ -16,7 +36,13 @@ function assessWrapperPublishSync(input) {
|
|
|
16
36
|
component: "daemon",
|
|
17
37
|
event: "daemon.wrapper_publish_guard_checked",
|
|
18
38
|
message: "evaluated wrapper publish sync",
|
|
19
|
-
meta: {
|
|
39
|
+
meta: {
|
|
40
|
+
changed: false,
|
|
41
|
+
localVersion: input.localVersion,
|
|
42
|
+
cliVersion: input.cliVersion,
|
|
43
|
+
publishedVersion: input.publishedVersion,
|
|
44
|
+
ok: result.ok,
|
|
45
|
+
},
|
|
20
46
|
});
|
|
21
47
|
return result;
|
|
22
48
|
}
|
|
@@ -30,7 +56,13 @@ function assessWrapperPublishSync(input) {
|
|
|
30
56
|
component: "daemon",
|
|
31
57
|
event: "daemon.wrapper_publish_guard_checked",
|
|
32
58
|
message: "evaluated wrapper publish sync",
|
|
33
|
-
meta: {
|
|
59
|
+
meta: {
|
|
60
|
+
changed: true,
|
|
61
|
+
localVersion: input.localVersion,
|
|
62
|
+
cliVersion: input.cliVersion,
|
|
63
|
+
publishedVersion: input.publishedVersion,
|
|
64
|
+
ok: result.ok,
|
|
65
|
+
},
|
|
34
66
|
});
|
|
35
67
|
return result;
|
|
36
68
|
}
|
|
@@ -42,7 +74,13 @@ function assessWrapperPublishSync(input) {
|
|
|
42
74
|
component: "daemon",
|
|
43
75
|
event: "daemon.wrapper_publish_guard_checked",
|
|
44
76
|
message: "evaluated wrapper publish sync",
|
|
45
|
-
meta: {
|
|
77
|
+
meta: {
|
|
78
|
+
changed: true,
|
|
79
|
+
localVersion: input.localVersion,
|
|
80
|
+
cliVersion: input.cliVersion,
|
|
81
|
+
publishedVersion: input.publishedVersion,
|
|
82
|
+
ok: result.ok,
|
|
83
|
+
},
|
|
46
84
|
});
|
|
47
85
|
return result;
|
|
48
86
|
}
|
|
@@ -35,59 +35,42 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.cosineSimilarity = cosineSimilarity;
|
|
37
37
|
exports.recallFactsForQuery = recallFactsForQuery;
|
|
38
|
+
exports.searchJournalIndex = searchJournalIndex;
|
|
38
39
|
exports.injectAssociativeRecall = injectAssociativeRecall;
|
|
39
40
|
const fs = __importStar(require("fs"));
|
|
40
41
|
const path = __importStar(require("path"));
|
|
41
|
-
const config_1 = require("../heart/config");
|
|
42
|
-
const identity_1 = require("../heart/identity");
|
|
43
42
|
const runtime_1 = require("../nerves/runtime");
|
|
44
|
-
const
|
|
43
|
+
const diary_1 = require("./diary");
|
|
44
|
+
const embedding_provider_1 = require("./embedding-provider");
|
|
45
45
|
const DEFAULT_MIN_SCORE = 0.5;
|
|
46
46
|
const DEFAULT_TOP_K = 3;
|
|
47
|
-
class OpenAIEmbeddingProvider {
|
|
48
|
-
apiKey;
|
|
49
|
-
model;
|
|
50
|
-
constructor(apiKey, model = DEFAULT_EMBEDDING_MODEL) {
|
|
51
|
-
this.apiKey = apiKey;
|
|
52
|
-
this.model = model;
|
|
53
|
-
}
|
|
54
|
-
async embed(texts) {
|
|
55
|
-
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
56
|
-
method: "POST",
|
|
57
|
-
headers: {
|
|
58
|
-
Authorization: `Bearer ${this.apiKey}`,
|
|
59
|
-
"Content-Type": "application/json",
|
|
60
|
-
},
|
|
61
|
-
body: JSON.stringify({
|
|
62
|
-
model: this.model,
|
|
63
|
-
input: texts,
|
|
64
|
-
}),
|
|
65
|
-
});
|
|
66
|
-
if (!response.ok) {
|
|
67
|
-
throw new Error(`embedding request failed: ${response.status} ${response.statusText}`);
|
|
68
|
-
}
|
|
69
|
-
const payload = (await response.json());
|
|
70
|
-
if (!payload.data || payload.data.length !== texts.length) {
|
|
71
|
-
throw new Error("embedding response missing expected vectors");
|
|
72
|
-
}
|
|
73
|
-
return payload.data.map((entry) => entry.embedding);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
47
|
function createDefaultProvider() {
|
|
77
|
-
const
|
|
78
|
-
if (!
|
|
48
|
+
const provider = (0, embedding_provider_1.createDefaultEmbeddingProvider)();
|
|
49
|
+
if (!provider) {
|
|
79
50
|
throw new Error("openaiEmbeddingsApiKey not configured");
|
|
80
51
|
}
|
|
81
|
-
return
|
|
52
|
+
return provider;
|
|
82
53
|
}
|
|
83
|
-
function readFacts(
|
|
84
|
-
const factsPath = path.join(
|
|
54
|
+
function readFacts(diaryRoot) {
|
|
55
|
+
const factsPath = path.join(diaryRoot, "facts.jsonl");
|
|
85
56
|
if (!fs.existsSync(factsPath))
|
|
86
57
|
return [];
|
|
87
58
|
const raw = fs.readFileSync(factsPath, "utf8").trim();
|
|
88
59
|
if (!raw)
|
|
89
60
|
return [];
|
|
90
|
-
|
|
61
|
+
const facts = [];
|
|
62
|
+
for (const line of raw.split("\n")) {
|
|
63
|
+
const trimmed = line.trim();
|
|
64
|
+
if (!trimmed)
|
|
65
|
+
continue;
|
|
66
|
+
try {
|
|
67
|
+
facts.push(JSON.parse(trimmed));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Skip corrupt lines (e.g. partial write from a crash).
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return facts;
|
|
91
74
|
}
|
|
92
75
|
function getLatestUserText(messages) {
|
|
93
76
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
@@ -133,6 +116,40 @@ async function recallFactsForQuery(query, facts, provider, options) {
|
|
|
133
116
|
.sort((left, right) => right.score - left.score)
|
|
134
117
|
.slice(0, topK);
|
|
135
118
|
}
|
|
119
|
+
function readJournalIndex(journalDir) {
|
|
120
|
+
const indexPath = path.join(journalDir, ".index.json");
|
|
121
|
+
try {
|
|
122
|
+
const raw = fs.readFileSync(indexPath, "utf8");
|
|
123
|
+
const parsed = JSON.parse(raw);
|
|
124
|
+
if (!Array.isArray(parsed))
|
|
125
|
+
return [];
|
|
126
|
+
return parsed;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return [];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function searchJournalIndex(queryEmbedding, entries, options) {
|
|
133
|
+
const minScore = options?.minScore ?? DEFAULT_MIN_SCORE;
|
|
134
|
+
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
135
|
+
return entries
|
|
136
|
+
.filter((entry) => Array.isArray(entry.embedding) && entry.embedding.length > 0)
|
|
137
|
+
.map((entry) => ({
|
|
138
|
+
filename: entry.filename,
|
|
139
|
+
preview: entry.preview,
|
|
140
|
+
score: cosineSimilarity(queryEmbedding, entry.embedding),
|
|
141
|
+
}))
|
|
142
|
+
.filter((entry) => entry.score >= minScore)
|
|
143
|
+
.sort((left, right) => right.score - left.score)
|
|
144
|
+
.slice(0, topK);
|
|
145
|
+
}
|
|
146
|
+
function resolveJournalDir(diaryRoot, explicitJournalDir) {
|
|
147
|
+
if (explicitJournalDir)
|
|
148
|
+
return explicitJournalDir;
|
|
149
|
+
// journal/ is a sibling of diary/ at the agent root level
|
|
150
|
+
const agentRoot = path.dirname(diaryRoot);
|
|
151
|
+
return path.join(agentRoot, "journal");
|
|
152
|
+
}
|
|
136
153
|
async function injectAssociativeRecall(messages, options) {
|
|
137
154
|
try {
|
|
138
155
|
if (messages[0]?.role !== "system" || typeof messages[0].content !== "string")
|
|
@@ -140,37 +157,80 @@ async function injectAssociativeRecall(messages, options) {
|
|
|
140
157
|
const query = getLatestUserText(messages);
|
|
141
158
|
if (!query)
|
|
142
159
|
return;
|
|
143
|
-
const
|
|
144
|
-
const facts = readFacts(
|
|
145
|
-
|
|
160
|
+
const diaryRoot = options?.diaryRoot ?? (0, diary_1.resolveDiaryRoot)();
|
|
161
|
+
const facts = readFacts(diaryRoot);
|
|
162
|
+
const journalDir = resolveJournalDir(diaryRoot, options?.journalDir);
|
|
163
|
+
const journalEntries = readJournalIndex(journalDir);
|
|
164
|
+
if (facts.length === 0 && journalEntries.length === 0)
|
|
146
165
|
return;
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
166
|
+
// Build combined result lines tagged by source
|
|
167
|
+
const resultLines = [];
|
|
168
|
+
let queryEmbedding;
|
|
169
|
+
// Search diary entries
|
|
170
|
+
if (facts.length > 0) {
|
|
171
|
+
let recalled;
|
|
172
|
+
try {
|
|
173
|
+
const provider = options?.provider ?? createDefaultProvider();
|
|
174
|
+
recalled = await recallFactsForQuery(query, facts, provider, options);
|
|
175
|
+
// Compute query embedding for journal search while provider is available
|
|
176
|
+
if (journalEntries.length > 0) {
|
|
177
|
+
const [qe] = await provider.embed([query.trim()]);
|
|
178
|
+
queryEmbedding = qe;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Embeddings unavailable — fall back to substring matching
|
|
183
|
+
const lowerQuery = query.toLowerCase();
|
|
184
|
+
const topK = options?.topK ?? DEFAULT_TOP_K;
|
|
185
|
+
recalled = facts
|
|
186
|
+
.filter((fact) => fact.text.toLowerCase().includes(lowerQuery))
|
|
187
|
+
.slice(0, topK)
|
|
188
|
+
.map((fact) => ({ ...fact, score: 1 }));
|
|
189
|
+
if (recalled.length > 0) {
|
|
190
|
+
(0, runtime_1.emitNervesEvent)({
|
|
191
|
+
level: "warn",
|
|
192
|
+
component: "mind",
|
|
193
|
+
event: "mind.associative_recall_fallback",
|
|
194
|
+
message: "embeddings unavailable, used substring fallback",
|
|
195
|
+
meta: { matchCount: recalled.length },
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
for (const fact of recalled) {
|
|
200
|
+
resultLines.push({
|
|
201
|
+
text: `[diary] ${fact.text} [score=${fact.score.toFixed(3)} source=${fact.source}]`,
|
|
202
|
+
score: fact.score,
|
|
167
203
|
});
|
|
168
204
|
}
|
|
169
205
|
}
|
|
170
|
-
|
|
206
|
+
// Search journal entries (works whether diary had results or not)
|
|
207
|
+
if (journalEntries.length > 0) {
|
|
208
|
+
try {
|
|
209
|
+
if (!queryEmbedding) {
|
|
210
|
+
const provider = options?.provider ?? createDefaultProvider();
|
|
211
|
+
const [qe] = await provider.embed([query.trim()]);
|
|
212
|
+
queryEmbedding = qe;
|
|
213
|
+
}
|
|
214
|
+
if (queryEmbedding) {
|
|
215
|
+
const journalResults = searchJournalIndex(queryEmbedding, journalEntries, options);
|
|
216
|
+
for (const entry of journalResults) {
|
|
217
|
+
resultLines.push({
|
|
218
|
+
text: `[journal] ${entry.filename}: ${entry.preview} [score=${entry.score.toFixed(3)}]`,
|
|
219
|
+
score: entry.score,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// Embeddings unavailable — no journal fallback
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (resultLines.length === 0)
|
|
171
229
|
return;
|
|
172
|
-
|
|
173
|
-
|
|
230
|
+
// Sort all results by score descending
|
|
231
|
+
resultLines.sort((left, right) => right.score - left.score);
|
|
232
|
+
const recallSection = resultLines
|
|
233
|
+
.map((entry, index) => `${index + 1}. ${entry.text}`)
|
|
174
234
|
.join("\n");
|
|
175
235
|
messages[0] = {
|
|
176
236
|
role: "system",
|
|
@@ -180,7 +240,7 @@ async function injectAssociativeRecall(messages, options) {
|
|
|
180
240
|
component: "mind",
|
|
181
241
|
event: "mind.associative_recall",
|
|
182
242
|
message: "associative recall injected",
|
|
183
|
-
meta: { count:
|
|
243
|
+
meta: { count: resultLines.length },
|
|
184
244
|
});
|
|
185
245
|
}
|
|
186
246
|
catch (error) {
|
|
@@ -190,7 +250,7 @@ async function injectAssociativeRecall(messages, options) {
|
|
|
190
250
|
event: "mind.associative_recall_error",
|
|
191
251
|
message: "associative recall failed",
|
|
192
252
|
meta: {
|
|
193
|
-
reason: error instanceof Error ? error.message : String(error)
|
|
253
|
+
reason: error instanceof Error ? error.message : /* v8 ignore start -- defensive: non-Error catch branch @preserve */ String(error) /* v8 ignore stop */,
|
|
194
254
|
},
|
|
195
255
|
});
|
|
196
256
|
}
|
|
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.CANONICAL_BUNDLE_MANIFEST = void 0;
|
|
37
|
+
exports.getChangelogPath = getChangelogPath;
|
|
37
38
|
exports.getPackageVersion = getPackageVersion;
|
|
38
39
|
exports.createBundleMeta = createBundleMeta;
|
|
39
40
|
exports.backfillBundleMeta = backfillBundleMeta;
|
|
@@ -51,13 +52,30 @@ exports.CANONICAL_BUNDLE_MANIFEST = [
|
|
|
51
52
|
{ path: "psyche/LORE.md", kind: "file" },
|
|
52
53
|
{ path: "psyche/TACIT.md", kind: "file" },
|
|
53
54
|
{ path: "psyche/ASPIRATIONS.md", kind: "file" },
|
|
54
|
-
{ path: "
|
|
55
|
+
{ path: "arc", kind: "dir" },
|
|
56
|
+
{ path: "arc/episodes", kind: "dir" },
|
|
57
|
+
{ path: "arc/obligations", kind: "dir" },
|
|
58
|
+
{ path: "arc/cares", kind: "dir" },
|
|
59
|
+
{ path: "arc/intentions", kind: "dir" },
|
|
60
|
+
{ path: "diary", kind: "dir" },
|
|
61
|
+
{ path: "journal", kind: "dir" },
|
|
55
62
|
{ path: "friends", kind: "dir" },
|
|
63
|
+
{ path: "state", kind: "dir" },
|
|
56
64
|
{ path: "tasks", kind: "dir" },
|
|
57
65
|
{ path: "skills", kind: "dir" },
|
|
58
66
|
{ path: "senses", kind: "dir" },
|
|
59
67
|
{ path: "senses/teams", kind: "dir" },
|
|
60
68
|
];
|
|
69
|
+
function getChangelogPath() {
|
|
70
|
+
const changelogPath = path.resolve(__dirname, "../../changelog.json");
|
|
71
|
+
(0, runtime_1.emitNervesEvent)({
|
|
72
|
+
component: "mind",
|
|
73
|
+
event: "mind.changelog_path_resolved",
|
|
74
|
+
message: "resolved changelog path",
|
|
75
|
+
meta: { path: changelogPath },
|
|
76
|
+
});
|
|
77
|
+
return changelogPath;
|
|
78
|
+
}
|
|
61
79
|
function getPackageVersion() {
|
|
62
80
|
const packageJsonPath = path.resolve(__dirname, "../../package.json");
|
|
63
81
|
const raw = fs.readFileSync(packageJsonPath, "utf-8");
|