@letta-ai/letta-code 0.33.8 → 0.34.1
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/dist/agent-presets.js +2 -2
- package/dist/agent-presets.js.map +1 -1
- package/dist/ask-user-question.cjs +128 -0
- package/dist/ask-user-question.cjs.map +10 -0
- package/dist/ask-user-question.js +88 -0
- package/dist/ask-user-question.js.map +10 -0
- package/dist/gateway-core.js +6 -20
- package/dist/gateway-core.js.map +5 -6
- package/dist/mcp-client.js +2 -2
- package/dist/mcp-client.js.map +1 -1
- package/dist/mcp-oauth.js +2 -2
- package/dist/mcp-oauth.js.map +1 -1
- package/dist/types/agent/client-skills.d.ts.map +1 -1
- package/dist/types/agent/memory-git-hooks.d.ts.map +1 -1
- package/dist/types/agent/skills.d.ts +0 -5
- package/dist/types/agent/skills.d.ts.map +1 -1
- package/dist/types/agent-settings.d.ts +23 -0
- package/dist/types/agent-settings.d.ts.map +1 -0
- package/dist/types/ask-user-question.d.ts +31 -0
- package/dist/types/ask-user-question.d.ts.map +1 -0
- package/dist/types/backend/dev/pi-provider-registry.d.ts.map +1 -1
- package/dist/types/channels/gateway-core.d.ts.map +1 -1
- package/dist/types/channels/message-channel-formatting.d.ts.map +1 -1
- package/dist/types/cli/helpers/tool-name-mapping.d.ts +0 -8
- package/dist/types/cli/helpers/tool-name-mapping.d.ts.map +1 -1
- package/dist/types/permissions/checker.d.ts.map +1 -1
- package/dist/types/providers/byok-providers.d.ts.map +1 -1
- package/dist/types/settings-manager.d.ts +5 -14
- package/dist/types/settings-manager.d.ts.map +1 -1
- package/dist/types/telemetry/error-reporting.d.ts +8 -0
- package/dist/types/telemetry/error-reporting.d.ts.map +1 -1
- package/dist/types/telemetry/index.d.ts +2 -7
- package/dist/types/telemetry/index.d.ts.map +1 -1
- package/dist/types/tools/client-preferences.d.ts +8 -0
- package/dist/types/tools/client-preferences.d.ts.map +1 -0
- package/dist/types/tools/impl/ask-user-question.d.ts +6 -18
- package/dist/types/tools/impl/ask-user-question.d.ts.map +1 -1
- package/dist/types/tools/impl/monitor.d.ts +0 -1
- package/dist/types/tools/impl/monitor.d.ts.map +1 -1
- package/dist/types/tools/impl/watch-pr.d.ts.map +1 -1
- package/dist/types/tools/manager.d.ts.map +1 -1
- package/dist/types/tools/tool-definitions.d.ts +1 -1
- package/dist/types/tools/toolset-catalog.d.ts +1 -1
- package/dist/types/tools/toolset-catalog.d.ts.map +1 -1
- package/dist/types/tools/toolset.d.ts.map +1 -1
- package/dist/types/types/client-preferences.d.ts +7 -0
- package/dist/types/types/client-preferences.d.ts.map +1 -0
- package/dist/types/types/protocol_v2.d.ts +4 -7
- package/dist/types/types/protocol_v2.d.ts.map +1 -1
- package/dist/types/types/teleport-protocol.d.ts +3 -0
- package/dist/types/types/teleport-protocol.d.ts.map +1 -1
- package/dist/types/utils/task-notifications.d.ts +0 -1
- package/dist/types/utils/task-notifications.d.ts.map +1 -1
- package/dist/types/websocket/listener/protocol-outbound.d.ts.map +1 -1
- package/dist/types/websocket/listener/queue.d.ts.map +1 -1
- package/dist/types/websocket/listener/runtime.d.ts.map +1 -1
- package/dist/types/websocket/listener/types.d.ts +1 -9
- package/dist/types/websocket/listener/types.d.ts.map +1 -1
- package/image-resize-worker.js +2 -6449
- package/letta.js +58144 -50737
- package/package.json +17 -3
- package/scripts/isolated-unit-tests.json +10 -0
- package/scripts/smoke-image-worker.mjs +68 -0
- package/scripts/source-file-size-baseline.json +13 -13
- package/scripts/stage-pypi-deps.mjs +1 -11
- package/scripts/unit-test-impact.test.cjs +2 -1
- package/skills/curating-memory-palace/SKILL.md +102 -60
- package/skills/initializing-memory/SKILL.md +1 -1
- package/dist/types/tools/interactive-policy.d.ts +0 -12
- package/dist/types/tools/interactive-policy.d.ts.map +0 -1
package/dist/agent-presets.js
CHANGED
|
@@ -1713,7 +1713,7 @@ user: What is the codebase structure?
|
|
|
1713
1713
|
assistant: [Uses the Agent tool with subagent_type=general-purpose]
|
|
1714
1714
|
</example>
|
|
1715
1715
|
|
|
1716
|
-
Tools are executed in a user-selected permission mode. When you attempt to call a tool that is not automatically allowed by the user's permission mode or permission settings, the user will be prompted so that they can approve or deny the execution. If the user denies a tool you call, do not re-attempt the exact same tool call. Instead, think about why the user has denied the tool call and adjust your approach. If you do not understand why the user has denied a tool call,
|
|
1716
|
+
Tools are executed in a user-selected permission mode. When you attempt to call a tool that is not automatically allowed by the user's permission mode or permission settings, the user will be prompted so that they can approve or deny the execution. If the user denies a tool you call, do not re-attempt the exact same tool call. Instead, think about why the user has denied the tool call and adjust your approach. If you do not understand why the user has denied a tool call, ask them using AskUserQuestion when available, or an ordinary message otherwise.
|
|
1717
1717
|
|
|
1718
1718
|
- Tool results and user messages may include <system-reminder> tags. <system-reminder> tags contain useful information and reminders. They are automatically added by the system, and bear no direct relation to the specific tool results or user messages in which they appear.
|
|
1719
1719
|
- The conversation has unlimited context through automatic summarization.
|
|
@@ -2586,4 +2586,4 @@ export {
|
|
|
2586
2586
|
DEFAULT_CREATED_AGENT_BASE_TOOLS
|
|
2587
2587
|
};
|
|
2588
2588
|
|
|
2589
|
-
//# debugId=
|
|
2589
|
+
//# debugId=006C28A4424C7CD564756E2164756E21
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
"/**\n * Pure builder for the `POST /v1/agents` wire payload of a Letta Code agent.\n *\n * This is the shared creation-policy choke point for the CLI and external\n * harness surfaces. It owns the defaults that must not drift between callers:\n * agent type, prompt mode, tags, server tools, initial messages, parallel tool\n * calls, and compaction. Callers may supply either a Letta Code personality or\n * their own identity blocks without rebuilding that policy.\n *\n * Everything reachable from this module must stay free of Node/backend imports\n * so it can be bundled in the browser-safe `agent-presets` package export.\n */\n\nimport type { CreateBlock } from \"@letta-ai/letta-client/resources/blocks/blocks\";\nimport { DEFAULT_SUMMARIZATION_MODEL } from \"@/constants\";\nimport { buildCreatedAgentTags } from \"./agent-tags\";\nimport { getDefaultMemoryBlocks } from \"./memory\";\nimport { getDefaultModel, resolveModel } from \"./model-catalog\";\nimport {\n buildPersonalityMemoryBlocks,\n getPersonalityCreationTags,\n getPersonalityDefaultMemoryFiles,\n getPersonalityOption,\n type PersonalityId,\n} from \"./personality-presets\";\nimport { buildSystemPrompt, type MemoryPromptMode } from \"./prompt-assets\";\n\n/** Agent type used for all Letta Code agents. */\nexport const LETTA_CODE_AGENT_TYPE = \"letta_v1_agent\";\n\n/**\n * Server-side tools attached to created agents. Client-side tools (Read,\n * Write, Bash, etc.) are passed via client_tools at runtime instead.\n */\nexport const DEFAULT_CREATED_AGENT_BASE_TOOLS = [\"web_search\", \"fetch_webpage\"];\n\nexport type CreateAgentMemoryBlock = CreateBlock;\n\n/**\n * Root marker that makes the hosted memory repository use MemFS v2.\n * The server seeds the root `MEMORY.md` layout only when the create request\n * includes a block with this label.\n */\nexport const DEFAULT_ROOT_MEMORY_BLOCK: CreateAgentMemoryBlock = {\n label: \"MEMORY\",\n value: \"# Memory\\n\",\n description: \"Root memory index.\",\n};\n\nexport interface BuildCreateAgentRequestOptions {\n personalityId?: PersonalityId;\n name?: string;\n description?: string;\n /** Model ID or handle. Personality default, then catalog default, applies. */\n model?: string;\n /** Complete prompt override. Null delegates default selection to the server. */\n system?: string | null;\n /** Whether the target is Letta Cloud; callers determine this with their backend's cloud detection. */\n isLettaCloud?: boolean;\n memoryPromptMode?: MemoryPromptMode;\n /**\n * Caller-defined identity. With a personality, matching labels replace its\n * blocks and new labels append after the personality blocks.\n */\n memoryBlocks?: CreateAgentMemoryBlock[];\n blockIds?: string[];\n /** Extra tags appended after canonical Letta Code and personality tags. */\n extraTags?: string[];\n enableMemfs?: boolean;\n isSubagent?: boolean;\n /** Exact server-side tools. Omission uses the Letta Code web-tool defaults. */\n baseTools?: string[];\n embedding?: string;\n hidden?: boolean;\n parallelToolCalls?: boolean;\n compactionModel?: string;\n}\n\nexport interface CreateAgentRequest {\n agent_type: typeof LETTA_CODE_AGENT_TYPE;\n name?: string;\n description?: string;\n model: string;\n system: string | null;\n memory_blocks?: CreateAgentMemoryBlock[];\n block_ids?: string[];\n tags: string[];\n tools: string[];\n include_base_tools: false;\n include_base_tool_rules: false;\n initial_message_sequence: never[];\n parallel_tool_calls: boolean;\n compaction_settings: { model: string };\n embedding?: string;\n hidden?: boolean;\n}\n\nexport type CreateAgentRequestForPersonality = CreateAgentRequest & {\n name: string;\n description: string;\n memory_blocks: CreateAgentMemoryBlock[];\n profile_picture?: {\n content: string;\n };\n};\n\nfunction mergeMemoryBlocks(\n base: CreateAgentMemoryBlock[],\n overrides: CreateAgentMemoryBlock[] | undefined,\n): CreateAgentMemoryBlock[] {\n const blocks = base.map((block) => ({ ...block }));\n for (const override of overrides ?? []) {\n const index = blocks.findIndex((block) => block.label === override.label);\n if (index >= 0) {\n blocks[index] = { ...override };\n } else {\n blocks.push({ ...override });\n }\n }\n return blocks;\n}\n\nfunction ensureRootMemoryBlock(\n blocks: CreateAgentMemoryBlock[],\n): CreateAgentMemoryBlock[] {\n return blocks.some((block) => block.label === DEFAULT_ROOT_MEMORY_BLOCK.label)\n ? blocks\n : [{ ...DEFAULT_ROOT_MEMORY_BLOCK }, ...blocks];\n}\n\n/** Build the canonical Core create-agent request for a Letta Code agent. */\nexport async function buildCreateAgentRequest(\n options: BuildCreateAgentRequestOptions = {},\n): Promise<CreateAgentRequest> {\n const personality = options.personalityId\n ? getPersonalityOption(options.personalityId)\n : undefined;\n const modelIdentifier = options.model ?? personality?.defaultModel;\n const modelHandle = modelIdentifier\n ? resolveModel(modelIdentifier)\n : getDefaultModel();\n if (!modelHandle) {\n throw new Error(`Unknown model: ${modelIdentifier}`);\n }\n\n if (\n !options.isSubagent &&\n options.enableMemfs !== undefined &&\n options.memoryPromptMode !== undefined &&\n options.enableMemfs !== (options.memoryPromptMode !== \"standard\")\n ) {\n throw new Error(\n \"enableMemfs and memoryPromptMode must describe the same memory mode\",\n );\n }\n const enableMemfs = options.isSubagent\n ? false\n : (options.enableMemfs ?? options.memoryPromptMode !== \"standard\");\n const memoryPromptMode = options.isSubagent\n ? \"standard\"\n : (options.memoryPromptMode ?? (enableMemfs ? \"root-memfs\" : \"standard\"));\n const personalityTags = options.personalityId\n ? getPersonalityCreationTags(options.personalityId)\n : [];\n const personalityBlocks = options.personalityId\n ? buildPersonalityMemoryBlocks(\n options.personalityId,\n await getDefaultMemoryBlocks(),\n )\n : [];\n const hasSuppliedMemoryBlocks =\n options.personalityId !== undefined || options.memoryBlocks !== undefined;\n const suppliedMemoryBlocks = hasSuppliedMemoryBlocks\n ? mergeMemoryBlocks(personalityBlocks, options.memoryBlocks)\n : [];\n // Root-layout agents must send the MEMORY block so the server seeds a\n // MemFS v2 repository; without it the initial repo uses the legacy\n // system/ layout even when the prompt mode says otherwise.\n const memoryBlocks = options.isSubagent\n ? undefined\n : memoryPromptMode === \"root-memfs\"\n ? ensureRootMemoryBlock(suppliedMemoryBlocks)\n : hasSuppliedMemoryBlocks\n ? suppliedMemoryBlocks\n : undefined;\n const blockIds = options.isSubagent ? undefined : options.blockIds;\n\n return {\n agent_type: LETTA_CODE_AGENT_TYPE,\n ...(options.name !== undefined || personality\n ? { name: options.name ?? personality?.label }\n : {}),\n ...(options.description !== undefined || personality\n ? { description: options.description ?? personality?.description }\n : {}),\n model: modelHandle,\n system:\n options.system !== undefined\n ? options.system\n : options.isLettaCloud\n ? null\n : buildSystemPrompt(\"default\", memoryPromptMode),\n ...(memoryBlocks !== undefined ? { memory_blocks: memoryBlocks } : {}),\n ...(blockIds && blockIds.length > 0 ? { block_ids: blockIds } : {}),\n tags: buildCreatedAgentTags({\n enableMemfs,\n isSubagent: options.isSubagent,\n tags: [...personalityTags, ...(options.extraTags ?? [])],\n }),\n tools: [...(options.baseTools ?? DEFAULT_CREATED_AGENT_BASE_TOOLS)],\n include_base_tools: false,\n include_base_tool_rules: false,\n initial_message_sequence: [],\n parallel_tool_calls: options.parallelToolCalls ?? true,\n compaction_settings: {\n model: options.compactionModel ?? DEFAULT_SUMMARIZATION_MODEL,\n },\n ...(options.embedding !== undefined\n ? { embedding: options.embedding }\n : {}),\n ...(options.isSubagent\n ? { hidden: true }\n : options.hidden !== undefined\n ? { hidden: options.hidden }\n : {}),\n };\n}\n\n/** Compatibility wrapper for callers that create a personality agent. */\nexport async function buildCreateAgentRequestForPersonality(params: {\n personalityId: PersonalityId;\n name?: string;\n description?: string;\n model?: string;\n extraTags?: string[];\n /** This browser-safe wrapper defaults to Cloud; pass false for a local server. */\n isLettaCloud?: boolean;\n}): Promise<CreateAgentRequestForPersonality> {\n const request = (await buildCreateAgentRequest({\n ...params,\n isLettaCloud: params.isLettaCloud ?? true,\n })) as CreateAgentRequestForPersonality;\n const profilePicture = getPersonalityDefaultMemoryFiles(\n params.personalityId,\n ).find((file) => file.path === \"profile.png\");\n if (!profilePicture) {\n return request;\n }\n const { getPersonalityAssetBase64 } = await import(\n \"./personality-asset-content\"\n );\n return {\n ...request,\n profile_picture: {\n content: await getPersonalityAssetBase64(profilePicture.assetId),\n },\n };\n}\n"
|
|
13
13
|
],
|
|
14
14
|
"mappings": ";;;;;AAQO,IAAM,wBAAwB;AAG9B,IAAM,wBAAwB;AAG9B,IAAM,0BAA0B;AAGhC,IAAM,yBAAyB;AAQ/B,SAAS,qBAAqB,CACnC,UAAwC,CAAC,GAC/B;AAAA,EACV,MAAM,OAAO,CAAC,qBAAqB;AAAA,EACnC,IAAI,QAAQ,YAAY;AAAA,IACtB,KAAK,KAAK,uBAAuB;AAAA,EACnC;AAAA,EACA,IAAI,QAAQ,aAAa;AAAA,IACvB,KAAK,KAAK,sBAAsB;AAAA,EAClC;AAAA,EACA,IAAI,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,IAAI,GAAG;AAAA,IAC/C,KAAK,KAAK,GAAG,QAAQ,IAAI;AAAA,EAC3B;AAAA,EACA,OAAO,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA;;AC1B1B,IAAM,8BAA8B;AA2BpC,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB,IAAI;AACjC,IAAM,wBAAwB,KAAK;AAEnC,IAAM,mBAAmB;AACzB,IAAM,oBAAoB,IAAI;AAC9B,IAAM,qBAAqB,KAAK;AAoBhC,IAAM,+BAA+B,KAAK;;;ACjE1C,IAAM,yBAAyB,CAAC,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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",
|
|
15
|
-
"debugId": "
|
|
15
|
+
"debugId": "006C28A4424C7CD564756E2164756E21",
|
|
16
16
|
"names": []
|
|
17
17
|
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
function __accessProp(key) {
|
|
6
|
+
return this[key];
|
|
7
|
+
}
|
|
8
|
+
var __toCommonJS = (from) => {
|
|
9
|
+
var entry = (__moduleCache ??= new WeakMap).get(from), desc;
|
|
10
|
+
if (entry)
|
|
11
|
+
return entry;
|
|
12
|
+
entry = __defProp({}, "__esModule", { value: true });
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (var key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(entry, key))
|
|
16
|
+
__defProp(entry, key, {
|
|
17
|
+
get: __accessProp.bind(from, key),
|
|
18
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
__moduleCache.set(from, entry);
|
|
22
|
+
return entry;
|
|
23
|
+
};
|
|
24
|
+
var __moduleCache;
|
|
25
|
+
var __returnValue = (v) => v;
|
|
26
|
+
function __exportSetter(name, newValue) {
|
|
27
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
28
|
+
}
|
|
29
|
+
var __export = (target, all) => {
|
|
30
|
+
for (var name in all)
|
|
31
|
+
__defProp(target, name, {
|
|
32
|
+
get: all[name],
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
set: __exportSetter.bind(all, name)
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/ask-user-question.ts
|
|
40
|
+
var exports_ask_user_question = {};
|
|
41
|
+
__export(exports_ask_user_question, {
|
|
42
|
+
prepareAskUserQuestionNotif: () => prepareAskUserQuestionNotif,
|
|
43
|
+
parseAskUserQuestionReceipt: () => parseAskUserQuestionReceipt,
|
|
44
|
+
parseAskUserQuestionNotif: () => parseAskUserQuestionNotif,
|
|
45
|
+
isAskUserQuestions: () => isAskUserQuestions
|
|
46
|
+
});
|
|
47
|
+
module.exports = __toCommonJS(exports_ask_user_question);
|
|
48
|
+
function isRecord(value) {
|
|
49
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
50
|
+
}
|
|
51
|
+
function isNonemptyString(value) {
|
|
52
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
53
|
+
}
|
|
54
|
+
function isAskUserQuestions(value) {
|
|
55
|
+
return Array.isArray(value) && value.length > 0 && value.length <= 4 && value.every((question) => isRecord(question) && isNonemptyString(question.question) && isNonemptyString(question.header) && (question.multiSelect === undefined || typeof question.multiSelect === "boolean") && Array.isArray(question.options) && question.options.length >= 2 && question.options.length <= 4 && question.options.every((option) => isRecord(option) && isNonemptyString(option.label) && isNonemptyString(option.description))) && new Set(value.map((question) => question.question)).size === value.length;
|
|
56
|
+
}
|
|
57
|
+
function parseJson(value) {
|
|
58
|
+
try {
|
|
59
|
+
return JSON.parse(value);
|
|
60
|
+
} catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function hasQuestionIdentity(value) {
|
|
65
|
+
return isRecord(value) && value.version === 2 && isNonemptyString(value.toolCallId) && isAskUserQuestions(value.questions);
|
|
66
|
+
}
|
|
67
|
+
function parseAskUserQuestionReceipt(value) {
|
|
68
|
+
const receipt = typeof value === "string" ? parseJson(value) : value;
|
|
69
|
+
if (!hasQuestionIdentity(receipt) || receipt.type !== "ask_user_question")
|
|
70
|
+
return null;
|
|
71
|
+
return {
|
|
72
|
+
type: receipt.type,
|
|
73
|
+
version: 2,
|
|
74
|
+
toolCallId: receipt.toolCallId,
|
|
75
|
+
questions: receipt.questions
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function parseResponse(value) {
|
|
79
|
+
if (!hasQuestionIdentity(value) || value.type !== "ask_user_question_response")
|
|
80
|
+
return null;
|
|
81
|
+
const base = {
|
|
82
|
+
type: value.type,
|
|
83
|
+
version: 2,
|
|
84
|
+
toolCallId: value.toolCallId,
|
|
85
|
+
questions: value.questions
|
|
86
|
+
};
|
|
87
|
+
if (value.status === "dismissed" && value.answers === undefined)
|
|
88
|
+
return { ...base, status: "dismissed" };
|
|
89
|
+
if (value.status !== "answered" || !isRecord(value.answers))
|
|
90
|
+
return null;
|
|
91
|
+
const answers = value.answers;
|
|
92
|
+
if (Object.keys(answers).length !== value.questions.length || !value.questions.every((question) => Object.hasOwn(answers, question.question) && isNonemptyString(answers[question.question])))
|
|
93
|
+
return null;
|
|
94
|
+
return {
|
|
95
|
+
...base,
|
|
96
|
+
status: "answered",
|
|
97
|
+
answers
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function escapeXml(value) {
|
|
101
|
+
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
102
|
+
}
|
|
103
|
+
function prepareAskUserQuestionNotif(response) {
|
|
104
|
+
const parsed = parseResponse(response);
|
|
105
|
+
if (!parsed)
|
|
106
|
+
throw new Error("Invalid AskUserQuestion response");
|
|
107
|
+
return `<task-notification>
|
|
108
|
+
<task-id>${escapeXml(parsed.toolCallId)}</task-id>
|
|
109
|
+
<summary>User ${parsed.status} your questions.</summary>
|
|
110
|
+
<ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>
|
|
111
|
+
</task-notification>`;
|
|
112
|
+
}
|
|
113
|
+
function parseAskUserQuestionNotif(text) {
|
|
114
|
+
const responses = [];
|
|
115
|
+
const notifications = text.matchAll(/<task-notification>(?:(?!<task-notification>)[\s\S])*?<\/task-notification>/g);
|
|
116
|
+
for (const [notification] of notifications) {
|
|
117
|
+
const content = notification.match(/<ask-user-question-response>([\s\S]*?)<\/ask-user-question-response>/)?.[1];
|
|
118
|
+
if (!content)
|
|
119
|
+
continue;
|
|
120
|
+
const decoded = content.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
121
|
+
const response = parseResponse(parseJson(decoded));
|
|
122
|
+
if (response)
|
|
123
|
+
responses.push(response);
|
|
124
|
+
}
|
|
125
|
+
return responses;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
//# debugId=9D909147504B11BC64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ask-user-question.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/** Browser-safe question receipts and user-message notifications. */\nexport interface AskUserQuestion {\n question: string;\n header: string;\n options: Array<{ label: string; description: string }>;\n multiSelect?: boolean;\n}\n\nexport interface AskUserQuestionReceipt {\n type: \"ask_user_question\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n}\n\nexport interface AskUserQuestionResponse {\n type: \"ask_user_question_response\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n status: \"answered\" | \"dismissed\";\n answers?: Record<string, string>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isNonemptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isAskUserQuestions(value: unknown): value is AskUserQuestion[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.length <= 4 &&\n value.every(\n (question) =>\n isRecord(question) &&\n isNonemptyString(question.question) &&\n isNonemptyString(question.header) &&\n (question.multiSelect === undefined ||\n typeof question.multiSelect === \"boolean\") &&\n Array.isArray(question.options) &&\n question.options.length >= 2 &&\n question.options.length <= 4 &&\n question.options.every(\n (option: unknown) =>\n isRecord(option) &&\n isNonemptyString(option.label) &&\n isNonemptyString(option.description),\n ),\n ) &&\n new Set(value.map((question) => question.question)).size === value.length\n );\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction hasQuestionIdentity(value: unknown): value is Record<\n string,\n unknown\n> & {\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n} {\n return (\n isRecord(value) &&\n value.version === 2 &&\n isNonemptyString(value.toolCallId) &&\n isAskUserQuestions(value.questions)\n );\n}\n\nexport function parseAskUserQuestionReceipt(\n value: unknown,\n): AskUserQuestionReceipt | null {\n const receipt = typeof value === \"string\" ? parseJson(value) : value;\n if (!hasQuestionIdentity(receipt) || receipt.type !== \"ask_user_question\")\n return null;\n return {\n type: receipt.type,\n version: 2,\n toolCallId: receipt.toolCallId,\n questions: receipt.questions,\n };\n}\n\nfunction parseResponse(value: unknown): AskUserQuestionResponse | null {\n if (\n !hasQuestionIdentity(value) ||\n value.type !== \"ask_user_question_response\"\n )\n return null;\n const base = {\n type: value.type,\n version: 2,\n toolCallId: value.toolCallId,\n questions: value.questions,\n } as const;\n if (value.status === \"dismissed\" && value.answers === undefined)\n return { ...base, status: \"dismissed\" };\n if (value.status !== \"answered\" || !isRecord(value.answers)) return null;\n const answers = value.answers;\n if (\n Object.keys(answers).length !== value.questions.length ||\n !value.questions.every(\n (question) =>\n Object.hasOwn(answers, question.question) &&\n isNonemptyString(answers[question.question]),\n )\n )\n return null;\n return {\n ...base,\n status: \"answered\",\n answers: answers as Record<string, string>,\n };\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n/** Return content for a user-role message submitted through normal message delivery. */\nexport function prepareAskUserQuestionNotif(\n response: AskUserQuestionResponse,\n): string {\n const parsed = parseResponse(response);\n if (!parsed) throw new Error(\"Invalid AskUserQuestion response\");\n return `<task-notification>\\n<task-id>${escapeXml(parsed.toolCallId)}</task-id>\\n<summary>User ${parsed.status} your questions.</summary>\\n<ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>\\n</task-notification>`;\n}\n\n/** Match only complete notifications; queued messages may coalesce several together. */\nexport function parseAskUserQuestionNotif(\n text: string,\n): AskUserQuestionResponse[] {\n const responses: AskUserQuestionResponse[] = [];\n const notifications = text.matchAll(\n /<task-notification>(?:(?!<task-notification>)[\\s\\S])*?<\\/task-notification>/g,\n );\n for (const [notification] of notifications) {\n const content = notification.match(\n /<ask-user-question-response>([\\s\\S]*?)<\\/ask-user-question-response>/,\n )?.[1];\n if (!content) continue;\n const decoded = content\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n const response = parseResponse(parseJson(decoded));\n if (response) responses.push(response);\n }\n return responses;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "9D909147504B11BC64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/ask-user-question.ts
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
function isNonemptyString(value) {
|
|
6
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
7
|
+
}
|
|
8
|
+
function isAskUserQuestions(value) {
|
|
9
|
+
return Array.isArray(value) && value.length > 0 && value.length <= 4 && value.every((question) => isRecord(question) && isNonemptyString(question.question) && isNonemptyString(question.header) && (question.multiSelect === undefined || typeof question.multiSelect === "boolean") && Array.isArray(question.options) && question.options.length >= 2 && question.options.length <= 4 && question.options.every((option) => isRecord(option) && isNonemptyString(option.label) && isNonemptyString(option.description))) && new Set(value.map((question) => question.question)).size === value.length;
|
|
10
|
+
}
|
|
11
|
+
function parseJson(value) {
|
|
12
|
+
try {
|
|
13
|
+
return JSON.parse(value);
|
|
14
|
+
} catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function hasQuestionIdentity(value) {
|
|
19
|
+
return isRecord(value) && value.version === 2 && isNonemptyString(value.toolCallId) && isAskUserQuestions(value.questions);
|
|
20
|
+
}
|
|
21
|
+
function parseAskUserQuestionReceipt(value) {
|
|
22
|
+
const receipt = typeof value === "string" ? parseJson(value) : value;
|
|
23
|
+
if (!hasQuestionIdentity(receipt) || receipt.type !== "ask_user_question")
|
|
24
|
+
return null;
|
|
25
|
+
return {
|
|
26
|
+
type: receipt.type,
|
|
27
|
+
version: 2,
|
|
28
|
+
toolCallId: receipt.toolCallId,
|
|
29
|
+
questions: receipt.questions
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function parseResponse(value) {
|
|
33
|
+
if (!hasQuestionIdentity(value) || value.type !== "ask_user_question_response")
|
|
34
|
+
return null;
|
|
35
|
+
const base = {
|
|
36
|
+
type: value.type,
|
|
37
|
+
version: 2,
|
|
38
|
+
toolCallId: value.toolCallId,
|
|
39
|
+
questions: value.questions
|
|
40
|
+
};
|
|
41
|
+
if (value.status === "dismissed" && value.answers === undefined)
|
|
42
|
+
return { ...base, status: "dismissed" };
|
|
43
|
+
if (value.status !== "answered" || !isRecord(value.answers))
|
|
44
|
+
return null;
|
|
45
|
+
const answers = value.answers;
|
|
46
|
+
if (Object.keys(answers).length !== value.questions.length || !value.questions.every((question) => Object.hasOwn(answers, question.question) && isNonemptyString(answers[question.question])))
|
|
47
|
+
return null;
|
|
48
|
+
return {
|
|
49
|
+
...base,
|
|
50
|
+
status: "answered",
|
|
51
|
+
answers
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function escapeXml(value) {
|
|
55
|
+
return value.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
56
|
+
}
|
|
57
|
+
function prepareAskUserQuestionNotif(response) {
|
|
58
|
+
const parsed = parseResponse(response);
|
|
59
|
+
if (!parsed)
|
|
60
|
+
throw new Error("Invalid AskUserQuestion response");
|
|
61
|
+
return `<task-notification>
|
|
62
|
+
<task-id>${escapeXml(parsed.toolCallId)}</task-id>
|
|
63
|
+
<summary>User ${parsed.status} your questions.</summary>
|
|
64
|
+
<ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>
|
|
65
|
+
</task-notification>`;
|
|
66
|
+
}
|
|
67
|
+
function parseAskUserQuestionNotif(text) {
|
|
68
|
+
const responses = [];
|
|
69
|
+
const notifications = text.matchAll(/<task-notification>(?:(?!<task-notification>)[\s\S])*?<\/task-notification>/g);
|
|
70
|
+
for (const [notification] of notifications) {
|
|
71
|
+
const content = notification.match(/<ask-user-question-response>([\s\S]*?)<\/ask-user-question-response>/)?.[1];
|
|
72
|
+
if (!content)
|
|
73
|
+
continue;
|
|
74
|
+
const decoded = content.replace(/</g, "<").replace(/>/g, ">").replace(/&/g, "&");
|
|
75
|
+
const response = parseResponse(parseJson(decoded));
|
|
76
|
+
if (response)
|
|
77
|
+
responses.push(response);
|
|
78
|
+
}
|
|
79
|
+
return responses;
|
|
80
|
+
}
|
|
81
|
+
export {
|
|
82
|
+
prepareAskUserQuestionNotif,
|
|
83
|
+
parseAskUserQuestionReceipt,
|
|
84
|
+
parseAskUserQuestionNotif,
|
|
85
|
+
isAskUserQuestions
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
//# debugId=F9A038729960456364756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ask-user-question.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/** Browser-safe question receipts and user-message notifications. */\nexport interface AskUserQuestion {\n question: string;\n header: string;\n options: Array<{ label: string; description: string }>;\n multiSelect?: boolean;\n}\n\nexport interface AskUserQuestionReceipt {\n type: \"ask_user_question\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n}\n\nexport interface AskUserQuestionResponse {\n type: \"ask_user_question_response\";\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n status: \"answered\" | \"dismissed\";\n answers?: Record<string, string>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isNonemptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isAskUserQuestions(value: unknown): value is AskUserQuestion[] {\n return (\n Array.isArray(value) &&\n value.length > 0 &&\n value.length <= 4 &&\n value.every(\n (question) =>\n isRecord(question) &&\n isNonemptyString(question.question) &&\n isNonemptyString(question.header) &&\n (question.multiSelect === undefined ||\n typeof question.multiSelect === \"boolean\") &&\n Array.isArray(question.options) &&\n question.options.length >= 2 &&\n question.options.length <= 4 &&\n question.options.every(\n (option: unknown) =>\n isRecord(option) &&\n isNonemptyString(option.label) &&\n isNonemptyString(option.description),\n ),\n ) &&\n new Set(value.map((question) => question.question)).size === value.length\n );\n}\n\nfunction parseJson(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n\nfunction hasQuestionIdentity(value: unknown): value is Record<\n string,\n unknown\n> & {\n version: 2;\n toolCallId: string;\n questions: AskUserQuestion[];\n} {\n return (\n isRecord(value) &&\n value.version === 2 &&\n isNonemptyString(value.toolCallId) &&\n isAskUserQuestions(value.questions)\n );\n}\n\nexport function parseAskUserQuestionReceipt(\n value: unknown,\n): AskUserQuestionReceipt | null {\n const receipt = typeof value === \"string\" ? parseJson(value) : value;\n if (!hasQuestionIdentity(receipt) || receipt.type !== \"ask_user_question\")\n return null;\n return {\n type: receipt.type,\n version: 2,\n toolCallId: receipt.toolCallId,\n questions: receipt.questions,\n };\n}\n\nfunction parseResponse(value: unknown): AskUserQuestionResponse | null {\n if (\n !hasQuestionIdentity(value) ||\n value.type !== \"ask_user_question_response\"\n )\n return null;\n const base = {\n type: value.type,\n version: 2,\n toolCallId: value.toolCallId,\n questions: value.questions,\n } as const;\n if (value.status === \"dismissed\" && value.answers === undefined)\n return { ...base, status: \"dismissed\" };\n if (value.status !== \"answered\" || !isRecord(value.answers)) return null;\n const answers = value.answers;\n if (\n Object.keys(answers).length !== value.questions.length ||\n !value.questions.every(\n (question) =>\n Object.hasOwn(answers, question.question) &&\n isNonemptyString(answers[question.question]),\n )\n )\n return null;\n return {\n ...base,\n status: \"answered\",\n answers: answers as Record<string, string>,\n };\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n/** Return content for a user-role message submitted through normal message delivery. */\nexport function prepareAskUserQuestionNotif(\n response: AskUserQuestionResponse,\n): string {\n const parsed = parseResponse(response);\n if (!parsed) throw new Error(\"Invalid AskUserQuestion response\");\n return `<task-notification>\\n<task-id>${escapeXml(parsed.toolCallId)}</task-id>\\n<summary>User ${parsed.status} your questions.</summary>\\n<ask-user-question-response>${escapeXml(JSON.stringify(parsed))}</ask-user-question-response>\\n</task-notification>`;\n}\n\n/** Match only complete notifications; queued messages may coalesce several together. */\nexport function parseAskUserQuestionNotif(\n text: string,\n): AskUserQuestionResponse[] {\n const responses: AskUserQuestionResponse[] = [];\n const notifications = text.matchAll(\n /<task-notification>(?:(?!<task-notification>)[\\s\\S])*?<\\/task-notification>/g,\n );\n for (const [notification] of notifications) {\n const content = notification.match(\n /<ask-user-question-response>([\\s\\S]*?)<\\/ask-user-question-response>/,\n )?.[1];\n if (!content) continue;\n const decoded = content\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n const response = parseResponse(parseJson(decoded));\n if (response) responses.push(response);\n }\n return responses;\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "F9A038729960456364756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
package/dist/gateway-core.js
CHANGED
|
@@ -485,22 +485,6 @@ class ChannelControlRequestCoordinator {
|
|
|
485
485
|
return true;
|
|
486
486
|
}
|
|
487
487
|
}
|
|
488
|
-
// src/tools/interactive-policy.ts
|
|
489
|
-
var INTERACTIVE_APPROVAL_TOOLS = new Set(["AskUserQuestion"]);
|
|
490
|
-
var INTERACTIVE_USER_INPUT_TOOL_NAMES = [
|
|
491
|
-
"AskUserQuestion"
|
|
492
|
-
];
|
|
493
|
-
var RUNTIME_USER_INPUT_TOOLS = new Set(INTERACTIVE_USER_INPUT_TOOL_NAMES);
|
|
494
|
-
var HEADLESS_AUTO_ALLOW_TOOLS = new Set;
|
|
495
|
-
function getInteractiveApprovalKind(toolName) {
|
|
496
|
-
switch (toolName) {
|
|
497
|
-
case "AskUserQuestion":
|
|
498
|
-
return "ask_user_question";
|
|
499
|
-
default:
|
|
500
|
-
return null;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
|
|
504
488
|
// src/channels/gateway-sources.ts
|
|
505
489
|
function sourceRouteKey(source) {
|
|
506
490
|
return [
|
|
@@ -1449,7 +1433,8 @@ class ChannelGateway {
|
|
|
1449
1433
|
client_message_id: delivery.clientMessageId
|
|
1450
1434
|
}
|
|
1451
1435
|
],
|
|
1452
|
-
image_failure_mode: "drop"
|
|
1436
|
+
image_failure_mode: "drop",
|
|
1437
|
+
client_preferences: {}
|
|
1453
1438
|
}
|
|
1454
1439
|
});
|
|
1455
1440
|
if (!response.accepted) {
|
|
@@ -1994,7 +1979,7 @@ class ChannelGateway {
|
|
|
1994
1979
|
return;
|
|
1995
1980
|
this.enqueueHook(state, () => this.hooks.onControlRequest({
|
|
1996
1981
|
requestId: message.request_id,
|
|
1997
|
-
kind:
|
|
1982
|
+
kind: "generic_tool_approval",
|
|
1998
1983
|
source,
|
|
1999
1984
|
toolName: message.request.tool_name,
|
|
2000
1985
|
input: message.request.input
|
|
@@ -2257,7 +2242,8 @@ function replaceSlackMarkdownLinks(text, placeholders) {
|
|
|
2257
2242
|
index++;
|
|
2258
2243
|
continue;
|
|
2259
2244
|
}
|
|
2260
|
-
|
|
2245
|
+
const label = restoreSlackPlaceholders(formatSlackLinkLabel(link.label), placeholders);
|
|
2246
|
+
result += createSlackPlaceholder(placeholders, `<${escapeSlackMrkdwnSegment(link.url)}|${label}>`);
|
|
2261
2247
|
index = link.endIndex;
|
|
2262
2248
|
}
|
|
2263
2249
|
return result;
|
|
@@ -3075,4 +3061,4 @@ export {
|
|
|
3075
3061
|
ChannelControlRequestCoordinator
|
|
3076
3062
|
};
|
|
3077
3063
|
|
|
3078
|
-
//# debugId=
|
|
3064
|
+
//# debugId=B90B3E001C72BB3264756E2164756E21
|