@asm-agent/coding-agent 0.8.7 → 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 (47) hide show
  1. package/CHANGELOG.md +4 -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-XSMQHGYB.js → anthropic-OFECORE7.js} +1 -1
  18. package/dist/bundle/{azure-openai-responses-XLQAIKKH.js → azure-openai-responses-AOVTLR6N.js} +2 -2
  19. package/dist/bundle/{bundled-modules-5OCN73BM.js → bundled-modules-JQCJDEIY.js} +3 -3
  20. package/dist/bundle/{chunk-2LPSALBF.js → chunk-7TB7CGPV.js} +11 -11
  21. package/dist/bundle/{chunk-YPNK4MRU.js → chunk-A65OM3TZ.js} +1 -1
  22. package/dist/bundle/{chunk-E3YE2Q7A.js → chunk-JC2TT4MZ.js} +33 -12
  23. package/dist/bundle/{chunk-IAQLPSMN.js → chunk-M67RGWDQ.js} +25 -6
  24. package/dist/bundle/{cli-main-QYX5R3LF.js → cli-main-FNHDQGQD.js} +3 -3
  25. package/dist/bundle/cli.js +1 -1
  26. package/dist/bundle/{google-ZXJEPWJA.js → google-RVJL6RIQ.js} +1 -1
  27. package/dist/bundle/{google-vertex-WAF3RIJ6.js → google-vertex-EZTRRRH6.js} +1 -1
  28. package/dist/bundle/{main-EOUAQCJH.js → main-IYXIIAJN.js} +3 -3
  29. package/dist/bundle/{mistral-GDZXSXRS.js → mistral-FSGKSMA7.js} +1 -1
  30. package/dist/bundle/{openai-codex-responses-7XMPW4LG.js → openai-codex-responses-VM5Y564D.js} +2 -2
  31. package/dist/bundle/{openai-completions-LNSVGDMF.js → openai-completions-X46FOQDN.js} +2 -2
  32. package/dist/bundle/{openai-responses-MFZOBMIT.js → openai-responses-SOQNEPBE.js} +2 -2
  33. package/dist/core/model-registry.d.ts.map +1 -1
  34. package/dist/core/model-registry.js +1 -1
  35. package/dist/core/model-registry.js.map +1 -1
  36. package/dist/core/ollama-models.d.ts +3 -1
  37. package/dist/core/ollama-models.d.ts.map +1 -1
  38. package/dist/core/ollama-models.js +31 -10
  39. package/dist/core/ollama-models.js.map +1 -1
  40. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  41. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  42. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  43. package/examples/extensions/sandbox/package-lock.json +2 -2
  44. package/examples/extensions/sandbox/package.json +1 -1
  45. package/examples/extensions/with-deps/package-lock.json +2 -2
  46. package/examples/extensions/with-deps/package.json +1 -1
  47. package/package.json +5 -5
@@ -1,3 +1,5 @@
1
+ import { get as httpGet } from "node:http";
2
+ import { get as httpsGet } from "node:https";
1
3
  const DEFAULT_OLLAMA_HOST = "http://127.0.0.1:11434";
2
4
  const OLLAMA_DISCOVERY_TIMEOUT_MS = 1500;
3
5
  export function getOllamaBaseUrl() {
@@ -8,6 +10,33 @@ export function getOllamaBaseUrl() {
8
10
  function getOllamaTagsUrl(baseUrl) {
9
11
  return `${baseUrl.replace(/\/v1$/, "")}/api/tags`;
10
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
+ }
11
40
  function modelFromTag(tag, baseUrl) {
12
41
  if (typeof tag.name !== "string" || !tag.name.trim())
13
42
  return undefined;
@@ -33,15 +62,10 @@ function modelFromTag(tag, baseUrl) {
33
62
  },
34
63
  };
35
64
  }
36
- export async function discoverOllamaModels() {
65
+ export async function discoverOllamaModels(request = requestJson) {
37
66
  const baseUrl = getOllamaBaseUrl();
38
- const controller = new AbortController();
39
- const timeout = setTimeout(() => controller.abort(), OLLAMA_DISCOVERY_TIMEOUT_MS);
40
67
  try {
41
- const response = await fetch(getOllamaTagsUrl(baseUrl), { signal: controller.signal });
42
- if (!response.ok)
43
- return [];
44
- const payload = (await response.json());
68
+ const payload = (await request(getOllamaTagsUrl(baseUrl), OLLAMA_DISCOVERY_TIMEOUT_MS));
45
69
  if (!Array.isArray(payload.models))
46
70
  return [];
47
71
  return payload.models.flatMap((tag) => tag && typeof tag === "object" ? [modelFromTag(tag, baseUrl)].filter(Boolean) : []);
@@ -49,8 +73,5 @@ export async function discoverOllamaModels() {
49
73
  catch {
50
74
  return [];
51
75
  }
52
- finally {
53
- clearTimeout(timeout);
54
- }
55
76
  }
56
77
  //# sourceMappingURL=ollama-models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ollama-models.js","sourceRoot":"","sources":["../../src/core/ollama-models.ts"],"names":[],"mappings":"AAEA,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AACrD,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEzC,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;AAOD,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,GAA2C;IACpF,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,2BAA2B,CAAC,CAAC;IAClF,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACvF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAChE,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;YAAS,CAAC;QACV,YAAY,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AAAA,CACD","sourcesContent":["import type { Model } from \"@asm-agent/ai\";\n\nconst DEFAULT_OLLAMA_HOST = \"http://127.0.0.1:11434\";\nconst OLLAMA_DISCOVERY_TIMEOUT_MS = 1500;\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\ninterface OllamaTag {\n\tname?: unknown;\n\tdetails?: { family?: unknown; parameter_size?: 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(): Promise<Model<\"openai-completions\">[]> {\n\tconst baseUrl = getOllamaBaseUrl();\n\tconst controller = new AbortController();\n\tconst timeout = setTimeout(() => controller.abort(), OLLAMA_DISCOVERY_TIMEOUT_MS);\n\ttry {\n\t\tconst response = await fetch(getOllamaTagsUrl(baseUrl), { signal: controller.signal });\n\t\tif (!response.ok) return [];\n\t\tconst payload = (await response.json()) 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} finally {\n\t\tclearTimeout(timeout);\n\t}\n}\n"]}
1
+ {"version":3,"file":"ollama-models.js","sourceRoot":"","sources":["../../src/core/ollama-models.ts"],"names":[],"mappings":"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","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,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.8.7",
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.7",
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.7",
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.7",
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.7",
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.7",
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.7",
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.7",
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.7",
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.7",
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.7",
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.7",
52
- "@asm-agent/ai": "^0.8.7",
53
- "@asm-agent/postgres": "^0.8.7",
54
- "@asm-agent/tui": "^0.8.7",
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",