@asm-agent/coding-agent 0.8.6 → 0.8.8

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 (55) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/asm-agent-runtime/src/rlm/__pycache__/__init__.cpython-313.pyc +0 -0
  3. package/dist/asm-agent-runtime/src/rlm/__pycache__/_winjob.cpython-313.pyc +0 -0
  4. package/dist/asm-agent-runtime/src/rlm/__pycache__/bash.cpython-313.pyc +0 -0
  5. package/dist/asm-agent-runtime/src/rlm/__pycache__/harness.cpython-313.pyc +0 -0
  6. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp.cpython-313.pyc +0 -0
  7. package/dist/asm-agent-runtime/src/rlm/__pycache__/mcp_base.cpython-313.pyc +0 -0
  8. package/dist/asm-agent-runtime/src/rlm/__pycache__/repl.cpython-313.pyc +0 -0
  9. package/dist/asm-agent-runtime/test/__pycache__/test_agent_message_skill.cpython-313.pyc +0 -0
  10. package/dist/asm-agent-runtime/test/__pycache__/test_bash.cpython-313.pyc +0 -0
  11. package/dist/asm-agent-runtime/test/__pycache__/test_harness.cpython-313.pyc +0 -0
  12. package/dist/asm-agent-runtime/test/__pycache__/test_mcp.cpython-313.pyc +0 -0
  13. package/dist/asm-agent-runtime/test/__pycache__/test_mcp_base.cpython-313.pyc +0 -0
  14. package/dist/asm-agent-runtime/test/__pycache__/test_repl.cpython-313.pyc +0 -0
  15. package/dist/asm-agent-runtime/test/__pycache__/test_subagent_registry.cpython-313.pyc +0 -0
  16. package/dist/asm-agent-runtime/test/__pycache__/test_winjob.cpython-313.pyc +0 -0
  17. package/dist/bundle/{anthropic-CILMWJ23.js → anthropic-OFECORE7.js} +1 -1
  18. package/dist/bundle/{azure-openai-responses-TPNZ54LG.js → azure-openai-responses-AOVTLR6N.js} +2 -2
  19. package/dist/bundle/{bundled-modules-SKYRKITN.js → bundled-modules-JQCJDEIY.js} +4 -4
  20. package/dist/bundle/{chunk-EFDSSG52.js → chunk-7TB7CGPV.js} +319 -292
  21. package/dist/bundle/{chunk-IYXHHLR6.js → chunk-A65OM3TZ.js} +1 -1
  22. package/dist/bundle/{chunk-J6ATXG62.js → chunk-CMMSLBAW.js} +12 -8
  23. package/dist/bundle/{chunk-YYVQTKC6.js → chunk-JC2TT4MZ.js} +88 -4
  24. package/dist/bundle/{chunk-7QIBGY2R.js → chunk-M67RGWDQ.js} +597 -191
  25. package/dist/bundle/{cli-main-O3HK7MNQ.js → cli-main-FNHDQGQD.js} +4 -4
  26. package/dist/bundle/cli.js +1 -1
  27. package/dist/bundle/{compile-UQNZ2TRI.js → compile-BYYUFOG3.js} +1 -1
  28. package/dist/bundle/{google-3TL5FKLN.js → google-RVJL6RIQ.js} +1 -1
  29. package/dist/bundle/{google-vertex-WVFMK6QO.js → google-vertex-EZTRRRH6.js} +1 -1
  30. package/dist/bundle/{main-4QYKME2K.js → main-IYXIIAJN.js} +4 -4
  31. package/dist/bundle/{mistral-QV2OSBWW.js → mistral-FSGKSMA7.js} +1 -1
  32. package/dist/bundle/{openai-codex-responses-J2GJ2FAO.js → openai-codex-responses-VM5Y564D.js} +2 -2
  33. package/dist/bundle/{openai-completions-W622H2EL.js → openai-completions-X46FOQDN.js} +5 -2
  34. package/dist/bundle/{openai-responses-V75QG5T7.js → openai-responses-SOQNEPBE.js} +2 -2
  35. package/dist/core/model-registry.d.ts.map +1 -1
  36. package/dist/core/model-registry.js +9 -1
  37. package/dist/core/model-registry.js.map +1 -1
  38. package/dist/core/ollama-models.d.ts +6 -0
  39. package/dist/core/ollama-models.d.ts.map +1 -0
  40. package/dist/core/ollama-models.js +77 -0
  41. package/dist/core/ollama-models.js.map +1 -0
  42. package/dist/core/provider-display-names.d.ts.map +1 -1
  43. package/dist/core/provider-display-names.js +1 -0
  44. package/dist/core/provider-display-names.js.map +1 -1
  45. package/dist/skills/request-report/SKILL.md +19 -0
  46. package/docs/models.md +2 -0
  47. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  48. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  49. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  50. package/examples/extensions/sandbox/package-lock.json +2 -2
  51. package/examples/extensions/sandbox/package.json +1 -1
  52. package/examples/extensions/with-deps/package-lock.json +2 -2
  53. package/examples/extensions/with-deps/package.json +1 -1
  54. package/package.json +5 -5
  55. package/skills/request-report/SKILL.md +19 -0
@@ -0,0 +1,77 @@
1
+ import { get as httpGet } from "node:http";
2
+ import { get as httpsGet } from "node:https";
3
+ const DEFAULT_OLLAMA_HOST = "http://127.0.0.1:11434";
4
+ const OLLAMA_DISCOVERY_TIMEOUT_MS = 1500;
5
+ export function getOllamaBaseUrl() {
6
+ const configured = process.env.OLLAMA_HOST?.trim() || DEFAULT_OLLAMA_HOST;
7
+ const host = configured.replace(/\/$/, "");
8
+ return host.endsWith("/v1") ? host : `${host}/v1`;
9
+ }
10
+ function getOllamaTagsUrl(baseUrl) {
11
+ return `${baseUrl.replace(/\/v1$/, "")}/api/tags`;
12
+ }
13
+ function requestJson(url, timeoutMs) {
14
+ return new Promise((resolve, reject) => {
15
+ const parsed = new URL(url);
16
+ const get = parsed.protocol === "https:" ? httpsGet : httpGet;
17
+ const request = get(parsed, { timeout: timeoutMs }, (response) => {
18
+ let body = "";
19
+ response.setEncoding("utf8");
20
+ response.on("data", (chunk) => {
21
+ body += chunk;
22
+ });
23
+ response.on("end", () => {
24
+ if (response.statusCode !== 200) {
25
+ reject(new Error(`Ollama returned HTTP ${response.statusCode ?? "unknown"}`));
26
+ return;
27
+ }
28
+ try {
29
+ resolve(JSON.parse(body));
30
+ }
31
+ catch (error) {
32
+ reject(error);
33
+ }
34
+ });
35
+ });
36
+ request.on("error", reject);
37
+ request.on("timeout", () => request.destroy(new Error("Ollama discovery timed out")));
38
+ });
39
+ }
40
+ function modelFromTag(tag, baseUrl) {
41
+ if (typeof tag.name !== "string" || !tag.name.trim())
42
+ return undefined;
43
+ const name = tag.name.trim();
44
+ return {
45
+ id: name,
46
+ name,
47
+ api: "openai-completions",
48
+ provider: "ollama",
49
+ baseUrl,
50
+ reasoning: false,
51
+ input: ["text"],
52
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
53
+ contextWindow: 131072,
54
+ maxTokens: 8192,
55
+ compat: {
56
+ supportsStore: false,
57
+ supportsDeveloperRole: false,
58
+ supportsReasoningEffort: false,
59
+ maxTokensField: "max_tokens",
60
+ supportsUsageInStreaming: false,
61
+ supportsStrictMode: false,
62
+ },
63
+ };
64
+ }
65
+ export async function discoverOllamaModels(request = requestJson) {
66
+ const baseUrl = getOllamaBaseUrl();
67
+ try {
68
+ const payload = (await request(getOllamaTagsUrl(baseUrl), OLLAMA_DISCOVERY_TIMEOUT_MS));
69
+ if (!Array.isArray(payload.models))
70
+ return [];
71
+ return payload.models.flatMap((tag) => tag && typeof tag === "object" ? [modelFromTag(tag, baseUrl)].filter(Boolean) : []);
72
+ }
73
+ catch {
74
+ return [];
75
+ }
76
+ }
77
+ //# sourceMappingURL=ollama-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-models.js","sourceRoot":"","sources":["../../src/core/ollama-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AACrD,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAIzC,MAAM,UAAU,gBAAgB,GAAW;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC;IAC1E,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;AAAA,CAClD;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAU;IAClD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;AAAA,CAClD;AAED,SAAS,WAAW,CAAC,GAAW,EAAE,SAAiB,EAAoB;IACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;YACjE,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7B,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC;gBACtC,IAAI,IAAI,KAAK,CAAC;YAAA,CACd,CAAC,CAAC;YACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;gBACxB,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,UAAU,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;oBAC9E,OAAO;gBACR,CAAC;gBACD,IAAI,CAAC;oBACJ,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC;gBACtC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,MAAM,CAAC,KAAK,CAAC,CAAC;gBACf,CAAC;YAAA,CACD,CAAC,CAAC;QAAA,CACH,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;IAAA,CACtF,CAAC,CAAC;AAAA,CACH;AAMD,SAAS,YAAY,CAAC,GAAc,EAAE,OAAe,EAA2C;IAC/F,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IACvE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO;QACN,EAAE,EAAE,IAAI;QACR,IAAI;QACJ,GAAG,EAAE,oBAAoB;QACzB,QAAQ,EAAE,QAAQ;QAClB,OAAO;QACP,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;QAC1D,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,IAAI;QACf,MAAM,EAAE;YACP,aAAa,EAAE,KAAK;YACpB,qBAAqB,EAAE,KAAK;YAC5B,uBAAuB,EAAE,KAAK;YAC9B,cAAc,EAAE,YAAY;YAC5B,wBAAwB,EAAE,KAAK;YAC/B,kBAAkB,EAAE,KAAK;SACzB;KACD,CAAC;AAAA,CACF;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAO,GAAgB,WAAW,EAA0C;IACtH,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,2BAA2B,CAAC,CAAyB,CAAC;QAChH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACrC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAC9D,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AAAA,CACD","sourcesContent":["import { get as httpGet } from \"node:http\";\nimport { get as httpsGet } from \"node:https\";\nimport type { Model } from \"@asm-agent/ai\";\n\nconst DEFAULT_OLLAMA_HOST = \"http://127.0.0.1:11434\";\nconst OLLAMA_DISCOVERY_TIMEOUT_MS = 1500;\n\ntype JsonRequest = (url: string, timeoutMs: number) => Promise<unknown>;\n\nexport function getOllamaBaseUrl(): string {\n\tconst configured = process.env.OLLAMA_HOST?.trim() || DEFAULT_OLLAMA_HOST;\n\tconst host = configured.replace(/\\/$/, \"\");\n\treturn host.endsWith(\"/v1\") ? host : `${host}/v1`;\n}\n\nfunction getOllamaTagsUrl(baseUrl: string): string {\n\treturn `${baseUrl.replace(/\\/v1$/, \"\")}/api/tags`;\n}\n\nfunction requestJson(url: string, timeoutMs: number): Promise<unknown> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst parsed = new URL(url);\n\t\tconst get = parsed.protocol === \"https:\" ? httpsGet : httpGet;\n\t\tconst request = get(parsed, { timeout: timeoutMs }, (response) => {\n\t\t\tlet body = \"\";\n\t\t\tresponse.setEncoding(\"utf8\");\n\t\t\tresponse.on(\"data\", (chunk: string) => {\n\t\t\t\tbody += chunk;\n\t\t\t});\n\t\t\tresponse.on(\"end\", () => {\n\t\t\t\tif (response.statusCode !== 200) {\n\t\t\t\t\treject(new Error(`Ollama returned HTTP ${response.statusCode ?? \"unknown\"}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tresolve(JSON.parse(body) as unknown);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\trequest.on(\"error\", reject);\n\t\trequest.on(\"timeout\", () => request.destroy(new Error(\"Ollama discovery timed out\")));\n\t});\n}\n\ninterface OllamaTag {\n\tname?: unknown;\n}\n\nfunction modelFromTag(tag: OllamaTag, baseUrl: string): Model<\"openai-completions\"> | undefined {\n\tif (typeof tag.name !== \"string\" || !tag.name.trim()) return undefined;\n\tconst name = tag.name.trim();\n\treturn {\n\t\tid: name,\n\t\tname,\n\t\tapi: \"openai-completions\",\n\t\tprovider: \"ollama\",\n\t\tbaseUrl,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 131072,\n\t\tmaxTokens: 8192,\n\t\tcompat: {\n\t\t\tsupportsStore: false,\n\t\t\tsupportsDeveloperRole: false,\n\t\t\tsupportsReasoningEffort: false,\n\t\t\tmaxTokensField: \"max_tokens\",\n\t\t\tsupportsUsageInStreaming: false,\n\t\t\tsupportsStrictMode: false,\n\t\t},\n\t};\n}\n\nexport async function discoverOllamaModels(request: JsonRequest = requestJson): Promise<Model<\"openai-completions\">[]> {\n\tconst baseUrl = getOllamaBaseUrl();\n\ttry {\n\t\tconst payload = (await request(getOllamaTagsUrl(baseUrl), OLLAMA_DISCOVERY_TIMEOUT_MS)) as { models?: unknown };\n\t\tif (!Array.isArray(payload.models)) return [];\n\t\treturn payload.models.flatMap((tag) =>\n\t\t\ttag && typeof tag === \"object\" ? [modelFromTag(tag as OllamaTag, baseUrl)].filter(Boolean) : [],\n\t\t) as Model<\"openai-completions\">[];\n\t} catch {\n\t\treturn [];\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider-display-names.d.ts","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgClE,CAAC","sourcesContent":["export const BUILT_IN_PROVIDER_DISPLAY_NAMES: Record<string, string> = {\n\tanthropic: \"Anthropic\",\n\t\"amazon-bedrock\": \"Amazon Bedrock\",\n\t\"azure-openai-responses\": \"Azure OpenAI Responses\",\n\tcerebras: \"Cerebras\",\n\t\"cloudflare-ai-gateway\": \"Cloudflare AI Gateway\",\n\t\"cloudflare-workers-ai\": \"Cloudflare Workers AI\",\n\tdeepseek: \"DeepSeek\",\n\tfireworks: \"Fireworks\",\n\tgoogle: \"Google Gemini\",\n\t\"google-vertex\": \"Google Vertex AI\",\n\tgroq: \"Groq\",\n\thuggingface: \"Hugging Face\",\n\t\"kimi-coding\": \"Kimi For Coding\",\n\tmistral: \"Mistral\",\n\tminimax: \"MiniMax\",\n\t\"minimax-cn\": \"MiniMax (China)\",\n\tmoonshotai: \"Moonshot AI\",\n\t\"moonshotai-cn\": \"Moonshot AI (China)\",\n\topencode: \"OpenCode Zen\",\n\t\"opencode-go\": \"OpenCode Go\",\n\topenai: \"OpenAI\",\n\topenrouter: \"OpenRouter\",\n\t\"asm-agent-traces\": \"ASM Agent Traces\",\n\t\"prime-inference\": \"Prime Inference\",\n\t\"vercel-ai-gateway\": \"Vercel AI Gateway\",\n\txai: \"xAI\",\n\tzai: \"ZAI\",\n\txiaomi: \"Xiaomi MiMo\",\n\t\"xiaomi-token-plan-cn\": \"Xiaomi MiMo Token Plan (China)\",\n\t\"xiaomi-token-plan-ams\": \"Xiaomi MiMo Token Plan (Amsterdam)\",\n\t\"xiaomi-token-plan-sgp\": \"Xiaomi MiMo Token Plan (Singapore)\",\n};\n"]}
1
+ {"version":3,"file":"provider-display-names.d.ts","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiClE,CAAC","sourcesContent":["export const BUILT_IN_PROVIDER_DISPLAY_NAMES: Record<string, string> = {\n\tanthropic: \"Anthropic\",\n\t\"amazon-bedrock\": \"Amazon Bedrock\",\n\t\"azure-openai-responses\": \"Azure OpenAI Responses\",\n\tcerebras: \"Cerebras\",\n\t\"cloudflare-ai-gateway\": \"Cloudflare AI Gateway\",\n\t\"cloudflare-workers-ai\": \"Cloudflare Workers AI\",\n\tdeepseek: \"DeepSeek\",\n\tfireworks: \"Fireworks\",\n\tgoogle: \"Google Gemini\",\n\t\"google-vertex\": \"Google Vertex AI\",\n\tgroq: \"Groq\",\n\thuggingface: \"Hugging Face\",\n\t\"kimi-coding\": \"Kimi For Coding\",\n\tmistral: \"Mistral\",\n\tminimax: \"MiniMax\",\n\t\"minimax-cn\": \"MiniMax (China)\",\n\tmoonshotai: \"Moonshot AI\",\n\t\"moonshotai-cn\": \"Moonshot AI (China)\",\n\topencode: \"OpenCode Zen\",\n\t\"opencode-go\": \"OpenCode Go\",\n\topenai: \"OpenAI\",\n\tollama: \"Ollama\",\n\topenrouter: \"OpenRouter\",\n\t\"asm-agent-traces\": \"ASM Agent Traces\",\n\t\"prime-inference\": \"Prime Inference\",\n\t\"vercel-ai-gateway\": \"Vercel AI Gateway\",\n\txai: \"xAI\",\n\tzai: \"ZAI\",\n\txiaomi: \"Xiaomi MiMo\",\n\t\"xiaomi-token-plan-cn\": \"Xiaomi MiMo Token Plan (China)\",\n\t\"xiaomi-token-plan-ams\": \"Xiaomi MiMo Token Plan (Amsterdam)\",\n\t\"xiaomi-token-plan-sgp\": \"Xiaomi MiMo Token Plan (Singapore)\",\n};\n"]}
@@ -20,6 +20,7 @@ export const BUILT_IN_PROVIDER_DISPLAY_NAMES = {
20
20
  opencode: "OpenCode Zen",
21
21
  "opencode-go": "OpenCode Go",
22
22
  openai: "OpenAI",
23
+ ollama: "Ollama",
23
24
  openrouter: "OpenRouter",
24
25
  "asm-agent-traces": "ASM Agent Traces",
25
26
  "prime-inference": "Prime Inference",
@@ -1 +1 @@
1
- {"version":3,"file":"provider-display-names.js","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,+BAA+B,GAA2B;IACtE,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,gBAAgB;IAClC,wBAAwB,EAAE,wBAAwB;IAClD,QAAQ,EAAE,UAAU;IACpB,uBAAuB,EAAE,uBAAuB;IAChD,uBAAuB,EAAE,uBAAuB;IAChD,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,eAAe;IACvB,eAAe,EAAE,kBAAkB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,iBAAiB;IAChC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,qBAAqB;IACtC,QAAQ,EAAE,cAAc;IACxB,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,kBAAkB,EAAE,kBAAkB;IACtC,iBAAiB,EAAE,iBAAiB;IACpC,mBAAmB,EAAE,mBAAmB;IACxC,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,aAAa;IACrB,sBAAsB,EAAE,gCAAgC;IACxD,uBAAuB,EAAE,oCAAoC;IAC7D,uBAAuB,EAAE,oCAAoC;CAC7D,CAAC","sourcesContent":["export const BUILT_IN_PROVIDER_DISPLAY_NAMES: Record<string, string> = {\n\tanthropic: \"Anthropic\",\n\t\"amazon-bedrock\": \"Amazon Bedrock\",\n\t\"azure-openai-responses\": \"Azure OpenAI Responses\",\n\tcerebras: \"Cerebras\",\n\t\"cloudflare-ai-gateway\": \"Cloudflare AI Gateway\",\n\t\"cloudflare-workers-ai\": \"Cloudflare Workers AI\",\n\tdeepseek: \"DeepSeek\",\n\tfireworks: \"Fireworks\",\n\tgoogle: \"Google Gemini\",\n\t\"google-vertex\": \"Google Vertex AI\",\n\tgroq: \"Groq\",\n\thuggingface: \"Hugging Face\",\n\t\"kimi-coding\": \"Kimi For Coding\",\n\tmistral: \"Mistral\",\n\tminimax: \"MiniMax\",\n\t\"minimax-cn\": \"MiniMax (China)\",\n\tmoonshotai: \"Moonshot AI\",\n\t\"moonshotai-cn\": \"Moonshot AI (China)\",\n\topencode: \"OpenCode Zen\",\n\t\"opencode-go\": \"OpenCode Go\",\n\topenai: \"OpenAI\",\n\topenrouter: \"OpenRouter\",\n\t\"asm-agent-traces\": \"ASM Agent Traces\",\n\t\"prime-inference\": \"Prime Inference\",\n\t\"vercel-ai-gateway\": \"Vercel AI Gateway\",\n\txai: \"xAI\",\n\tzai: \"ZAI\",\n\txiaomi: \"Xiaomi MiMo\",\n\t\"xiaomi-token-plan-cn\": \"Xiaomi MiMo Token Plan (China)\",\n\t\"xiaomi-token-plan-ams\": \"Xiaomi MiMo Token Plan (Amsterdam)\",\n\t\"xiaomi-token-plan-sgp\": \"Xiaomi MiMo Token Plan (Singapore)\",\n};\n"]}
1
+ {"version":3,"file":"provider-display-names.js","sourceRoot":"","sources":["../../src/core/provider-display-names.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,+BAA+B,GAA2B;IACtE,SAAS,EAAE,WAAW;IACtB,gBAAgB,EAAE,gBAAgB;IAClC,wBAAwB,EAAE,wBAAwB;IAClD,QAAQ,EAAE,UAAU;IACpB,uBAAuB,EAAE,uBAAuB;IAChD,uBAAuB,EAAE,uBAAuB;IAChD,QAAQ,EAAE,UAAU;IACpB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,eAAe;IACvB,eAAe,EAAE,kBAAkB;IACnC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,iBAAiB;IAChC,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,iBAAiB;IAC/B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,qBAAqB;IACtC,QAAQ,EAAE,cAAc;IACxB,aAAa,EAAE,aAAa;IAC5B,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,UAAU,EAAE,YAAY;IACxB,kBAAkB,EAAE,kBAAkB;IACtC,iBAAiB,EAAE,iBAAiB;IACpC,mBAAmB,EAAE,mBAAmB;IACxC,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,aAAa;IACrB,sBAAsB,EAAE,gCAAgC;IACxD,uBAAuB,EAAE,oCAAoC;IAC7D,uBAAuB,EAAE,oCAAoC;CAC7D,CAAC","sourcesContent":["export const BUILT_IN_PROVIDER_DISPLAY_NAMES: Record<string, string> = {\n\tanthropic: \"Anthropic\",\n\t\"amazon-bedrock\": \"Amazon Bedrock\",\n\t\"azure-openai-responses\": \"Azure OpenAI Responses\",\n\tcerebras: \"Cerebras\",\n\t\"cloudflare-ai-gateway\": \"Cloudflare AI Gateway\",\n\t\"cloudflare-workers-ai\": \"Cloudflare Workers AI\",\n\tdeepseek: \"DeepSeek\",\n\tfireworks: \"Fireworks\",\n\tgoogle: \"Google Gemini\",\n\t\"google-vertex\": \"Google Vertex AI\",\n\tgroq: \"Groq\",\n\thuggingface: \"Hugging Face\",\n\t\"kimi-coding\": \"Kimi For Coding\",\n\tmistral: \"Mistral\",\n\tminimax: \"MiniMax\",\n\t\"minimax-cn\": \"MiniMax (China)\",\n\tmoonshotai: \"Moonshot AI\",\n\t\"moonshotai-cn\": \"Moonshot AI (China)\",\n\topencode: \"OpenCode Zen\",\n\t\"opencode-go\": \"OpenCode Go\",\n\topenai: \"OpenAI\",\n\tollama: \"Ollama\",\n\topenrouter: \"OpenRouter\",\n\t\"asm-agent-traces\": \"ASM Agent Traces\",\n\t\"prime-inference\": \"Prime Inference\",\n\t\"vercel-ai-gateway\": \"Vercel AI Gateway\",\n\txai: \"xAI\",\n\tzai: \"ZAI\",\n\txiaomi: \"Xiaomi MiMo\",\n\t\"xiaomi-token-plan-cn\": \"Xiaomi MiMo Token Plan (China)\",\n\t\"xiaomi-token-plan-ams\": \"Xiaomi MiMo Token Plan (Amsterdam)\",\n\t\"xiaomi-token-plan-sgp\": \"Xiaomi MiMo Token Plan (Singapore)\",\n};\n"]}
@@ -26,6 +26,25 @@ path = await request_report(
26
26
  )
27
27
  ```
28
28
 
29
+ ## Content fidelity
30
+
31
+ The report is the durable, self-contained counterpart of the final response.
32
+ Preserve all substantive user-facing content that the final response will contain,
33
+ including explanations, interpretations, rationale, tables, metrics, constraints,
34
+ caveats, and next steps. A short statement that an explanation was provided is
35
+ not a substitute for the explanation itself.
36
+
37
+ This is especially important when the user asks for a translation, a human-readable
38
+ explanation, an analysis, or a detailed answer: put the complete substantive answer
39
+ in the report. The `summary` argument may contain multiline Markdown with sections;
40
+ use it when needed instead of reducing the deliverable to one short paragraph. Do
41
+ not copy routine greetings, progress chatter, raw tool logs, or the full transcript.
42
+
43
+ Before sending the final response, compare it with the report.
44
+ No substantive section may exist only in the final response.
45
+ If necessary, update the report before completion so that it preserves the complete
46
+ deliverable.
47
+
29
48
  The skill:
30
49
 
31
50
  - creates `docs/report/` when needed;
package/docs/models.md CHANGED
@@ -36,6 +36,8 @@ For local models (Ollama, LM Studio, vLLM), only `id` is required per model:
36
36
 
37
37
  The `apiKey` is required but Ollama ignores it, so any value works.
38
38
 
39
+ When Ollama is running locally, ASM Agent discovers the models returned by `GET /api/tags` automatically. Open `/model`, search for `ollama`, and select an installed model. No `models.json` entry or API key is required. Set `OLLAMA_HOST` when Ollama runs on another host.
40
+
39
41
  Some OpenAI-compatible servers do not understand the `developer` role used for reasoning-capable models. For those providers, set `compat.supportsDeveloperRole` to `false` so ASM Agent sends the system prompt as a `system` message instead. If the server also does not support `reasoning_effort`, set `compat.supportsReasoningEffort` to `false` too.
40
42
 
41
43
  You can set `compat` at the provider level to apply to all models, or at the model level to override a specific model. This commonly applies to Ollama, vLLM, SGLang, and similar OpenAI-compatible servers.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.8.6",
9
+ "version": "0.8.8",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.8.6",
4
+ "version": "0.8.8",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.8.6",
4
+ "version": "0.8.8",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "0.8.6",
9
+ "version": "0.8.8",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.55"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "0.8.6",
4
+ "version": "0.8.8",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.8.6",
9
+ "version": "0.8.8",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.8.6",
4
+ "version": "0.8.8",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asm-agent/coding-agent",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
4
4
  "description": "Coding agent CLI with a persistent Python REPL kernel and session management",
5
5
  "type": "module",
6
6
  "asmAgentConfig": {
@@ -48,10 +48,10 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@agentclientprotocol/sdk": "^1.3.0",
51
- "@asm-agent/agent": "^0.8.6",
52
- "@asm-agent/ai": "^0.8.6",
53
- "@asm-agent/postgres": "^0.8.6",
54
- "@asm-agent/tui": "^0.8.6",
51
+ "@asm-agent/agent": "^0.8.8",
52
+ "@asm-agent/ai": "^0.8.8",
53
+ "@asm-agent/postgres": "^0.8.8",
54
+ "@asm-agent/tui": "^0.8.8",
55
55
  "@silvia-odwyer/photon-node": "^0.3.4",
56
56
  "chalk": "^5.5.0",
57
57
  "cli-highlight": "^2.1.11",
@@ -26,6 +26,25 @@ path = await request_report(
26
26
  )
27
27
  ```
28
28
 
29
+ ## Content fidelity
30
+
31
+ The report is the durable, self-contained counterpart of the final response.
32
+ Preserve all substantive user-facing content that the final response will contain,
33
+ including explanations, interpretations, rationale, tables, metrics, constraints,
34
+ caveats, and next steps. A short statement that an explanation was provided is
35
+ not a substitute for the explanation itself.
36
+
37
+ This is especially important when the user asks for a translation, a human-readable
38
+ explanation, an analysis, or a detailed answer: put the complete substantive answer
39
+ in the report. The `summary` argument may contain multiline Markdown with sections;
40
+ use it when needed instead of reducing the deliverable to one short paragraph. Do
41
+ not copy routine greetings, progress chatter, raw tool logs, or the full transcript.
42
+
43
+ Before sending the final response, compare it with the report.
44
+ No substantive section may exist only in the final response.
45
+ If necessary, update the report before completion so that it preserves the complete
46
+ deliverable.
47
+
29
48
  The skill:
30
49
 
31
50
  - creates `docs/report/` when needed;