@copilotkit/runtime 1.72.0 → 1.73.0
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/index.cjs +82 -8
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +55 -8
- package/dist/agent/index.d.cts.map +1 -1
- package/dist/agent/index.d.mts +53 -6
- package/dist/agent/index.d.mts.map +1 -1
- package/dist/agent/index.mjs +83 -10
- package/dist/agent/index.mjs.map +1 -1
- package/dist/agent/learned-skills.cjs +77 -0
- package/dist/agent/learned-skills.cjs.map +1 -0
- package/dist/agent/learned-skills.d.cts +16 -0
- package/dist/agent/learned-skills.d.cts.map +1 -0
- package/dist/agent/learned-skills.d.mts +16 -0
- package/dist/agent/learned-skills.d.mts.map +1 -0
- package/dist/agent/learned-skills.mjs +75 -0
- package/dist/agent/learned-skills.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +27 -20
- package/dist/index.d.mts +27 -20
- package/dist/index.mjs +1 -1
- package/dist/internal/learned-skills.cjs +22 -0
- package/dist/internal/learned-skills.d.cts +10 -0
- package/dist/internal/learned-skills.d.mts +10 -0
- package/dist/internal/learned-skills.mjs +10 -0
- package/dist/langgraph.d.cts +3 -1
- package/dist/langgraph.d.mts +3 -1
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.cjs.map +1 -1
- package/dist/lib/index.d.cts +2 -2
- package/dist/lib/index.d.cts.map +1 -1
- package/dist/lib/index.d.mts +2 -2
- package/dist/lib/index.d.mts.map +1 -1
- package/dist/lib/index.mjs +1 -1
- package/dist/lib/index.mjs.map +1 -1
- package/dist/lib/integrations/nextjs/app-router.cjs.map +1 -1
- package/dist/lib/integrations/nextjs/app-router.mjs.map +1 -1
- package/dist/lib/integrations/node-express/index.cjs.map +1 -1
- package/dist/lib/integrations/node-express/index.mjs.map +1 -1
- package/dist/lib/integrations/node-http/index.cjs.map +1 -1
- package/dist/lib/integrations/node-http/index.d.cts.map +1 -1
- package/dist/lib/integrations/node-http/index.d.mts.map +1 -1
- package/dist/lib/integrations/node-http/index.mjs.map +1 -1
- package/dist/lib/integrations/shared.cjs.map +1 -1
- package/dist/lib/integrations/shared.d.cts +1 -1
- package/dist/lib/integrations/shared.d.cts.map +1 -1
- package/dist/lib/integrations/shared.d.mts +1 -1
- package/dist/lib/integrations/shared.d.mts.map +1 -1
- package/dist/lib/integrations/shared.mjs.map +1 -1
- package/dist/lib/runtime/agent-integrations/langgraph/agent.d.cts +1 -1
- package/dist/lib/runtime/copilot-runtime.cjs +2 -16
- package/dist/lib/runtime/copilot-runtime.cjs.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.cts +2 -2
- package/dist/lib/runtime/copilot-runtime.d.cts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.d.mts +2 -2
- package/dist/lib/runtime/copilot-runtime.d.mts.map +1 -1
- package/dist/lib/runtime/copilot-runtime.mjs +3 -17
- package/dist/lib/runtime/copilot-runtime.mjs.map +1 -1
- package/dist/package.cjs +9 -3
- package/dist/package.mjs +9 -3
- package/dist/service-adapters/anthropic/anthropic-adapter.cjs.map +1 -1
- package/dist/service-adapters/anthropic/anthropic-adapter.d.cts.map +1 -1
- package/dist/service-adapters/anthropic/anthropic-adapter.d.mts.map +1 -1
- package/dist/service-adapters/anthropic/anthropic-adapter.mjs.map +1 -1
- package/dist/service-adapters/shared/sdk-client-utils.cjs.map +1 -1
- package/dist/service-adapters/shared/sdk-client-utils.d.cts.map +1 -1
- package/dist/service-adapters/shared/sdk-client-utils.d.mts.map +1 -1
- package/dist/service-adapters/shared/sdk-client-utils.mjs.map +1 -1
- package/dist/v2/index.cjs +7 -0
- package/dist/v2/index.d.cts +6 -5
- package/dist/v2/index.d.mts +6 -5
- package/dist/v2/index.mjs +3 -3
- package/dist/v2/runtime/core/channel-manager.d.cts +1 -1
- package/dist/v2/runtime/core/channel-manager.d.mts +2 -1
- package/dist/v2/runtime/core/channel-manager.d.mts.map +1 -1
- package/dist/v2/runtime/core/debug-event-bus.cjs +22 -0
- package/dist/v2/runtime/core/debug-event-bus.cjs.map +1 -1
- package/dist/v2/runtime/core/debug-event-bus.d.cts +1 -1
- package/dist/v2/runtime/core/debug-event-bus.d.mts +1 -1
- package/dist/v2/runtime/core/debug-event-bus.mjs +22 -1
- package/dist/v2/runtime/core/debug-event-bus.mjs.map +1 -1
- package/dist/v2/runtime/core/runtime.cjs +10 -5
- package/dist/v2/runtime/core/runtime.cjs.map +1 -1
- package/dist/v2/runtime/core/runtime.d.cts +29 -3
- package/dist/v2/runtime/core/runtime.d.cts.map +1 -1
- package/dist/v2/runtime/core/runtime.d.mts +28 -2
- package/dist/v2/runtime/core/runtime.d.mts.map +1 -1
- package/dist/v2/runtime/core/runtime.mjs +11 -6
- package/dist/v2/runtime/core/runtime.mjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-connect.cjs +3 -2
- package/dist/v2/runtime/handlers/handle-connect.cjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-connect.mjs +3 -2
- package/dist/v2/runtime/handlers/handle-connect.mjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-debug-events.cjs +2 -1
- package/dist/v2/runtime/handlers/handle-debug-events.cjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-debug-events.mjs +3 -1
- package/dist/v2/runtime/handlers/handle-debug-events.mjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-run.cjs +5 -3
- package/dist/v2/runtime/handlers/handle-run.cjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-run.mjs +5 -3
- package/dist/v2/runtime/handlers/handle-run.mjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-suggest.cjs +4 -3
- package/dist/v2/runtime/handlers/handle-suggest.cjs.map +1 -1
- package/dist/v2/runtime/handlers/handle-suggest.mjs +5 -4
- package/dist/v2/runtime/handlers/handle-suggest.mjs.map +1 -1
- package/dist/v2/runtime/handlers/shared/cloud-telemetry.cjs +31 -0
- package/dist/v2/runtime/handlers/shared/cloud-telemetry.cjs.map +1 -0
- package/dist/v2/runtime/handlers/shared/cloud-telemetry.mjs +30 -0
- package/dist/v2/runtime/handlers/shared/cloud-telemetry.mjs.map +1 -0
- package/dist/v2/runtime/handlers/shared/sse-keep-alive.cjs +69 -0
- package/dist/v2/runtime/handlers/shared/sse-keep-alive.cjs.map +1 -0
- package/dist/v2/runtime/handlers/shared/sse-keep-alive.mjs +67 -0
- package/dist/v2/runtime/handlers/shared/sse-keep-alive.mjs.map +1 -0
- package/dist/v2/runtime/handlers/shared/sse-response.cjs +35 -4
- package/dist/v2/runtime/handlers/shared/sse-response.cjs.map +1 -1
- package/dist/v2/runtime/handlers/shared/sse-response.mjs +35 -4
- package/dist/v2/runtime/handlers/shared/sse-response.mjs.map +1 -1
- package/dist/v2/runtime/handlers/sse/connect.cjs +1 -0
- package/dist/v2/runtime/handlers/sse/connect.cjs.map +1 -1
- package/dist/v2/runtime/handlers/sse/connect.mjs +1 -0
- package/dist/v2/runtime/handlers/sse/connect.mjs.map +1 -1
- package/dist/v2/runtime/handlers/sse/run.cjs +2 -0
- package/dist/v2/runtime/handlers/sse/run.cjs.map +1 -1
- package/dist/v2/runtime/handlers/sse/run.mjs +2 -0
- package/dist/v2/runtime/handlers/sse/run.mjs.map +1 -1
- package/dist/v2/runtime/index.d.cts +3 -3
- package/dist/v2/runtime/index.d.mts +3 -3
- package/dist/v2/runtime/intelligence-platform/client.d.cts +1 -1
- package/dist/v2/runtime/intelligence-platform/client.d.mts +1 -1
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.cjs +132 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.cjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.d.cts +11 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.d.cts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.d.mts +11 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.d.mts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.mjs +128 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/archive.mjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.cjs +48 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.cjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.d.cts +27 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.d.cts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.d.mts +27 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.d.mts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.mjs +48 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/config.mjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.cjs +11 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.cjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.d.cts +8 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.d.cts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.d.mts +8 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.d.mts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.mjs +11 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/errors.mjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/index.d.cts +8 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/index.d.mts +8 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.cjs +132 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.cjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.d.cts +31 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.d.cts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.d.mts +31 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.d.mts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.mjs +132 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/registry.mjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.cjs +42 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.cjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.d.cts +13 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.d.cts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.d.mts +13 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.d.mts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.mjs +39 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/skill-content.mjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.cjs +93 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.cjs.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.d.cts +28 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.d.cts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.d.mts +28 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.d.mts.map +1 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.mjs +92 -0
- package/dist/v2/runtime/intelligence-platform/skill-registry/snapshot.mjs.map +1 -0
- package/dist/v2/runtime/runner/agent-runner.d.cts +1 -1
- package/dist/v2/runtime/runner/in-memory.d.cts +1 -1
- package/dist/v2/runtime/runner/index.d.cts +2 -2
- package/dist/v2/runtime/runner/index.d.mts +2 -2
- package/dist/v2/runtime/runner/index.mjs +2 -2
- package/dist/v2/runtime/runner/intelligence.d.cts +1 -1
- package/dist/v2/runtime/telemetry/events.d.cts +12 -0
- package/dist/v2/runtime/telemetry/events.d.cts.map +1 -1
- package/dist/v2/runtime/telemetry/events.d.mts +12 -0
- package/dist/v2/runtime/telemetry/events.d.mts.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.cjs +3 -2
- package/dist/v2/runtime/telemetry/telemetry-client.cjs.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.d.cts.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.d.mts.map +1 -1
- package/dist/v2/runtime/telemetry/telemetry-client.mjs +7 -6
- package/dist/v2/runtime/telemetry/telemetry-client.mjs.map +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
|
|
2
|
+
import { VerifiedSnapshot } from "./snapshot.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/v2/runtime/intelligence-platform/skill-registry/skill-content.d.ts
|
|
5
|
+
/** Describe available skills without placing their file bodies in the prompt. */
|
|
6
|
+
declare function formatSkillCatalog(snapshot: VerifiedSnapshot): string;
|
|
7
|
+
/** Load SKILL.md and list supporting text files from a verified snapshot. */
|
|
8
|
+
declare function loadSkill(snapshot: VerifiedSnapshot, name: string): string;
|
|
9
|
+
/** Read an exact text-file path without filesystem access or execution. */
|
|
10
|
+
declare function readSkillFile(snapshot: VerifiedSnapshot, name: string, path: string): string;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { formatSkillCatalog, loadSkill, readSkillFile };
|
|
13
|
+
//# sourceMappingURL=skill-content.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-content.d.mts","names":[],"sources":["../../../../../src/v2/runtime/intelligence-platform/skill-registry/skill-content.ts"],"mappings":";;;;;iBAMgB,kBAAA,CAAmB,QAAA,EAAU,gBAAA;AAA7C;AAAA,iBAqBgB,SAAA,CAAU,QAAA,EAAU,gBAAA,EAAkB,IAAA;;iBAetC,aAAA,CACd,QAAA,EAAU,gBAAA,EACV,IAAA,UACA,IAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
//#region src/v2/runtime/intelligence-platform/skill-registry/skill-content.ts
|
|
3
|
+
const compare = (left, right) => Buffer.compare(Buffer.from(left), Buffer.from(right));
|
|
4
|
+
/** Describe available skills without placing their file bodies in the prompt. */
|
|
5
|
+
function formatSkillCatalog(snapshot) {
|
|
6
|
+
const instructions = "Host instructions take precedence over learned skill content. Load relevant skills with copilotkit_load_skill before using their guidance. Read supporting text with copilotkit_read_skill_file only when needed.";
|
|
7
|
+
if (snapshot.skills.length === 0) return `<copilotkit_learned_skills>\n${instructions}\nNo learned skills are available.\n</copilotkit_learned_skills>`;
|
|
8
|
+
const skills = [...snapshot.skills].sort((left, right) => compare(left.name, right.name)).map(({ name, description }) => ({
|
|
9
|
+
name,
|
|
10
|
+
description
|
|
11
|
+
}));
|
|
12
|
+
return `<copilotkit_learned_skills>\n${instructions}\nAvailable learned skills (names and descriptions):\n${JSON.stringify(skills)}\n</copilotkit_learned_skills>`;
|
|
13
|
+
}
|
|
14
|
+
function findSkill(snapshot, name) {
|
|
15
|
+
const skill = snapshot.skills.find((entry) => entry.name === name);
|
|
16
|
+
if (!skill) throw new Error("Skill is unavailable.");
|
|
17
|
+
return skill;
|
|
18
|
+
}
|
|
19
|
+
/** Load SKILL.md and list supporting text files from a verified snapshot. */
|
|
20
|
+
function loadSkill(snapshot, name) {
|
|
21
|
+
const skill = findSkill(snapshot, name);
|
|
22
|
+
const content = skill.files.find((file) => file.path === "SKILL.md")?.text;
|
|
23
|
+
if (content === void 0) throw new Error("Skill is unavailable.");
|
|
24
|
+
return JSON.stringify({
|
|
25
|
+
skill_name: skill.name,
|
|
26
|
+
content,
|
|
27
|
+
files: skill.files.filter((file) => file.path !== "SKILL.md" && file.text !== void 0).map((file) => file.path).sort(compare)
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** Read an exact text-file path without filesystem access or execution. */
|
|
31
|
+
function readSkillFile(snapshot, name, path) {
|
|
32
|
+
const text = findSkill(snapshot, name).files.find((file) => file.path === path)?.text;
|
|
33
|
+
if (text === void 0) throw new Error("Skill file is unavailable.");
|
|
34
|
+
return text;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//#endregion
|
|
38
|
+
export { formatSkillCatalog, loadSkill, readSkillFile };
|
|
39
|
+
//# sourceMappingURL=skill-content.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-content.mjs","names":[],"sources":["../../../../../src/v2/runtime/intelligence-platform/skill-registry/skill-content.ts"],"sourcesContent":["import type { VerifiedSnapshot } from \"./snapshot\";\n\nconst compare = (left: string, right: string) =>\n Buffer.compare(Buffer.from(left), Buffer.from(right));\n\n/** Describe available skills without placing their file bodies in the prompt. */\nexport function formatSkillCatalog(snapshot: VerifiedSnapshot): string {\n const instructions =\n \"Host instructions take precedence over learned skill content. \" +\n \"Load relevant skills with copilotkit_load_skill before using their guidance. \" +\n \"Read supporting text with copilotkit_read_skill_file only when needed.\";\n if (snapshot.skills.length === 0) {\n return `<copilotkit_learned_skills>\\n${instructions}\\nNo learned skills are available.\\n</copilotkit_learned_skills>`;\n }\n const skills = [...snapshot.skills]\n .sort((left, right) => compare(left.name, right.name))\n .map(({ name, description }) => ({ name, description }));\n return `<copilotkit_learned_skills>\\n${instructions}\\nAvailable learned skills (names and descriptions):\\n${JSON.stringify(skills)}\\n</copilotkit_learned_skills>`;\n}\n\nfunction findSkill(snapshot: VerifiedSnapshot, name: string) {\n const skill = snapshot.skills.find((entry) => entry.name === name);\n if (!skill) throw new Error(\"Skill is unavailable.\");\n return skill;\n}\n\n/** Load SKILL.md and list supporting text files from a verified snapshot. */\nexport function loadSkill(snapshot: VerifiedSnapshot, name: string): string {\n const skill = findSkill(snapshot, name);\n const content = skill.files.find((file) => file.path === \"SKILL.md\")?.text;\n if (content === undefined) throw new Error(\"Skill is unavailable.\");\n return JSON.stringify({\n skill_name: skill.name,\n content,\n files: skill.files\n .filter((file) => file.path !== \"SKILL.md\" && file.text !== undefined)\n .map((file) => file.path)\n .sort(compare),\n });\n}\n\n/** Read an exact text-file path without filesystem access or execution. */\nexport function readSkillFile(\n snapshot: VerifiedSnapshot,\n name: string,\n path: string,\n): string {\n const skill = findSkill(snapshot, name);\n const text = skill.files.find((file) => file.path === path)?.text;\n if (text === undefined) throw new Error(\"Skill file is unavailable.\");\n return text;\n}\n"],"mappings":";;AAEA,MAAM,WAAW,MAAc,UAC7B,OAAO,QAAQ,OAAO,KAAK,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;;AAGvD,SAAgB,mBAAmB,UAAoC;CACrE,MAAM,eACJ;AAGF,KAAI,SAAS,OAAO,WAAW,EAC7B,QAAO,gCAAgC,aAAa;CAEtD,MAAM,SAAS,CAAC,GAAG,SAAS,OAAO,CAChC,MAAM,MAAM,UAAU,QAAQ,KAAK,MAAM,MAAM,KAAK,CAAC,CACrD,KAAK,EAAE,MAAM,mBAAmB;EAAE;EAAM;EAAa,EAAE;AAC1D,QAAO,gCAAgC,aAAa,wDAAwD,KAAK,UAAU,OAAO,CAAC;;AAGrI,SAAS,UAAU,UAA4B,MAAc;CAC3D,MAAM,QAAQ,SAAS,OAAO,MAAM,UAAU,MAAM,SAAS,KAAK;AAClE,KAAI,CAAC,MAAO,OAAM,IAAI,MAAM,wBAAwB;AACpD,QAAO;;;AAIT,SAAgB,UAAU,UAA4B,MAAsB;CAC1E,MAAM,QAAQ,UAAU,UAAU,KAAK;CACvC,MAAM,UAAU,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,WAAW,EAAE;AACtE,KAAI,YAAY,OAAW,OAAM,IAAI,MAAM,wBAAwB;AACnE,QAAO,KAAK,UAAU;EACpB,YAAY,MAAM;EAClB;EACA,OAAO,MAAM,MACV,QAAQ,SAAS,KAAK,SAAS,cAAc,KAAK,SAAS,OAAU,CACrE,KAAK,SAAS,KAAK,KAAK,CACxB,KAAK,QAAQ;EACjB,CAAC;;;AAIJ,SAAgB,cACd,UACA,MACA,MACQ;CAER,MAAM,OADQ,UAAU,UAAU,KAAK,CACpB,MAAM,MAAM,SAAS,KAAK,SAAS,KAAK,EAAE;AAC7D,KAAI,SAAS,OAAW,OAAM,IAAI,MAAM,6BAA6B;AACrE,QAAO"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require("reflect-metadata");
|
|
2
|
+
const require_runtime = require('../../../../_virtual/_rolldown/runtime.cjs');
|
|
3
|
+
const require_learned_skills = require('../learned-skills.cjs');
|
|
4
|
+
const require_errors = require('./errors.cjs');
|
|
5
|
+
const require_archive = require('./archive.cjs');
|
|
6
|
+
let node_crypto = require("node:crypto");
|
|
7
|
+
|
|
8
|
+
//#region src/v2/runtime/intelligence-platform/skill-registry/snapshot.ts
|
|
9
|
+
function object(value) {
|
|
10
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function sha256(bytes) {
|
|
13
|
+
return (0, node_crypto.createHash)("sha256").update(bytes).digest("hex");
|
|
14
|
+
}
|
|
15
|
+
function utf8(bytes) {
|
|
16
|
+
try {
|
|
17
|
+
return new TextDecoder("utf-8", {
|
|
18
|
+
fatal: true,
|
|
19
|
+
ignoreBOM: true
|
|
20
|
+
}).decode(bytes);
|
|
21
|
+
} catch {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Validate a replacement fully before it can become an invocation snapshot. */
|
|
26
|
+
async function validateSnapshot(response, signal) {
|
|
27
|
+
try {
|
|
28
|
+
if (!object(response) || !(response.bytes instanceof Uint8Array) || typeof response.revision !== "string" || typeof response.etag !== "string" || typeof response.contentType !== "string") throw require_errors.invalidSnapshot();
|
|
29
|
+
const { revision, etag, contentType } = response;
|
|
30
|
+
if (response.status !== "snapshot" || response.bytes.byteLength > require_archive.MAX_SNAPSHOT_BYTES || contentType.split(";", 1)[0]?.trim().toLowerCase() !== "application/zip" || !revision || !/^"[a-f0-9]{64}"$/.test(etag)) throw require_errors.invalidSnapshot();
|
|
31
|
+
const bytes = Buffer.from(response.bytes);
|
|
32
|
+
if (`"${sha256(bytes)}"` !== etag) throw require_errors.invalidSnapshot();
|
|
33
|
+
const archive = await require_archive.readArchive(bytes, signal);
|
|
34
|
+
const manifestBytes = archive.get("manifest.json");
|
|
35
|
+
if (!manifestBytes) throw require_errors.invalidSnapshot();
|
|
36
|
+
const decoded = utf8(manifestBytes);
|
|
37
|
+
if (decoded === void 0) throw require_errors.invalidSnapshot();
|
|
38
|
+
const manifest = JSON.parse(decoded);
|
|
39
|
+
if (!object(manifest)) throw require_errors.invalidSnapshot();
|
|
40
|
+
if (typeof manifest.schemaVersion === "number" && manifest.schemaVersion !== 1) throw new require_learned_skills.LearnedSkillsError("UNSUPPORTED_SERVER", false);
|
|
41
|
+
if (manifest.schemaVersion !== 1 || manifest.revision !== revision || !Array.isArray(manifest.skills)) throw require_errors.invalidSnapshot();
|
|
42
|
+
const expected = new Set(["manifest.json"]);
|
|
43
|
+
let previousName;
|
|
44
|
+
const skills = [];
|
|
45
|
+
for (const skill of manifest.skills) {
|
|
46
|
+
if (!object(skill) || typeof skill.name !== "string" || !require_archive.safeRelativePath(skill.name) || skill.name.includes("/") || previousName !== void 0 && Buffer.compare(Buffer.from(previousName), Buffer.from(skill.name)) >= 0 || typeof skill.description !== "string" || !Array.isArray(skill.files)) throw require_errors.invalidSnapshot();
|
|
47
|
+
previousName = skill.name;
|
|
48
|
+
let previousPath;
|
|
49
|
+
let hasSkill = false;
|
|
50
|
+
const files = [];
|
|
51
|
+
for (const file of skill.files) {
|
|
52
|
+
if (!object(file) || typeof file.path !== "string" || !require_archive.safeRelativePath(file.path) || previousPath !== void 0 && Buffer.compare(Buffer.from(previousPath), Buffer.from(file.path)) >= 0 || typeof file.size !== "number" || !Number.isSafeInteger(file.size) || file.size < 0 || typeof file.sha256 !== "string" || !/^[a-f0-9]{64}$/.test(file.sha256)) throw require_errors.invalidSnapshot();
|
|
53
|
+
previousPath = file.path;
|
|
54
|
+
const path = `${skill.name}/${file.path}`;
|
|
55
|
+
if (expected.has(path)) throw require_errors.invalidSnapshot();
|
|
56
|
+
expected.add(path);
|
|
57
|
+
const content = archive.get(path);
|
|
58
|
+
if (!content || content.length !== file.size || sha256(content) !== file.sha256) throw require_errors.invalidSnapshot();
|
|
59
|
+
const text = utf8(content);
|
|
60
|
+
if (file.path === "SKILL.md") {
|
|
61
|
+
if (text === void 0) throw require_errors.invalidSnapshot();
|
|
62
|
+
hasSkill = true;
|
|
63
|
+
}
|
|
64
|
+
files.push(Object.freeze({
|
|
65
|
+
path: file.path,
|
|
66
|
+
size: file.size,
|
|
67
|
+
sha256: file.sha256,
|
|
68
|
+
...text !== void 0 ? { text } : {}
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
if (!hasSkill) throw require_errors.invalidSnapshot();
|
|
72
|
+
skills.push(Object.freeze({
|
|
73
|
+
name: skill.name,
|
|
74
|
+
description: skill.description,
|
|
75
|
+
files: Object.freeze(files)
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
if (expected.size !== archive.size || [...archive.keys()].some((path) => !expected.has(path))) throw require_errors.invalidSnapshot();
|
|
79
|
+
return Object.freeze({
|
|
80
|
+
revision,
|
|
81
|
+
etag,
|
|
82
|
+
skills: Object.freeze(skills)
|
|
83
|
+
});
|
|
84
|
+
} catch (error) {
|
|
85
|
+
if (signal?.aborted) throw signal.reason;
|
|
86
|
+
if (error instanceof require_learned_skills.LearnedSkillsError) throw error;
|
|
87
|
+
throw require_errors.invalidSnapshot(error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
exports.validateSnapshot = validateSnapshot;
|
|
93
|
+
//# sourceMappingURL=snapshot.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.cjs","names":["invalidSnapshot","MAX_SNAPSHOT_BYTES","readArchive","SkillDeliveryError","safeRelativePath"],"sources":["../../../../../src/v2/runtime/intelligence-platform/skill-registry/snapshot.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { LearnedSkillsSnapshotResult } from \"../learned-skills\";\nimport { SkillDeliveryError, invalidSnapshot } from \"./errors\";\nimport { MAX_SNAPSHOT_BYTES, readArchive, safeRelativePath } from \"./archive\";\n\nexport interface SnapshotFile {\n readonly path: string;\n readonly size: number;\n readonly sha256: string;\n /** Absent for supporting resources that cannot be decoded as UTF-8 text. */\n readonly text?: string;\n}\nexport interface SnapshotSkill {\n readonly name: string;\n readonly description: string;\n readonly files: readonly SnapshotFile[];\n}\nexport interface VerifiedSnapshot {\n readonly revision: string;\n readonly etag: string;\n readonly skills: readonly SnapshotSkill[];\n}\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction sha256(bytes: Uint8Array): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\nfunction utf8(bytes: Uint8Array): string | undefined {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(\n bytes,\n );\n } catch {\n return undefined;\n }\n}\n\n/** Validate a replacement fully before it can become an invocation snapshot. */\nexport async function validateSnapshot(\n response: Extract<LearnedSkillsSnapshotResult, { status: \"snapshot\" }>,\n signal?: AbortSignal,\n): Promise<VerifiedSnapshot> {\n try {\n if (\n !object(response) ||\n !(response.bytes instanceof Uint8Array) ||\n typeof response.revision !== \"string\" ||\n typeof response.etag !== \"string\" ||\n typeof response.contentType !== \"string\"\n )\n throw invalidSnapshot();\n const { revision, etag, contentType } = response;\n if (\n response.status !== \"snapshot\" ||\n response.bytes.byteLength > MAX_SNAPSHOT_BYTES ||\n contentType.split(\";\", 1)[0]?.trim().toLowerCase() !==\n \"application/zip\" ||\n !revision ||\n !/^\"[a-f0-9]{64}\"$/.test(etag)\n )\n throw invalidSnapshot();\n // Own the bytes before asynchronous decompression so an injected client\n // cannot mutate an in-flight replacement after its digest is checked.\n const bytes = Buffer.from(response.bytes);\n if (`\"${sha256(bytes)}\"` !== etag) throw invalidSnapshot();\n const archive = await readArchive(bytes, signal);\n const manifestBytes = archive.get(\"manifest.json\");\n if (!manifestBytes) throw invalidSnapshot();\n const decoded = utf8(manifestBytes);\n if (decoded === undefined) throw invalidSnapshot();\n const manifest: unknown = JSON.parse(decoded);\n if (!object(manifest)) throw invalidSnapshot();\n if (\n typeof manifest.schemaVersion === \"number\" &&\n manifest.schemaVersion !== 1\n )\n throw new SkillDeliveryError(\"UNSUPPORTED_SERVER\", false);\n if (\n manifest.schemaVersion !== 1 ||\n manifest.revision !== revision ||\n !Array.isArray(manifest.skills)\n )\n throw invalidSnapshot();\n const expected = new Set([\"manifest.json\"]);\n let previousName: string | undefined;\n const skills: SnapshotSkill[] = [];\n for (const skill of manifest.skills) {\n if (\n !object(skill) ||\n typeof skill.name !== \"string\" ||\n !safeRelativePath(skill.name) ||\n skill.name.includes(\"/\") ||\n (previousName !== undefined &&\n Buffer.compare(Buffer.from(previousName), Buffer.from(skill.name)) >=\n 0) ||\n typeof skill.description !== \"string\" ||\n !Array.isArray(skill.files)\n )\n throw invalidSnapshot();\n previousName = skill.name;\n let previousPath: string | undefined;\n let hasSkill = false;\n const files: SnapshotFile[] = [];\n for (const file of skill.files) {\n if (\n !object(file) ||\n typeof file.path !== \"string\" ||\n !safeRelativePath(file.path) ||\n (previousPath !== undefined &&\n Buffer.compare(Buffer.from(previousPath), Buffer.from(file.path)) >=\n 0) ||\n typeof file.size !== \"number\" ||\n !Number.isSafeInteger(file.size) ||\n file.size < 0 ||\n typeof file.sha256 !== \"string\" ||\n !/^[a-f0-9]{64}$/.test(file.sha256)\n )\n throw invalidSnapshot();\n previousPath = file.path;\n const path = `${skill.name}/${file.path}`;\n if (expected.has(path)) throw invalidSnapshot();\n expected.add(path);\n const content = archive.get(path);\n if (\n !content ||\n content.length !== file.size ||\n sha256(content) !== file.sha256\n )\n throw invalidSnapshot();\n const text = utf8(content);\n if (file.path === \"SKILL.md\") {\n if (text === undefined) throw invalidSnapshot();\n hasSkill = true;\n }\n files.push(\n Object.freeze({\n path: file.path,\n size: file.size,\n sha256: file.sha256,\n ...(text !== undefined ? { text } : {}),\n }),\n );\n }\n if (!hasSkill) throw invalidSnapshot();\n skills.push(\n Object.freeze({\n name: skill.name,\n description: skill.description,\n files: Object.freeze(files),\n }),\n );\n }\n if (\n expected.size !== archive.size ||\n [...archive.keys()].some((path) => !expected.has(path))\n )\n throw invalidSnapshot();\n return Object.freeze({\n revision: revision,\n etag: etag,\n skills: Object.freeze(skills),\n });\n } catch (error) {\n if (signal?.aborted) throw signal.reason;\n if (error instanceof SkillDeliveryError) throw error;\n throw invalidSnapshot(error);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
import { LearnedSkillsSnapshotResult } from "../learned-skills.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/v2/runtime/intelligence-platform/skill-registry/snapshot.d.ts
|
|
5
|
+
interface SnapshotFile {
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly size: number;
|
|
8
|
+
readonly sha256: string;
|
|
9
|
+
/** Absent for supporting resources that cannot be decoded as UTF-8 text. */
|
|
10
|
+
readonly text?: string;
|
|
11
|
+
}
|
|
12
|
+
interface SnapshotSkill {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly description: string;
|
|
15
|
+
readonly files: readonly SnapshotFile[];
|
|
16
|
+
}
|
|
17
|
+
interface VerifiedSnapshot {
|
|
18
|
+
readonly revision: string;
|
|
19
|
+
readonly etag: string;
|
|
20
|
+
readonly skills: readonly SnapshotSkill[];
|
|
21
|
+
}
|
|
22
|
+
/** Validate a replacement fully before it can become an invocation snapshot. */
|
|
23
|
+
declare function validateSnapshot(response: Extract<LearnedSkillsSnapshotResult, {
|
|
24
|
+
status: "snapshot";
|
|
25
|
+
}>, signal?: AbortSignal): Promise<VerifiedSnapshot>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { SnapshotFile, SnapshotSkill, VerifiedSnapshot, validateSnapshot };
|
|
28
|
+
//# sourceMappingURL=snapshot.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.cts","names":[],"sources":["../../../../../src/v2/runtime/intelligence-platform/skill-registry/snapshot.ts"],"mappings":";;;;UAKiB,YAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA;;WAEA,IAAA;AAAA;AAAA,UAEM,aAAA;EAAA,SACN,IAAA;EAAA,SACA,WAAA;EAAA,SACA,KAAA,WAAgB,YAAA;AAAA;AAAA,UAEV,gBAAA;EAAA,SACN,QAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,WAAiB,aAAA;AAAA;;iBAoBN,gBAAA,CACpB,QAAA,EAAU,OAAA,CAAQ,2BAAA;EAA+B,MAAA;AAAA,IACjD,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,gBAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
|
|
2
|
+
import { LearnedSkillsSnapshotResult } from "../learned-skills.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/v2/runtime/intelligence-platform/skill-registry/snapshot.d.ts
|
|
5
|
+
interface SnapshotFile {
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly size: number;
|
|
8
|
+
readonly sha256: string;
|
|
9
|
+
/** Absent for supporting resources that cannot be decoded as UTF-8 text. */
|
|
10
|
+
readonly text?: string;
|
|
11
|
+
}
|
|
12
|
+
interface SnapshotSkill {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly description: string;
|
|
15
|
+
readonly files: readonly SnapshotFile[];
|
|
16
|
+
}
|
|
17
|
+
interface VerifiedSnapshot {
|
|
18
|
+
readonly revision: string;
|
|
19
|
+
readonly etag: string;
|
|
20
|
+
readonly skills: readonly SnapshotSkill[];
|
|
21
|
+
}
|
|
22
|
+
/** Validate a replacement fully before it can become an invocation snapshot. */
|
|
23
|
+
declare function validateSnapshot(response: Extract<LearnedSkillsSnapshotResult, {
|
|
24
|
+
status: "snapshot";
|
|
25
|
+
}>, signal?: AbortSignal): Promise<VerifiedSnapshot>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { SnapshotFile, SnapshotSkill, VerifiedSnapshot, validateSnapshot };
|
|
28
|
+
//# sourceMappingURL=snapshot.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.mts","names":[],"sources":["../../../../../src/v2/runtime/intelligence-platform/skill-registry/snapshot.ts"],"mappings":";;;;UAKiB,YAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA;;WAEA,IAAA;AAAA;AAAA,UAEM,aAAA;EAAA,SACN,IAAA;EAAA,SACA,WAAA;EAAA,SACA,KAAA,WAAgB,YAAA;AAAA;AAAA,UAEV,gBAAA;EAAA,SACN,QAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,WAAiB,aAAA;AAAA;;iBAoBN,gBAAA,CACpB,QAAA,EAAU,OAAA,CAAQ,2BAAA;EAA+B,MAAA;AAAA,IACjD,MAAA,GAAS,WAAA,GACR,OAAA,CAAQ,gBAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { LearnedSkillsError } from "../learned-skills.mjs";
|
|
3
|
+
import { invalidSnapshot } from "./errors.mjs";
|
|
4
|
+
import { MAX_SNAPSHOT_BYTES, readArchive, safeRelativePath } from "./archive.mjs";
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
|
|
7
|
+
//#region src/v2/runtime/intelligence-platform/skill-registry/snapshot.ts
|
|
8
|
+
function object(value) {
|
|
9
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
function sha256(bytes) {
|
|
12
|
+
return createHash("sha256").update(bytes).digest("hex");
|
|
13
|
+
}
|
|
14
|
+
function utf8(bytes) {
|
|
15
|
+
try {
|
|
16
|
+
return new TextDecoder("utf-8", {
|
|
17
|
+
fatal: true,
|
|
18
|
+
ignoreBOM: true
|
|
19
|
+
}).decode(bytes);
|
|
20
|
+
} catch {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Validate a replacement fully before it can become an invocation snapshot. */
|
|
25
|
+
async function validateSnapshot(response, signal) {
|
|
26
|
+
try {
|
|
27
|
+
if (!object(response) || !(response.bytes instanceof Uint8Array) || typeof response.revision !== "string" || typeof response.etag !== "string" || typeof response.contentType !== "string") throw invalidSnapshot();
|
|
28
|
+
const { revision, etag, contentType } = response;
|
|
29
|
+
if (response.status !== "snapshot" || response.bytes.byteLength > MAX_SNAPSHOT_BYTES || contentType.split(";", 1)[0]?.trim().toLowerCase() !== "application/zip" || !revision || !/^"[a-f0-9]{64}"$/.test(etag)) throw invalidSnapshot();
|
|
30
|
+
const bytes = Buffer.from(response.bytes);
|
|
31
|
+
if (`"${sha256(bytes)}"` !== etag) throw invalidSnapshot();
|
|
32
|
+
const archive = await readArchive(bytes, signal);
|
|
33
|
+
const manifestBytes = archive.get("manifest.json");
|
|
34
|
+
if (!manifestBytes) throw invalidSnapshot();
|
|
35
|
+
const decoded = utf8(manifestBytes);
|
|
36
|
+
if (decoded === void 0) throw invalidSnapshot();
|
|
37
|
+
const manifest = JSON.parse(decoded);
|
|
38
|
+
if (!object(manifest)) throw invalidSnapshot();
|
|
39
|
+
if (typeof manifest.schemaVersion === "number" && manifest.schemaVersion !== 1) throw new LearnedSkillsError("UNSUPPORTED_SERVER", false);
|
|
40
|
+
if (manifest.schemaVersion !== 1 || manifest.revision !== revision || !Array.isArray(manifest.skills)) throw invalidSnapshot();
|
|
41
|
+
const expected = new Set(["manifest.json"]);
|
|
42
|
+
let previousName;
|
|
43
|
+
const skills = [];
|
|
44
|
+
for (const skill of manifest.skills) {
|
|
45
|
+
if (!object(skill) || typeof skill.name !== "string" || !safeRelativePath(skill.name) || skill.name.includes("/") || previousName !== void 0 && Buffer.compare(Buffer.from(previousName), Buffer.from(skill.name)) >= 0 || typeof skill.description !== "string" || !Array.isArray(skill.files)) throw invalidSnapshot();
|
|
46
|
+
previousName = skill.name;
|
|
47
|
+
let previousPath;
|
|
48
|
+
let hasSkill = false;
|
|
49
|
+
const files = [];
|
|
50
|
+
for (const file of skill.files) {
|
|
51
|
+
if (!object(file) || typeof file.path !== "string" || !safeRelativePath(file.path) || previousPath !== void 0 && Buffer.compare(Buffer.from(previousPath), Buffer.from(file.path)) >= 0 || typeof file.size !== "number" || !Number.isSafeInteger(file.size) || file.size < 0 || typeof file.sha256 !== "string" || !/^[a-f0-9]{64}$/.test(file.sha256)) throw invalidSnapshot();
|
|
52
|
+
previousPath = file.path;
|
|
53
|
+
const path = `${skill.name}/${file.path}`;
|
|
54
|
+
if (expected.has(path)) throw invalidSnapshot();
|
|
55
|
+
expected.add(path);
|
|
56
|
+
const content = archive.get(path);
|
|
57
|
+
if (!content || content.length !== file.size || sha256(content) !== file.sha256) throw invalidSnapshot();
|
|
58
|
+
const text = utf8(content);
|
|
59
|
+
if (file.path === "SKILL.md") {
|
|
60
|
+
if (text === void 0) throw invalidSnapshot();
|
|
61
|
+
hasSkill = true;
|
|
62
|
+
}
|
|
63
|
+
files.push(Object.freeze({
|
|
64
|
+
path: file.path,
|
|
65
|
+
size: file.size,
|
|
66
|
+
sha256: file.sha256,
|
|
67
|
+
...text !== void 0 ? { text } : {}
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
if (!hasSkill) throw invalidSnapshot();
|
|
71
|
+
skills.push(Object.freeze({
|
|
72
|
+
name: skill.name,
|
|
73
|
+
description: skill.description,
|
|
74
|
+
files: Object.freeze(files)
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
if (expected.size !== archive.size || [...archive.keys()].some((path) => !expected.has(path))) throw invalidSnapshot();
|
|
78
|
+
return Object.freeze({
|
|
79
|
+
revision,
|
|
80
|
+
etag,
|
|
81
|
+
skills: Object.freeze(skills)
|
|
82
|
+
});
|
|
83
|
+
} catch (error) {
|
|
84
|
+
if (signal?.aborted) throw signal.reason;
|
|
85
|
+
if (error instanceof LearnedSkillsError) throw error;
|
|
86
|
+
throw invalidSnapshot(error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { validateSnapshot };
|
|
92
|
+
//# sourceMappingURL=snapshot.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.mjs","names":["SkillDeliveryError"],"sources":["../../../../../src/v2/runtime/intelligence-platform/skill-registry/snapshot.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { LearnedSkillsSnapshotResult } from \"../learned-skills\";\nimport { SkillDeliveryError, invalidSnapshot } from \"./errors\";\nimport { MAX_SNAPSHOT_BYTES, readArchive, safeRelativePath } from \"./archive\";\n\nexport interface SnapshotFile {\n readonly path: string;\n readonly size: number;\n readonly sha256: string;\n /** Absent for supporting resources that cannot be decoded as UTF-8 text. */\n readonly text?: string;\n}\nexport interface SnapshotSkill {\n readonly name: string;\n readonly description: string;\n readonly files: readonly SnapshotFile[];\n}\nexport interface VerifiedSnapshot {\n readonly revision: string;\n readonly etag: string;\n readonly skills: readonly SnapshotSkill[];\n}\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction sha256(bytes: Uint8Array): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\nfunction utf8(bytes: Uint8Array): string | undefined {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(\n bytes,\n );\n } catch {\n return undefined;\n }\n}\n\n/** Validate a replacement fully before it can become an invocation snapshot. */\nexport async function validateSnapshot(\n response: Extract<LearnedSkillsSnapshotResult, { status: \"snapshot\" }>,\n signal?: AbortSignal,\n): Promise<VerifiedSnapshot> {\n try {\n if (\n !object(response) ||\n !(response.bytes instanceof Uint8Array) ||\n typeof response.revision !== \"string\" ||\n typeof response.etag !== \"string\" ||\n typeof response.contentType !== \"string\"\n )\n throw invalidSnapshot();\n const { revision, etag, contentType } = response;\n if (\n response.status !== \"snapshot\" ||\n response.bytes.byteLength > MAX_SNAPSHOT_BYTES ||\n contentType.split(\";\", 1)[0]?.trim().toLowerCase() !==\n \"application/zip\" ||\n !revision ||\n !/^\"[a-f0-9]{64}\"$/.test(etag)\n )\n throw invalidSnapshot();\n // Own the bytes before asynchronous decompression so an injected client\n // cannot mutate an in-flight replacement after its digest is checked.\n const bytes = Buffer.from(response.bytes);\n if (`\"${sha256(bytes)}\"` !== etag) throw invalidSnapshot();\n const archive = await readArchive(bytes, signal);\n const manifestBytes = archive.get(\"manifest.json\");\n if (!manifestBytes) throw invalidSnapshot();\n const decoded = utf8(manifestBytes);\n if (decoded === undefined) throw invalidSnapshot();\n const manifest: unknown = JSON.parse(decoded);\n if (!object(manifest)) throw invalidSnapshot();\n if (\n typeof manifest.schemaVersion === \"number\" &&\n manifest.schemaVersion !== 1\n )\n throw new SkillDeliveryError(\"UNSUPPORTED_SERVER\", false);\n if (\n manifest.schemaVersion !== 1 ||\n manifest.revision !== revision ||\n !Array.isArray(manifest.skills)\n )\n throw invalidSnapshot();\n const expected = new Set([\"manifest.json\"]);\n let previousName: string | undefined;\n const skills: SnapshotSkill[] = [];\n for (const skill of manifest.skills) {\n if (\n !object(skill) ||\n typeof skill.name !== \"string\" ||\n !safeRelativePath(skill.name) ||\n skill.name.includes(\"/\") ||\n (previousName !== undefined &&\n Buffer.compare(Buffer.from(previousName), Buffer.from(skill.name)) >=\n 0) ||\n typeof skill.description !== \"string\" ||\n !Array.isArray(skill.files)\n )\n throw invalidSnapshot();\n previousName = skill.name;\n let previousPath: string | undefined;\n let hasSkill = false;\n const files: SnapshotFile[] = [];\n for (const file of skill.files) {\n if (\n !object(file) ||\n typeof file.path !== \"string\" ||\n !safeRelativePath(file.path) ||\n (previousPath !== undefined &&\n Buffer.compare(Buffer.from(previousPath), Buffer.from(file.path)) >=\n 0) ||\n typeof file.size !== \"number\" ||\n !Number.isSafeInteger(file.size) ||\n file.size < 0 ||\n typeof file.sha256 !== \"string\" ||\n !/^[a-f0-9]{64}$/.test(file.sha256)\n )\n throw invalidSnapshot();\n previousPath = file.path;\n const path = `${skill.name}/${file.path}`;\n if (expected.has(path)) throw invalidSnapshot();\n expected.add(path);\n const content = archive.get(path);\n if (\n !content ||\n content.length !== file.size ||\n sha256(content) !== file.sha256\n )\n throw invalidSnapshot();\n const text = utf8(content);\n if (file.path === \"SKILL.md\") {\n if (text === undefined) throw invalidSnapshot();\n hasSkill = true;\n }\n files.push(\n Object.freeze({\n path: file.path,\n size: file.size,\n sha256: file.sha256,\n ...(text !== undefined ? { text } : {}),\n }),\n );\n }\n if (!hasSkill) throw invalidSnapshot();\n skills.push(\n Object.freeze({\n name: skill.name,\n description: skill.description,\n files: Object.freeze(files),\n }),\n );\n }\n if (\n expected.size !== archive.size ||\n [...archive.keys()].some((path) => !expected.has(path))\n )\n throw invalidSnapshot();\n return Object.freeze({\n revision: revision,\n etag: etag,\n skills: Object.freeze(skills),\n });\n } catch (error) {\n if (signal?.aborted) throw signal.reason;\n if (error instanceof SkillDeliveryError) throw error;\n throw invalidSnapshot(error);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest } from "./agent-runner.cjs";
|
|
3
|
-
import { Observable, ReplaySubject } from "rxjs";
|
|
4
3
|
import { AbstractAgent, BaseEvent, Message } from "@ag-ui/client";
|
|
4
|
+
import { Observable, ReplaySubject } from "rxjs";
|
|
5
5
|
|
|
6
6
|
//#region src/v2/runtime/runner/in-memory.d.ts
|
|
7
7
|
interface InMemoryLimits {
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, LocalThreadEndpointRecord, LocalThreadEndpointRunner, supportsLocalThreadEndpoints } from "./agent-runner.cjs";
|
|
3
3
|
import { InMemoryAgentRunner, InMemoryAgentRunnerOptions, InMemoryLimits, InMemoryThread, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits } from "./in-memory.cjs";
|
|
4
4
|
import { IntelligenceAgentRunner, IntelligenceAgentRunnerOptions, RunnerStartupBoundary } from "./intelligence.cjs";
|
|
5
|
-
import { finalizeRunEvents } from "@copilotkit/shared";
|
|
6
|
-
export { finalizeRunEvents };
|
|
5
|
+
import { FinalizeRunOptions, RunEventFinalizer, createRunEventFinalizer, finalizeRunEvents } from "@copilotkit/shared";
|
|
6
|
+
export { type FinalizeRunOptions, type RunEventFinalizer, createRunEventFinalizer, finalizeRunEvents };
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest, LocalThreadEndpointRecord, LocalThreadEndpointRunner, supportsLocalThreadEndpoints } from "./agent-runner.mjs";
|
|
3
3
|
import { InMemoryAgentRunner, InMemoryAgentRunnerOptions, InMemoryLimits, InMemoryThread, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits } from "./in-memory.mjs";
|
|
4
4
|
import { IntelligenceAgentRunner, IntelligenceAgentRunnerOptions, RunnerStartupBoundary } from "./intelligence.mjs";
|
|
5
|
-
import { finalizeRunEvents as finalizeRunEvents$1 } from "@copilotkit/shared";
|
|
6
|
-
export { finalizeRunEvents$1 as finalizeRunEvents };
|
|
5
|
+
import { FinalizeRunOptions, RunEventFinalizer, createRunEventFinalizer as createRunEventFinalizer$1, finalizeRunEvents as finalizeRunEvents$1 } from "@copilotkit/shared";
|
|
6
|
+
export { type FinalizeRunOptions, type RunEventFinalizer, createRunEventFinalizer$1 as createRunEventFinalizer, finalizeRunEvents$1 as finalizeRunEvents };
|
|
@@ -2,6 +2,6 @@ import "reflect-metadata";
|
|
|
2
2
|
import { AgentRunner, supportsLocalThreadEndpoints } from "./agent-runner.mjs";
|
|
3
3
|
import { InMemoryAgentRunner, ɵBoundedThreadStore, ɵGLOBAL_STORE, ɵINMEMORY_DEFAULTS, ɵestimateBytes, ɵnormalizeLimits } from "./in-memory.mjs";
|
|
4
4
|
import { IntelligenceAgentRunner } from "./intelligence.mjs";
|
|
5
|
-
import { finalizeRunEvents as finalizeRunEvents$1 } from "@copilotkit/shared";
|
|
5
|
+
import { createRunEventFinalizer as createRunEventFinalizer$1, finalizeRunEvents as finalizeRunEvents$1 } from "@copilotkit/shared";
|
|
6
6
|
|
|
7
|
-
export { finalizeRunEvents$1 as finalizeRunEvents };
|
|
7
|
+
export { createRunEventFinalizer$1 as createRunEventFinalizer, finalizeRunEvents$1 as finalizeRunEvents };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
import { AgentRunner, AgentRunnerConnectRequest, AgentRunnerIsRunningRequest, AgentRunnerRunRequest, AgentRunnerStopRequest } from "./agent-runner.cjs";
|
|
3
|
-
import { Observable } from "rxjs";
|
|
4
3
|
import { BaseEvent } from "@ag-ui/client";
|
|
4
|
+
import { Observable } from "rxjs";
|
|
5
5
|
|
|
6
6
|
//#region src/v2/runtime/runner/intelligence.d.ts
|
|
7
7
|
interface IntelligenceAgentRunnerOptions {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
|
|
2
|
+
import { ModelHostClass } from "@copilotkit/shared";
|
|
3
|
+
|
|
2
4
|
//#region src/v2/runtime/telemetry/events.d.ts
|
|
3
5
|
type AnalyticsEvents = {
|
|
4
6
|
"oss.runtime.instance_created": RuntimeInstanceCreatedInfo;
|
|
@@ -44,6 +46,16 @@ interface RuntimeInstanceCreatedInfo {
|
|
|
44
46
|
"cloud.base_url"?: string;
|
|
45
47
|
}
|
|
46
48
|
interface AgentExecutionResponseInfo {
|
|
49
|
+
/**
|
|
50
|
+
* Which vendor the runtime actually sent the completion to, as a closed
|
|
51
|
+
* vocabulary — see `classifyModelHost`. Distinct from `provider` below,
|
|
52
|
+
* which the upstream reports as a model name and which cannot tell Azure,
|
|
53
|
+
* OpenRouter or a local server apart from OpenAI.
|
|
54
|
+
*
|
|
55
|
+
* `unknown` when the developer handed us an already-built model, because
|
|
56
|
+
* the endpoint is unrecoverable from one.
|
|
57
|
+
*/
|
|
58
|
+
llmHostClass?: ModelHostClass;
|
|
47
59
|
provider?: string;
|
|
48
60
|
model?: string;
|
|
49
61
|
langGraphHost?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.cts","names":[],"sources":["../../../../src/v2/runtime/telemetry/events.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.d.cts","names":[],"sources":["../../../../src/v2/runtime/telemetry/events.ts"],"mappings":";;;;KAEY,eAAA;EACV,8BAAA,EAAgC,0BAAA;EAChC,qCAAA;IACE,0BAAA;IACA,WAAA;IACA,wBAAA;IACA,sBAAA;IACA,gBAAA;EAAA;EAEF,4CAAA;IAAgD,YAAA;EAAA;EAChD,0CAAA,EAA4C,0BAAA;EAC5C,4CAAA;IACE,YAAA;IACA,KAAA;EAAA;EANA;;;;;EAaF,qCAAA,EAAuC,yBAAA,EARrC;EAUF,uCAAA;IAA2C,SAAA;EAAA;AAAA;AAAA,UAG5B,yBAAA;EAHqC;EAKpD,MAAA;EAFe;EAIf,IAAA;AAAA;AAAA,UAGe,0BAAA;EACf,aAAA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,YAAA;EACA,wBAAA;EACA,sBAAA;EACA,gBAAA;AAAA;AAAA,UAGe,0BAAA;EALf;;;;;AAKF;;;;EAUE,YAAA,GAAe,cAAA;EACf,QAAA;EACA,KAAA;EACA,aAAA;EACA,gBAAA;EACA,YAAA;AAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
|
|
2
|
+
import { ModelHostClass } from "@copilotkit/shared";
|
|
3
|
+
|
|
2
4
|
//#region src/v2/runtime/telemetry/events.d.ts
|
|
3
5
|
type AnalyticsEvents = {
|
|
4
6
|
"oss.runtime.instance_created": RuntimeInstanceCreatedInfo;
|
|
@@ -44,6 +46,16 @@ interface RuntimeInstanceCreatedInfo {
|
|
|
44
46
|
"cloud.base_url"?: string;
|
|
45
47
|
}
|
|
46
48
|
interface AgentExecutionResponseInfo {
|
|
49
|
+
/**
|
|
50
|
+
* Which vendor the runtime actually sent the completion to, as a closed
|
|
51
|
+
* vocabulary — see `classifyModelHost`. Distinct from `provider` below,
|
|
52
|
+
* which the upstream reports as a model name and which cannot tell Azure,
|
|
53
|
+
* OpenRouter or a local server apart from OpenAI.
|
|
54
|
+
*
|
|
55
|
+
* `unknown` when the developer handed us an already-built model, because
|
|
56
|
+
* the endpoint is unrecoverable from one.
|
|
57
|
+
*/
|
|
58
|
+
llmHostClass?: ModelHostClass;
|
|
47
59
|
provider?: string;
|
|
48
60
|
model?: string;
|
|
49
61
|
langGraphHost?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.mts","names":[],"sources":["../../../../src/v2/runtime/telemetry/events.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.d.mts","names":[],"sources":["../../../../src/v2/runtime/telemetry/events.ts"],"mappings":";;;;KAEY,eAAA;EACV,8BAAA,EAAgC,0BAAA;EAChC,qCAAA;IACE,0BAAA;IACA,WAAA;IACA,wBAAA;IACA,sBAAA;IACA,gBAAA;EAAA;EAEF,4CAAA;IAAgD,YAAA;EAAA;EAChD,0CAAA,EAA4C,0BAAA;EAC5C,4CAAA;IACE,YAAA;IACA,KAAA;EAAA;EANA;;;;;EAaF,qCAAA,EAAuC,yBAAA,EARrC;EAUF,uCAAA;IAA2C,SAAA;EAAA;AAAA;AAAA,UAG5B,yBAAA;EAHqC;EAKpD,MAAA;EAFe;EAIf,IAAA;AAAA;AAAA,UAGe,0BAAA;EACf,aAAA;EACA,aAAA;EACA,YAAA;EACA,eAAA;EACA,YAAA;EACA,wBAAA;EACA,sBAAA;EACA,gBAAA;AAAA;AAAA,UAGe,0BAAA;EALf;;;;;AAKF;;;;EAUE,YAAA,GAAe,cAAA;EACf,QAAA;EACA,KAAA;EACA,aAAA;EACA,gBAAA;EACA,YAAA;AAAA"}
|
|
@@ -11,7 +11,7 @@ function isTelemetryDisabled() {
|
|
|
11
11
|
var TelemetryClient = class {
|
|
12
12
|
constructor({ telemetryDisabled, sampleRate } = {}) {
|
|
13
13
|
this.telemetryDisabled = false;
|
|
14
|
-
this.sampleRate =
|
|
14
|
+
this.sampleRate = 1;
|
|
15
15
|
this.licenseToken = null;
|
|
16
16
|
this.telemetryId = null;
|
|
17
17
|
this.licenseTelemetryId = null;
|
|
@@ -72,6 +72,7 @@ var TelemetryClient = class {
|
|
|
72
72
|
sampleRate: this.sampleRate
|
|
73
73
|
}),
|
|
74
74
|
telemetry_emitter: _copilotkit_shared.TELEMETRY_EMITTER_V2,
|
|
75
|
+
telemetry_surface: _copilotkit_shared.TELEMETRY_SURFACE_V2,
|
|
75
76
|
telemetry_transport: "lambda"
|
|
76
77
|
},
|
|
77
78
|
packageName: import_package.name,
|
|
@@ -95,7 +96,7 @@ var TelemetryClient = class {
|
|
|
95
96
|
}
|
|
96
97
|
setSampleRate(sampleRate) {
|
|
97
98
|
let _sampleRate;
|
|
98
|
-
_sampleRate = sampleRate ??
|
|
99
|
+
_sampleRate = sampleRate ?? 1;
|
|
99
100
|
if (process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE) _sampleRate = parseFloat(process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE);
|
|
100
101
|
if (Number.isNaN(_sampleRate) || _sampleRate < 0 || _sampleRate > 1) throw new Error("Sample rate must be between 0 and 1");
|
|
101
102
|
this.sampleRate = _sampleRate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-client.cjs","names":["lambdaClient","TELEMETRY_EMITTER_V2","packageJson"],"sources":["../../../../src/v2/runtime/telemetry/telemetry-client.ts"],"sourcesContent":["import type { AnalyticsEvents } from \"./events\";\nimport {\n lambdaClient,\n parseAndWarnTelemetryId,\n computeSamplingMeta,\n TELEMETRY_EMITTER_V2,\n} from \"@copilotkit/shared\";\nimport * as packageJson from \"../../../../package.json\";\nimport { firstNonBlankTelemetryId } from \"./telemetry-identity\";\n\n/** Transport identity and sampling authority resolved for one runtime. */\nexport interface TelemetryIdentity {\n telemetryId?: string;\n licenseToken?: string;\n}\n\n/** Capture-only telemetry client bound to one runtime identity. */\nexport interface TelemetryCapture {\n capture<K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n ): Promise<void>;\n}\n\ninterface ResolvedTelemetryIdentity {\n telemetryId: string | null;\n licenseToken: string | null;\n licenseTelemetryId: string | null;\n}\n\nexport function isTelemetryDisabled(): boolean {\n return (\n (process.env as Record<string, string | undefined>)\n .COPILOTKIT_TELEMETRY_DISABLED === \"true\" ||\n (process.env as Record<string, string | undefined>)\n .COPILOTKIT_TELEMETRY_DISABLED === \"1\" ||\n (process.env as Record<string, string | undefined>).DO_NOT_TRACK ===\n \"true\" ||\n (process.env as Record<string, string | undefined>).DO_NOT_TRACK === \"1\"\n );\n}\n\nexport class TelemetryClient {\n private telemetryDisabled: boolean = false;\n // Client-side sampling rate for anonymous events. Identified callers\n // (license token with telemetry_id) bypass the gate. Default 0.05\n // caps anonymous OSS-runtime egress; identified customers send at\n // full fidelity. Override via COPILOTKIT_TELEMETRY_SAMPLE_RATE.\n private sampleRate: number = 0.05;\n // EIP / Intelligence license token (Ed25519-signed JWT). Kept separate\n // from standalone identity so the transport receives only the selected\n // identity source.\n private licenseToken: string | null = null;\n // Standalone identity sent as a transport claim. It does not grant sampling\n // authority.\n private telemetryId: string | null = null;\n // License-derived identity used only as sampling authority.\n private licenseTelemetryId: string | null = null;\n // Properties merged into every event this client sends.\n //\n // For facts about the caller that are true for the whole process rather than\n // for one event: which product is embedding the runtime, for instance. A\n // distribution built on top of this can then be told apart in the existing\n // events instead of sending its own, which is the difference between one\n // extra field and a second pipeline nobody asked for.\n //\n // Sent as `global_properties`, a field of its own, so these stay separable\n // from an event's own properties all the way to the sink.\n //\n // Do not reuse a key an event already sets: the fanout spreads this bag last\n // for `oss.runtime.*`, so a collision resolves in favour of the global and\n // does so silently. Names here should describe the caller, not the call.\n private globalProperties: Record<string, unknown> = {};\n\n constructor({\n telemetryDisabled,\n sampleRate,\n }: {\n telemetryDisabled?: boolean;\n sampleRate?: number;\n } = {}) {\n this.telemetryDisabled = telemetryDisabled || isTelemetryDisabled();\n this.setSampleRate(sampleRate);\n }\n\n private shouldSendEvent() {\n if (this.sampleRate >= 1) return true;\n return Math.random() < this.sampleRate;\n }\n\n /**\n * Add properties carried by every subsequent event.\n *\n * Merged rather than replaced, so two callers setting different fields do not\n * erase each other. Set once at runtime construction in practice; nothing\n * here is per-request.\n */\n setGlobalProperties(properties: Record<string, unknown>) {\n this.globalProperties = { ...this.globalProperties, ...properties };\n }\n\n /** Atomically replace the process-wide telemetry identity. */\n setTelemetryIdentity(identity: TelemetryIdentity): void {\n const resolvedIdentity = this.resolveTelemetryIdentity(identity);\n this.telemetryId = resolvedIdentity.telemetryId;\n this.licenseToken = resolvedIdentity.licenseToken;\n this.licenseTelemetryId = resolvedIdentity.licenseTelemetryId;\n }\n\n /** @deprecated Prefer {@link setTelemetryIdentity}. */\n setLicenseToken(licenseToken: string): void {\n this.setTelemetryIdentity({ licenseToken });\n }\n\n /** Create an immutable capture scope for one Runtime instance. */\n createScope(identity: TelemetryIdentity): TelemetryCapture {\n const resolvedIdentity = this.resolveTelemetryIdentity(identity);\n return {\n capture: <K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n ) => this.captureWithIdentity(event, properties, resolvedIdentity),\n };\n }\n\n async capture<K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n ): Promise<void> {\n return this.captureWithIdentity(event, properties, {\n telemetryId: this.telemetryId,\n licenseToken: this.licenseToken,\n licenseTelemetryId: this.licenseTelemetryId,\n });\n }\n\n private async captureWithIdentity<K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n identity: ResolvedTelemetryIdentity,\n ): Promise<void> {\n if (this.telemetryDisabled) return;\n // Standalone identity is a transport claim, not sampling authority.\n // Only a legacy license token with telemetry_id bypasses sampleRate.\n if (!identity.licenseTelemetryId && !this.shouldSendEvent()) return;\n\n await lambdaClient.send({\n event,\n properties: properties as Record<string, unknown>,\n // Its own field on the wire rather than folded into `properties`, which\n // is what the sink expects: for `oss.runtime.*` the fanout treats\n // `global_properties` as the SDK's pass-through bag and spreads it into\n // the analytics event, and v1's client sends package name and version the\n // same way. Folding it in would work and would put a process-level fact\n // in the per-event slot, where nothing downstream expects to find one.\n // Sampling metadata rides in the same slot, as it does in v1: an event\n // that records no sampling decision can't be weighted, and anyone\n // counting raw events understates anonymous volume ~20× (OSS-1017).\n globalProperties: {\n ...this.globalProperties,\n ...computeSamplingMeta({\n telemetryId: identity.licenseTelemetryId,\n sampleRate: this.sampleRate,\n }),\n telemetry_emitter: TELEMETRY_EMITTER_V2,\n // This client has one transport, so the marker is constant here. It\n // is stamped anyway so the property means the same thing on every\n // event whichever client produced it (OSS-1019).\n telemetry_transport: \"lambda\",\n },\n packageName: packageJson.name,\n packageVersion: packageJson.version,\n telemetryId: identity.telemetryId ?? undefined,\n licenseToken: identity.licenseToken ?? undefined,\n });\n }\n\n private resolveTelemetryIdentity(\n identity: TelemetryIdentity,\n ): ResolvedTelemetryIdentity {\n const telemetryId = firstNonBlankTelemetryId(identity.telemetryId);\n if (telemetryId !== undefined) {\n return {\n telemetryId,\n licenseToken: null,\n licenseTelemetryId: null,\n };\n }\n\n return {\n telemetryId: null,\n licenseToken: identity.licenseToken ?? null,\n licenseTelemetryId: identity.licenseToken\n ? parseAndWarnTelemetryId(identity.licenseToken)\n : null,\n };\n }\n\n private setSampleRate(sampleRate: number | undefined) {\n let _sampleRate: number;\n\n _sampleRate = sampleRate ?? 0.05;\n\n if (process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE) {\n _sampleRate = parseFloat(process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE);\n }\n\n // Number.isNaN guards against parseFloat(\"nonsense\") slipping past the\n // range check (all NaN comparisons are false), which would silently\n // drop every anonymous event with no signal.\n if (Number.isNaN(_sampleRate) || _sampleRate < 0 || _sampleRate > 1) {\n throw new Error(\"Sample rate must be between 0 and 1\");\n }\n\n this.sampleRate = _sampleRate;\n }\n}\n\nconst telemetry = new TelemetryClient();\nexport default telemetry;\n"],"mappings":";;;;;;;AA8BA,SAAgB,sBAA+B;AAC7C,QACG,QAAQ,IACN,kCAAkC,UACpC,QAAQ,IACN,kCAAkC,OACpC,QAAQ,IAA2C,iBAClD,UACD,QAAQ,IAA2C,iBAAiB;;AAIzE,IAAa,kBAAb,MAA6B;CAgC3B,YAAY,EACV,mBACA,eAIE,EAAE,EAAE;2BArC6B;oBAKR;sBAIS;qBAGD;4BAEO;0BAeQ,EAAE;AASpD,OAAK,oBAAoB,qBAAqB,qBAAqB;AACnE,OAAK,cAAc,WAAW;;CAGhC,AAAQ,kBAAkB;AACxB,MAAI,KAAK,cAAc,EAAG,QAAO;AACjC,SAAO,KAAK,QAAQ,GAAG,KAAK;;;;;;;;;CAU9B,oBAAoB,YAAqC;AACvD,OAAK,mBAAmB;GAAE,GAAG,KAAK;GAAkB,GAAG;GAAY;;;CAIrE,qBAAqB,UAAmC;EACtD,MAAM,mBAAmB,KAAK,yBAAyB,SAAS;AAChE,OAAK,cAAc,iBAAiB;AACpC,OAAK,eAAe,iBAAiB;AACrC,OAAK,qBAAqB,iBAAiB;;;CAI7C,gBAAgB,cAA4B;AAC1C,OAAK,qBAAqB,EAAE,cAAc,CAAC;;;CAI7C,YAAY,UAA+C;EACzD,MAAM,mBAAmB,KAAK,yBAAyB,SAAS;AAChE,SAAO,EACL,UACE,OACA,eACG,KAAK,oBAAoB,OAAO,YAAY,iBAAiB,EACnE;;CAGH,MAAM,QACJ,OACA,YACe;AACf,SAAO,KAAK,oBAAoB,OAAO,YAAY;GACjD,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,oBAAoB,KAAK;GAC1B,CAAC;;CAGJ,MAAc,oBACZ,OACA,YACA,UACe;AACf,MAAI,KAAK,kBAAmB;AAG5B,MAAI,CAAC,SAAS,sBAAsB,CAAC,KAAK,iBAAiB,CAAE;AAE7D,QAAMA,gCAAa,KAAK;GACtB;GACY;GAUZ,kBAAkB;IAChB,GAAG,KAAK;IACR,+CAAuB;KACrB,aAAa,SAAS;KACtB,YAAY,KAAK;KAClB,CAAC;IACF,mBAAmBC;IAInB,qBAAqB;IACtB;GACD,aAAaC,eAAY;GACzB,gBAAgBA,eAAY;GAC5B,aAAa,SAAS,eAAe;GACrC,cAAc,SAAS,gBAAgB;GACxC,CAAC;;CAGJ,AAAQ,yBACN,UAC2B;EAC3B,MAAM,+DAAuC,SAAS,YAAY;AAClE,MAAI,gBAAgB,OAClB,QAAO;GACL;GACA,cAAc;GACd,oBAAoB;GACrB;AAGH,SAAO;GACL,aAAa;GACb,cAAc,SAAS,gBAAgB;GACvC,oBAAoB,SAAS,+DACD,SAAS,aAAa,GAC9C;GACL;;CAGH,AAAQ,cAAc,YAAgC;EACpD,IAAI;AAEJ,gBAAc,cAAc;AAE5B,MAAI,QAAQ,IAAI,iCACd,eAAc,WAAW,QAAQ,IAAI,iCAAiC;AAMxE,MAAI,OAAO,MAAM,YAAY,IAAI,cAAc,KAAK,cAAc,EAChE,OAAM,IAAI,MAAM,sCAAsC;AAGxD,OAAK,aAAa;;;AAItB,MAAM,YAAY,IAAI,iBAAiB"}
|
|
1
|
+
{"version":3,"file":"telemetry-client.cjs","names":["lambdaClient","TELEMETRY_EMITTER_V2","TELEMETRY_SURFACE_V2","packageJson"],"sources":["../../../../src/v2/runtime/telemetry/telemetry-client.ts"],"sourcesContent":["import type { AnalyticsEvents } from \"./events\";\nimport {\n lambdaClient,\n parseAndWarnTelemetryId,\n computeSamplingMeta,\n TELEMETRY_EMITTER_V2,\n TELEMETRY_SURFACE_V2,\n} from \"@copilotkit/shared\";\nimport * as packageJson from \"../../../../package.json\";\nimport { firstNonBlankTelemetryId } from \"./telemetry-identity\";\n\n/** Transport identity and sampling authority resolved for one runtime. */\nexport interface TelemetryIdentity {\n telemetryId?: string;\n licenseToken?: string;\n}\n\n/** Capture-only telemetry client bound to one runtime identity. */\nexport interface TelemetryCapture {\n capture<K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n ): Promise<void>;\n}\n\ninterface ResolvedTelemetryIdentity {\n telemetryId: string | null;\n licenseToken: string | null;\n licenseTelemetryId: string | null;\n}\n\nexport function isTelemetryDisabled(): boolean {\n return (\n (process.env as Record<string, string | undefined>)\n .COPILOTKIT_TELEMETRY_DISABLED === \"true\" ||\n (process.env as Record<string, string | undefined>)\n .COPILOTKIT_TELEMETRY_DISABLED === \"1\" ||\n (process.env as Record<string, string | undefined>).DO_NOT_TRACK ===\n \"true\" ||\n (process.env as Record<string, string | undefined>).DO_NOT_TRACK === \"1\"\n );\n}\n\nexport class TelemetryClient {\n private telemetryDisabled: boolean = false;\n // Opt-down for anonymous events, defaulting to 1: the sink is ours, so a\n // real count beats one extrapolated from a fraction of the population.\n // It stays configurable because it is the cross-SDK lever for reducing or\n // stopping anonymous volume — the Go, Python, Ruby, and .NET runtimes all\n // expose it, and the cross-language conformance suite drives it to 0 to\n // assert silence. Identified callers bypass it.\n private sampleRate: number = 1;\n // EIP / Intelligence license token (Ed25519-signed JWT). Kept separate\n // from standalone identity so the transport receives only the selected\n // identity source.\n private licenseToken: string | null = null;\n // Standalone identity sent as a transport claim. It does not make an\n // event identified.\n private telemetryId: string | null = null;\n // License-derived identity. This client sends every event either way;\n // the id is what sets telemetry_identified on the sampling block, which\n // is how the two populations stay separable downstream.\n private licenseTelemetryId: string | null = null;\n // Properties merged into every event this client sends.\n //\n // For facts about the caller that are true for the whole process rather than\n // for one event: which product is embedding the runtime, for instance. A\n // distribution built on top of this can then be told apart in the existing\n // events instead of sending its own, which is the difference between one\n // extra field and a second pipeline nobody asked for.\n //\n // Sent as `global_properties`, a field of its own, so these stay separable\n // from an event's own properties all the way to the sink.\n //\n // Do not reuse a key an event already sets: the fanout spreads this bag last\n // for `oss.runtime.*`, so a collision resolves in favour of the global and\n // does so silently. Names here should describe the caller, not the call.\n private globalProperties: Record<string, unknown> = {};\n\n constructor({\n telemetryDisabled,\n sampleRate,\n }: {\n telemetryDisabled?: boolean;\n sampleRate?: number;\n } = {}) {\n this.telemetryDisabled = telemetryDisabled || isTelemetryDisabled();\n this.setSampleRate(sampleRate);\n }\n\n private shouldSendEvent() {\n if (this.sampleRate >= 1) return true;\n return Math.random() < this.sampleRate;\n }\n\n /**\n * Add properties carried by every subsequent event.\n *\n * Merged rather than replaced, so two callers setting different fields do not\n * erase each other. Set once at runtime construction in practice; nothing\n * here is per-request.\n */\n setGlobalProperties(properties: Record<string, unknown>) {\n this.globalProperties = { ...this.globalProperties, ...properties };\n }\n\n /** Atomically replace the process-wide telemetry identity. */\n setTelemetryIdentity(identity: TelemetryIdentity): void {\n const resolvedIdentity = this.resolveTelemetryIdentity(identity);\n this.telemetryId = resolvedIdentity.telemetryId;\n this.licenseToken = resolvedIdentity.licenseToken;\n this.licenseTelemetryId = resolvedIdentity.licenseTelemetryId;\n }\n\n /** @deprecated Prefer {@link setTelemetryIdentity}. */\n setLicenseToken(licenseToken: string): void {\n this.setTelemetryIdentity({ licenseToken });\n }\n\n /** Create an immutable capture scope for one Runtime instance. */\n createScope(identity: TelemetryIdentity): TelemetryCapture {\n const resolvedIdentity = this.resolveTelemetryIdentity(identity);\n return {\n capture: <K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n ) => this.captureWithIdentity(event, properties, resolvedIdentity),\n };\n }\n\n async capture<K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n ): Promise<void> {\n return this.captureWithIdentity(event, properties, {\n telemetryId: this.telemetryId,\n licenseToken: this.licenseToken,\n licenseTelemetryId: this.licenseTelemetryId,\n });\n }\n\n private async captureWithIdentity<K extends keyof AnalyticsEvents>(\n event: K,\n properties: AnalyticsEvents[K],\n identity: ResolvedTelemetryIdentity,\n ): Promise<void> {\n if (this.telemetryDisabled) return;\n // Nothing is gated at the default rate of 1. A caller who dialled it\n // down means it, and identified callers are exempt either way.\n if (!identity.licenseTelemetryId && !this.shouldSendEvent()) return;\n\n await lambdaClient.send({\n event,\n properties: properties as Record<string, unknown>,\n // Its own field on the wire rather than folded into `properties`, which\n // is what the sink expects: for `oss.runtime.*` the fanout treats\n // `global_properties` as the SDK's pass-through bag and spreads it into\n // the analytics event, and v1's client sends package name and version the\n // same way. Folding it in would work and would put a process-level fact\n // in the per-event slot, where nothing downstream expects to find one.\n // Sampling metadata rides in the same slot, as it does in v1. It\n // reads 1/1 unless a caller dialled the rate down, and is stamped\n // either way: a consumer summing sampleWeight across emitters must\n // not find the field missing on a quarter of the rows, which is the\n // state that made ~24% of runtime volume unweightable (OSS-1017).\n globalProperties: {\n ...this.globalProperties,\n ...computeSamplingMeta({\n telemetryId: identity.licenseTelemetryId,\n sampleRate: this.sampleRate,\n }),\n telemetry_emitter: TELEMETRY_EMITTER_V2,\n // Constant here: a v1 request never reaches this client. The v1\n // entrypoint hands its own capture scope to the V2 runtime it\n // builds, so v1 traffic is emitted by the v1 client and stamped\n // v1 there — which is also what keeps it on the Segment wire.\n telemetry_surface: TELEMETRY_SURFACE_V2,\n // This client has one transport, so the marker is constant here. It\n // is stamped anyway so the property means the same thing on every\n // event whichever client produced it (OSS-1019).\n telemetry_transport: \"lambda\",\n },\n packageName: packageJson.name,\n packageVersion: packageJson.version,\n telemetryId: identity.telemetryId ?? undefined,\n licenseToken: identity.licenseToken ?? undefined,\n });\n }\n\n private resolveTelemetryIdentity(\n identity: TelemetryIdentity,\n ): ResolvedTelemetryIdentity {\n const telemetryId = firstNonBlankTelemetryId(identity.telemetryId);\n if (telemetryId !== undefined) {\n return {\n telemetryId,\n licenseToken: null,\n licenseTelemetryId: null,\n };\n }\n\n return {\n telemetryId: null,\n licenseToken: identity.licenseToken ?? null,\n licenseTelemetryId: identity.licenseToken\n ? parseAndWarnTelemetryId(identity.licenseToken)\n : null,\n };\n }\n\n private setSampleRate(sampleRate: number | undefined) {\n let _sampleRate: number;\n\n _sampleRate = sampleRate ?? 1;\n\n if (process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE) {\n _sampleRate = parseFloat(process.env.COPILOTKIT_TELEMETRY_SAMPLE_RATE);\n }\n\n // Number.isNaN guards against parseFloat(\"nonsense\") slipping past the\n // range check (all NaN comparisons are false), which would silently\n // drop every anonymous event with no signal.\n if (Number.isNaN(_sampleRate) || _sampleRate < 0 || _sampleRate > 1) {\n throw new Error(\"Sample rate must be between 0 and 1\");\n }\n\n this.sampleRate = _sampleRate;\n }\n}\n\nconst telemetry = new TelemetryClient();\nexport default telemetry;\n"],"mappings":";;;;;;;AA+BA,SAAgB,sBAA+B;AAC7C,QACG,QAAQ,IACN,kCAAkC,UACpC,QAAQ,IACN,kCAAkC,OACpC,QAAQ,IAA2C,iBAClD,UACD,QAAQ,IAA2C,iBAAiB;;AAIzE,IAAa,kBAAb,MAA6B;CAoC3B,YAAY,EACV,mBACA,eAIE,EAAE,EAAE;2BAzC6B;oBAOR;sBAIS;qBAGD;4BAIO;0BAeQ,EAAE;AASpD,OAAK,oBAAoB,qBAAqB,qBAAqB;AACnE,OAAK,cAAc,WAAW;;CAGhC,AAAQ,kBAAkB;AACxB,MAAI,KAAK,cAAc,EAAG,QAAO;AACjC,SAAO,KAAK,QAAQ,GAAG,KAAK;;;;;;;;;CAU9B,oBAAoB,YAAqC;AACvD,OAAK,mBAAmB;GAAE,GAAG,KAAK;GAAkB,GAAG;GAAY;;;CAIrE,qBAAqB,UAAmC;EACtD,MAAM,mBAAmB,KAAK,yBAAyB,SAAS;AAChE,OAAK,cAAc,iBAAiB;AACpC,OAAK,eAAe,iBAAiB;AACrC,OAAK,qBAAqB,iBAAiB;;;CAI7C,gBAAgB,cAA4B;AAC1C,OAAK,qBAAqB,EAAE,cAAc,CAAC;;;CAI7C,YAAY,UAA+C;EACzD,MAAM,mBAAmB,KAAK,yBAAyB,SAAS;AAChE,SAAO,EACL,UACE,OACA,eACG,KAAK,oBAAoB,OAAO,YAAY,iBAAiB,EACnE;;CAGH,MAAM,QACJ,OACA,YACe;AACf,SAAO,KAAK,oBAAoB,OAAO,YAAY;GACjD,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,oBAAoB,KAAK;GAC1B,CAAC;;CAGJ,MAAc,oBACZ,OACA,YACA,UACe;AACf,MAAI,KAAK,kBAAmB;AAG5B,MAAI,CAAC,SAAS,sBAAsB,CAAC,KAAK,iBAAiB,CAAE;AAE7D,QAAMA,gCAAa,KAAK;GACtB;GACY;GAYZ,kBAAkB;IAChB,GAAG,KAAK;IACR,+CAAuB;KACrB,aAAa,SAAS;KACtB,YAAY,KAAK;KAClB,CAAC;IACF,mBAAmBC;IAKnB,mBAAmBC;IAInB,qBAAqB;IACtB;GACD,aAAaC,eAAY;GACzB,gBAAgBA,eAAY;GAC5B,aAAa,SAAS,eAAe;GACrC,cAAc,SAAS,gBAAgB;GACxC,CAAC;;CAGJ,AAAQ,yBACN,UAC2B;EAC3B,MAAM,+DAAuC,SAAS,YAAY;AAClE,MAAI,gBAAgB,OAClB,QAAO;GACL;GACA,cAAc;GACd,oBAAoB;GACrB;AAGH,SAAO;GACL,aAAa;GACb,cAAc,SAAS,gBAAgB;GACvC,oBAAoB,SAAS,+DACD,SAAS,aAAa,GAC9C;GACL;;CAGH,AAAQ,cAAc,YAAgC;EACpD,IAAI;AAEJ,gBAAc,cAAc;AAE5B,MAAI,QAAQ,IAAI,iCACd,eAAc,WAAW,QAAQ,IAAI,iCAAiC;AAMxE,MAAI,OAAO,MAAM,YAAY,IAAI,cAAc,KAAK,cAAc,EAChE,OAAM,IAAI,MAAM,sCAAsC;AAGxD,OAAK,aAAa;;;AAItB,MAAM,YAAY,IAAI,iBAAiB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-client.d.cts","names":[],"sources":["../../../../src/v2/runtime/telemetry/telemetry-client.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"telemetry-client.d.cts","names":[],"sources":["../../../../src/v2/runtime/telemetry/telemetry-client.ts"],"mappings":";;;;;UAkBiB,gBAAA;EACf,OAAA,iBAAwB,eAAA,EACtB,KAAA,EAAO,CAAA,EACP,UAAA,EAAY,eAAA,CAAgB,CAAA,IAC3B,OAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-client.d.mts","names":[],"sources":["../../../../src/v2/runtime/telemetry/telemetry-client.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"telemetry-client.d.mts","names":[],"sources":["../../../../src/v2/runtime/telemetry/telemetry-client.ts"],"mappings":";;;;;UAkBiB,gBAAA;EACf,OAAA,iBAAwB,eAAA,EACtB,KAAA,EAAO,CAAA,EACP,UAAA,EAAY,eAAA,CAAgB,CAAA,IAC3B,OAAA;AAAA"}
|