@ouro.bot/cli 0.1.0-alpha.22 → 0.1.0-alpha.220
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -191
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/agent.json +3 -2
- package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/SOUL.md +1 -1
- package/changelog.json +1354 -2
- package/dist/arc/attention-types.js +8 -0
- package/dist/arc/cares.js +140 -0
- package/dist/arc/episodes.js +119 -0
- package/dist/arc/intentions.js +133 -0
- package/dist/arc/json-store.js +120 -0
- package/dist/arc/obligations.js +237 -0
- package/dist/arc/presence.js +185 -0
- package/dist/heart/active-work.js +832 -0
- package/dist/heart/agent-entry.js +37 -2
- package/dist/heart/auth/auth-flow.js +444 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -0
- package/dist/heart/commitments.js +111 -0
- package/dist/heart/config-registry.js +305 -0
- package/dist/heart/config.js +59 -30
- package/dist/heart/core.js +601 -145
- package/dist/heart/cross-chat-delivery.js +131 -0
- package/dist/heart/daemon/agent-config-check.js +149 -0
- package/dist/heart/daemon/agent-discovery.js +81 -0
- package/dist/heart/daemon/agent-service.js +360 -0
- package/dist/heart/daemon/cadence.js +70 -0
- package/dist/heart/daemon/cli-defaults.js +557 -0
- package/dist/heart/daemon/cli-exec.js +1847 -0
- package/dist/heart/daemon/cli-parse.js +759 -0
- package/dist/heart/daemon/cli-render.js +316 -0
- package/dist/heart/daemon/cli-types.js +8 -0
- package/dist/heart/daemon/daemon-cli.js +29 -1163
- package/dist/heart/daemon/daemon-entry.js +202 -4
- package/dist/heart/daemon/daemon-health.js +136 -0
- package/dist/heart/daemon/daemon-runtime-sync.js +153 -12
- package/dist/heart/daemon/daemon-tombstone.js +123 -0
- package/dist/heart/daemon/daemon.js +487 -20
- package/dist/heart/daemon/hooks/agent-config-v2.js +33 -0
- package/dist/heart/daemon/hooks/bundle-meta.js +115 -1
- package/dist/heart/daemon/inner-status.js +89 -0
- package/dist/heart/daemon/launchd.js +39 -8
- package/dist/heart/daemon/log-tailer.js +4 -3
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/os-cron-deps.js +134 -0
- package/dist/heart/daemon/ouro-bot-entry.js +1 -1
- package/dist/heart/daemon/process-manager.js +123 -0
- package/dist/heart/daemon/run-hooks.js +2 -0
- package/dist/heart/daemon/runtime-logging.js +58 -15
- package/dist/heart/daemon/runtime-metadata.js +101 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/safe-mode.js +161 -0
- package/dist/heart/daemon/sense-manager.js +72 -3
- package/dist/heart/daemon/session-id-resolver.js +131 -0
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +202 -0
- package/dist/heart/daemon/task-scheduler.js +3 -25
- package/dist/heart/daemon/thoughts.js +507 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/habits/habit-migration.js +181 -0
- package/dist/heart/habits/habit-parser.js +119 -0
- package/dist/heart/habits/habit-scheduler.js +369 -0
- package/dist/heart/{daemon → hatch}/hatch-flow.js +29 -119
- package/dist/heart/{daemon → hatch}/hatch-specialist.js +3 -3
- package/dist/heart/{daemon → hatch}/specialist-prompt.js +10 -7
- package/dist/heart/{daemon → hatch}/specialist-tools.js +49 -3
- package/dist/heart/identity.js +144 -55
- package/dist/heart/kicks.js +2 -20
- package/dist/heart/mcp/mcp-server.js +608 -0
- package/dist/heart/migrate-config.js +127 -0
- package/dist/heart/model-capabilities.js +48 -0
- package/dist/heart/outlook/outlook-http.js +439 -0
- package/dist/heart/outlook/outlook-read.js +1618 -0
- package/dist/heart/outlook/outlook-render.js +1032 -0
- package/dist/heart/outlook/outlook-types.js +7 -0
- package/dist/heart/outlook/outlook-view.js +194 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-failover.js +88 -0
- package/dist/heart/provider-ping.js +162 -0
- package/dist/heart/providers/anthropic-token.js +163 -0
- package/dist/heart/providers/anthropic.js +187 -41
- package/dist/heart/providers/azure.js +116 -10
- package/dist/heart/providers/github-copilot.js +157 -0
- package/dist/heart/providers/minimax.js +33 -3
- package/dist/heart/providers/openai-codex.js +51 -16
- package/dist/heart/session-activity.js +172 -0
- package/dist/heart/session-recall.js +216 -0
- package/dist/heart/start-of-turn-packet.js +330 -0
- package/dist/heart/streaming.js +36 -27
- package/dist/heart/sync.js +217 -0
- package/dist/heart/target-resolution.js +127 -0
- package/dist/heart/tempo.js +93 -0
- package/dist/heart/temporal-view.js +41 -0
- package/dist/heart/tool-activity-callbacks.js +36 -0
- package/dist/heart/tool-description.js +135 -0
- package/dist/heart/tool-loop.js +200 -0
- package/dist/heart/turn-context.js +358 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/heart/versioning/ouro-bot-global-installer.js +128 -0
- package/dist/heart/{daemon → versioning}/ouro-bot-wrapper.js +1 -1
- package/dist/heart/{daemon → versioning}/ouro-path-installer.js +78 -35
- package/dist/heart/versioning/ouro-version-manager.js +171 -0
- package/dist/heart/{daemon → versioning}/staged-restart.js +30 -6
- package/dist/heart/{daemon → versioning}/update-checker.js +9 -1
- package/dist/heart/{daemon → versioning}/update-hooks.js +20 -2
- package/dist/heart/{daemon → versioning}/wrapper-publish-guard.js +41 -3
- package/dist/mind/associative-recall.js +126 -66
- package/dist/mind/bundle-manifest.js +8 -1
- package/dist/mind/context.js +125 -14
- package/dist/mind/{memory.js → diary.js} +73 -96
- package/dist/mind/embedding-provider.js +60 -0
- package/dist/mind/file-state.js +179 -0
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +56 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/store-file.js +36 -0
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +8 -0
- package/dist/mind/journal-index.js +161 -0
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt.js +779 -109
- package/dist/mind/scrutiny.js +173 -0
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/coverage/audit.js +1 -1
- package/dist/nerves/coverage/file-completeness.js +47 -5
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/event-buffer.js +111 -0
- package/dist/nerves/index.js +64 -4
- package/dist/nerves/observation.js +20 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/outlook-ui/assets/index-Ck8agNeO.js +61 -0
- package/dist/outlook-ui/assets/index-LwChZTgL.css +1 -0
- package/dist/outlook-ui/index.html +15 -0
- package/dist/repertoire/ado-client.js +15 -56
- package/dist/repertoire/ado-semantic.js +11 -5
- package/dist/repertoire/api-client.js +100 -0
- package/dist/repertoire/bitwarden-client.js +290 -0
- package/dist/repertoire/coding/codex-jsonl.js +64 -0
- package/dist/repertoire/coding/context-pack.js +330 -0
- package/dist/repertoire/coding/feedback.js +197 -30
- package/dist/repertoire/coding/manager.js +149 -2
- package/dist/repertoire/coding/spawner.js +55 -9
- package/dist/repertoire/coding/tools.js +170 -7
- package/dist/repertoire/github-client.js +14 -55
- package/dist/repertoire/graph-client.js +11 -52
- package/dist/repertoire/guardrails.js +342 -0
- package/dist/repertoire/mcp-client.js +254 -0
- package/dist/repertoire/mcp-manager.js +251 -0
- package/dist/repertoire/shell-sessions.js +133 -0
- package/dist/repertoire/skills.js +14 -23
- package/dist/repertoire/tasks/board.js +43 -5
- package/dist/repertoire/tasks/fix.js +182 -0
- package/dist/repertoire/tasks/index.js +28 -10
- package/dist/repertoire/tasks/lifecycle.js +2 -2
- package/dist/repertoire/tasks/parser.js +3 -2
- package/dist/repertoire/tasks/scanner.js +194 -37
- package/dist/repertoire/tasks/transitions.js +11 -28
- package/dist/repertoire/tools-base.js +35 -771
- package/dist/repertoire/tools-bluebubbles.js +94 -0
- package/dist/repertoire/tools-bridge.js +141 -0
- package/dist/repertoire/tools-config.js +266 -0
- package/dist/repertoire/tools-continuity.js +248 -0
- package/dist/repertoire/tools-files.js +342 -0
- package/dist/repertoire/tools-flow.js +62 -0
- package/dist/repertoire/tools-github.js +1 -6
- package/dist/repertoire/tools-memory.js +347 -0
- package/dist/repertoire/tools-session.js +721 -0
- package/dist/repertoire/tools-shell.js +120 -0
- package/dist/repertoire/tools-surface.js +242 -0
- package/dist/repertoire/tools-teams.js +12 -59
- package/dist/repertoire/tools-travel.js +125 -0
- package/dist/repertoire/tools-vault.js +185 -0
- package/dist/repertoire/tools.js +132 -124
- package/dist/repertoire/travel-api-client.js +224 -0
- package/dist/scripts/claude-code-hook.js +41 -0
- package/dist/scripts/claude-code-stop-hook.js +47 -0
- package/dist/senses/attention-queue.js +97 -0
- package/dist/senses/{bluebubbles-client.js → bluebubbles/client.js} +109 -10
- package/dist/senses/bluebubbles/entry.js +13 -0
- package/dist/senses/bluebubbles/inbound-log.js +109 -0
- package/dist/senses/bluebubbles/index.js +1327 -0
- package/dist/senses/{bluebubbles-media.js → bluebubbles/media.js} +119 -24
- package/dist/senses/{bluebubbles-model.js → bluebubbles/model.js} +13 -5
- package/dist/senses/{bluebubbles-mutation-log.js → bluebubbles/mutation-log.js} +46 -6
- package/dist/senses/bluebubbles/runtime-state.js +109 -0
- package/dist/senses/bluebubbles/session-cleanup.js +72 -0
- package/dist/senses/cli/adapter.js +274 -0
- package/dist/senses/cli/ink-app.js +156 -0
- package/dist/senses/cli/inline-diff.js +64 -0
- package/dist/senses/cli/message-list.js +51 -0
- package/dist/senses/cli/ouro-tui.js +358 -0
- package/dist/senses/cli/spinner-imperative.js +135 -0
- package/dist/senses/cli/spinner.js +101 -0
- package/dist/senses/cli/status-line.js +60 -0
- package/dist/senses/cli/streaming-markdown.js +526 -0
- package/dist/senses/cli/tool-display.js +83 -0
- package/dist/senses/cli/tool-render.js +85 -0
- package/dist/senses/cli/tui-store.js +198 -0
- package/dist/senses/cli/virtual-list.js +35 -0
- package/dist/senses/cli-entry.js +1 -1
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +503 -244
- package/dist/senses/commands.js +65 -1
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/habit-turn-message.js +108 -0
- package/dist/senses/inner-dialog-worker.js +112 -19
- package/dist/senses/inner-dialog.js +591 -84
- package/dist/senses/pipeline.js +559 -0
- package/dist/senses/shared-turn.js +196 -0
- package/dist/senses/surface-tool.js +68 -0
- package/dist/senses/teams.js +667 -120
- package/dist/senses/trust-gate.js +112 -2
- package/package.json +12 -6
- package/skills/browser-navigation.md +110 -0
- package/skills/configure-dev-tools.md +81 -0
- package/skills/travel-planning.md +143 -0
- package/dist/heart/daemon/subagent-installer.js +0 -134
- package/dist/senses/bluebubbles-entry.js +0 -11
- package/dist/senses/bluebubbles.js +0 -421
- package/dist/senses/debug-activity.js +0 -107
- package/subagents/README.md +0 -73
- package/subagents/work-doer.md +0 -235
- package/subagents/work-merger.md +0 -618
- package/subagents/work-planner.md +0 -382
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/basilisk.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jafar.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/jormungandr.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/kaa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/medusa.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/monty.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/nagini.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/ouroboros.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/python.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/quetzalcoatl.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/sir-hiss.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-serpent.md +0 -0
- /package/{AdoptionSpecialist.ouro → SerpentGuide.ouro}/psyche/identities/the-snake.md +0 -0
- /package/dist/heart/{daemon → hatch}/hatch-animation.js +0 -0
- /package/dist/heart/{daemon → hatch}/specialist-orchestrator.js +0 -0
- /package/dist/heart/{daemon → versioning}/ouro-uti.js +0 -0
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.codingToolDefinitions = void 0;
|
|
4
|
+
exports.countFilesInSessionOutput = countFilesInSessionOutput;
|
|
4
5
|
const index_1 = require("./index");
|
|
6
|
+
const context_pack_1 = require("./context-pack");
|
|
7
|
+
const identity_1 = require("../../heart/identity");
|
|
8
|
+
const obligations_1 = require("../../arc/obligations");
|
|
5
9
|
const runtime_1 = require("../../nerves/runtime");
|
|
10
|
+
const scrutiny_1 = require("../../mind/scrutiny");
|
|
6
11
|
const RUNNERS = ["claude", "codex"];
|
|
7
12
|
function requireArg(args, key) {
|
|
8
13
|
const value = args[key];
|
|
@@ -29,11 +34,112 @@ function emitCodingToolEvent(toolName) {
|
|
|
29
34
|
meta: { toolName },
|
|
30
35
|
});
|
|
31
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Count distinct file paths mentioned in a coding session's stdout output.
|
|
39
|
+
* Looks for path-like tokens (containing / and a file extension).
|
|
40
|
+
* Returns the count of unique paths found.
|
|
41
|
+
*/
|
|
42
|
+
function countFilesInSessionOutput(session) {
|
|
43
|
+
const text = `${session.stdoutTail}\n${session.stderrTail}`;
|
|
44
|
+
// Match path-like tokens: contain at least one / and a file extension
|
|
45
|
+
const pathPattern = /(?:^|\s)((?:\/|\.\/|\.\.\/)?(?:[\w.@-]+\/)+[\w.-]+\.[\w]+)/gm;
|
|
46
|
+
const paths = new Set();
|
|
47
|
+
let match;
|
|
48
|
+
while ((match = pathPattern.exec(text)) !== null) {
|
|
49
|
+
paths.add(match[1]);
|
|
50
|
+
}
|
|
51
|
+
return paths.size;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* If a coding session is completed, append scrutiny to the result.
|
|
55
|
+
* Returns the original result with scrutiny appended, or unchanged if
|
|
56
|
+
* the session is not completed or has no file changes.
|
|
57
|
+
*/
|
|
58
|
+
function appendCompletionScrutiny(result, session) {
|
|
59
|
+
if (session.status !== "completed")
|
|
60
|
+
return result;
|
|
61
|
+
const fileCount = countFilesInSessionOutput(session);
|
|
62
|
+
const scrutiny = (0, scrutiny_1.getCodingCompletionScrutiny)(fileCount);
|
|
63
|
+
return scrutiny ? `${result}\n\n${scrutiny}` : result;
|
|
64
|
+
}
|
|
65
|
+
function sameOriginSession(left, right) {
|
|
66
|
+
if (!left && !right)
|
|
67
|
+
return true;
|
|
68
|
+
if (!left || !right)
|
|
69
|
+
return false;
|
|
70
|
+
return left.friendId === right.friendId && left.channel === right.channel && left.key === right.key;
|
|
71
|
+
}
|
|
72
|
+
function matchesReusableCodingSession(session, request) {
|
|
73
|
+
if (session.status !== "spawning" && session.status !== "running" && session.status !== "waiting_input" && session.status !== "stalled") {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const scopeMatches = request.scopeFile ? session.scopeFile === request.scopeFile : true;
|
|
77
|
+
const stateMatches = request.stateFile ? session.stateFile === request.stateFile : true;
|
|
78
|
+
return (session.runner === request.runner &&
|
|
79
|
+
session.workdir === request.workdir &&
|
|
80
|
+
session.taskRef === request.taskRef &&
|
|
81
|
+
scopeMatches &&
|
|
82
|
+
stateMatches &&
|
|
83
|
+
session.obligationId === request.obligationId &&
|
|
84
|
+
sameOriginSession(request.originSession, session.originSession));
|
|
85
|
+
}
|
|
86
|
+
function latestSessionFirst(left, right) {
|
|
87
|
+
const lastActivityDelta = Date.parse(right.lastActivityAt) - Date.parse(left.lastActivityAt);
|
|
88
|
+
if (lastActivityDelta !== 0)
|
|
89
|
+
return lastActivityDelta;
|
|
90
|
+
return right.id.localeCompare(left.id);
|
|
91
|
+
}
|
|
92
|
+
function findReusableCodingSession(sessions, request) {
|
|
93
|
+
const matches = sessions.filter((session) => matchesReusableCodingSession(session, request)).sort(latestSessionFirst);
|
|
94
|
+
return matches[0] ?? null;
|
|
95
|
+
}
|
|
96
|
+
function isLiveCodingStatus(status) {
|
|
97
|
+
return status === "spawning" || status === "running" || status === "waiting_input" || status === "stalled";
|
|
98
|
+
}
|
|
99
|
+
function rankCodingStatusSession(session, currentSession) {
|
|
100
|
+
return sameOriginSession({
|
|
101
|
+
friendId: currentSession.friendId,
|
|
102
|
+
channel: currentSession.channel,
|
|
103
|
+
key: currentSession.key,
|
|
104
|
+
}, session.originSession)
|
|
105
|
+
? 0
|
|
106
|
+
: 1;
|
|
107
|
+
}
|
|
108
|
+
function selectCodingStatusSessions(sessions, currentSession) {
|
|
109
|
+
if (sessions.length === 0)
|
|
110
|
+
return [];
|
|
111
|
+
if (!currentSession) {
|
|
112
|
+
return sessions;
|
|
113
|
+
}
|
|
114
|
+
const activeSessions = sessions.filter((session) => isLiveCodingStatus(session.status)).sort(latestSessionFirst);
|
|
115
|
+
if (activeSessions.length > 0) {
|
|
116
|
+
return activeSessions.sort((left, right) => {
|
|
117
|
+
const rankDelta = rankCodingStatusSession(left, currentSession) - rankCodingStatusSession(right, currentSession);
|
|
118
|
+
if (rankDelta !== 0)
|
|
119
|
+
return rankDelta;
|
|
120
|
+
return latestSessionFirst(left, right);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
const matchingClosedSessions = sessions
|
|
124
|
+
.filter((session) => sameOriginSession({
|
|
125
|
+
friendId: currentSession.friendId,
|
|
126
|
+
channel: currentSession.channel,
|
|
127
|
+
key: currentSession.key,
|
|
128
|
+
}, session.originSession))
|
|
129
|
+
.sort(latestSessionFirst);
|
|
130
|
+
if (matchingClosedSessions.length > 0) {
|
|
131
|
+
return matchingClosedSessions;
|
|
132
|
+
}
|
|
133
|
+
return [...sessions].sort(latestSessionFirst);
|
|
134
|
+
}
|
|
135
|
+
function buildCodingObligationContent(taskRef) {
|
|
136
|
+
return `finish ${taskRef} and bring the result back`;
|
|
137
|
+
}
|
|
32
138
|
const codingSpawnTool = {
|
|
33
139
|
type: "function",
|
|
34
140
|
function: {
|
|
35
141
|
name: "coding_spawn",
|
|
36
|
-
description: "
|
|
142
|
+
description: "Spawn a coding session using claude or codex with task-threaded guidance. The coding session runs as a separate process with its own context. Give it a COMPLETE, SELF-CONTAINED task description -- it cannot see this conversation, doesn't know what you've tried, doesn't understand the broader context. Include: what to do, why, what files are involved, what 'done' looks like. Never delegate understanding -- don't write 'based on the conversation, fix the bug.' Write the specific file paths, line numbers, and what to change. Include any required verification steps or tests in the task description so the coding session knows how to prove the work is done.",
|
|
37
143
|
parameters: {
|
|
38
144
|
type: "object",
|
|
39
145
|
properties: {
|
|
@@ -52,7 +158,7 @@ const codingStatusTool = {
|
|
|
52
158
|
type: "function",
|
|
53
159
|
function: {
|
|
54
160
|
name: "coding_status",
|
|
55
|
-
description: "
|
|
161
|
+
description: "Inspect coding sessions. Omit sessionId to list all active/known sessions with their status. Use this to check progress before asking the human for a status update.",
|
|
56
162
|
parameters: {
|
|
57
163
|
type: "object",
|
|
58
164
|
properties: {
|
|
@@ -65,7 +171,7 @@ const codingTailTool = {
|
|
|
65
171
|
type: "function",
|
|
66
172
|
function: {
|
|
67
173
|
name: "coding_tail",
|
|
68
|
-
description: "
|
|
174
|
+
description: "Show recent stdout/stderr output from a coding session. Use this to understand what the session is doing or why it might be stuck. Read the actual output before reporting status -- don't guess.",
|
|
69
175
|
parameters: {
|
|
70
176
|
type: "object",
|
|
71
177
|
properties: {
|
|
@@ -130,6 +236,17 @@ exports.codingToolDefinitions = [
|
|
|
130
236
|
prompt,
|
|
131
237
|
taskRef,
|
|
132
238
|
};
|
|
239
|
+
if (ctx?.currentSession && ctx.currentSession.channel !== "inner") {
|
|
240
|
+
request.originSession = {
|
|
241
|
+
friendId: ctx.currentSession.friendId,
|
|
242
|
+
channel: ctx.currentSession.channel,
|
|
243
|
+
key: ctx.currentSession.key,
|
|
244
|
+
};
|
|
245
|
+
const obligation = (0, obligations_1.findPendingObligationForOrigin)((0, identity_1.getAgentRoot)(), request.originSession);
|
|
246
|
+
if (obligation) {
|
|
247
|
+
request.obligationId = obligation.id;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
133
250
|
const scopeFile = optionalArg(args, "scopeFile");
|
|
134
251
|
if (scopeFile)
|
|
135
252
|
request.scopeFile = scopeFile;
|
|
@@ -137,7 +254,48 @@ exports.codingToolDefinitions = [
|
|
|
137
254
|
if (stateFile)
|
|
138
255
|
request.stateFile = stateFile;
|
|
139
256
|
const manager = (0, index_1.getCodingSessionManager)();
|
|
257
|
+
const existingSessions = manager.listSessions();
|
|
258
|
+
const existingSession = findReusableCodingSession(existingSessions, request);
|
|
259
|
+
if (existingSession) {
|
|
260
|
+
(0, runtime_1.emitNervesEvent)({
|
|
261
|
+
component: "repertoire",
|
|
262
|
+
event: "repertoire.coding_session_reused",
|
|
263
|
+
message: "reused active coding session",
|
|
264
|
+
meta: { id: existingSession.id, runner: existingSession.runner, taskRef: existingSession.taskRef },
|
|
265
|
+
});
|
|
266
|
+
if (ctx?.codingFeedback) {
|
|
267
|
+
(0, index_1.attachCodingSessionFeedback)(manager, existingSession, ctx.codingFeedback);
|
|
268
|
+
}
|
|
269
|
+
return JSON.stringify({ ...existingSession, reused: true });
|
|
270
|
+
}
|
|
271
|
+
if (request.originSession && !request.obligationId) {
|
|
272
|
+
const created = (0, obligations_1.createObligation)((0, identity_1.getAgentRoot)(), {
|
|
273
|
+
origin: request.originSession,
|
|
274
|
+
content: buildCodingObligationContent(taskRef),
|
|
275
|
+
});
|
|
276
|
+
request.obligationId = created.id;
|
|
277
|
+
}
|
|
278
|
+
if (!request.scopeFile || !request.stateFile) {
|
|
279
|
+
const generated = (0, context_pack_1.prepareCodingContextPack)({
|
|
280
|
+
request: { ...request },
|
|
281
|
+
existingSessions,
|
|
282
|
+
activeWorkFrame: ctx?.activeWorkFrame,
|
|
283
|
+
});
|
|
284
|
+
if (!request.scopeFile)
|
|
285
|
+
request.scopeFile = generated.scopeFile;
|
|
286
|
+
if (!request.stateFile)
|
|
287
|
+
request.stateFile = generated.stateFile;
|
|
288
|
+
}
|
|
140
289
|
const session = await manager.spawnSession(request);
|
|
290
|
+
if (session.obligationId) {
|
|
291
|
+
(0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), session.obligationId, {
|
|
292
|
+
status: "investigating",
|
|
293
|
+
currentSurface: { kind: "coding", label: `${session.runner} ${session.id}` },
|
|
294
|
+
latestNote: session.originSession
|
|
295
|
+
? `coding session started for ${session.originSession.channel}/${session.originSession.key}`
|
|
296
|
+
: "coding session started",
|
|
297
|
+
});
|
|
298
|
+
}
|
|
141
299
|
if (args.runner === "codex" && args.taskRef) {
|
|
142
300
|
(0, runtime_1.emitNervesEvent)({
|
|
143
301
|
component: "repertoire",
|
|
@@ -151,21 +309,23 @@ exports.codingToolDefinitions = [
|
|
|
151
309
|
}
|
|
152
310
|
return JSON.stringify(session);
|
|
153
311
|
},
|
|
312
|
+
summaryKeys: ["runner", "workdir", "taskRef"],
|
|
154
313
|
},
|
|
155
314
|
{
|
|
156
315
|
tool: codingStatusTool,
|
|
157
|
-
handler: (args) => {
|
|
316
|
+
handler: (args, ctx) => {
|
|
158
317
|
emitCodingToolEvent("coding_status");
|
|
159
318
|
const manager = (0, index_1.getCodingSessionManager)();
|
|
160
319
|
const sessionId = requireArg(args, "sessionId");
|
|
161
320
|
if (!sessionId) {
|
|
162
|
-
return JSON.stringify(manager.listSessions());
|
|
321
|
+
return JSON.stringify(selectCodingStatusSessions(manager.listSessions(), ctx?.currentSession));
|
|
163
322
|
}
|
|
164
323
|
const session = manager.getSession(sessionId);
|
|
165
324
|
if (!session)
|
|
166
325
|
return `session not found: ${sessionId}`;
|
|
167
|
-
return JSON.stringify(session);
|
|
326
|
+
return appendCompletionScrutiny(JSON.stringify(session), session);
|
|
168
327
|
},
|
|
328
|
+
summaryKeys: ["sessionId"],
|
|
169
329
|
},
|
|
170
330
|
{
|
|
171
331
|
tool: codingTailTool,
|
|
@@ -177,8 +337,9 @@ exports.codingToolDefinitions = [
|
|
|
177
337
|
const session = (0, index_1.getCodingSessionManager)().getSession(sessionId);
|
|
178
338
|
if (!session)
|
|
179
339
|
return `session not found: ${sessionId}`;
|
|
180
|
-
return (0, index_1.formatCodingTail)(session);
|
|
340
|
+
return appendCompletionScrutiny((0, index_1.formatCodingTail)(session), session);
|
|
181
341
|
},
|
|
342
|
+
summaryKeys: ["sessionId"],
|
|
182
343
|
},
|
|
183
344
|
{
|
|
184
345
|
tool: codingSendInputTool,
|
|
@@ -192,6 +353,7 @@ exports.codingToolDefinitions = [
|
|
|
192
353
|
return "input is required";
|
|
193
354
|
return JSON.stringify((0, index_1.getCodingSessionManager)().sendInput(sessionId, input));
|
|
194
355
|
},
|
|
356
|
+
summaryKeys: ["sessionId", "input"],
|
|
195
357
|
},
|
|
196
358
|
{
|
|
197
359
|
tool: codingKillTool,
|
|
@@ -202,5 +364,6 @@ exports.codingToolDefinitions = [
|
|
|
202
364
|
return "sessionId is required";
|
|
203
365
|
return JSON.stringify((0, index_1.getCodingSessionManager)().killSession(sessionId));
|
|
204
366
|
},
|
|
367
|
+
summaryKeys: ["sessionId"],
|
|
205
368
|
},
|
|
206
369
|
];
|
|
@@ -3,62 +3,21 @@
|
|
|
3
3
|
// Provides a generic githubRequest() for arbitrary GitHub REST API endpoints.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
5
|
exports.githubRequest = githubRequest;
|
|
6
|
-
const
|
|
7
|
-
const runtime_1 = require("../nerves/runtime");
|
|
6
|
+
const api_client_1 = require("./api-client");
|
|
8
7
|
const GITHUB_BASE = "https://api.github.com";
|
|
9
8
|
// Generic GitHub API request. Returns response body as pretty-printed JSON string.
|
|
10
9
|
async function githubRequest(token, method, path, body) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
"Content-Type": "application/json",
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
if (body)
|
|
28
|
-
opts.body = body;
|
|
29
|
-
const res = await fetch(url, opts);
|
|
30
|
-
if (!res.ok) {
|
|
31
|
-
(0, runtime_1.emitNervesEvent)({
|
|
32
|
-
level: "error",
|
|
33
|
-
event: "client.error",
|
|
34
|
-
component: "clients",
|
|
35
|
-
message: "GitHub request failed",
|
|
36
|
-
meta: { client: "github", method, path, status: res.status },
|
|
37
|
-
});
|
|
38
|
-
return (0, api_error_1.handleApiError)(res, "GitHub", "github");
|
|
39
|
-
}
|
|
40
|
-
const data = await res.json();
|
|
41
|
-
(0, runtime_1.emitNervesEvent)({
|
|
42
|
-
event: "client.request_end",
|
|
43
|
-
component: "clients",
|
|
44
|
-
message: "GitHub request completed",
|
|
45
|
-
meta: { client: "github", method, path, success: true },
|
|
46
|
-
});
|
|
47
|
-
return JSON.stringify(data, null, 2);
|
|
48
|
-
}
|
|
49
|
-
catch (err) {
|
|
50
|
-
(0, runtime_1.emitNervesEvent)({
|
|
51
|
-
level: "error",
|
|
52
|
-
event: "client.error",
|
|
53
|
-
component: "clients",
|
|
54
|
-
message: "GitHub request threw exception",
|
|
55
|
-
meta: {
|
|
56
|
-
client: "github",
|
|
57
|
-
method,
|
|
58
|
-
path,
|
|
59
|
-
reason: err instanceof Error ? err.message : String(err),
|
|
60
|
-
},
|
|
61
|
-
});
|
|
62
|
-
return (0, api_error_1.handleApiError)(err, "GitHub", "github");
|
|
63
|
-
}
|
|
10
|
+
return (0, api_client_1.apiRequest)({
|
|
11
|
+
baseUrl: GITHUB_BASE,
|
|
12
|
+
method,
|
|
13
|
+
path,
|
|
14
|
+
token,
|
|
15
|
+
clientName: "github",
|
|
16
|
+
serviceLabel: "GitHub",
|
|
17
|
+
connectionName: "github",
|
|
18
|
+
body,
|
|
19
|
+
extraHeaders: {
|
|
20
|
+
Accept: "application/vnd.github+json",
|
|
21
|
+
},
|
|
22
|
+
});
|
|
64
23
|
}
|
|
@@ -7,61 +7,20 @@ exports.graphRequest = graphRequest;
|
|
|
7
7
|
exports.getProfile = getProfile;
|
|
8
8
|
const api_error_1 = require("../heart/api-error");
|
|
9
9
|
const runtime_1 = require("../nerves/runtime");
|
|
10
|
+
const api_client_1 = require("./api-client");
|
|
10
11
|
const GRAPH_BASE = "https://graph.microsoft.com/v1.0";
|
|
11
12
|
// Generic Graph API request. Returns response body as pretty-printed JSON string.
|
|
12
13
|
async function graphRequest(token, method, path, body) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
headers: {
|
|
24
|
-
Authorization: `Bearer ${token}`,
|
|
25
|
-
"Content-Type": "application/json",
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
if (body)
|
|
29
|
-
opts.body = body;
|
|
30
|
-
const res = await fetch(url, opts);
|
|
31
|
-
if (!res.ok) {
|
|
32
|
-
(0, runtime_1.emitNervesEvent)({
|
|
33
|
-
level: "error",
|
|
34
|
-
event: "client.error",
|
|
35
|
-
component: "clients",
|
|
36
|
-
message: "Graph request failed",
|
|
37
|
-
meta: { client: "graph", method, path, status: res.status },
|
|
38
|
-
});
|
|
39
|
-
return (0, api_error_1.handleApiError)(res, "Graph", "graph");
|
|
40
|
-
}
|
|
41
|
-
const data = await res.json();
|
|
42
|
-
(0, runtime_1.emitNervesEvent)({
|
|
43
|
-
event: "client.request_end",
|
|
44
|
-
component: "clients",
|
|
45
|
-
message: "Graph request completed",
|
|
46
|
-
meta: { client: "graph", method, path, success: true },
|
|
47
|
-
});
|
|
48
|
-
return JSON.stringify(data, null, 2);
|
|
49
|
-
}
|
|
50
|
-
catch (err) {
|
|
51
|
-
(0, runtime_1.emitNervesEvent)({
|
|
52
|
-
level: "error",
|
|
53
|
-
event: "client.error",
|
|
54
|
-
component: "clients",
|
|
55
|
-
message: "Graph request threw exception",
|
|
56
|
-
meta: {
|
|
57
|
-
client: "graph",
|
|
58
|
-
method,
|
|
59
|
-
path,
|
|
60
|
-
reason: err instanceof Error ? err.message : String(err),
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
return (0, api_error_1.handleApiError)(err, "Graph", "graph");
|
|
64
|
-
}
|
|
14
|
+
return (0, api_client_1.apiRequest)({
|
|
15
|
+
baseUrl: GRAPH_BASE,
|
|
16
|
+
method,
|
|
17
|
+
path,
|
|
18
|
+
token,
|
|
19
|
+
clientName: "graph",
|
|
20
|
+
serviceLabel: "Graph",
|
|
21
|
+
connectionName: "graph",
|
|
22
|
+
body,
|
|
23
|
+
});
|
|
65
24
|
}
|
|
66
25
|
// Backward-compatible thin wrapper: fetches /me and formats as human-readable text.
|
|
67
26
|
async function getProfile(token) {
|