@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,8 @@
1
+ "use strict";
2
+ /**
3
+ * Shared attention queue types.
4
+ *
5
+ * Canonical home for the AttentionItem interface — consumed by heart/, repertoire/, nerves/, and senses/.
6
+ * Placed in heart/ because attention is a turn-coordination concern.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,179 @@
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.createCare = createCare;
37
+ exports.readCares = readCares;
38
+ exports.readActiveCares = readActiveCares;
39
+ exports.updateCare = updateCare;
40
+ exports.resolveCare = resolveCare;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const runtime_1 = require("../nerves/runtime");
44
+ const sync_1 = require("../heart/sync");
45
+ function caresDir(agentRoot) {
46
+ return path.join(agentRoot, "arc", "cares");
47
+ }
48
+ function careFilePath(agentRoot, id) {
49
+ return path.join(caresDir(agentRoot), `${id}.json`);
50
+ }
51
+ function generateId() {
52
+ const timestamp = Date.now();
53
+ const random = Math.random().toString(36).slice(2, 10);
54
+ return `care-${timestamp}-${random}`;
55
+ }
56
+ function createCare(agentRoot, input) {
57
+ const now = new Date().toISOString();
58
+ const id = generateId();
59
+ const care = {
60
+ id,
61
+ label: input.label,
62
+ why: input.why,
63
+ kind: input.kind,
64
+ status: input.status,
65
+ salience: input.salience,
66
+ steward: input.steward,
67
+ relatedFriendIds: input.relatedFriendIds,
68
+ relatedAgentIds: input.relatedAgentIds,
69
+ relatedObligationIds: input.relatedObligationIds,
70
+ relatedEpisodeIds: input.relatedEpisodeIds,
71
+ currentRisk: input.currentRisk,
72
+ nextCheckAt: input.nextCheckAt,
73
+ createdAt: now,
74
+ updatedAt: now,
75
+ };
76
+ const dir = caresDir(agentRoot);
77
+ fs.mkdirSync(dir, { recursive: true });
78
+ const filePath = careFilePath(agentRoot, id);
79
+ fs.writeFileSync(filePath, JSON.stringify(care, null, 2), "utf-8");
80
+ (0, sync_1.trackSyncWrite)(filePath);
81
+ (0, runtime_1.emitNervesEvent)({
82
+ component: "heart",
83
+ event: "heart.care_created",
84
+ message: `care created: ${input.label}`,
85
+ meta: { careId: id, status: input.status, salience: input.salience },
86
+ });
87
+ return care;
88
+ }
89
+ function readCares(agentRoot) {
90
+ const dir = caresDir(agentRoot);
91
+ if (!fs.existsSync(dir)) {
92
+ (0, runtime_1.emitNervesEvent)({
93
+ component: "heart",
94
+ event: "heart.cares_read",
95
+ message: "read cares: directory missing, returning empty",
96
+ meta: { count: 0 },
97
+ });
98
+ return [];
99
+ }
100
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith(".json"));
101
+ const cares = [];
102
+ for (const file of files) {
103
+ try {
104
+ const content = fs.readFileSync(path.join(dir, file), "utf-8");
105
+ const care = JSON.parse(content);
106
+ cares.push(care);
107
+ }
108
+ catch {
109
+ // Skip malformed JSON files gracefully
110
+ }
111
+ }
112
+ (0, runtime_1.emitNervesEvent)({
113
+ component: "heart",
114
+ event: "heart.cares_read",
115
+ message: `read ${cares.length} cares`,
116
+ meta: { count: cares.length },
117
+ });
118
+ return cares;
119
+ }
120
+ function readActiveCares(agentRoot) {
121
+ const all = readCares(agentRoot);
122
+ const active = all.filter((c) => c.status === "active" || c.status === "watching");
123
+ (0, runtime_1.emitNervesEvent)({
124
+ component: "heart",
125
+ event: "heart.active_cares_read",
126
+ message: `read ${active.length} active cares`,
127
+ meta: { count: active.length, total: all.length },
128
+ });
129
+ return active;
130
+ }
131
+ function readCareFile(agentRoot, id) {
132
+ const filePath = careFilePath(agentRoot, id);
133
+ if (!fs.existsSync(filePath)) {
134
+ throw new Error(`Care not found: ${id}`);
135
+ }
136
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
137
+ }
138
+ function writeCareFile(agentRoot, care) {
139
+ const filePath = careFilePath(agentRoot, care.id);
140
+ fs.writeFileSync(filePath, JSON.stringify(care, null, 2), "utf-8");
141
+ (0, sync_1.trackSyncWrite)(filePath);
142
+ }
143
+ function updateCare(agentRoot, id, updates) {
144
+ const care = readCareFile(agentRoot, id);
145
+ const now = new Date().toISOString();
146
+ const updated = {
147
+ ...care,
148
+ ...updates,
149
+ id: care.id, // protect ID from overwrite
150
+ createdAt: care.createdAt, // protect createdAt
151
+ updatedAt: now,
152
+ };
153
+ writeCareFile(agentRoot, updated);
154
+ (0, runtime_1.emitNervesEvent)({
155
+ component: "heart",
156
+ event: "heart.care_updated",
157
+ message: `care updated: ${updated.label}`,
158
+ meta: { careId: id, updates: Object.keys(updates) },
159
+ });
160
+ return updated;
161
+ }
162
+ function resolveCare(agentRoot, id) {
163
+ const care = readCareFile(agentRoot, id);
164
+ const now = new Date().toISOString();
165
+ const resolved = {
166
+ ...care,
167
+ status: "resolved",
168
+ resolvedAt: now,
169
+ updatedAt: now,
170
+ };
171
+ writeCareFile(agentRoot, resolved);
172
+ (0, runtime_1.emitNervesEvent)({
173
+ component: "heart",
174
+ event: "heart.care_resolved",
175
+ message: `care resolved: ${resolved.label}`,
176
+ meta: { careId: id },
177
+ });
178
+ return resolved;
179
+ }
@@ -0,0 +1,119 @@
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.emitEpisode = emitEpisode;
37
+ exports.readRecentEpisodes = readRecentEpisodes;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const runtime_1 = require("../nerves/runtime");
41
+ const sync_1 = require("../heart/sync");
42
+ function episodesDir(agentRoot) {
43
+ return path.join(agentRoot, "arc", "episodes");
44
+ }
45
+ function generateId() {
46
+ const timestamp = Date.now();
47
+ const random = Math.random().toString(36).slice(2, 10);
48
+ return `ep-${timestamp}-${random}`;
49
+ }
50
+ function emitEpisode(agentRoot, input) {
51
+ const now = new Date().toISOString();
52
+ const id = generateId();
53
+ const episode = {
54
+ id,
55
+ timestamp: now,
56
+ kind: input.kind,
57
+ summary: input.summary,
58
+ whyItMattered: input.whyItMattered,
59
+ relatedEntities: input.relatedEntities,
60
+ salience: input.salience,
61
+ ...(input.meta ? { meta: input.meta } : {}),
62
+ };
63
+ const dir = episodesDir(agentRoot);
64
+ fs.mkdirSync(dir, { recursive: true });
65
+ const filePath = path.join(dir, `${id}.json`);
66
+ fs.writeFileSync(filePath, JSON.stringify(episode, null, 2), "utf-8");
67
+ (0, sync_1.trackSyncWrite)(filePath);
68
+ (0, runtime_1.emitNervesEvent)({
69
+ component: "mind",
70
+ event: "mind.episode_emitted",
71
+ message: `episode emitted: ${input.kind}`,
72
+ meta: {
73
+ episodeId: id,
74
+ kind: input.kind,
75
+ salience: input.salience,
76
+ },
77
+ });
78
+ return episode;
79
+ }
80
+ function readRecentEpisodes(agentRoot, options) {
81
+ const dir = episodesDir(agentRoot);
82
+ if (!fs.existsSync(dir)) {
83
+ (0, runtime_1.emitNervesEvent)({
84
+ component: "mind",
85
+ event: "mind.episodes_read",
86
+ message: "read episodes: directory missing, returning empty",
87
+ meta: { count: 0 },
88
+ });
89
+ return [];
90
+ }
91
+ const limit = options?.limit ?? 50;
92
+ const since = options?.since;
93
+ const kinds = options?.kinds;
94
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith(".json"));
95
+ const episodes = [];
96
+ for (const file of files) {
97
+ try {
98
+ const content = fs.readFileSync(path.join(dir, file), "utf-8");
99
+ const episode = JSON.parse(content);
100
+ if (since && episode.timestamp < since)
101
+ continue;
102
+ if (kinds && !kinds.includes(episode.kind))
103
+ continue;
104
+ episodes.push(episode);
105
+ }
106
+ catch {
107
+ // Skip malformed JSON files gracefully
108
+ }
109
+ }
110
+ episodes.sort((a, b) => b.timestamp.localeCompare(a.timestamp));
111
+ const result = episodes.slice(0, limit);
112
+ (0, runtime_1.emitNervesEvent)({
113
+ component: "mind",
114
+ event: "mind.episodes_read",
115
+ message: `read ${result.length} recent episodes`,
116
+ meta: { count: result.length, total: episodes.length, limit },
117
+ });
118
+ return result;
119
+ }
@@ -0,0 +1,173 @@
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.captureIntention = captureIntention;
37
+ exports.readOpenIntentions = readOpenIntentions;
38
+ exports.resolveIntention = resolveIntention;
39
+ exports.dismissIntention = dismissIntention;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const runtime_1 = require("../nerves/runtime");
43
+ const sync_1 = require("../heart/sync");
44
+ function intentionsDir(agentRoot) {
45
+ return path.join(agentRoot, "arc", "intentions");
46
+ }
47
+ function intentionFilePath(agentRoot, id) {
48
+ return path.join(intentionsDir(agentRoot), `${id}.json`);
49
+ }
50
+ function generateId() {
51
+ const timestamp = Date.now();
52
+ const random = Math.random().toString(36).slice(2, 10);
53
+ return `int-${timestamp}-${random}`;
54
+ }
55
+ const SALIENCE_ORDER = {
56
+ high: 3,
57
+ medium: 2,
58
+ low: 1,
59
+ };
60
+ function salienceRank(salience) {
61
+ if (!salience)
62
+ return 0;
63
+ return SALIENCE_ORDER[salience] ?? 0;
64
+ }
65
+ function captureIntention(agentRoot, input) {
66
+ const now = new Date().toISOString();
67
+ const id = generateId();
68
+ const intention = {
69
+ id,
70
+ content: input.content,
71
+ status: "open",
72
+ createdAt: now,
73
+ updatedAt: now,
74
+ ...(input.salience ? { salience: input.salience } : {}),
75
+ source: input.source,
76
+ ...(input.relatedFriendId ? { relatedFriendId: input.relatedFriendId } : {}),
77
+ ...(input.relatedObligationId ? { relatedObligationId: input.relatedObligationId } : {}),
78
+ ...(input.relatedCareId ? { relatedCareId: input.relatedCareId } : {}),
79
+ ...(input.nudgeAfter ? { nudgeAfter: input.nudgeAfter } : {}),
80
+ };
81
+ const dir = intentionsDir(agentRoot);
82
+ fs.mkdirSync(dir, { recursive: true });
83
+ const filePath = intentionFilePath(agentRoot, id);
84
+ fs.writeFileSync(filePath, JSON.stringify(intention, null, 2), "utf-8");
85
+ (0, sync_1.trackSyncWrite)(filePath);
86
+ (0, runtime_1.emitNervesEvent)({
87
+ component: "heart",
88
+ event: "heart.intention_captured",
89
+ message: `intention captured: ${input.content.slice(0, 60)}`,
90
+ meta: { intentionId: id, source: input.source, salience: input.salience },
91
+ });
92
+ return intention;
93
+ }
94
+ function readOpenIntentions(agentRoot, options) {
95
+ const dir = intentionsDir(agentRoot);
96
+ if (!fs.existsSync(dir)) {
97
+ (0, runtime_1.emitNervesEvent)({
98
+ component: "heart",
99
+ event: "heart.intentions_read",
100
+ message: "read intentions: directory missing, returning empty",
101
+ meta: { count: 0 },
102
+ });
103
+ return [];
104
+ }
105
+ const limit = options?.limit ?? 20;
106
+ const files = fs.readdirSync(dir).filter((f) => f.endsWith(".json"));
107
+ const intentions = [];
108
+ for (const file of files) {
109
+ try {
110
+ const content = fs.readFileSync(path.join(dir, file), "utf-8");
111
+ const intention = JSON.parse(content);
112
+ if (intention.status === "open") {
113
+ intentions.push(intention);
114
+ }
115
+ }
116
+ catch {
117
+ // Skip malformed JSON files
118
+ }
119
+ }
120
+ // Sort by salience descending, then createdAt descending
121
+ intentions.sort((a, b) => {
122
+ const salienceDiff = salienceRank(b.salience) - salienceRank(a.salience);
123
+ if (salienceDiff !== 0)
124
+ return salienceDiff;
125
+ return b.createdAt.localeCompare(a.createdAt);
126
+ });
127
+ const result = intentions.slice(0, limit);
128
+ (0, runtime_1.emitNervesEvent)({
129
+ component: "heart",
130
+ event: "heart.intentions_read",
131
+ message: `read ${result.length} open intentions`,
132
+ meta: { count: result.length, total: intentions.length, limit },
133
+ });
134
+ return result;
135
+ }
136
+ function readIntentionFile(agentRoot, id) {
137
+ const filePath = intentionFilePath(agentRoot, id);
138
+ if (!fs.existsSync(filePath)) {
139
+ throw new Error(`Intention not found: ${id}`);
140
+ }
141
+ return JSON.parse(fs.readFileSync(filePath, "utf-8"));
142
+ }
143
+ function writeIntentionFile(agentRoot, intention) {
144
+ const filePath = intentionFilePath(agentRoot, intention.id);
145
+ fs.writeFileSync(filePath, JSON.stringify(intention, null, 2), "utf-8");
146
+ (0, sync_1.trackSyncWrite)(filePath);
147
+ }
148
+ function resolveIntention(agentRoot, id) {
149
+ const intention = readIntentionFile(agentRoot, id);
150
+ intention.status = "done";
151
+ intention.updatedAt = new Date().toISOString();
152
+ writeIntentionFile(agentRoot, intention);
153
+ (0, runtime_1.emitNervesEvent)({
154
+ component: "heart",
155
+ event: "heart.intention_resolved",
156
+ message: `intention resolved: ${intention.content.slice(0, 60)}`,
157
+ meta: { intentionId: id },
158
+ });
159
+ return intention;
160
+ }
161
+ function dismissIntention(agentRoot, id) {
162
+ const intention = readIntentionFile(agentRoot, id);
163
+ intention.status = "dismissed";
164
+ intention.updatedAt = new Date().toISOString();
165
+ writeIntentionFile(agentRoot, intention);
166
+ (0, runtime_1.emitNervesEvent)({
167
+ component: "heart",
168
+ event: "heart.intention_dismissed",
169
+ message: `intention dismissed: ${intention.content.slice(0, 60)}`,
170
+ meta: { intentionId: id },
171
+ });
172
+ return intention;
173
+ }