@ouro.bot/cli 0.1.0-alpha.21 → 0.1.0-alpha.210

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.
Files changed (227) hide show
  1. package/README.md +187 -191
  2. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
  3. package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
  4. package/changelog.json +1312 -0
  5. package/dist/arc/attention-types.js +8 -0
  6. package/dist/arc/cares.js +179 -0
  7. package/dist/arc/episodes.js +119 -0
  8. package/dist/arc/intentions.js +173 -0
  9. package/dist/arc/obligations.js +321 -0
  10. package/dist/arc/presence.js +185 -0
  11. package/dist/heart/active-work.js +832 -0
  12. package/dist/heart/agent-entry.js +37 -2
  13. package/dist/heart/auth/auth-flow.js +444 -0
  14. package/dist/heart/bridges/manager.js +358 -0
  15. package/dist/heart/bridges/state-machine.js +135 -0
  16. package/dist/heart/bridges/store.js +123 -0
  17. package/dist/heart/commitments.js +111 -0
  18. package/dist/heart/config-registry.js +305 -0
  19. package/dist/heart/config.js +59 -30
  20. package/dist/heart/core.js +606 -131
  21. package/dist/heart/cross-chat-delivery.js +146 -0
  22. package/dist/heart/daemon/agent-config-check.js +149 -0
  23. package/dist/heart/daemon/agent-discovery.js +81 -0
  24. package/dist/heart/daemon/agent-service.js +360 -0
  25. package/dist/heart/daemon/cadence.js +70 -0
  26. package/dist/heart/daemon/cli-defaults.js +557 -0
  27. package/dist/heart/daemon/cli-exec.js +1847 -0
  28. package/dist/heart/daemon/cli-parse.js +759 -0
  29. package/dist/heart/daemon/cli-render.js +316 -0
  30. package/dist/heart/daemon/cli-types.js +8 -0
  31. package/dist/heart/daemon/daemon-cli.js +29 -1163
  32. package/dist/heart/daemon/daemon-entry.js +182 -4
  33. package/dist/heart/daemon/daemon-health.js +136 -0
  34. package/dist/heart/daemon/daemon-runtime-sync.js +153 -12
  35. package/dist/heart/daemon/daemon-tombstone.js +123 -0
  36. package/dist/heart/daemon/daemon.js +491 -18
  37. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  38. package/dist/heart/daemon/hooks/bundle-meta.js +206 -0
  39. package/dist/heart/daemon/inner-status.js +89 -0
  40. package/dist/heart/daemon/launchd.js +165 -0
  41. package/dist/heart/daemon/log-tailer.js +4 -3
  42. package/dist/heart/daemon/message-router.js +17 -8
  43. package/dist/heart/daemon/os-cron-deps.js +134 -0
  44. package/dist/heart/daemon/ouro-bot-entry.js +1 -1
  45. package/dist/heart/daemon/process-manager.js +123 -0
  46. package/dist/heart/daemon/run-hooks.js +39 -0
  47. package/dist/heart/daemon/runtime-logging.js +58 -15
  48. package/dist/heart/daemon/runtime-metadata.js +101 -0
  49. package/dist/heart/daemon/runtime-mode.js +67 -0
  50. package/dist/heart/daemon/safe-mode.js +161 -0
  51. package/dist/heart/daemon/sense-manager.js +71 -2
  52. package/dist/heart/daemon/session-id-resolver.js +131 -0
  53. package/dist/heart/daemon/skill-management-installer.js +94 -0
  54. package/dist/heart/daemon/socket-client.js +202 -0
  55. package/dist/heart/daemon/task-scheduler.js +3 -25
  56. package/dist/heart/daemon/thoughts.js +507 -0
  57. package/dist/heart/delegation.js +62 -0
  58. package/dist/heart/habits/habit-migration.js +181 -0
  59. package/dist/heart/habits/habit-parser.js +119 -0
  60. package/dist/heart/habits/habit-scheduler.js +369 -0
  61. package/dist/heart/{daemon → hatch}/hatch-flow.js +29 -119
  62. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  63. package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
  64. package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
  65. package/dist/heart/identity.js +144 -55
  66. package/dist/heart/kicks.js +2 -20
  67. package/dist/heart/mcp/mcp-server.js +608 -0
  68. package/dist/heart/migrate-config.js +127 -0
  69. package/dist/heart/model-capabilities.js +48 -0
  70. package/dist/heart/outlook/outlook-http.js +439 -0
  71. package/dist/heart/outlook/outlook-read.js +1618 -0
  72. package/dist/heart/outlook/outlook-render.js +1032 -0
  73. package/dist/heart/outlook/outlook-types.js +7 -0
  74. package/dist/heart/outlook/outlook-view.js +194 -0
  75. package/dist/heart/progress-story.js +42 -0
  76. package/dist/heart/provider-failover.js +88 -0
  77. package/dist/heart/provider-ping.js +162 -0
  78. package/dist/heart/providers/anthropic-token.js +163 -0
  79. package/dist/heart/providers/anthropic.js +187 -41
  80. package/dist/heart/providers/azure.js +116 -10
  81. package/dist/heart/providers/github-copilot.js +157 -0
  82. package/dist/heart/providers/minimax.js +33 -3
  83. package/dist/heart/providers/openai-codex.js +51 -16
  84. package/dist/heart/session-activity.js +172 -0
  85. package/dist/heart/session-recall.js +216 -0
  86. package/dist/heart/start-of-turn-packet.js +330 -0
  87. package/dist/heart/streaming.js +36 -27
  88. package/dist/heart/sync.js +217 -0
  89. package/dist/heart/target-resolution.js +127 -0
  90. package/dist/heart/tempo.js +93 -0
  91. package/dist/heart/temporal-view.js +41 -0
  92. package/dist/heart/tool-activity-callbacks.js +36 -0
  93. package/dist/heart/tool-description.js +135 -0
  94. package/dist/heart/tool-loop.js +200 -0
  95. package/dist/heart/turn-context.js +358 -0
  96. package/dist/heart/turn-coordinator.js +28 -0
  97. package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
  98. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  99. package/dist/heart/{daemon → versioning}/ouro-path-installer.js +78 -35
  100. package/dist/heart/versioning/ouro-version-manager.js +171 -0
  101. package/dist/heart/versioning/staged-restart.js +138 -0
  102. package/dist/heart/versioning/update-checker.js +111 -0
  103. package/dist/heart/versioning/update-hooks.js +138 -0
  104. package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +41 -3
  105. package/dist/mind/associative-recall.js +122 -32
  106. package/dist/mind/bundle-manifest.js +19 -1
  107. package/dist/mind/context.js +125 -14
  108. package/dist/mind/{memory.js → diary.js} +69 -56
  109. package/dist/mind/file-state.js +179 -0
  110. package/dist/mind/first-impressions.js +16 -2
  111. package/dist/mind/friends/channel.js +56 -0
  112. package/dist/mind/friends/group-context.js +144 -0
  113. package/dist/mind/friends/store-file.js +36 -0
  114. package/dist/mind/friends/trust-explanation.js +74 -0
  115. package/dist/mind/friends/types.js +8 -0
  116. package/dist/mind/journal-index.js +161 -0
  117. package/dist/mind/obligation-steering.js +221 -0
  118. package/dist/mind/pending.js +76 -9
  119. package/dist/mind/phrases.js +1 -0
  120. package/dist/mind/prompt.js +795 -108
  121. package/dist/mind/scrutiny.js +173 -0
  122. package/dist/mind/token-estimate.js +8 -12
  123. package/dist/nerves/coverage/audit.js +1 -1
  124. package/dist/nerves/coverage/file-completeness.js +42 -5
  125. package/dist/nerves/coverage/run-artifacts.js +1 -1
  126. package/dist/nerves/event-buffer.js +111 -0
  127. package/dist/nerves/index.js +63 -3
  128. package/dist/nerves/observation.js +20 -0
  129. package/dist/nerves/runtime.js +5 -1
  130. package/dist/outlook-ui/assets/index-Ck8agNeO.js +61 -0
  131. package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
  132. package/dist/outlook-ui/index.html +15 -0
  133. package/dist/repertoire/ado-semantic.js +11 -5
  134. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  135. package/dist/repertoire/coding/context-pack.js +330 -0
  136. package/dist/repertoire/coding/feedback.js +197 -30
  137. package/dist/repertoire/coding/manager.js +149 -2
  138. package/dist/repertoire/coding/spawner.js +55 -9
  139. package/dist/repertoire/coding/tools.js +170 -7
  140. package/dist/repertoire/guardrails.js +291 -0
  141. package/dist/repertoire/mcp-client.js +254 -0
  142. package/dist/repertoire/mcp-manager.js +251 -0
  143. package/dist/repertoire/shell-sessions.js +133 -0
  144. package/dist/repertoire/skills.js +14 -23
  145. package/dist/repertoire/tasks/board.js +43 -5
  146. package/dist/repertoire/tasks/fix.js +182 -0
  147. package/dist/repertoire/tasks/index.js +28 -10
  148. package/dist/repertoire/tasks/lifecycle.js +2 -2
  149. package/dist/repertoire/tasks/parser.js +3 -2
  150. package/dist/repertoire/tasks/scanner.js +194 -37
  151. package/dist/repertoire/tasks/transitions.js +11 -28
  152. package/dist/repertoire/tools-base.js +31 -771
  153. package/dist/repertoire/tools-bluebubbles.js +94 -0
  154. package/dist/repertoire/tools-bridge.js +141 -0
  155. package/dist/repertoire/tools-config.js +266 -0
  156. package/dist/repertoire/tools-continuity.js +248 -0
  157. package/dist/repertoire/tools-files.js +342 -0
  158. package/dist/repertoire/tools-flow.js +62 -0
  159. package/dist/repertoire/tools-github.js +1 -6
  160. package/dist/repertoire/tools-memory.js +347 -0
  161. package/dist/repertoire/tools-session.js +682 -0
  162. package/dist/repertoire/tools-shell.js +120 -0
  163. package/dist/repertoire/tools-surface.js +228 -0
  164. package/dist/repertoire/tools-teams.js +12 -59
  165. package/dist/repertoire/tools.js +132 -124
  166. package/dist/scripts/claude-code-hook.js +41 -0
  167. package/dist/scripts/claude-code-stop-hook.js +47 -0
  168. package/dist/senses/attention-queue.js +97 -0
  169. package/dist/senses/bluebubbles-client.js +102 -3
  170. package/dist/senses/bluebubbles-entry.js +2 -0
  171. package/dist/senses/bluebubbles-inbound-log.js +109 -0
  172. package/dist/senses/bluebubbles-media.js +118 -23
  173. package/dist/senses/bluebubbles-model.js +12 -4
  174. package/dist/senses/bluebubbles-mutation-log.js +45 -5
  175. package/dist/senses/bluebubbles-runtime-state.js +109 -0
  176. package/dist/senses/bluebubbles-session-cleanup.js +72 -0
  177. package/dist/senses/bluebubbles.js +1008 -102
  178. package/dist/senses/cli/adapter.js +274 -0
  179. package/dist/senses/cli/ink-app.js +156 -0
  180. package/dist/senses/cli/inline-diff.js +64 -0
  181. package/dist/senses/cli/message-list.js +51 -0
  182. package/dist/senses/cli/ouro-tui.js +358 -0
  183. package/dist/senses/cli/spinner-imperative.js +135 -0
  184. package/dist/senses/cli/spinner.js +101 -0
  185. package/dist/senses/cli/status-line.js +60 -0
  186. package/dist/senses/cli/streaming-markdown.js +526 -0
  187. package/dist/senses/cli/tool-display.js +83 -0
  188. package/dist/senses/cli/tool-render.js +85 -0
  189. package/dist/senses/cli/tui-store.js +198 -0
  190. package/dist/senses/cli/virtual-list.js +35 -0
  191. package/dist/senses/cli-entry.js +1 -1
  192. package/dist/senses/cli-layout.js +187 -0
  193. package/dist/senses/cli.js +508 -243
  194. package/dist/senses/commands.js +65 -1
  195. package/dist/senses/continuity.js +94 -0
  196. package/dist/senses/habit-turn-message.js +108 -0
  197. package/dist/senses/inner-dialog-worker.js +112 -19
  198. package/dist/senses/inner-dialog.js +591 -84
  199. package/dist/senses/pipeline.js +559 -0
  200. package/dist/senses/shared-turn.js +196 -0
  201. package/dist/senses/surface-tool.js +68 -0
  202. package/dist/senses/teams.js +667 -120
  203. package/dist/senses/trust-gate.js +112 -2
  204. package/package.json +16 -6
  205. package/skills/configure-dev-tools.md +81 -0
  206. package/subagents/README.md +4 -70
  207. package/dist/heart/daemon/subagent-installer.js +0 -134
  208. package/dist/senses/debug-activity.js +0 -107
  209. package/subagents/work-doer.md +0 -235
  210. package/subagents/work-merger.md +0 -618
  211. package/subagents/work-planner.md +0 -382
  212. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  213. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  214. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  215. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  216. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  217. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  218. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  219. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  220. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  221. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  222. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  223. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +0 -0
  224. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  225. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  226. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  227. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
@@ -0,0 +1,321 @@
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.isOpenObligationStatus = isOpenObligationStatus;
37
+ exports.isOpenObligation = isOpenObligation;
38
+ exports.createObligation = createObligation;
39
+ exports.readObligations = readObligations;
40
+ exports.readPendingObligations = readPendingObligations;
41
+ exports.advanceObligation = advanceObligation;
42
+ exports.fulfillObligation = fulfillObligation;
43
+ exports.findPendingObligationForOrigin = findPendingObligationForOrigin;
44
+ exports.enrichObligation = enrichObligation;
45
+ exports.generateObligationId = generateObligationId;
46
+ exports.getReturnObligationsDir = getReturnObligationsDir;
47
+ exports.createReturnObligation = createReturnObligation;
48
+ exports.readReturnObligation = readReturnObligation;
49
+ exports.advanceReturnObligation = advanceReturnObligation;
50
+ exports.listActiveReturnObligations = listActiveReturnObligations;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const identity_1 = require("../heart/identity");
54
+ const runtime_1 = require("../nerves/runtime");
55
+ const sync_1 = require("../heart/sync");
56
+ function obligationsDir(agentRoot) {
57
+ return path.join(agentRoot, "arc", "obligations");
58
+ }
59
+ function obligationFilePath(agentRoot, id) {
60
+ return path.join(obligationsDir(agentRoot), `${id}.json`);
61
+ }
62
+ function generateId() {
63
+ const timestamp = Date.now();
64
+ const random = Math.random().toString(36).slice(2, 10);
65
+ return `${timestamp}-${random}`;
66
+ }
67
+ function isOpenObligationStatus(status) {
68
+ return status !== "fulfilled";
69
+ }
70
+ function isOpenObligation(obligation) {
71
+ return isOpenObligationStatus(obligation.status);
72
+ }
73
+ function createObligation(agentRoot, input) {
74
+ const now = new Date().toISOString();
75
+ const id = generateId();
76
+ const obligation = {
77
+ id,
78
+ origin: input.origin,
79
+ ...(input.bridgeId ? { bridgeId: input.bridgeId } : {}),
80
+ content: input.content,
81
+ status: "pending",
82
+ createdAt: now,
83
+ updatedAt: now,
84
+ };
85
+ const dir = obligationsDir(agentRoot);
86
+ fs.mkdirSync(dir, { recursive: true });
87
+ const filePath = obligationFilePath(agentRoot, id);
88
+ fs.writeFileSync(filePath, JSON.stringify(obligation, null, 2), "utf-8");
89
+ (0, sync_1.trackSyncWrite)(filePath);
90
+ (0, runtime_1.emitNervesEvent)({
91
+ component: "engine",
92
+ event: "engine.obligation_created",
93
+ message: "obligation created",
94
+ meta: {
95
+ obligationId: id,
96
+ friendId: input.origin.friendId,
97
+ channel: input.origin.channel,
98
+ key: input.origin.key,
99
+ },
100
+ });
101
+ return obligation;
102
+ }
103
+ function readObligations(agentRoot) {
104
+ const dir = obligationsDir(agentRoot);
105
+ if (!fs.existsSync(dir))
106
+ return [];
107
+ let entries;
108
+ try {
109
+ entries = fs.readdirSync(dir);
110
+ }
111
+ catch {
112
+ /* v8 ignore next -- defensive: readdirSync race after existsSync @preserve */
113
+ return [];
114
+ }
115
+ const jsonFiles = entries.filter((entry) => entry.endsWith(".json")).sort();
116
+ const obligations = [];
117
+ for (const file of jsonFiles) {
118
+ try {
119
+ const raw = fs.readFileSync(path.join(dir, file), "utf-8");
120
+ const parsed = JSON.parse(raw);
121
+ if (typeof parsed.id === "string" && typeof parsed.content === "string") {
122
+ obligations.push(parsed);
123
+ }
124
+ }
125
+ catch {
126
+ // skip malformed files
127
+ }
128
+ }
129
+ return obligations;
130
+ }
131
+ function readPendingObligations(agentRoot) {
132
+ return readObligations(agentRoot).filter(isOpenObligation);
133
+ }
134
+ function advanceObligation(agentRoot, obligationId, update) {
135
+ const filePath = obligationFilePath(agentRoot, obligationId);
136
+ let obligation;
137
+ try {
138
+ const raw = fs.readFileSync(filePath, "utf-8");
139
+ obligation = JSON.parse(raw);
140
+ }
141
+ catch {
142
+ return;
143
+ }
144
+ const previousStatus = obligation.status;
145
+ if (update.status) {
146
+ obligation.status = update.status;
147
+ if (update.status === "fulfilled") {
148
+ obligation.fulfilledAt = new Date().toISOString();
149
+ }
150
+ }
151
+ if (update.currentSurface) {
152
+ obligation.currentSurface = update.currentSurface;
153
+ }
154
+ if (typeof update.currentArtifact === "string") {
155
+ obligation.currentArtifact = update.currentArtifact;
156
+ }
157
+ if (typeof update.nextAction === "string") {
158
+ obligation.nextAction = update.nextAction;
159
+ }
160
+ if (typeof update.latestNote === "string") {
161
+ obligation.latestNote = update.latestNote;
162
+ }
163
+ obligation.updatedAt = new Date().toISOString();
164
+ fs.writeFileSync(filePath, JSON.stringify(obligation, null, 2), "utf-8");
165
+ (0, sync_1.trackSyncWrite)(filePath);
166
+ (0, runtime_1.emitNervesEvent)({
167
+ component: "engine",
168
+ event: "engine.obligation_advanced",
169
+ message: "obligation advanced",
170
+ meta: {
171
+ obligationId,
172
+ previousStatus,
173
+ status: obligation.status,
174
+ friendId: obligation.origin.friendId,
175
+ channel: obligation.origin.channel,
176
+ key: obligation.origin.key,
177
+ surfaceKind: obligation.currentSurface?.kind ?? null,
178
+ surfaceLabel: obligation.currentSurface?.label ?? null,
179
+ },
180
+ });
181
+ }
182
+ function fulfillObligation(agentRoot, obligationId) {
183
+ advanceObligation(agentRoot, obligationId, { status: "fulfilled" });
184
+ const filePath = obligationFilePath(agentRoot, obligationId);
185
+ let obligation;
186
+ try {
187
+ const raw = fs.readFileSync(filePath, "utf-8");
188
+ obligation = JSON.parse(raw);
189
+ }
190
+ catch {
191
+ return;
192
+ }
193
+ (0, runtime_1.emitNervesEvent)({
194
+ component: "engine",
195
+ event: "engine.obligation_fulfilled",
196
+ message: "obligation fulfilled",
197
+ meta: {
198
+ obligationId,
199
+ friendId: obligation.origin.friendId,
200
+ channel: obligation.origin.channel,
201
+ key: obligation.origin.key,
202
+ },
203
+ });
204
+ }
205
+ function findPendingObligationForOrigin(agentRoot, origin) {
206
+ return readPendingObligations(agentRoot).find((ob) => ob.origin.friendId === origin.friendId
207
+ && ob.origin.channel === origin.channel
208
+ && ob.origin.key === origin.key);
209
+ }
210
+ function enrichObligation(agentRoot, id, meaning) {
211
+ const filePath = obligationFilePath(agentRoot, id);
212
+ if (!fs.existsSync(filePath)) {
213
+ throw new Error(`Obligation not found: ${id}`);
214
+ }
215
+ const raw = fs.readFileSync(filePath, "utf-8");
216
+ const obligation = JSON.parse(raw);
217
+ obligation.meaning = meaning;
218
+ obligation.updatedAt = new Date().toISOString();
219
+ fs.writeFileSync(filePath, JSON.stringify(obligation, null, 2), "utf-8");
220
+ (0, sync_1.trackSyncWrite)(filePath);
221
+ (0, runtime_1.emitNervesEvent)({
222
+ component: "engine",
223
+ event: "engine.obligation_enriched",
224
+ message: "obligation enriched with meaning",
225
+ meta: {
226
+ obligationId: id,
227
+ salience: meaning.salience,
228
+ stalenessClass: meaning.stalenessClass,
229
+ },
230
+ });
231
+ return obligation;
232
+ }
233
+ function generateObligationId(timestamp) {
234
+ return `${timestamp}-${Math.random().toString(36).slice(2, 10)}`;
235
+ }
236
+ function getReturnObligationsDir(agentName) {
237
+ return path.join((0, identity_1.getAgentRoot)(agentName), "arc", "obligations", "inner");
238
+ }
239
+ function createReturnObligation(agentName, obligation) {
240
+ const dir = getReturnObligationsDir(agentName);
241
+ fs.mkdirSync(dir, { recursive: true });
242
+ const filePath = path.join(dir, `${obligation.id}.json`);
243
+ fs.writeFileSync(filePath, JSON.stringify(obligation, null, 2), "utf8");
244
+ (0, sync_1.trackSyncWrite)(filePath);
245
+ (0, runtime_1.emitNervesEvent)({
246
+ event: "mind.obligation_created",
247
+ component: "mind",
248
+ message: "return obligation created",
249
+ meta: {
250
+ obligationId: obligation.id,
251
+ origin: `${obligation.origin.friendId}/${obligation.origin.channel}/${obligation.origin.key}`,
252
+ status: obligation.status,
253
+ },
254
+ });
255
+ return filePath;
256
+ }
257
+ function readReturnObligation(agentName, obligationId) {
258
+ const dir = getReturnObligationsDir(agentName);
259
+ try {
260
+ const raw = fs.readFileSync(path.join(dir, `${obligationId}.json`), "utf-8");
261
+ return JSON.parse(raw);
262
+ }
263
+ catch {
264
+ return null;
265
+ }
266
+ }
267
+ function advanceReturnObligation(agentName, obligationId, update) {
268
+ const existing = readReturnObligation(agentName, obligationId);
269
+ if (!existing)
270
+ return null;
271
+ const updated = {
272
+ ...existing,
273
+ status: update.status,
274
+ ...(update.startedAt !== undefined ? { startedAt: update.startedAt } : {}),
275
+ ...(update.returnedAt !== undefined ? { returnedAt: update.returnedAt } : {}),
276
+ ...(update.returnTarget !== undefined ? { returnTarget: update.returnTarget } : {}),
277
+ };
278
+ const dir = getReturnObligationsDir(agentName);
279
+ const advancedFilePath = path.join(dir, `${obligationId}.json`);
280
+ fs.writeFileSync(advancedFilePath, JSON.stringify(updated, null, 2), "utf8");
281
+ (0, sync_1.trackSyncWrite)(advancedFilePath);
282
+ (0, runtime_1.emitNervesEvent)({
283
+ event: "mind.obligation_advanced",
284
+ component: "mind",
285
+ message: `obligation advanced to ${update.status}`,
286
+ meta: {
287
+ obligationId,
288
+ status: update.status,
289
+ ...(update.returnTarget ? { returnTarget: update.returnTarget } : {}),
290
+ },
291
+ });
292
+ return updated;
293
+ }
294
+ function listActiveReturnObligations(agentName) {
295
+ const dir = getReturnObligationsDir(agentName);
296
+ if (!fs.existsSync(dir))
297
+ return [];
298
+ let entries;
299
+ try {
300
+ entries = fs.readdirSync(dir);
301
+ }
302
+ catch {
303
+ return [];
304
+ }
305
+ const obligations = [];
306
+ for (const file of entries) {
307
+ if (!file.endsWith(".json"))
308
+ continue;
309
+ try {
310
+ const raw = fs.readFileSync(path.join(dir, file), "utf-8");
311
+ const parsed = JSON.parse(raw);
312
+ if (parsed.status === "queued" || parsed.status === "running") {
313
+ obligations.push(parsed);
314
+ }
315
+ }
316
+ catch {
317
+ // skip unparseable
318
+ }
319
+ }
320
+ return obligations.sort((a, b) => a.createdAt - b.createdAt);
321
+ }
@@ -0,0 +1,185 @@
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.derivePresence = derivePresence;
37
+ exports.writePresence = writePresence;
38
+ exports.readPresence = readPresence;
39
+ exports.readPeerPresence = readPeerPresence;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const runtime_1 = require("../nerves/runtime");
43
+ function presenceDir(agentRoot) {
44
+ return path.join(agentRoot, "state", "presence");
45
+ }
46
+ function deriveAvailability(inputs) {
47
+ if (inputs.currentTempo === "crisis")
48
+ return "dnd";
49
+ if (inputs.activeSessions > 0)
50
+ return "active";
51
+ if (inputs.openObligations > 0)
52
+ return "idle";
53
+ return "away";
54
+ }
55
+ function deriveLane(inputs) {
56
+ const hasCoding = inputs.codingLanes > 0;
57
+ const hasBridges = inputs.activeBridges > 0;
58
+ if (hasCoding && hasBridges)
59
+ return "mixed";
60
+ if (hasCoding)
61
+ return "coding";
62
+ if (hasBridges)
63
+ return "conversation";
64
+ return "idle";
65
+ }
66
+ function deriveMission(inputs) {
67
+ const parts = [];
68
+ if (inputs.openObligations > 0) {
69
+ parts.push(`${inputs.openObligations} open obligation${inputs.openObligations !== 1 ? "s" : ""}`);
70
+ }
71
+ if (inputs.activeBridges > 0) {
72
+ parts.push(`${inputs.activeBridges} active bridge${inputs.activeBridges !== 1 ? "s" : ""}`);
73
+ }
74
+ if (inputs.codingLanes > 0) {
75
+ parts.push(`${inputs.codingLanes} coding lane${inputs.codingLanes !== 1 ? "s" : ""}`);
76
+ }
77
+ if (parts.length === 0)
78
+ return "no active work";
79
+ return parts.join(", ");
80
+ }
81
+ function derivePresence(_agentRoot, agentName, inputs) {
82
+ const presence = {
83
+ agentName,
84
+ availability: deriveAvailability(inputs),
85
+ lane: deriveLane(inputs),
86
+ mission: deriveMission(inputs),
87
+ tempo: inputs.currentTempo,
88
+ updatedAt: new Date().toISOString(),
89
+ };
90
+ (0, runtime_1.emitNervesEvent)({
91
+ component: "heart",
92
+ event: "heart.presence_derived",
93
+ message: `presence derived: ${presence.availability}/${presence.lane}`,
94
+ meta: {
95
+ agentName,
96
+ availability: presence.availability,
97
+ lane: presence.lane,
98
+ tempo: presence.tempo,
99
+ },
100
+ });
101
+ return presence;
102
+ }
103
+ function writePresence(agentRoot, _agentName, presence) {
104
+ const dir = presenceDir(agentRoot);
105
+ fs.mkdirSync(dir, { recursive: true });
106
+ fs.writeFileSync(path.join(dir, "self.json"), JSON.stringify(presence, null, 2), "utf-8");
107
+ (0, runtime_1.emitNervesEvent)({
108
+ component: "heart",
109
+ event: "heart.presence_written",
110
+ message: `presence written for ${presence.agentName}`,
111
+ meta: { agentName: presence.agentName },
112
+ });
113
+ }
114
+ function readPresence(agentRoot, _agentName) {
115
+ const filePath = path.join(presenceDir(agentRoot), "self.json");
116
+ if (!fs.existsSync(filePath)) {
117
+ (0, runtime_1.emitNervesEvent)({
118
+ component: "heart",
119
+ event: "heart.presence_read",
120
+ message: "presence file not found",
121
+ meta: { found: false },
122
+ });
123
+ return null;
124
+ }
125
+ try {
126
+ const raw = fs.readFileSync(filePath, "utf-8");
127
+ const presence = JSON.parse(raw);
128
+ (0, runtime_1.emitNervesEvent)({
129
+ component: "heart",
130
+ event: "heart.presence_read",
131
+ message: `presence read: ${presence.availability}`,
132
+ meta: { agentName: presence.agentName, found: true },
133
+ });
134
+ return presence;
135
+ }
136
+ catch {
137
+ (0, runtime_1.emitNervesEvent)({
138
+ component: "heart",
139
+ event: "heart.presence_read_error",
140
+ message: "failed to read presence file",
141
+ meta: { error: "parse error" },
142
+ });
143
+ return null;
144
+ }
145
+ }
146
+ function readPeerPresence(agentRoot) {
147
+ const friendsDir = path.join(agentRoot, "friends");
148
+ if (!fs.existsSync(friendsDir)) {
149
+ (0, runtime_1.emitNervesEvent)({
150
+ component: "heart",
151
+ event: "heart.peer_presence_read",
152
+ message: "no friends directory, no peers",
153
+ meta: { peerCount: 0 },
154
+ });
155
+ return [];
156
+ }
157
+ const files = fs.readdirSync(friendsDir).filter((f) => f.endsWith(".json"));
158
+ const peers = [];
159
+ for (const file of files) {
160
+ try {
161
+ const raw = fs.readFileSync(path.join(friendsDir, file), "utf-8");
162
+ const friend = JSON.parse(raw);
163
+ if (friend.kind !== "agent")
164
+ continue;
165
+ peers.push({
166
+ agentName: friend.name ?? path.basename(file, ".json"),
167
+ availability: "idle",
168
+ lane: "idle",
169
+ mission: "",
170
+ tempo: "brief",
171
+ updatedAt: friend.updatedAt ?? new Date().toISOString(),
172
+ });
173
+ }
174
+ catch {
175
+ // Skip malformed or unreadable files
176
+ }
177
+ }
178
+ (0, runtime_1.emitNervesEvent)({
179
+ component: "heart",
180
+ event: "heart.peer_presence_read",
181
+ message: `read ${peers.length} agent peer records from friends`,
182
+ meta: { peerCount: peers.length },
183
+ });
184
+ return peers;
185
+ }