@ouro.bot/cli 0.1.0-alpha.23 → 0.1.0-alpha.231

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 (241) 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 +1408 -1
  5. package/dist/arc/attention-types.js +8 -0
  6. package/dist/arc/cares.js +140 -0
  7. package/dist/arc/episodes.js +119 -0
  8. package/dist/arc/intentions.js +133 -0
  9. package/dist/arc/json-store.js +120 -0
  10. package/dist/arc/obligations.js +237 -0
  11. package/dist/arc/presence.js +185 -0
  12. package/dist/heart/active-work.js +832 -0
  13. package/dist/heart/agent-entry.js +37 -2
  14. package/dist/heart/auth/auth-flow.js +447 -0
  15. package/dist/heart/bridges/manager.js +358 -0
  16. package/dist/heart/bridges/state-machine.js +135 -0
  17. package/dist/heart/bridges/store.js +123 -0
  18. package/dist/heart/commitments.js +111 -0
  19. package/dist/heart/config-registry.js +305 -0
  20. package/dist/heart/config.js +63 -30
  21. package/dist/heart/core.js +601 -145
  22. package/dist/heart/cross-chat-delivery.js +131 -0
  23. package/dist/heart/daemon/agent-config-check.js +149 -0
  24. package/dist/heart/daemon/agent-discovery.js +81 -0
  25. package/dist/heart/daemon/agent-service.js +360 -0
  26. package/dist/heart/daemon/cadence.js +70 -0
  27. package/dist/heart/daemon/cli-defaults.js +557 -0
  28. package/dist/heart/daemon/cli-exec.js +1847 -0
  29. package/dist/heart/daemon/cli-parse.js +759 -0
  30. package/dist/heart/daemon/cli-render.js +316 -0
  31. package/dist/heart/daemon/cli-types.js +8 -0
  32. package/dist/heart/daemon/daemon-cli.js +29 -1163
  33. package/dist/heart/daemon/daemon-entry.js +202 -4
  34. package/dist/heart/daemon/daemon-health.js +136 -0
  35. package/dist/heart/daemon/daemon-runtime-sync.js +153 -12
  36. package/dist/heart/daemon/daemon-tombstone.js +123 -0
  37. package/dist/heart/daemon/daemon.js +489 -20
  38. package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
  39. package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
  40. package/dist/heart/daemon/inner-status.js +89 -0
  41. package/dist/heart/daemon/launchd.js +39 -8
  42. package/dist/heart/daemon/log-tailer.js +4 -3
  43. package/dist/heart/daemon/message-router.js +17 -8
  44. package/dist/heart/daemon/os-cron-deps.js +134 -0
  45. package/dist/heart/daemon/ouro-bot-entry.js +1 -1
  46. package/dist/heart/daemon/process-manager.js +123 -0
  47. package/dist/heart/daemon/run-hooks.js +2 -0
  48. package/dist/heart/daemon/runtime-logging.js +58 -15
  49. package/dist/heart/daemon/runtime-metadata.js +101 -0
  50. package/dist/heart/daemon/runtime-mode.js +67 -0
  51. package/dist/heart/daemon/safe-mode.js +161 -0
  52. package/dist/heart/daemon/sense-manager.js +72 -3
  53. package/dist/heart/daemon/session-id-resolver.js +131 -0
  54. package/dist/heart/daemon/skill-management-installer.js +94 -0
  55. package/dist/heart/daemon/socket-client.js +201 -0
  56. package/dist/heart/daemon/task-scheduler.js +3 -25
  57. package/dist/heart/daemon/thoughts.js +507 -0
  58. package/dist/heart/delegation.js +62 -0
  59. package/dist/heart/habits/habit-migration.js +181 -0
  60. package/dist/heart/habits/habit-parser.js +119 -0
  61. package/dist/heart/habits/habit-scheduler.js +369 -0
  62. package/dist/heart/{daemon → hatch}/hatch-flow.js +29 -119
  63. package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
  64. package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
  65. package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
  66. package/dist/heart/identity.js +144 -55
  67. package/dist/heart/kicks.js +2 -20
  68. package/dist/heart/mcp/mcp-server.js +608 -0
  69. package/dist/heart/migrate-config.js +127 -0
  70. package/dist/heart/model-capabilities.js +48 -0
  71. package/dist/heart/outlook/outlook-http.js +439 -0
  72. package/dist/heart/outlook/outlook-read.js +1618 -0
  73. package/dist/heart/outlook/outlook-render.js +1032 -0
  74. package/dist/heart/outlook/outlook-types.js +7 -0
  75. package/dist/heart/outlook/outlook-view.js +194 -0
  76. package/dist/heart/progress-story.js +42 -0
  77. package/dist/heart/provider-failover.js +88 -0
  78. package/dist/heart/provider-ping.js +162 -0
  79. package/dist/heart/providers/anthropic-token.js +163 -0
  80. package/dist/heart/providers/anthropic.js +187 -41
  81. package/dist/heart/providers/azure.js +116 -10
  82. package/dist/heart/providers/github-copilot.js +157 -0
  83. package/dist/heart/providers/minimax.js +33 -3
  84. package/dist/heart/providers/openai-codex.js +51 -16
  85. package/dist/heart/session-activity.js +172 -0
  86. package/dist/heart/session-recall.js +216 -0
  87. package/dist/heart/start-of-turn-packet.js +330 -0
  88. package/dist/heart/streaming.js +36 -27
  89. package/dist/heart/sync.js +217 -0
  90. package/dist/heart/target-resolution.js +127 -0
  91. package/dist/heart/tempo.js +93 -0
  92. package/dist/heart/temporal-view.js +41 -0
  93. package/dist/heart/tool-activity-callbacks.js +36 -0
  94. package/dist/heart/tool-description.js +135 -0
  95. package/dist/heart/tool-loop.js +200 -0
  96. package/dist/heart/turn-context.js +358 -0
  97. package/dist/heart/turn-coordinator.js +28 -0
  98. package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
  99. package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
  100. package/dist/heart/{daemon → versioning}/ouro-path-installer.js +78 -35
  101. package/dist/heart/versioning/ouro-version-manager.js +171 -0
  102. package/dist/heart/{daemon → versioning}/staged-restart.js +30 -6
  103. package/dist/heart/{daemon → versioning}/update-checker.js +9 -1
  104. package/dist/heart/{daemon → versioning}/update-hooks.js +20 -2
  105. package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +41 -3
  106. package/dist/mind/associative-recall.js +126 -66
  107. package/dist/mind/bundle-manifest.js +8 -1
  108. package/dist/mind/context.js +125 -14
  109. package/dist/mind/{memory.js → diary.js} +73 -96
  110. package/dist/mind/embedding-provider.js +60 -0
  111. package/dist/mind/file-state.js +179 -0
  112. package/dist/mind/first-impressions.js +16 -2
  113. package/dist/mind/friends/channel.js +56 -0
  114. package/dist/mind/friends/group-context.js +144 -0
  115. package/dist/mind/friends/store-file.js +58 -3
  116. package/dist/mind/friends/trust-explanation.js +74 -0
  117. package/dist/mind/friends/types.js +8 -0
  118. package/dist/mind/journal-index.js +161 -0
  119. package/dist/mind/obligation-steering.js +221 -0
  120. package/dist/mind/pending.js +76 -9
  121. package/dist/mind/phrases.js +1 -0
  122. package/dist/mind/prompt.js +779 -109
  123. package/dist/mind/scrutiny.js +173 -0
  124. package/dist/mind/token-estimate.js +8 -12
  125. package/dist/nerves/coverage/audit.js +1 -1
  126. package/dist/nerves/coverage/file-completeness.js +47 -5
  127. package/dist/nerves/coverage/run-artifacts.js +1 -1
  128. package/dist/nerves/event-buffer.js +111 -0
  129. package/dist/nerves/index.js +64 -4
  130. package/dist/nerves/observation.js +20 -0
  131. package/dist/nerves/runtime.js +5 -1
  132. package/dist/outlook-ui/assets/index-Ck8agNeO.js +61 -0
  133. package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
  134. package/dist/outlook-ui/index.html +15 -0
  135. package/dist/repertoire/ado-client.js +15 -56
  136. package/dist/repertoire/ado-semantic.js +11 -5
  137. package/dist/repertoire/api-client.js +97 -0
  138. package/dist/repertoire/coding/codex-jsonl.js +64 -0
  139. package/dist/repertoire/coding/context-pack.js +330 -0
  140. package/dist/repertoire/coding/feedback.js +197 -30
  141. package/dist/repertoire/coding/manager.js +149 -2
  142. package/dist/repertoire/coding/spawner.js +55 -9
  143. package/dist/repertoire/coding/tools.js +170 -7
  144. package/dist/repertoire/credential-access.js +449 -0
  145. package/dist/repertoire/github-client.js +14 -55
  146. package/dist/repertoire/graph-client.js +11 -52
  147. package/dist/repertoire/guardrails.js +342 -0
  148. package/dist/repertoire/mcp-client.js +254 -0
  149. package/dist/repertoire/mcp-manager.js +251 -0
  150. package/dist/repertoire/shell-sessions.js +133 -0
  151. package/dist/repertoire/skills.js +14 -23
  152. package/dist/repertoire/tasks/board.js +43 -5
  153. package/dist/repertoire/tasks/fix.js +182 -0
  154. package/dist/repertoire/tasks/index.js +28 -10
  155. package/dist/repertoire/tasks/lifecycle.js +2 -2
  156. package/dist/repertoire/tasks/parser.js +3 -2
  157. package/dist/repertoire/tasks/scanner.js +194 -37
  158. package/dist/repertoire/tasks/transitions.js +11 -28
  159. package/dist/repertoire/tools-base.js +35 -771
  160. package/dist/repertoire/tools-bluebubbles.js +94 -0
  161. package/dist/repertoire/tools-bridge.js +141 -0
  162. package/dist/repertoire/tools-config.js +266 -0
  163. package/dist/repertoire/tools-continuity.js +248 -0
  164. package/dist/repertoire/tools-credential.js +184 -0
  165. package/dist/repertoire/tools-files.js +342 -0
  166. package/dist/repertoire/tools-flow.js +62 -0
  167. package/dist/repertoire/tools-github.js +1 -6
  168. package/dist/repertoire/tools-memory.js +347 -0
  169. package/dist/repertoire/tools-session.js +739 -0
  170. package/dist/repertoire/tools-shell.js +120 -0
  171. package/dist/repertoire/tools-surface.js +243 -0
  172. package/dist/repertoire/tools-teams.js +12 -59
  173. package/dist/repertoire/tools-travel.js +125 -0
  174. package/dist/repertoire/tools.js +132 -124
  175. package/dist/repertoire/travel-api-client.js +214 -0
  176. package/dist/scripts/claude-code-hook.js +41 -0
  177. package/dist/scripts/claude-code-stop-hook.js +47 -0
  178. package/dist/senses/attention-queue.js +97 -0
  179. package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +109 -10
  180. package/dist/senses/bluebubbles/entry.js +13 -0
  181. package/dist/senses/bluebubbles/inbound-log.js +109 -0
  182. package/dist/senses/bluebubbles/index.js +1374 -0
  183. package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +119 -24
  184. package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +13 -5
  185. package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
  186. package/dist/senses/bluebubbles/runtime-state.js +109 -0
  187. package/dist/senses/bluebubbles/session-cleanup.js +72 -0
  188. package/dist/senses/cli/adapter.js +274 -0
  189. package/dist/senses/cli/ink-app.js +156 -0
  190. package/dist/senses/cli/inline-diff.js +64 -0
  191. package/dist/senses/cli/message-list.js +51 -0
  192. package/dist/senses/cli/ouro-tui.js +358 -0
  193. package/dist/senses/cli/spinner-imperative.js +135 -0
  194. package/dist/senses/cli/spinner.js +101 -0
  195. package/dist/senses/cli/status-line.js +60 -0
  196. package/dist/senses/cli/streaming-markdown.js +526 -0
  197. package/dist/senses/cli/tool-display.js +83 -0
  198. package/dist/senses/cli/tool-render.js +85 -0
  199. package/dist/senses/cli/tui-store.js +198 -0
  200. package/dist/senses/cli/virtual-list.js +35 -0
  201. package/dist/senses/cli-entry.js +1 -1
  202. package/dist/senses/cli-layout.js +187 -0
  203. package/dist/senses/cli.js +503 -244
  204. package/dist/senses/commands.js +65 -1
  205. package/dist/senses/continuity.js +94 -0
  206. package/dist/senses/habit-turn-message.js +108 -0
  207. package/dist/senses/inner-dialog-worker.js +112 -19
  208. package/dist/senses/inner-dialog.js +594 -85
  209. package/dist/senses/pipeline.js +559 -0
  210. package/dist/senses/shared-turn.js +196 -0
  211. package/dist/senses/surface-tool.js +68 -0
  212. package/dist/senses/teams.js +667 -120
  213. package/dist/senses/trust-gate.js +112 -2
  214. package/package.json +12 -6
  215. package/skills/browser-navigation.md +110 -0
  216. package/skills/configure-dev-tools.md +81 -0
  217. package/skills/travel-planning.md +138 -0
  218. package/dist/heart/daemon/subagent-installer.js +0 -134
  219. package/dist/senses/bluebubbles-entry.js +0 -11
  220. package/dist/senses/bluebubbles.js +0 -421
  221. package/dist/senses/debug-activity.js +0 -107
  222. package/subagents/README.md +0 -73
  223. package/subagents/work-doer.md +0 -235
  224. package/subagents/work-merger.md +0 -618
  225. package/subagents/work-planner.md +0 -382
  226. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
  227. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
  228. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
  229. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
  230. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
  231. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
  232. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
  233. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
  234. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
  235. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
  236. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
  237. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +0 -0
  238. /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
  239. /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
  240. /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
  241. /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.continuityToolDefinitions = void 0;
4
+ const identity_1 = require("../heart/identity");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ const episodes_1 = require("../arc/episodes");
7
+ const cares_1 = require("../arc/cares");
8
+ const presence_1 = require("../arc/presence");
9
+ const intentions_1 = require("../arc/intentions");
10
+ exports.continuityToolDefinitions = [
11
+ // ── Continuity tools ──────────────────────────────────────────────
12
+ {
13
+ tool: {
14
+ type: "function",
15
+ function: {
16
+ name: "query_episodes",
17
+ description: "Query recent episodes from my continuity memory. Returns timestamped records of significant events (obligation shifts, coding milestones, bridge events, care events, turning points).",
18
+ parameters: {
19
+ type: "object",
20
+ properties: {
21
+ limit: { type: "number", description: "Maximum episodes to return (default 20)" },
22
+ kind: { type: "string", description: "Filter by episode kind: obligation_shift, coding_milestone, bridge_event, care_event, tempo_shift, turning_point" },
23
+ since: { type: "string", description: "ISO timestamp — only return episodes after this time" },
24
+ },
25
+ },
26
+ },
27
+ },
28
+ handler: (a) => {
29
+ const agentRoot = (0, identity_1.getAgentRoot)();
30
+ const options = {};
31
+ if (a.limit)
32
+ options.limit = parseInt(a.limit, 10);
33
+ if (a.kind)
34
+ options.kinds = [a.kind];
35
+ if (a.since)
36
+ options.since = a.since;
37
+ const episodes = (0, episodes_1.readRecentEpisodes)(agentRoot, options);
38
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_episodes", message: `queried ${episodes.length} episodes`, meta: { count: episodes.length } });
39
+ return JSON.stringify(episodes, null, 2);
40
+ },
41
+ },
42
+ {
43
+ tool: {
44
+ type: "function",
45
+ function: {
46
+ name: "capture_episode",
47
+ description: "Record a turning point or significant moment. This is my tool for saying 'that was important — keep it.' Nearly frictionless: only summary and whyItMattered required.",
48
+ parameters: {
49
+ type: "object",
50
+ properties: {
51
+ summary: { type: "string", description: "What happened" },
52
+ whyItMattered: { type: "string", description: "Why this was significant" },
53
+ kind: { type: "string", description: "Episode kind (default: turning_point)" },
54
+ salience: { type: "string", description: "low, medium, high, or critical (default: medium)" },
55
+ },
56
+ required: ["summary", "whyItMattered"],
57
+ },
58
+ },
59
+ },
60
+ handler: (a) => {
61
+ const agentRoot = (0, identity_1.getAgentRoot)();
62
+ const episode = (0, episodes_1.emitEpisode)(agentRoot, {
63
+ kind: a.kind ?? "turning_point",
64
+ summary: a.summary,
65
+ whyItMattered: a.whyItMattered,
66
+ relatedEntities: [],
67
+ salience: a.salience ?? "medium",
68
+ });
69
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.capture_episode", message: `captured episode ${episode.id}`, meta: { id: episode.id } });
70
+ return JSON.stringify(episode, null, 2);
71
+ },
72
+ },
73
+ {
74
+ tool: {
75
+ type: "function",
76
+ function: {
77
+ name: "query_presence",
78
+ description: "Check who's around — my own availability/lane and known peer agents.",
79
+ parameters: { type: "object", properties: {} },
80
+ },
81
+ },
82
+ handler: () => {
83
+ const agentRoot = (0, identity_1.getAgentRoot)();
84
+ const agentName = (0, identity_1.getAgentName)();
85
+ const self = (0, presence_1.readPresence)(agentRoot, agentName);
86
+ const peers = (0, presence_1.readPeerPresence)(agentRoot);
87
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_presence", message: `presence: self + ${peers.length} peers`, meta: { peerCount: peers.length } });
88
+ return JSON.stringify({ self, peers }, null, 2);
89
+ },
90
+ },
91
+ {
92
+ tool: {
93
+ type: "function",
94
+ function: {
95
+ name: "query_cares",
96
+ description: "Query things I care about — ongoing concerns, watched situations, projects, people.",
97
+ parameters: {
98
+ type: "object",
99
+ properties: {
100
+ status: { type: "string", description: "Filter by status: 'active', 'watching', 'resolved', 'dormant', or 'all' (default: active cares only)" },
101
+ },
102
+ },
103
+ },
104
+ },
105
+ handler: (a) => {
106
+ const agentRoot = (0, identity_1.getAgentRoot)();
107
+ const cares = a.status === "all" ? (0, cares_1.readCares)(agentRoot) : (0, cares_1.readActiveCares)(agentRoot);
108
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_cares", message: `queried ${cares.length} cares`, meta: { count: cares.length } });
109
+ return JSON.stringify(cares, null, 2);
110
+ },
111
+ },
112
+ {
113
+ tool: {
114
+ type: "function",
115
+ function: {
116
+ name: "care_manage",
117
+ description: "Create, update, or resolve a care. Cares are things I watch over — people, projects, missions, system health.",
118
+ parameters: {
119
+ type: "object",
120
+ properties: {
121
+ action: { type: "string", enum: ["create", "update", "resolve"], description: "What to do" },
122
+ id: { type: "string", description: "Care ID (required for update/resolve)" },
123
+ label: { type: "string", description: "Short label for the care" },
124
+ why: { type: "string", description: "Why this matters" },
125
+ salience: { type: "string", description: "low, medium, high, or critical" },
126
+ kind: { type: "string", description: "person, agent, project, mission, or system" },
127
+ stewardship: { type: "string", description: "mine, shared, or delegated" },
128
+ },
129
+ required: ["action"],
130
+ },
131
+ },
132
+ },
133
+ handler: (a) => {
134
+ const agentRoot = (0, identity_1.getAgentRoot)();
135
+ let result;
136
+ if (a.action === "create") {
137
+ result = (0, cares_1.createCare)(agentRoot, {
138
+ label: a.label ?? "untitled",
139
+ why: a.why ?? "",
140
+ kind: a.kind ?? "project",
141
+ status: "active",
142
+ salience: a.salience ?? "medium",
143
+ steward: a.stewardship ?? "mine",
144
+ relatedFriendIds: [],
145
+ relatedAgentIds: [],
146
+ relatedObligationIds: [],
147
+ relatedEpisodeIds: [],
148
+ currentRisk: null,
149
+ nextCheckAt: null,
150
+ });
151
+ }
152
+ else if (a.action === "update") {
153
+ const updates = {};
154
+ if (a.label)
155
+ updates.label = a.label;
156
+ if (a.why)
157
+ updates.why = a.why;
158
+ if (a.salience)
159
+ updates.salience = a.salience;
160
+ result = (0, cares_1.updateCare)(agentRoot, a.id, updates);
161
+ }
162
+ else if (a.action === "resolve") {
163
+ result = (0, cares_1.resolveCare)(agentRoot, a.id);
164
+ }
165
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.care_manage", message: `care ${a.action}`, meta: { action: a.action, id: a.id } });
166
+ return JSON.stringify(result, null, 2);
167
+ },
168
+ },
169
+ {
170
+ tool: {
171
+ type: "function",
172
+ function: {
173
+ name: "query_relationships",
174
+ description: "Query known agent relationships — familiarity, trust, shared missions, interaction history.",
175
+ parameters: {
176
+ type: "object",
177
+ properties: {
178
+ agentName: { type: "string", description: "Specific agent name to query (omit for all)" },
179
+ },
180
+ },
181
+ },
182
+ },
183
+ handler: async (a, ctx) => {
184
+ const allFriends = ctx?.friendStore?.listAll ? await ctx.friendStore.listAll() : [];
185
+ let agents = allFriends.filter((f) => f.kind === "agent");
186
+ if (a.agentName) {
187
+ const needle = a.agentName.toLowerCase();
188
+ agents = agents.filter((f) => f.name?.toLowerCase() === needle);
189
+ }
190
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.query_relationships", message: `queried relationships`, meta: { agentName: a.agentName ?? "all" } });
191
+ return JSON.stringify(agents, null, 2);
192
+ },
193
+ },
194
+ {
195
+ tool: {
196
+ type: "function",
197
+ function: {
198
+ name: "intention_capture",
199
+ description: "File a lightweight mental note — something I want to do or check later, below the ceremony threshold of tasks or cares. Cheap to create, easy to close.",
200
+ parameters: {
201
+ type: "object",
202
+ properties: {
203
+ content: { type: "string", description: "What I want to remember to do" },
204
+ salience: { type: "string", description: "low, medium, or high (default: low)" },
205
+ nudgeAfter: { type: "string", description: "ISO timestamp — nudge me after this time" },
206
+ },
207
+ required: ["content"],
208
+ },
209
+ },
210
+ },
211
+ handler: (a) => {
212
+ const agentRoot = (0, identity_1.getAgentRoot)();
213
+ const intention = (0, intentions_1.captureIntention)(agentRoot, {
214
+ content: a.content,
215
+ salience: a.salience ?? "low",
216
+ source: "tool",
217
+ ...(a.nudgeAfter ? { nudgeAfter: a.nudgeAfter } : {}),
218
+ });
219
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.intention_capture", message: `captured intention ${intention.id}`, meta: { id: intention.id } });
220
+ return JSON.stringify(intention, null, 2);
221
+ },
222
+ },
223
+ {
224
+ tool: {
225
+ type: "function",
226
+ function: {
227
+ name: "intention_manage",
228
+ description: "Resolve or dismiss an intention. Resolve = done. Dismiss = no longer relevant. Both remove it from active list.",
229
+ parameters: {
230
+ type: "object",
231
+ properties: {
232
+ action: { type: "string", enum: ["resolve", "dismiss"], description: "What to do" },
233
+ id: { type: "string", description: "Intention ID" },
234
+ },
235
+ required: ["action", "id"],
236
+ },
237
+ },
238
+ },
239
+ handler: (a) => {
240
+ const agentRoot = (0, identity_1.getAgentRoot)();
241
+ const result = a.action === "resolve"
242
+ ? (0, intentions_1.resolveIntention)(agentRoot, a.id)
243
+ : (0, intentions_1.dismissIntention)(agentRoot, a.id);
244
+ (0, runtime_1.emitNervesEvent)({ component: "repertoire", event: "repertoire.intention_manage", message: `intention ${a.action}: ${a.id}`, meta: { action: a.action, id: a.id } });
245
+ return JSON.stringify(result, null, 2);
246
+ },
247
+ },
248
+ ];
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.credentialToolDefinitions = void 0;
4
+ const credential_access_1 = require("./credential-access");
5
+ const runtime_1 = require("../nerves/runtime");
6
+ exports.credentialToolDefinitions = [
7
+ {
8
+ tool: {
9
+ type: "function",
10
+ function: {
11
+ name: "credential_get",
12
+ description: "Get credential metadata for a domain. Returns username, notes, and creation date. Never returns passwords — the credential gateway handles secret injection internally.",
13
+ parameters: {
14
+ type: "object",
15
+ properties: {
16
+ domain: {
17
+ type: "string",
18
+ description: "Domain to look up (e.g. 'airbnb.com', 'api.openweathermap.org')",
19
+ },
20
+ },
21
+ required: ["domain"],
22
+ },
23
+ },
24
+ },
25
+ handler: async (args) => {
26
+ (0, runtime_1.emitNervesEvent)({
27
+ component: "repertoire",
28
+ event: "repertoire.credential_tool_call",
29
+ message: "credential_get invoked",
30
+ meta: { tool: "credential_get", domain: args.domain },
31
+ });
32
+ try {
33
+ const store = (0, credential_access_1.getCredentialStore)();
34
+ const meta = await store.get(args.domain);
35
+ if (!meta) {
36
+ return `No credential found for "${args.domain}".`;
37
+ }
38
+ return JSON.stringify(meta, null, 2);
39
+ }
40
+ catch (err) {
41
+ /* v8 ignore next -- defensive: store.get wraps errors @preserve */
42
+ return `Credential error: ${err instanceof Error ? err.message : String(err)}`;
43
+ }
44
+ },
45
+ summaryKeys: ["domain"],
46
+ },
47
+ {
48
+ tool: {
49
+ type: "function",
50
+ function: {
51
+ name: "credential_store",
52
+ description: "Store credentials the agent acquired (e.g. during sign-up). The password is accepted in args because the model generated it. Stored passwords are never returned later — only metadata is visible.",
53
+ parameters: {
54
+ type: "object",
55
+ properties: {
56
+ domain: {
57
+ type: "string",
58
+ description: "Domain these credentials are for (e.g. 'airbnb.com')",
59
+ },
60
+ username: {
61
+ type: "string",
62
+ description: "Username or email for the account",
63
+ },
64
+ password: {
65
+ type: "string",
66
+ description: "Password for the account",
67
+ },
68
+ notes: {
69
+ type: "string",
70
+ description: "Optional notes about this credential",
71
+ },
72
+ },
73
+ required: ["domain", "username", "password"],
74
+ },
75
+ },
76
+ },
77
+ handler: async (args) => {
78
+ (0, runtime_1.emitNervesEvent)({
79
+ component: "repertoire",
80
+ event: "repertoire.credential_tool_call",
81
+ message: "credential_store invoked",
82
+ meta: { tool: "credential_store", domain: args.domain },
83
+ });
84
+ try {
85
+ const store = (0, credential_access_1.getCredentialStore)();
86
+ await store.store(args.domain, {
87
+ username: args.username,
88
+ password: args.password,
89
+ notes: args.notes,
90
+ });
91
+ return `Credentials stored for "${args.domain}".`;
92
+ }
93
+ catch (err) {
94
+ /* v8 ignore next -- defensive: store.store wraps errors @preserve */
95
+ return `Credential store error: ${err instanceof Error ? err.message : String(err)}`;
96
+ }
97
+ },
98
+ confirmationRequired: true,
99
+ summaryKeys: ["domain"],
100
+ },
101
+ {
102
+ tool: {
103
+ type: "function",
104
+ function: {
105
+ name: "credential_list",
106
+ description: "List stored credential domains. Returns metadata only (domain, username, notes, creation date). Never returns passwords.",
107
+ parameters: {
108
+ type: "object",
109
+ properties: {
110
+ search: {
111
+ type: "string",
112
+ description: "Optional search filter to match against domain names",
113
+ },
114
+ },
115
+ },
116
+ },
117
+ },
118
+ handler: async (args) => {
119
+ (0, runtime_1.emitNervesEvent)({
120
+ component: "repertoire",
121
+ event: "repertoire.credential_tool_call",
122
+ message: "credential_list invoked",
123
+ meta: { tool: "credential_list" },
124
+ });
125
+ try {
126
+ const store = (0, credential_access_1.getCredentialStore)();
127
+ let items = await store.list();
128
+ // Client-side search filter
129
+ if (args.search) {
130
+ const term = args.search.toLowerCase();
131
+ items = items.filter((item) => item.domain.toLowerCase().includes(term) ||
132
+ (item.username && item.username.toLowerCase().includes(term)));
133
+ }
134
+ return JSON.stringify(items, null, 2);
135
+ }
136
+ catch (err) {
137
+ /* v8 ignore next -- defensive: store.list wraps errors @preserve */
138
+ return `Credential list error: ${err instanceof Error ? err.message : String(err)}`;
139
+ }
140
+ },
141
+ summaryKeys: ["search"],
142
+ },
143
+ {
144
+ tool: {
145
+ type: "function",
146
+ function: {
147
+ name: "credential_delete",
148
+ description: "Delete stored credentials for a domain.",
149
+ parameters: {
150
+ type: "object",
151
+ properties: {
152
+ domain: {
153
+ type: "string",
154
+ description: "Domain whose credentials should be deleted",
155
+ },
156
+ },
157
+ required: ["domain"],
158
+ },
159
+ },
160
+ },
161
+ handler: async (args) => {
162
+ (0, runtime_1.emitNervesEvent)({
163
+ component: "repertoire",
164
+ event: "repertoire.credential_tool_call",
165
+ message: "credential_delete invoked",
166
+ meta: { tool: "credential_delete", domain: args.domain },
167
+ });
168
+ try {
169
+ const store = (0, credential_access_1.getCredentialStore)();
170
+ const deleted = await store.delete(args.domain);
171
+ if (deleted) {
172
+ return `Credentials for "${args.domain}" deleted.`;
173
+ }
174
+ return `No credential found for "${args.domain}".`;
175
+ }
176
+ catch (err) {
177
+ /* v8 ignore next -- defensive: store.delete wraps errors @preserve */
178
+ return `Credential delete error: ${err instanceof Error ? err.message : String(err)}`;
179
+ }
180
+ },
181
+ confirmationRequired: true,
182
+ summaryKeys: ["domain"],
183
+ },
184
+ ];