@code-yeongyu/senpi 0.74.0 → 2026.5.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +4 -0
  3. package/dist/core/agent-session-services.d.ts.map +1 -1
  4. package/dist/core/agent-session-services.js +3 -1
  5. package/dist/core/agent-session-services.js.map +1 -1
  6. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  7. package/dist/core/extensions/builtin/anthropic-web-search/index.js +25 -14
  8. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  9. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  10. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js +56 -7
  11. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  12. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts +7 -3
  13. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/prompt-preset/presets.js +12 -4
  15. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  16. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -0
  17. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  18. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -1
  19. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  20. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +1 -1
  21. package/dist/core/extensions/builtin/todotools/continuation/runtime.js +7 -10
  22. package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +1 -1
  23. package/dist/core/extensions/builtin/todotools/index.d.ts +2 -2
  24. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/todotools/index.js +2 -2
  26. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  27. package/dist/core/extensions/builtin/todotools/settings.d.ts +6 -0
  28. package/dist/core/extensions/builtin/todotools/settings.d.ts.map +1 -0
  29. package/dist/core/extensions/builtin/todotools/settings.js +58 -0
  30. package/dist/core/extensions/builtin/todotools/settings.js.map +1 -0
  31. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +34 -0
  32. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -0
  33. package/dist/core/extensions/builtin/todotools/system-messages.js +82 -0
  34. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -0
  35. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/todotools/tools/todoread.js +3 -1
  37. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
  38. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
  39. package/dist/core/extensions/builtin/todotools/tools/todowrite.js +3 -1
  40. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
  41. package/dist/core/keybindings.d.ts +5 -0
  42. package/dist/core/keybindings.d.ts.map +1 -1
  43. package/dist/core/keybindings.js +10 -3
  44. package/dist/core/keybindings.js.map +1 -1
  45. package/dist/core/model-registry.d.ts.map +1 -1
  46. package/dist/core/model-registry.js +8 -3
  47. package/dist/core/model-registry.js.map +1 -1
  48. package/dist/core/resource-loader.d.ts +8 -0
  49. package/dist/core/resource-loader.d.ts.map +1 -1
  50. package/dist/core/resource-loader.js +168 -17
  51. package/dist/core/resource-loader.js.map +1 -1
  52. package/dist/core/tools/bash.d.ts.map +1 -1
  53. package/dist/core/tools/bash.js +11 -4
  54. package/dist/core/tools/bash.js.map +1 -1
  55. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  56. package/dist/modes/interactive/components/bash-execution.js +11 -3
  57. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  58. package/dist/modes/interactive/components/favorite-models-selector.d.ts +10 -4
  59. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  60. package/dist/modes/interactive/components/favorite-models-selector.js +56 -78
  61. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  62. package/dist/modes/interactive/components/model-favorites.d.ts +10 -0
  63. package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -0
  64. package/dist/modes/interactive/components/model-favorites.js +53 -0
  65. package/dist/modes/interactive/components/model-favorites.js.map +1 -0
  66. package/dist/modes/interactive/components/model-selector.d.ts +9 -1
  67. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  68. package/dist/modes/interactive/components/model-selector.js +52 -10
  69. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  70. package/dist/modes/interactive/interactive-mode.d.ts +4 -0
  71. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  72. package/dist/modes/interactive/interactive-mode.js +83 -94
  73. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  74. package/docs/models.md +26 -1
  75. package/docs/settings.md +14 -0
  76. package/package.json +5 -8
  77. package/dist/core/extensions/builtin/agent-system/agent-types.d.ts +0 -25
  78. package/dist/core/extensions/builtin/agent-system/agent-types.d.ts.map +0 -1
  79. package/dist/core/extensions/builtin/agent-system/agent-types.js +0 -38
  80. package/dist/core/extensions/builtin/agent-system/agent-types.js.map +0 -1
  81. package/dist/core/extensions/builtin/agent-system/builtin-agents.d.ts +0 -3
  82. package/dist/core/extensions/builtin/agent-system/builtin-agents.d.ts.map +0 -1
  83. package/dist/core/extensions/builtin/agent-system/builtin-agents.js +0 -32
  84. package/dist/core/extensions/builtin/agent-system/builtin-agents.js.map +0 -1
  85. package/dist/core/extensions/builtin/agent-system/index.d.ts +0 -3
  86. package/dist/core/extensions/builtin/agent-system/index.d.ts.map +0 -1
  87. package/dist/core/extensions/builtin/agent-system/index.js +0 -42
  88. package/dist/core/extensions/builtin/agent-system/index.js.map +0 -1
  89. package/dist/core/extensions/builtin/agent-system/loader.d.ts +0 -4
  90. package/dist/core/extensions/builtin/agent-system/loader.d.ts.map +0 -1
  91. package/dist/core/extensions/builtin/agent-system/loader.js +0 -59
  92. package/dist/core/extensions/builtin/agent-system/loader.js.map +0 -1
  93. package/dist/core/extensions/builtin/agent-system/permission.d.ts +0 -11
  94. package/dist/core/extensions/builtin/agent-system/permission.d.ts.map +0 -1
  95. package/dist/core/extensions/builtin/agent-system/permission.js +0 -24
  96. package/dist/core/extensions/builtin/agent-system/permission.js.map +0 -1
  97. package/dist/core/extensions/builtin/agent-system/registry.d.ts +0 -10
  98. package/dist/core/extensions/builtin/agent-system/registry.d.ts.map +0 -1
  99. package/dist/core/extensions/builtin/agent-system/registry.js +0 -50
  100. package/dist/core/extensions/builtin/agent-system/registry.js.map +0 -1
  101. package/dist/core/extensions/builtin/agent-system/types.d.ts +0 -9
  102. package/dist/core/extensions/builtin/agent-system/types.d.ts.map +0 -1
  103. package/dist/core/extensions/builtin/agent-system/types.js +0 -2
  104. package/dist/core/extensions/builtin/agent-system/types.js.map +0 -1
  105. package/dist/core/extensions/builtin/agent-system/wildcard.d.ts +0 -4
  106. package/dist/core/extensions/builtin/agent-system/wildcard.d.ts.map +0 -1
  107. package/dist/core/extensions/builtin/agent-system/wildcard.js +0 -58
  108. package/dist/core/extensions/builtin/agent-system/wildcard.js.map +0 -1
  109. package/dist/core/extensions/builtin/anthropic-web-fetch/index.d.ts +0 -7
  110. package/dist/core/extensions/builtin/anthropic-web-fetch/index.d.ts.map +0 -1
  111. package/dist/core/extensions/builtin/anthropic-web-fetch/index.js +0 -112
  112. package/dist/core/extensions/builtin/anthropic-web-fetch/index.js.map +0 -1
@@ -1,58 +0,0 @@
1
- export { Wildcard };
2
- var Wildcard;
3
- (function (Wildcard) {
4
- function match(value, pattern) {
5
- if (value === "" && pattern === "") {
6
- return true;
7
- }
8
- if (pattern === "") {
9
- return false;
10
- }
11
- if (value === "" && pattern === "*") {
12
- return true;
13
- }
14
- if (value === "") {
15
- for (let i = 0; i < pattern.length; i++) {
16
- if (pattern[i] !== "*") {
17
- return false;
18
- }
19
- }
20
- return true;
21
- }
22
- let valueIdx = 0;
23
- let patternIdx = 0;
24
- let starIdx = -1;
25
- let matchIdx = 0;
26
- while (valueIdx < value.length) {
27
- const patternChar = pattern[patternIdx];
28
- const valueChar = value[valueIdx];
29
- if (patternChar === "?") {
30
- valueIdx++;
31
- patternIdx++;
32
- }
33
- else if (patternChar === "*") {
34
- starIdx = patternIdx;
35
- matchIdx = valueIdx;
36
- patternIdx++;
37
- }
38
- else if (patternChar === valueChar) {
39
- valueIdx++;
40
- patternIdx++;
41
- }
42
- else if (starIdx >= 0) {
43
- patternIdx = starIdx + 1;
44
- matchIdx++;
45
- valueIdx = matchIdx;
46
- }
47
- else {
48
- return false;
49
- }
50
- }
51
- while (patternIdx < pattern.length && pattern[patternIdx] === "*") {
52
- patternIdx++;
53
- }
54
- return patternIdx === pattern.length;
55
- }
56
- Wildcard.match = match;
57
- })(Wildcard || (Wildcard = {}));
58
- //# sourceMappingURL=wildcard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wildcard.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/agent-system/wildcard.ts"],"names":[],"mappings":"SAAiB,QAAQ;AAAzB,IAAiB,QAsDhB;AAtDD,WAAiB,QAAQ,EAAC;IACzB,SAAgB,KAAK,CAAC,KAAa,EAAE,OAAe,EAAW;QAC9D,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,OAAO,KAAK,CAAC;gBACd,CAAC;YACF,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;QACjB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,OAAO,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;YAElC,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;gBACzB,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,CAAC;YACd,CAAC;iBAAM,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;gBAChC,OAAO,GAAG,UAAU,CAAC;gBACrB,QAAQ,GAAG,QAAQ,CAAC;gBACpB,UAAU,EAAE,CAAC;YACd,CAAC;iBAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACtC,QAAQ,EAAE,CAAC;gBACX,UAAU,EAAE,CAAC;YACd,CAAC;iBAAM,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;gBACzB,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC;gBACzB,QAAQ,EAAE,CAAC;gBACX,QAAQ,GAAG,QAAQ,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACd,CAAC;QACF,CAAC;QAED,OAAO,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;YACnE,UAAU,EAAE,CAAC;QACd,CAAC;QAED,OAAO,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC;IAAA,CACrC;IApDe,SAAA,KAAK,QAoDpB,CAAA;AAAA,CACD,EAtDgB,QAAQ,KAAR,QAAQ,QAsDxB","sourcesContent":["export namespace Wildcard {\n\texport function match(value: string, pattern: string): boolean {\n\t\tif (value === \"\" && pattern === \"\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (pattern === \"\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (value === \"\" && pattern === \"*\") {\n\t\t\treturn true;\n\t\t}\n\t\tif (value === \"\") {\n\t\t\tfor (let i = 0; i < pattern.length; i++) {\n\t\t\t\tif (pattern[i] !== \"*\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\tlet valueIdx = 0;\n\t\tlet patternIdx = 0;\n\t\tlet starIdx = -1;\n\t\tlet matchIdx = 0;\n\n\t\twhile (valueIdx < value.length) {\n\t\t\tconst patternChar = pattern[patternIdx];\n\t\t\tconst valueChar = value[valueIdx];\n\n\t\t\tif (patternChar === \"?\") {\n\t\t\t\tvalueIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t} else if (patternChar === \"*\") {\n\t\t\t\tstarIdx = patternIdx;\n\t\t\t\tmatchIdx = valueIdx;\n\t\t\t\tpatternIdx++;\n\t\t\t} else if (patternChar === valueChar) {\n\t\t\t\tvalueIdx++;\n\t\t\t\tpatternIdx++;\n\t\t\t} else if (starIdx >= 0) {\n\t\t\t\tpatternIdx = starIdx + 1;\n\t\t\t\tmatchIdx++;\n\t\t\t\tvalueIdx = matchIdx;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\twhile (patternIdx < pattern.length && pattern[patternIdx] === \"*\") {\n\t\t\tpatternIdx++;\n\t\t}\n\n\t\treturn patternIdx === pattern.length;\n\t}\n}\n"]}
@@ -1,7 +0,0 @@
1
- import type { Api } from "@earendil-works/pi-ai";
2
- import type { ExtensionAPI } from "../../types.js";
3
- export declare function addAnthropicWebFetchToPayload(api: Api | undefined, payload: unknown): unknown;
4
- export declare function isAnthropicWebFetchEnabled(): boolean;
5
- export declare const ANTHROPIC_WEB_FETCH_SECTION = "\n## Web Fetch\n\nThe native web_fetch tool is available in this session.\nUse web_fetch to retrieve content from a URL when needed.\n";
6
- export default function anthropicWebFetchExtension(pi: ExtensionAPI): void;
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-web-fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoFnD,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAwB7F;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED,eAAO,MAAM,2BAA2B,2IAKvC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAkBzE","sourcesContent":["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\n\nconst NATIVE_WEB_FETCH_TYPE = \"web_fetch_20260309\";\nconst ENABLE_ENV = \"PI_ANTHROPIC_WEB_FETCH\";\nconst MAX_USES_ENV = \"PI_ANTHROPIC_WEB_FETCH_MAX_USES\";\n\nfunction parseEnableEnv(envVar: string): boolean {\n\tconst envValue = process.env[envVar];\n\tif (!envValue) {\n\t\treturn true;\n\t}\n\n\tconst normalized = envValue.trim().toLowerCase();\n\tif (normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\") {\n\t\treturn false;\n\t}\n\n\tif (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\") {\n\t\treturn true;\n\t}\n\n\t// Unknown values fall back to default-on behavior.\n\treturn true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isWebFetchType(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.startsWith(\"web_fetch_\");\n}\n\nfunction parseMaxUses(): number | undefined {\n\tconst envValue = process.env[MAX_USES_ENV];\n\tif (!envValue) {\n\t\treturn undefined;\n\t}\n\n\tconst parsed = Number.parseInt(envValue, 10);\n\tif (Number.isNaN(parsed) || parsed <= 0) {\n\t\treturn undefined;\n\t}\n\n\treturn parsed;\n}\n\nfunction sanitizeTools(tools: unknown[]): ToolDefinition[] {\n\tconst sanitized: ToolDefinition[] = [];\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst name = tool.name;\n\t\tconst type = tool.type;\n\t\tconst stripLegacyWebfetch = name === \"webfetch\" && !isWebFetchType(type);\n\t\tconst stripUnderscoreFunction = name === \"web_fetch\" && !isWebFetchType(type);\n\t\tif (!stripLegacyWebfetch && !stripUnderscoreFunction) {\n\t\t\tsanitized.push(tool);\n\t\t}\n\t}\n\n\treturn sanitized;\n}\n\nfunction createNativeWebFetchTool(): ToolDefinition {\n\tconst maxUses = parseMaxUses();\n\tif (maxUses === undefined) {\n\t\treturn {\n\t\t\ttype: NATIVE_WEB_FETCH_TYPE,\n\t\t\tname: \"web_fetch\",\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: NATIVE_WEB_FETCH_TYPE,\n\t\tname: \"web_fetch\",\n\t\tmax_uses: maxUses,\n\t};\n}\n\nexport function addAnthropicWebFetchToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (api !== \"anthropic-messages\") {\n\t\treturn payload;\n\t}\n\n\tif (!isAnthropicWebFetchEnabled()) {\n\t\treturn payload;\n\t}\n\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst sanitizedTools = sanitizeTools(tools);\n\tconst hasNativeWebFetch = sanitizedTools.some((tool) => isWebFetchType(tool.type));\n\tif (!hasNativeWebFetch) {\n\t\tsanitizedTools.push(createNativeWebFetchTool());\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport function isAnthropicWebFetchEnabled(): boolean {\n\treturn parseEnableEnv(ENABLE_ENV);\n}\n\nexport const ANTHROPIC_WEB_FETCH_SECTION = `\n## Web Fetch\n\nThe native web_fetch tool is available in this session.\nUse web_fetch to retrieve content from a URL when needed.\n`;\n\nexport default function anthropicWebFetchExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addAnthropicWebFetchToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (ctx.model?.api !== \"anthropic-messages\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isAnthropicWebFetchEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${ANTHROPIC_WEB_FETCH_SECTION}`,\n\t\t};\n\t});\n}\n"]}
@@ -1,112 +0,0 @@
1
- const NATIVE_WEB_FETCH_TYPE = "web_fetch_20260309";
2
- const ENABLE_ENV = "PI_ANTHROPIC_WEB_FETCH";
3
- const MAX_USES_ENV = "PI_ANTHROPIC_WEB_FETCH_MAX_USES";
4
- function parseEnableEnv(envVar) {
5
- const envValue = process.env[envVar];
6
- if (!envValue) {
7
- return true;
8
- }
9
- const normalized = envValue.trim().toLowerCase();
10
- if (normalized === "0" || normalized === "false" || normalized === "no" || normalized === "off") {
11
- return false;
12
- }
13
- if (normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on") {
14
- return true;
15
- }
16
- // Unknown values fall back to default-on behavior.
17
- return true;
18
- }
19
- function isRecord(value) {
20
- return typeof value === "object" && value !== null;
21
- }
22
- function isWebFetchType(value) {
23
- return typeof value === "string" && value.startsWith("web_fetch_");
24
- }
25
- function parseMaxUses() {
26
- const envValue = process.env[MAX_USES_ENV];
27
- if (!envValue) {
28
- return undefined;
29
- }
30
- const parsed = Number.parseInt(envValue, 10);
31
- if (Number.isNaN(parsed) || parsed <= 0) {
32
- return undefined;
33
- }
34
- return parsed;
35
- }
36
- function sanitizeTools(tools) {
37
- const sanitized = [];
38
- for (const tool of tools) {
39
- if (!isRecord(tool)) {
40
- continue;
41
- }
42
- const name = tool.name;
43
- const type = tool.type;
44
- const stripLegacyWebfetch = name === "webfetch" && !isWebFetchType(type);
45
- const stripUnderscoreFunction = name === "web_fetch" && !isWebFetchType(type);
46
- if (!stripLegacyWebfetch && !stripUnderscoreFunction) {
47
- sanitized.push(tool);
48
- }
49
- }
50
- return sanitized;
51
- }
52
- function createNativeWebFetchTool() {
53
- const maxUses = parseMaxUses();
54
- if (maxUses === undefined) {
55
- return {
56
- type: NATIVE_WEB_FETCH_TYPE,
57
- name: "web_fetch",
58
- };
59
- }
60
- return {
61
- type: NATIVE_WEB_FETCH_TYPE,
62
- name: "web_fetch",
63
- max_uses: maxUses,
64
- };
65
- }
66
- export function addAnthropicWebFetchToPayload(api, payload) {
67
- if (api !== "anthropic-messages") {
68
- return payload;
69
- }
70
- if (!isAnthropicWebFetchEnabled()) {
71
- return payload;
72
- }
73
- if (!isRecord(payload)) {
74
- return payload;
75
- }
76
- const tools = Array.isArray(payload.tools) ? payload.tools : [];
77
- const sanitizedTools = sanitizeTools(tools);
78
- const hasNativeWebFetch = sanitizedTools.some((tool) => isWebFetchType(tool.type));
79
- if (!hasNativeWebFetch) {
80
- sanitizedTools.push(createNativeWebFetchTool());
81
- }
82
- return {
83
- ...payload,
84
- tools: sanitizedTools,
85
- };
86
- }
87
- export function isAnthropicWebFetchEnabled() {
88
- return parseEnableEnv(ENABLE_ENV);
89
- }
90
- export const ANTHROPIC_WEB_FETCH_SECTION = `
91
- ## Web Fetch
92
-
93
- The native web_fetch tool is available in this session.
94
- Use web_fetch to retrieve content from a URL when needed.
95
- `;
96
- export default function anthropicWebFetchExtension(pi) {
97
- pi.on("before_provider_request", (event, ctx) => {
98
- return addAnthropicWebFetchToPayload(ctx.model?.api, event.payload);
99
- });
100
- pi.on("before_agent_start", async (event, ctx) => {
101
- if (ctx.model?.api !== "anthropic-messages") {
102
- return undefined;
103
- }
104
- if (!isAnthropicWebFetchEnabled()) {
105
- return undefined;
106
- }
107
- return {
108
- systemPrompt: `${event.systemPrompt}\n${ANTHROPIC_WEB_FETCH_SECTION}`,
109
- };
110
- });
111
- }
112
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/anthropic-web-fetch/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"../../types.js\";\n\ntype ToolDefinition = Record<string, unknown>;\n\nconst NATIVE_WEB_FETCH_TYPE = \"web_fetch_20260309\";\nconst ENABLE_ENV = \"PI_ANTHROPIC_WEB_FETCH\";\nconst MAX_USES_ENV = \"PI_ANTHROPIC_WEB_FETCH_MAX_USES\";\n\nfunction parseEnableEnv(envVar: string): boolean {\n\tconst envValue = process.env[envVar];\n\tif (!envValue) {\n\t\treturn true;\n\t}\n\n\tconst normalized = envValue.trim().toLowerCase();\n\tif (normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\") {\n\t\treturn false;\n\t}\n\n\tif (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\") {\n\t\treturn true;\n\t}\n\n\t// Unknown values fall back to default-on behavior.\n\treturn true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isWebFetchType(value: unknown): value is string {\n\treturn typeof value === \"string\" && value.startsWith(\"web_fetch_\");\n}\n\nfunction parseMaxUses(): number | undefined {\n\tconst envValue = process.env[MAX_USES_ENV];\n\tif (!envValue) {\n\t\treturn undefined;\n\t}\n\n\tconst parsed = Number.parseInt(envValue, 10);\n\tif (Number.isNaN(parsed) || parsed <= 0) {\n\t\treturn undefined;\n\t}\n\n\treturn parsed;\n}\n\nfunction sanitizeTools(tools: unknown[]): ToolDefinition[] {\n\tconst sanitized: ToolDefinition[] = [];\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst name = tool.name;\n\t\tconst type = tool.type;\n\t\tconst stripLegacyWebfetch = name === \"webfetch\" && !isWebFetchType(type);\n\t\tconst stripUnderscoreFunction = name === \"web_fetch\" && !isWebFetchType(type);\n\t\tif (!stripLegacyWebfetch && !stripUnderscoreFunction) {\n\t\t\tsanitized.push(tool);\n\t\t}\n\t}\n\n\treturn sanitized;\n}\n\nfunction createNativeWebFetchTool(): ToolDefinition {\n\tconst maxUses = parseMaxUses();\n\tif (maxUses === undefined) {\n\t\treturn {\n\t\t\ttype: NATIVE_WEB_FETCH_TYPE,\n\t\t\tname: \"web_fetch\",\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: NATIVE_WEB_FETCH_TYPE,\n\t\tname: \"web_fetch\",\n\t\tmax_uses: maxUses,\n\t};\n}\n\nexport function addAnthropicWebFetchToPayload(api: Api | undefined, payload: unknown): unknown {\n\tif (api !== \"anthropic-messages\") {\n\t\treturn payload;\n\t}\n\n\tif (!isAnthropicWebFetchEnabled()) {\n\t\treturn payload;\n\t}\n\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst sanitizedTools = sanitizeTools(tools);\n\tconst hasNativeWebFetch = sanitizedTools.some((tool) => isWebFetchType(tool.type));\n\tif (!hasNativeWebFetch) {\n\t\tsanitizedTools.push(createNativeWebFetchTool());\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t};\n}\n\nexport function isAnthropicWebFetchEnabled(): boolean {\n\treturn parseEnableEnv(ENABLE_ENV);\n}\n\nexport const ANTHROPIC_WEB_FETCH_SECTION = `\n## Web Fetch\n\nThe native web_fetch tool is available in this session.\nUse web_fetch to retrieve content from a URL when needed.\n`;\n\nexport default function anthropicWebFetchExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addAnthropicWebFetchToPayload(ctx.model?.api, event.payload);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (ctx.model?.api !== \"anthropic-messages\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isAnthropicWebFetchEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${ANTHROPIC_WEB_FETCH_SECTION}`,\n\t\t};\n\t});\n}\n"]}