@geminixiang/mikan 1.0.0-beta.20 → 1.0.0-beta.21
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/CHANGELOG.md +34 -0
- package/README.md +18 -11
- package/dist/adapters/buffered-responder.d.ts +60 -0
- package/dist/adapters/buffered-responder.d.ts.map +1 -0
- package/dist/adapters/buffered-responder.js +201 -0
- package/dist/adapters/buffered-responder.js.map +1 -0
- package/dist/adapters/discord/context.d.ts.map +1 -1
- package/dist/adapters/discord/context.js +42 -177
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +14 -76
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +52 -443
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/client.d.ts +4 -0
- package/dist/adapters/github/client.d.ts.map +1 -1
- package/dist/adapters/github/client.js +5 -0
- package/dist/adapters/github/client.js.map +1 -1
- package/dist/adapters/github/context.d.ts.map +1 -1
- package/dist/adapters/github/context.js +32 -104
- package/dist/adapters/github/context.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +90 -0
- package/dist/adapters/github/github-ops.d.ts.map +1 -0
- package/dist/adapters/github/github-ops.js +405 -0
- package/dist/adapters/github/github-ops.js.map +1 -0
- package/dist/adapters/github/repo.d.ts +2 -0
- package/dist/adapters/github/repo.d.ts.map +1 -1
- package/dist/adapters/github/repo.js +5 -0
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/github/tools/checks.d.ts.map +1 -1
- package/dist/adapters/github/tools/checks.js +6 -17
- package/dist/adapters/github/tools/checks.js.map +1 -1
- package/dist/adapters/github/tools/issue.d.ts.map +1 -1
- package/dist/adapters/github/tools/issue.js +6 -17
- package/dist/adapters/github/tools/issue.js.map +1 -1
- package/dist/adapters/github/tools/pr.d.ts.map +1 -1
- package/dist/adapters/github/tools/pr.js +6 -17
- package/dist/adapters/github/tools/pr.js.map +1 -1
- package/dist/adapters/github/tools/read.d.ts.map +1 -1
- package/dist/adapters/github/tools/read.js +6 -17
- package/dist/adapters/github/tools/read.js.map +1 -1
- package/dist/adapters/github/tools/review-reply.d.ts.map +1 -1
- package/dist/adapters/github/tools/review-reply.js +6 -17
- package/dist/adapters/github/tools/review-reply.js.map +1 -1
- package/dist/adapters/github/tools/sync.d.ts.map +1 -1
- package/dist/adapters/github/tools/sync.js +6 -17
- package/dist/adapters/github/tools/sync.js.map +1 -1
- package/dist/adapters/slack/bot.js +1 -1
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/telegram/context.d.ts.map +1 -1
- package/dist/adapters/telegram/context.js +33 -151
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/agent.d.ts +0 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +28 -32
- package/dist/agent.js.map +1 -1
- package/dist/cli/arg-grammar.d.ts +25 -0
- package/dist/cli/arg-grammar.d.ts.map +1 -0
- package/dist/cli/arg-grammar.js +59 -0
- package/dist/cli/arg-grammar.js.map +1 -0
- package/dist/cli/boot.d.ts +16 -0
- package/dist/cli/boot.d.ts.map +1 -0
- package/dist/cli/boot.js +119 -0
- package/dist/cli/boot.js.map +1 -0
- package/dist/cli/ext.js +9 -11
- package/dist/cli/ext.js.map +1 -1
- package/dist/commands/extensions.js +2 -2
- package/dist/commands/extensions.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +5 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +8 -8
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +7 -5
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -41
- package/dist/config.js.map +1 -1
- package/dist/env-manifest.d.ts +35 -0
- package/dist/env-manifest.d.ts.map +1 -0
- package/dist/env-manifest.js +225 -0
- package/dist/env-manifest.js.map +1 -0
- package/dist/events.d.ts +0 -10
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +9 -82
- package/dist/events.js.map +1 -1
- package/dist/execution-resolver.d.ts +1 -0
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +33 -36
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/event-format.d.ts +66 -0
- package/dist/harness/event-format.d.ts.map +1 -0
- package/dist/harness/event-format.js +112 -0
- package/dist/harness/event-format.js.map +1 -0
- package/dist/harness/extensions/loader.d.ts +9 -6
- package/dist/harness/extensions/loader.d.ts.map +1 -1
- package/dist/harness/extensions/loader.js +35 -50
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/extensions/types.d.ts +10 -14
- package/dist/harness/extensions/types.d.ts.map +1 -1
- package/dist/harness/extensions/types.js.map +1 -1
- package/dist/harness/index.d.ts +1 -0
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +1 -0
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/runner.d.ts +16 -0
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +27 -1
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/subagent-runner.d.ts +18 -1
- package/dist/harness/subagent-runner.d.ts.map +1 -1
- package/dist/harness/subagent-runner.js +62 -30
- package/dist/harness/subagent-runner.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/main.js +69 -121
- package/dist/main.js.map +1 -1
- package/dist/observability/instrument.js +6 -4
- package/dist/observability/instrument.js.map +1 -1
- package/dist/observability/sentry.d.ts.map +1 -1
- package/dist/observability/sentry.js +3 -2
- package/dist/observability/sentry.js.map +1 -1
- package/dist/runtime/conversation-runtime.js +13 -3
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/types.d.ts +4 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/cloudflare.d.ts +1 -0
- package/dist/sandbox/cloudflare.d.ts.map +1 -1
- package/dist/sandbox/cloudflare.js +4 -1
- package/dist/sandbox/cloudflare.js.map +1 -1
- package/dist/sandbox/container.d.ts +1 -0
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +4 -1
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/firecracker.d.ts +1 -0
- package/dist/sandbox/firecracker.d.ts.map +1 -1
- package/dist/sandbox/firecracker.js +4 -1
- package/dist/sandbox/firecracker.js.map +1 -1
- package/dist/sandbox/gondolin-bootstrap.d.ts +26 -0
- package/dist/sandbox/gondolin-bootstrap.d.ts.map +1 -0
- package/dist/sandbox/gondolin-bootstrap.js +27 -0
- package/dist/sandbox/gondolin-bootstrap.js.map +1 -0
- package/dist/sandbox/gondolin-contract.d.ts +125 -0
- package/dist/sandbox/gondolin-contract.d.ts.map +1 -0
- package/dist/sandbox/gondolin-contract.js +155 -0
- package/dist/sandbox/gondolin-contract.js.map +1 -0
- package/dist/sandbox/gondolin-fleet.d.ts +1 -1
- package/dist/sandbox/gondolin-fleet.d.ts.map +1 -1
- package/dist/sandbox/gondolin-fleet.js +1 -1
- package/dist/sandbox/gondolin-fleet.js.map +1 -1
- package/dist/sandbox/gondolin-gateway.d.ts +1 -0
- package/dist/sandbox/gondolin-gateway.d.ts.map +1 -1
- package/dist/sandbox/gondolin-gateway.js +13 -6
- package/dist/sandbox/gondolin-gateway.js.map +1 -1
- package/dist/sandbox/gondolin-inventory.d.ts +2 -16
- package/dist/sandbox/gondolin-inventory.d.ts.map +1 -1
- package/dist/sandbox/gondolin-inventory.js +2 -12
- package/dist/sandbox/gondolin-inventory.js.map +1 -1
- package/dist/sandbox/gondolin-placement.d.ts +0 -2
- package/dist/sandbox/gondolin-placement.d.ts.map +1 -1
- package/dist/sandbox/gondolin-placement.js +0 -6
- package/dist/sandbox/gondolin-placement.js.map +1 -1
- package/dist/sandbox/gondolin-recovery.d.ts +33 -0
- package/dist/sandbox/gondolin-recovery.d.ts.map +1 -0
- package/dist/sandbox/gondolin-recovery.js +39 -0
- package/dist/sandbox/gondolin-recovery.js.map +1 -0
- package/dist/sandbox/gondolin-remote.d.ts +2 -5
- package/dist/sandbox/gondolin-remote.d.ts.map +1 -1
- package/dist/sandbox/gondolin-remote.js +12 -39
- package/dist/sandbox/gondolin-remote.js.map +1 -1
- package/dist/sandbox/gondolin-worker-client.d.ts +8 -12
- package/dist/sandbox/gondolin-worker-client.d.ts.map +1 -1
- package/dist/sandbox/gondolin-worker-client.js +13 -15
- package/dist/sandbox/gondolin-worker-client.js.map +1 -1
- package/dist/sandbox/gondolin-worker.d.ts +2 -40
- package/dist/sandbox/gondolin-worker.d.ts.map +1 -1
- package/dist/sandbox/gondolin-worker.js.map +1 -1
- package/dist/sandbox/gondolin.d.ts +1 -0
- package/dist/sandbox/gondolin.d.ts.map +1 -1
- package/dist/sandbox/gondolin.js +8 -4
- package/dist/sandbox/gondolin.js.map +1 -1
- package/dist/sandbox/host.d.ts +1 -0
- package/dist/sandbox/host.d.ts.map +1 -1
- package/dist/sandbox/host.js +3 -0
- package/dist/sandbox/host.js.map +1 -1
- package/dist/sandbox/index.d.ts +9 -1
- package/dist/sandbox/index.d.ts.map +1 -1
- package/dist/sandbox/index.js +14 -0
- package/dist/sandbox/index.js.map +1 -1
- package/dist/sandbox/types.d.ts +5 -0
- package/dist/sandbox/types.d.ts.map +1 -1
- package/dist/sandbox/types.js.map +1 -1
- package/dist/sandbox/utils.d.ts +1 -0
- package/dist/sandbox/utils.d.ts.map +1 -1
- package/dist/sandbox/utils.js +5 -2
- package/dist/sandbox/utils.js.map +1 -1
- package/dist/sessions/chat-history-sync.d.ts +32 -0
- package/dist/sessions/chat-history-sync.d.ts.map +1 -0
- package/dist/sessions/{agent-memory-file-manager.js → chat-history-sync.js} +24 -83
- package/dist/sessions/chat-history-sync.js.map +1 -0
- package/dist/sessions/conversation-log.d.ts +13 -0
- package/dist/sessions/conversation-log.d.ts.map +1 -0
- package/dist/sessions/conversation-log.js +47 -0
- package/dist/sessions/conversation-log.js.map +1 -0
- package/dist/sessions/rotation.d.ts +2 -0
- package/dist/sessions/rotation.d.ts.map +1 -0
- package/dist/sessions/rotation.js +39 -0
- package/dist/sessions/rotation.js.map +1 -0
- package/dist/sessions/store.d.ts.map +1 -1
- package/dist/sessions/store.js +4 -10
- package/dist/sessions/store.js.map +1 -1
- package/dist/sessions/types.d.ts +2 -2
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/settings-mutation.d.ts +23 -0
- package/dist/settings-mutation.d.ts.map +1 -0
- package/dist/settings-mutation.js +42 -0
- package/dist/settings-mutation.js.map +1 -0
- package/dist/tools/event.d.ts.map +1 -1
- package/dist/tools/event.js +27 -46
- package/dist/tools/event.js.map +1 -1
- package/dist/tools/host-fn-tool.d.ts +21 -0
- package/dist/tools/host-fn-tool.d.ts.map +1 -0
- package/dist/tools/host-fn-tool.js +32 -0
- package/dist/tools/host-fn-tool.js.map +1 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +1 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/react.d.ts.map +1 -1
- package/dist/tools/react.js +6 -17
- package/dist/tools/react.js.map +1 -1
- package/dist/tools/read.d.ts.map +1 -1
- package/dist/tools/read.js +7 -26
- package/dist/tools/read.js.map +1 -1
- package/dist/tools/sandbox.d.ts.map +1 -1
- package/dist/tools/sandbox.js +5 -2
- package/dist/tools/sandbox.js.map +1 -1
- package/dist/tools/subagent-slots.d.ts +28 -0
- package/dist/tools/subagent-slots.d.ts.map +1 -0
- package/dist/tools/subagent-slots.js +57 -0
- package/dist/tools/subagent-slots.js.map +1 -0
- package/dist/tools/subagent.d.ts +7 -2
- package/dist/tools/subagent.d.ts.map +1 -1
- package/dist/tools/subagent.js +160 -111
- package/dist/tools/subagent.js.map +1 -1
- package/dist/tools/types.d.ts +10 -9
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/types.d.ts +5 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/date.d.ts +1 -1
- package/dist/utils/date.js +1 -1
- package/dist/utils/date.js.map +1 -1
- package/dist/vault/disabled.d.ts.map +1 -1
- package/dist/vault/disabled.js +0 -1
- package/dist/vault/disabled.js.map +1 -1
- package/dist/vault/index.d.ts +0 -2
- package/dist/vault/index.d.ts.map +1 -1
- package/dist/vault/index.js +0 -10
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/injection.d.ts +20 -0
- package/dist/vault/injection.d.ts.map +1 -0
- package/dist/vault/injection.js +27 -0
- package/dist/vault/injection.js.map +1 -0
- package/dist/vault/types.d.ts +0 -2
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js.map +1 -1
- package/dist/web/admin/portal.d.ts +3 -3
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +41 -39
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +3 -0
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/agent-events/portal.d.ts.map +1 -1
- package/dist/web/agent-events/portal.js +2 -1
- package/dist/web/agent-events/portal.js.map +1 -1
- package/package.json +1 -1
- package/dist/sessions/agent-memory-file-manager.d.ts +0 -19
- package/dist/sessions/agent-memory-file-manager.d.ts.map +0 -1
- package/dist/sessions/agent-memory-file-manager.js.map +0 -1
- package/dist/vault/routing.d.ts +0 -4
- package/dist/vault/routing.d.ts.map +0 -1
- package/dist/vault/routing.js +0 -6
- package/dist/vault/routing.js.map +0 -1
|
@@ -1,39 +1,13 @@
|
|
|
1
|
-
import * as log from "../../log.js";
|
|
2
1
|
import { resolveChatSessionKey } from "../../sessions/policy.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { createBufferedResponder, formatMarkdownToolResult } from "../buffered-responder.js";
|
|
3
|
+
import { createChatResponseErrorReporter } from "../shared.js";
|
|
5
4
|
// Discord hard limit is 2000 chars; 1900 leaves headroom for working indicator.
|
|
6
5
|
const MAX_LENGTH = 1900;
|
|
7
6
|
const formatDiscordContinuation = (partNum) => `*(continued ${partNum})*`;
|
|
8
7
|
function isDiscordMessageReference(id) {
|
|
9
8
|
return typeof id === "string" && id !== "" && !id.startsWith("event:");
|
|
10
9
|
}
|
|
11
|
-
function formatToolResult(result) {
|
|
12
|
-
const argsFormatted = formatToolArgs(result.args);
|
|
13
|
-
const duration = (result.durationMs / 1000).toFixed(1);
|
|
14
|
-
let text = `**${result.isError ? "Error" : "Done"} ${result.toolName}**`;
|
|
15
|
-
if (result.label)
|
|
16
|
-
text += `: ${result.label}`;
|
|
17
|
-
text += ` (${duration}s)\n`;
|
|
18
|
-
if (argsFormatted)
|
|
19
|
-
text += `\`\`\`\n${argsFormatted}\n\`\`\`\n`;
|
|
20
|
-
text += `**Result:**\n\`\`\`\n${result.result}\n\`\`\``;
|
|
21
|
-
return text;
|
|
22
|
-
}
|
|
23
10
|
export function createDiscordAdapters(event, bot) {
|
|
24
|
-
let messageId = null;
|
|
25
|
-
let accumulatedText = "";
|
|
26
|
-
let isWorking = true;
|
|
27
|
-
const workingIndicator = " ...";
|
|
28
|
-
const responseOperations = new OrderedResponseOperations();
|
|
29
|
-
let typingInterval = null;
|
|
30
|
-
let typingFailureWarned = false;
|
|
31
|
-
function stopTyping() {
|
|
32
|
-
if (typingInterval !== null) {
|
|
33
|
-
clearInterval(typingInterval);
|
|
34
|
-
typingInterval = null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
11
|
const conversationId = event.conversationId;
|
|
38
12
|
const channelId = conversationId;
|
|
39
13
|
const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;
|
|
@@ -57,170 +31,61 @@ export function createDiscordAdapters(event, bot) {
|
|
|
57
31
|
};
|
|
58
32
|
// The bot's getMessagingInfo() is the single authority for platform info.
|
|
59
33
|
const platform = bot.getMessagingInfo();
|
|
60
|
-
|
|
61
|
-
stopTyping();
|
|
62
|
-
if (threadTargetId) {
|
|
63
|
-
return bot.postInThread(channelId, threadTargetId, text);
|
|
64
|
-
}
|
|
65
|
-
if (replyTargetId) {
|
|
66
|
-
return bot.postReply(channelId, replyTargetId, text);
|
|
67
|
-
}
|
|
68
|
-
if (messageId !== null) {
|
|
69
|
-
return bot.postReply(channelId, messageId, text);
|
|
70
|
-
}
|
|
71
|
-
return bot.postMessage(channelId, text);
|
|
72
|
-
}
|
|
34
|
+
let currentResponseId = null;
|
|
73
35
|
const reportResponseError = createChatResponseErrorReporter(() => ({
|
|
74
36
|
platform: "discord",
|
|
75
37
|
conversationId,
|
|
76
38
|
channelId,
|
|
77
39
|
messageId: message.id,
|
|
78
40
|
sessionKey: message.sessionKey,
|
|
79
|
-
responseMessageId:
|
|
41
|
+
responseMessageId: currentResponseId,
|
|
80
42
|
threadTs: threadTargetId,
|
|
81
43
|
replyTargetId,
|
|
82
44
|
conversationKind: message.conversationKind,
|
|
83
45
|
}));
|
|
84
|
-
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (threadTargetId) {
|
|
91
|
-
messageId = await bot.postInThread(channelId, threadTargetId, displayText);
|
|
92
|
-
}
|
|
93
|
-
else if (replyTargetId) {
|
|
94
|
-
messageId = await bot.postReply(channelId, replyTargetId, displayText);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
messageId = await bot.postMessage(channelId, displayText);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
async function postSplitResponse(text) {
|
|
101
|
-
const [displayText, ...extraParts] = splitText(text, MAX_LENGTH, formatDiscordContinuation);
|
|
102
|
-
await postOrUpdateResponse(displayText);
|
|
103
|
-
for (const part of extraParts) {
|
|
104
|
-
await postDiagnosticMessage(part);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
const stream = new BufferedResponseStream({
|
|
108
|
-
flush: async (text) => {
|
|
109
|
-
await postSplitResponse(isWorking ? text + workingIndicator : text);
|
|
110
|
-
},
|
|
111
|
-
finish: async (text) => {
|
|
112
|
-
isWorking = false;
|
|
113
|
-
stopTyping();
|
|
114
|
-
await postSplitResponse(text);
|
|
115
|
-
},
|
|
116
|
-
});
|
|
117
|
-
function queueDiscordResponse(label, operation, work, report) {
|
|
118
|
-
return responseOperations.run(work, (err) => {
|
|
119
|
-
log.logWarning(`Discord ${label} error`, err instanceof Error ? err.message : String(err));
|
|
120
|
-
reportResponseError(err, operation, report(err));
|
|
121
|
-
});
|
|
46
|
+
function postFirst(text) {
|
|
47
|
+
if (threadTargetId)
|
|
48
|
+
return bot.postInThread(channelId, threadTargetId, text);
|
|
49
|
+
if (replyTargetId)
|
|
50
|
+
return bot.postReply(channelId, replyTargetId, text);
|
|
51
|
+
return bot.postMessage(channelId, text);
|
|
122
52
|
}
|
|
123
|
-
const responder = {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
accumulatedLength: accumulatedText.length,
|
|
136
|
-
}));
|
|
137
|
-
},
|
|
138
|
-
appendResponseDelta: async (delta) => {
|
|
139
|
-
await queueDiscordResponse("appendResponseDelta", "respond", async () => {
|
|
140
|
-
await stream.append(delta);
|
|
141
|
-
accumulatedText = stream.getText();
|
|
142
|
-
if (messageId !== null) {
|
|
143
|
-
bot.logBotResponse(channelId, delta, messageId);
|
|
144
|
-
}
|
|
145
|
-
}, () => ({ textLength: delta.length, accumulatedLength: stream.getText().length }));
|
|
146
|
-
},
|
|
147
|
-
finishResponse: async (finalText) => {
|
|
148
|
-
await queueDiscordResponse("finishResponse", "set_working", async () => {
|
|
149
|
-
await stream.finish(finalText);
|
|
150
|
-
accumulatedText = stream.getText();
|
|
151
|
-
}, () => ({ finalTextLength: finalText?.length }));
|
|
152
|
-
},
|
|
153
|
-
replaceResponse: async (text) => {
|
|
154
|
-
await queueDiscordResponse("replaceResponse", "replace_response", async () => {
|
|
155
|
-
accumulatedText = text;
|
|
156
|
-
stream.setText(accumulatedText);
|
|
157
|
-
await postSplitResponse(accumulatedText);
|
|
158
|
-
}, () => ({
|
|
159
|
-
textLength: text.length,
|
|
160
|
-
hadExistingResponse: Boolean(messageId),
|
|
161
|
-
}));
|
|
53
|
+
const { responder } = createBufferedResponder({
|
|
54
|
+
label: "Discord",
|
|
55
|
+
maxLength: MAX_LENGTH,
|
|
56
|
+
formatContinuation: formatDiscordContinuation,
|
|
57
|
+
errorPrefix: "*Error:* ",
|
|
58
|
+
workingIndicator: " ...",
|
|
59
|
+
streaming: true,
|
|
60
|
+
typing: {
|
|
61
|
+
// Send immediately and repeat every 8s (Discord clears indicator after ~10s)
|
|
62
|
+
send: () => bot.sendTyping(channelId),
|
|
63
|
+
intervalMs: 8000,
|
|
64
|
+
stopOnSend: true,
|
|
162
65
|
},
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
}, () => ({
|
|
170
|
-
textLength: text.length,
|
|
171
|
-
style: options?.style,
|
|
172
|
-
}));
|
|
66
|
+
formatToolResult: formatMarkdownToolResult,
|
|
67
|
+
reportError: reportResponseError,
|
|
68
|
+
post: async (text) => {
|
|
69
|
+
currentResponseId = await postFirst(text);
|
|
70
|
+
return currentResponseId;
|
|
173
71
|
},
|
|
174
|
-
|
|
175
|
-
|
|
72
|
+
update: (id, text) => bot.updateMessageRaw(channelId, id, text),
|
|
73
|
+
postExtra: (text, responseId) => {
|
|
74
|
+
if (threadTargetId)
|
|
75
|
+
return bot.postInThread(channelId, threadTargetId, text);
|
|
76
|
+
if (replyTargetId)
|
|
77
|
+
return bot.postReply(channelId, replyTargetId, text);
|
|
78
|
+
if (responseId !== null)
|
|
79
|
+
return bot.postReply(channelId, responseId, text);
|
|
80
|
+
return bot.postMessage(channelId, text);
|
|
176
81
|
},
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
return;
|
|
181
|
-
typingFailureWarned = true;
|
|
182
|
-
log.logWarning("Discord sendTyping failed (further occurrences suppressed for this session)", err instanceof Error ? err.message : String(err));
|
|
183
|
-
};
|
|
184
|
-
if (isTyping && typingInterval === null) {
|
|
185
|
-
// Send immediately and repeat every 8s (Discord clears indicator after ~10s)
|
|
186
|
-
bot.sendTyping(channelId).catch(onTypingError);
|
|
187
|
-
typingInterval = setInterval(() => {
|
|
188
|
-
bot.sendTyping(channelId).catch(onTypingError);
|
|
189
|
-
}, 8000);
|
|
190
|
-
}
|
|
191
|
-
else if (!isTyping) {
|
|
192
|
-
stopTyping();
|
|
193
|
-
}
|
|
82
|
+
delete: async (id) => {
|
|
83
|
+
await bot.deleteMessageRaw(channelId, id);
|
|
84
|
+
currentResponseId = null;
|
|
194
85
|
},
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
if (!working)
|
|
199
|
-
stopTyping();
|
|
200
|
-
if (messageId !== null) {
|
|
201
|
-
const [displayText] = splitText(isWorking ? accumulatedText + workingIndicator : accumulatedText, MAX_LENGTH, formatDiscordContinuation);
|
|
202
|
-
await bot.updateMessageRaw(channelId, messageId, displayText);
|
|
203
|
-
}
|
|
204
|
-
}, () => ({ working }));
|
|
205
|
-
},
|
|
206
|
-
uploadFile: async (filePath, title) => {
|
|
207
|
-
await bot.uploadFile(channelId, filePath, title);
|
|
208
|
-
},
|
|
209
|
-
deleteResponse: async () => {
|
|
210
|
-
await responseOperations.run(async () => {
|
|
211
|
-
stopTyping();
|
|
212
|
-
if (messageId !== null) {
|
|
213
|
-
try {
|
|
214
|
-
await bot.deleteMessageRaw(channelId, messageId);
|
|
215
|
-
}
|
|
216
|
-
catch {
|
|
217
|
-
// Ignore errors
|
|
218
|
-
}
|
|
219
|
-
messageId = null;
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
},
|
|
223
|
-
};
|
|
86
|
+
logBotResponse: (text, id) => bot.logBotResponse(channelId, text, id),
|
|
87
|
+
uploadFile: (filePath, title) => bot.uploadFile(channelId, filePath, title),
|
|
88
|
+
});
|
|
224
89
|
return { message, responder, platform };
|
|
225
90
|
}
|
|
226
91
|
//# sourceMappingURL=context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ConversationMessage,\n ConversationResponder,\n ChatToolResult,\n MessagingInfo,\n} from \"../../adapter.js\";\nimport * as log from \"../../log.js\";\nimport { resolveChatSessionKey } from \"../../sessions/policy.js\";\nimport {\n createChatResponseErrorReporter,\n formatToolArgs,\n splitText,\n type ChatResponseErrorOperation,\n} from \"../shared.js\";\nimport { BufferedResponseStream, OrderedResponseOperations } from \"../streaming.js\";\nimport type { DiscordMessagingBot, DiscordEvent } from \"./bot.js\";\n\n// Discord hard limit is 2000 chars; 1900 leaves headroom for working indicator.\nconst MAX_LENGTH = 1900;\n\nconst formatDiscordContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nfunction isDiscordMessageReference(id: string | undefined): id is string {\n return typeof id === \"string\" && id !== \"\" && !id.startsWith(\"event:\");\n}\n\nfunction formatToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `**${result.isError ? \"Error\" : \"Done\"} ${result.toolName}**`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `**Result:**\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nexport function createDiscordAdapters(\n event: DiscordEvent,\n bot: DiscordMessagingBot,\n): {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n} {\n let messageId: string | null = null;\n let accumulatedText = \"\";\n let isWorking = true;\n const workingIndicator = \" ...\";\n const responseOperations = new OrderedResponseOperations();\n let typingInterval: ReturnType<typeof setInterval> | null = null;\n let typingFailureWarned = false;\n\n function stopTyping(): void {\n if (typingInterval !== null) {\n clearInterval(typingInterval);\n typingInterval = null;\n }\n }\n\n const conversationId = event.conversationId;\n const channelId = conversationId;\n const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;\n const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;\n\n const message: ConversationMessage = {\n id: event.ts,\n sessionKey:\n event.sessionKey ??\n resolveChatSessionKey({\n conversationId,\n conversationKind: event.conversationKind,\n messageId: event.ts,\n persistentTopLevel: true,\n threadTs: event.thread_ts,\n }),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n };\n\n // The bot's getMessagingInfo() is the single authority for platform info.\n const platform: MessagingInfo = bot.getMessagingInfo();\n\n async function postDiagnosticMessage(text: string): Promise<string> {\n stopTyping();\n if (threadTargetId) {\n return bot.postInThread(channelId, threadTargetId, text);\n }\n if (replyTargetId) {\n return bot.postReply(channelId, replyTargetId, text);\n }\n if (messageId !== null) {\n return bot.postReply(channelId, messageId, text);\n }\n return bot.postMessage(channelId, text);\n }\n\n const reportResponseError = createChatResponseErrorReporter(() => ({\n platform: \"discord\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: messageId,\n threadTs: threadTargetId,\n replyTargetId,\n conversationKind: message.conversationKind,\n }));\n\n async function postOrUpdateResponse(displayText: string): Promise<void> {\n if (messageId !== null) {\n await bot.updateMessageRaw(channelId, messageId, displayText);\n return;\n }\n stopTyping();\n if (threadTargetId) {\n messageId = await bot.postInThread(channelId, threadTargetId, displayText);\n } else if (replyTargetId) {\n messageId = await bot.postReply(channelId, replyTargetId, displayText);\n } else {\n messageId = await bot.postMessage(channelId, displayText);\n }\n }\n\n async function postSplitResponse(text: string): Promise<void> {\n const [displayText, ...extraParts] = splitText(text, MAX_LENGTH, formatDiscordContinuation);\n await postOrUpdateResponse(displayText);\n for (const part of extraParts) {\n await postDiagnosticMessage(part);\n }\n }\n\n const stream = new BufferedResponseStream({\n flush: async (text) => {\n await postSplitResponse(isWorking ? text + workingIndicator : text);\n },\n finish: async (text) => {\n isWorking = false;\n stopTyping();\n await postSplitResponse(text);\n },\n });\n\n function queueDiscordResponse(\n label: string,\n operation: ChatResponseErrorOperation,\n work: () => Promise<void>,\n report: (err: unknown) => Record<string, unknown>,\n ): Promise<void> {\n return responseOperations.run(work, (err) => {\n log.logWarning(`Discord ${label} error`, err instanceof Error ? err.message : String(err));\n reportResponseError(err, operation, report(err));\n });\n }\n\n const responder: ConversationResponder = {\n respond: async (text: string) => {\n await queueDiscordResponse(\n \"respond\",\n \"respond\",\n async () => {\n accumulatedText = accumulatedText ? `${accumulatedText}\\n${text}` : text;\n stream.setText(accumulatedText);\n await postSplitResponse(isWorking ? accumulatedText + workingIndicator : accumulatedText);\n if (messageId !== null) {\n bot.logBotResponse(channelId, text, messageId);\n }\n },\n () => ({\n phase: messageId ? \"update\" : \"initial_post\",\n textLength: text.length,\n accumulatedLength: accumulatedText.length,\n }),\n );\n },\n\n appendResponseDelta: async (delta: string) => {\n await queueDiscordResponse(\n \"appendResponseDelta\",\n \"respond\",\n async () => {\n await stream.append(delta);\n accumulatedText = stream.getText();\n if (messageId !== null) {\n bot.logBotResponse(channelId, delta, messageId);\n }\n },\n () => ({ textLength: delta.length, accumulatedLength: stream.getText().length }),\n );\n },\n\n finishResponse: async (finalText?: string) => {\n await queueDiscordResponse(\n \"finishResponse\",\n \"set_working\",\n async () => {\n await stream.finish(finalText);\n accumulatedText = stream.getText();\n },\n () => ({ finalTextLength: finalText?.length }),\n );\n },\n\n replaceResponse: async (text: string) => {\n await queueDiscordResponse(\n \"replaceResponse\",\n \"replace_response\",\n async () => {\n accumulatedText = text;\n stream.setText(accumulatedText);\n await postSplitResponse(accumulatedText);\n },\n () => ({\n textLength: text.length,\n hadExistingResponse: Boolean(messageId),\n }),\n );\n },\n\n respondDiagnostic: async (text: string, options?: { style?: \"muted\" | \"error\" }) => {\n await queueDiscordResponse(\n \"respondDiagnostic\",\n \"respond_diagnostic\",\n async () => {\n const prefix = options?.style === \"error\" ? \"*Error:* \" : \"\";\n for (const part of splitText(`${prefix}${text}`, MAX_LENGTH, formatDiscordContinuation)) {\n await postDiagnosticMessage(part);\n }\n },\n () => ({\n textLength: text.length,\n style: options?.style,\n }),\n );\n },\n\n respondToolResult: async (result: ChatToolResult) => {\n await responder.respondDiagnostic(formatToolResult(result));\n },\n\n setTyping: async (isTyping: boolean) => {\n const onTypingError = (err: unknown): void => {\n if (typingFailureWarned) return;\n typingFailureWarned = true;\n log.logWarning(\n \"Discord sendTyping failed (further occurrences suppressed for this session)\",\n err instanceof Error ? err.message : String(err),\n );\n };\n if (isTyping && typingInterval === null) {\n // Send immediately and repeat every 8s (Discord clears indicator after ~10s)\n bot.sendTyping(channelId).catch(onTypingError);\n typingInterval = setInterval(() => {\n bot.sendTyping(channelId).catch(onTypingError);\n }, 8000);\n } else if (!isTyping) {\n stopTyping();\n }\n },\n\n setWorking: async (working: boolean) => {\n await queueDiscordResponse(\n \"setWorking\",\n \"set_working\",\n async () => {\n isWorking = working;\n if (!working) stopTyping();\n if (messageId !== null) {\n const [displayText] = splitText(\n isWorking ? accumulatedText + workingIndicator : accumulatedText,\n MAX_LENGTH,\n formatDiscordContinuation,\n );\n await bot.updateMessageRaw(channelId, messageId, displayText);\n }\n },\n () => ({ working }),\n );\n },\n\n uploadFile: async (filePath: string, title?: string) => {\n await bot.uploadFile(channelId, filePath, title);\n },\n\n deleteResponse: async () => {\n await responseOperations.run(async () => {\n stopTyping();\n if (messageId !== null) {\n try {\n await bot.deleteMessageRaw(channelId, messageId);\n } catch {\n // Ignore errors\n }\n messageId = null;\n }\n });\n },\n };\n\n return { message, responder, platform };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/discord/context.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationMessage, ConversationResponder, MessagingInfo } from \"../../adapter.js\";\nimport { resolveChatSessionKey } from \"../../sessions/policy.js\";\nimport { createBufferedResponder, formatMarkdownToolResult } from \"../buffered-responder.js\";\nimport { createChatResponseErrorReporter } from \"../shared.js\";\nimport type { DiscordMessagingBot, DiscordEvent } from \"./bot.js\";\n\n// Discord hard limit is 2000 chars; 1900 leaves headroom for working indicator.\nconst MAX_LENGTH = 1900;\n\nconst formatDiscordContinuation = (partNum: number): string => `*(continued ${partNum})*`;\n\nfunction isDiscordMessageReference(id: string | undefined): id is string {\n return typeof id === \"string\" && id !== \"\" && !id.startsWith(\"event:\");\n}\n\nexport function createDiscordAdapters(\n event: DiscordEvent,\n bot: DiscordMessagingBot,\n): {\n message: ConversationMessage;\n responder: ConversationResponder;\n platform: MessagingInfo;\n} {\n const conversationId = event.conversationId;\n const channelId = conversationId;\n const threadTargetId = isDiscordMessageReference(event.thread_ts) ? event.thread_ts : undefined;\n const replyTargetId = isDiscordMessageReference(event.ts) ? event.ts : undefined;\n\n const message: ConversationMessage = {\n id: event.ts,\n sessionKey:\n event.sessionKey ??\n resolveChatSessionKey({\n conversationId,\n conversationKind: event.conversationKind,\n messageId: event.ts,\n persistentTopLevel: true,\n threadTs: event.thread_ts,\n }),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n };\n\n // The bot's getMessagingInfo() is the single authority for platform info.\n const platform: MessagingInfo = bot.getMessagingInfo();\n\n let currentResponseId: string | null = null;\n\n const reportResponseError = createChatResponseErrorReporter(() => ({\n platform: \"discord\",\n conversationId,\n channelId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: currentResponseId,\n threadTs: threadTargetId,\n replyTargetId,\n conversationKind: message.conversationKind,\n }));\n\n function postFirst(text: string): Promise<string> {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n return bot.postMessage(channelId, text);\n }\n\n const { responder } = createBufferedResponder({\n label: \"Discord\",\n maxLength: MAX_LENGTH,\n formatContinuation: formatDiscordContinuation,\n errorPrefix: \"*Error:* \",\n workingIndicator: \" ...\",\n streaming: true,\n typing: {\n // Send immediately and repeat every 8s (Discord clears indicator after ~10s)\n send: () => bot.sendTyping(channelId),\n intervalMs: 8000,\n stopOnSend: true,\n },\n formatToolResult: formatMarkdownToolResult,\n reportError: reportResponseError,\n post: async (text) => {\n currentResponseId = await postFirst(text);\n return currentResponseId;\n },\n update: (id, text) => bot.updateMessageRaw(channelId, id, text),\n postExtra: (text, responseId) => {\n if (threadTargetId) return bot.postInThread(channelId, threadTargetId, text);\n if (replyTargetId) return bot.postReply(channelId, replyTargetId, text);\n if (responseId !== null) return bot.postReply(channelId, responseId, text);\n return bot.postMessage(channelId, text);\n },\n delete: async (id) => {\n await bot.deleteMessageRaw(channelId, id);\n currentResponseId = null;\n },\n logBotResponse: (text, id) => bot.logBotResponse(channelId, text, id),\n uploadFile: (filePath, title) => bot.uploadFile(channelId, filePath, title),\n });\n\n return { message, responder, platform };\n}\n"]}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
import type { ConversationEvent, MessagingBot, MessagingEventHandler, MessagingInfo } from "../../adapter.js";
|
|
2
|
-
import type { GithubCheckSummary, GithubIssueRequest, GithubPrRequest, GithubPrResult, GithubReadRequest, GithubReadResult } from "./types.js";
|
|
3
2
|
import { GithubClient } from "./client.js";
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
export declare const GITHUB_MAX_COMMENT_LENGTH = 60000;
|
|
3
|
+
import { GithubOps } from "./github-ops.js";
|
|
4
|
+
import type { GithubBotConfig, GithubConversationRef, GithubSyncState } from "./types.js";
|
|
7
5
|
export declare const formatGithubContinuation: (partNum: number) => string;
|
|
8
6
|
export declare class GithubMessagingBot implements MessagingBot {
|
|
9
7
|
private readonly client;
|
|
10
8
|
private readonly handler;
|
|
11
9
|
private readonly config;
|
|
10
|
+
/** Host-side backend for the github_* tool pack; standalone from polling. */
|
|
11
|
+
readonly ops: GithubOps;
|
|
12
12
|
private appSlug;
|
|
13
13
|
private botEmail;
|
|
14
14
|
private watchedRepos;
|
|
15
15
|
private queues;
|
|
16
16
|
private repoState;
|
|
17
17
|
private permissionCache;
|
|
18
|
-
/** Cloud Build ids seen in getChecks summaries → their GCP project. */
|
|
19
|
-
private buildRef;
|
|
20
18
|
private pollInFlight;
|
|
21
19
|
constructor(handler: MessagingEventHandler, config: GithubBotConfig, client?: GithubClient);
|
|
22
20
|
start(): Promise<void>;
|
|
@@ -33,7 +31,17 @@ export declare class GithubMessagingBot implements MessagingBot {
|
|
|
33
31
|
/** One poll tick over every watched repo. Public for tests. */
|
|
34
32
|
poll(): Promise<void>;
|
|
35
33
|
private pollRepo;
|
|
34
|
+
/**
|
|
35
|
+
* One feed's watermark advance — the same discipline for all three feeds:
|
|
36
|
+
* bump the cursor on any fresher updated_at, then let the id watermark plus
|
|
37
|
+
* the creation baseline decide what actually triggers (edits re-surface old
|
|
38
|
+
* items with a fresh updated_at). Bot-authored items advance the watermark
|
|
39
|
+
* without triggering.
|
|
40
|
+
*/
|
|
41
|
+
private advanceFeed;
|
|
36
42
|
private loadSyncState;
|
|
43
|
+
/** The persisted form of the current watermarks; the test/inspection surface. */
|
|
44
|
+
syncStateSnapshot(): GithubSyncState;
|
|
37
45
|
private persistSyncState;
|
|
38
46
|
/** Fresh regex per call: the `g` flag makes `test`/`replace` stateful. */
|
|
39
47
|
private mentionPattern;
|
|
@@ -68,81 +76,11 @@ export declare class GithubMessagingBot implements MessagingBot {
|
|
|
68
76
|
*/
|
|
69
77
|
private reviewThreadContext;
|
|
70
78
|
private logIssueContext;
|
|
71
|
-
private repoDir;
|
|
72
|
-
/** Whether the conversation's issue is a PR, for clone retries where the
|
|
73
|
-
* triggering item didn't carry that knowledge. Errs toward plain issue. */
|
|
74
|
-
private fetchIsPr;
|
|
75
|
-
/**
|
|
76
|
-
* The PR's head branch name when it lives in this repo — that is the name
|
|
77
|
-
* the local checkout should carry, so committing on it and calling
|
|
78
|
-
* github_pr pushes back to the PR itself instead of opening a new one.
|
|
79
|
-
* Fork heads (unpushable with the repo-scoped token) and failed lookups
|
|
80
|
-
* return undefined; callers then fall back to the synthetic pr-<n>.
|
|
81
|
-
*/
|
|
82
|
-
private fetchPrHeadBranch;
|
|
83
79
|
/**
|
|
84
80
|
* Clone the conversation's repo into its dir (bind-mounted into the
|
|
85
81
|
* sandbox) using an ephemeral contents:read token that never leaves the
|
|
86
82
|
* host. Non-fatal: a failed clone degrades to the pre-clone experience.
|
|
87
83
|
*/
|
|
88
84
|
private ensureRepoClone;
|
|
89
|
-
/**
|
|
90
|
-
* Backs the `github_pr` tool: push a `pi/*` branch the agent prepared in
|
|
91
|
-
* the conversation's clone, then open a pull request as the App. The write
|
|
92
|
-
* token is minted per call, scoped to this one repo, and never enters the
|
|
93
|
-
* sandbox.
|
|
94
|
-
*/
|
|
95
|
-
pushAndCreatePr(conversationId: string, request: GithubPrRequest): Promise<GithubPrResult>;
|
|
96
|
-
/**
|
|
97
|
-
* Backs the `github_checks` tool: CI check runs for a branch the agent
|
|
98
|
-
* pushed, or for the conversation's PR head when no branch is given.
|
|
99
|
-
*/
|
|
100
|
-
getChecks(conversationId: string, branch?: string): Promise<GithubCheckSummary[]>;
|
|
101
|
-
private rememberBuild;
|
|
102
|
-
/**
|
|
103
|
-
* Backs the Cloud Build log mode of `github_checks`. GCP credentials stay
|
|
104
|
-
* host-side (ADC via GOOGLE_APPLICATION_CREDENTIALS — e.g. a Workload
|
|
105
|
-
* Identity Federation external_account file); the build must have appeared
|
|
106
|
-
* in a github_checks summary first, which is also where its project is
|
|
107
|
-
* learned. Unreadable logs degrade to the console url, never a dead end.
|
|
108
|
-
*/
|
|
109
|
-
getBuildLog(conversationId: string, buildId: string): Promise<string>;
|
|
110
|
-
/**
|
|
111
|
-
* Backs the `github_sync` tool: refresh the conversation's ./repo clone
|
|
112
|
-
* from origin with an ephemeral read token. Fetch-only when moving the
|
|
113
|
-
* checkout could lose agent work; the formatted report tells the agent
|
|
114
|
-
* what happened and what to do next.
|
|
115
|
-
*/
|
|
116
|
-
syncRepo(conversationId: string, branch?: string): Promise<string>;
|
|
117
|
-
/**
|
|
118
|
-
* Backs the `github_read` tool: PR/issue metadata the ./repo clone cannot
|
|
119
|
-
* provide (diff stats, review state, other issues in the repo). Owner/repo
|
|
120
|
-
* always come from the conversation id, so reads never leave this repo.
|
|
121
|
-
*/
|
|
122
|
-
readGithub(conversationId: string, request: GithubReadRequest): Promise<GithubReadResult>;
|
|
123
|
-
/**
|
|
124
|
-
* Backs the `github_issue` tool: labels, assignees, and open/closed state
|
|
125
|
-
* on any issue of this conversation's repo (triage). Same-repo by
|
|
126
|
-
* construction — owner/repo come from the conversation id; the action enum
|
|
127
|
-
* is closed, so lock/delete/transfer cannot be expressed at all.
|
|
128
|
-
*/
|
|
129
|
-
manageIssue(conversationId: string, request: GithubIssueRequest): Promise<string>;
|
|
130
|
-
/**
|
|
131
|
-
* Backs the `github_review_reply` tool: answer inside one inline review
|
|
132
|
-
* thread of this conversation's PR. The comment id comes from an
|
|
133
|
-
* `[PR review comment rc-<id> …]` message; GitHub validates it belongs to
|
|
134
|
-
* this PR (404 otherwise, translated into agent-actionable guidance).
|
|
135
|
-
*/
|
|
136
|
-
replyToReviewThread(conversationId: string, commentId: number, body: string): Promise<{
|
|
137
|
-
url: string;
|
|
138
|
-
}>;
|
|
139
|
-
/**
|
|
140
|
-
* Backs the log mode of `github_checks`: the tail of one CI job's log so
|
|
141
|
-
* the agent can diagnose a failing check without sandbox credentials. Only
|
|
142
|
-
* GitHub Actions checks have logs on GitHub — external CI apps (e.g. Cloud
|
|
143
|
-
* Build) keep theirs on their own service, so a 404 here is translated
|
|
144
|
-
* into guidance instead of a dead end.
|
|
145
|
-
*/
|
|
146
|
-
getJobLog(conversationId: string, jobId: number): Promise<string>;
|
|
147
85
|
}
|
|
148
86
|
//# sourceMappingURL=bot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACd,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/bot.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAY1B,OAAO,EAAE,YAAY,EAA0C,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAgC,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAS1E,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EAKrB,eAAe,EAChB,MAAM,YAAY,CAAC;AAuDpB,eAAO,MAAM,wBAAwB,YAAa,MAAM,KAAG,MAAoC,CAAC;AAmFhG,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,eAAe,CAA0D;IACjF,OAAO,CAAC,YAAY,CAAS;IAE7B,YAAY,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,YAAY,EAczF;IAMK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA0D3B;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhE;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5E;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlF;IAED,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAe9C;IAED,gBAAgB,IAAI,aAAa,CAWhC;IAMK,WAAW,CAAC,GAAG,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3E;IAEK,aAAa,CAAC,GAAG,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;IAED,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAErD;IAED,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAErE;IAMD,OAAO,CAAC,QAAQ;IAShB,+DAA+D;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB1B;YAEa,QAAQ;IA2DtB;;;;;;OAMG;YACW,WAAW;IAgCzB,OAAO,CAAC,aAAa;IAkBrB,iFAAiF;IACjF,iBAAiB,IAAI,eAAe,CAYnC;IAED,OAAO,CAAC,gBAAgB;IASxB,0EAA0E;IAC1E,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,eAAe;IAIvB;;;;OAIG;YACW,oBAAoB;YA+BpB,cAAc;IAwE5B;;;;;;OAMG;YACW,mBAAmB;IAkBjC;;;;;OAKG;YACW,mBAAmB;IAqBjC;;;OAGG;YACW,mBAAmB;YA+BnB,eAAe;IAqC7B;;;;OAIG;YACW,eAAe;CA+B9B"}
|