@agentproto/adapter-jcode 0.2.1 → 0.2.4

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/JCODE.md CHANGED
@@ -6,8 +6,15 @@ coordination, and broad provider support.
6
6
 
7
7
  ## Protocol
8
8
 
9
- `print` — spawns `jcode run "<prompt>"` per turn. No ACP or structured JSON
10
- streaming mode is currently documented; stdout is captured as raw text.
9
+ `print` — spawns `jcode run --ndjson "<prompt>"` per turn and parses the
10
+ NDJSON event stream (`jcode-stream-json` schema). No ACP or interactive
11
+ mode is currently documented.
12
+
13
+ If the adapter cannot spawn `jcode` because a required interactive setup
14
+ step needs a TTY, the spawn fails fast with exit code `78`
15
+ (`EXIT_SETUP_NEEDS_TTY`) and the install result carries
16
+ `needsInteractiveSetup: true` so callers can offer an "Open Setup Terminal"
17
+ option.
11
18
 
12
19
  ## Installation
13
20
 
@@ -50,6 +57,5 @@ Interactive login is also available: `jcode login --provider <name>`.
50
57
  ## Known gaps
51
58
 
52
59
  - No ACP mode — adapter uses print/headless arm
53
- - No structured JSON streaming output — events are raw text
54
60
  - Swarm coordination not yet wired into the adapter
55
61
  - Browser tool (Firefox Agent Bridge) not exposed
package/dist/index.mjs CHANGED
@@ -111,7 +111,7 @@ var jcode = defineAgentCli({
111
111
  {
112
112
  id: "model",
113
113
  type: "string",
114
- description: "Model id for this run (e.g. `claude-sonnet-4-5`). Forwarded to `--model`.",
114
+ description: "Model id for this run (e.g. `claude-sonnet-4-5`). Forwarded to `--model`. An id jcode can't resolve makes its CLI silently fall back to its OWN default model \u2014 the print arm detects that from the NDJSON `start` line's reported model and aborts the turn loudly instead (derived-from-model guard; see PrintArmOptions.expectedModel).",
115
115
  bin_args_template: ["--model", "{value}"]
116
116
  },
117
117
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @agentproto/adapter-jcode — AIP-45 adapter for 1jehuang/jcode.\n *\n * jcode is a RAM-efficient Rust coding agent with multi-provider support\n * (Claude, OpenAI, Gemini, OpenRouter, Copilot, DeepSeek, Groq, Mistral,\n * Ollama, and OpenAI-compatible endpoints). No ACP mode is documented, so\n * this is a `protocol: \"print\"` (headless) arm: we spawn `jcode run\n * --ndjson \"<prompt>\"` per turn and map its NDJSON stream (see the\n * `jcode-ndjson` mapper in the driver's print-arm).\n *\n * Argv order matters: `run` is a clap SUBCOMMAND, so it lives in\n * `bin_args` (the spawn base) — every composed flag (`--ndjson`,\n * `--model`, `--resume`) must come AFTER it or jcode rejects the argv\n * (`error: unexpected argument '--json' found`). The prompt is\n * positional, not a flag.\n *\n * import { jcode, jcodeRuntime } from \"@agentproto/adapter-jcode\"\n * const session = await jcodeRuntime().start({\n * env: { ANTHROPIC_API_KEY: \"sk-...\" },\n * })\n * for await (const evt of session.send({ role: \"user\", content: \"...\" })) {\n * console.log(evt)\n * }\n * await session.close()\n */\n\nimport {\n createAgentCliRuntime,\n defineAgentCli,\n type AgentCliHandle,\n type AgentCliRuntime,\n} from \"@agentproto/driver-agent-cli\"\nimport { listModels } from \"@agentproto/model-catalog\"\nimport {\n deriveDeclaredCapabilities,\n type CapabilityStrategy,\n type ProviderCapability,\n} from \"@agentproto/provider-kit\"\n\n/**\n * Build jcode's model menu from the shared provider catalog. jcode accepts\n * bare model ids via `--model`; the provider is inferred from the id or\n * specified explicitly via `--provider`.\n */\nfunction buildJcodeModelMenu(): Array<{ id: string; provider: string }> {\n const supported = [\n { provider: \"anthropic\", prefix: \"anthropic\" },\n { provider: \"openai\", prefix: \"openai\" },\n { provider: \"openrouter\", prefix: \"openrouter\" },\n { provider: \"google\", prefix: \"google\" },\n { provider: \"deepseek\", prefix: \"deepseek\" },\n { provider: \"groq\", prefix: \"groq\" },\n { provider: \"mistral\", prefix: \"mistral\" },\n ] as const\n\n const seen = new Set<string>()\n const out: Array<{ id: string; provider: string }> = []\n\n for (const { provider, prefix } of supported) {\n for (const model of listModels({ kind: \"llm\", provider })) {\n const bareId = model.id\n const canonicalId = bareId.includes(\"/\") ? bareId : `${prefix}/${bareId}`\n const id =\n provider === \"openrouter\" ? `openrouter/${bareId}` : canonicalId\n if (seen.has(id)) continue\n seen.add(id)\n out.push({ id, provider })\n }\n }\n\n return out.sort((a, b) => {\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider)\n return a.id.localeCompare(b.id)\n })\n}\n\nexport const jcode: AgentCliHandle = defineAgentCli({\n name: \"jcode\",\n id: \"jcode\",\n description:\n \"1jehuang/jcode — RAM-efficient Rust coding agent with semantic memory, \" +\n \"multi-agent swarm, and broad provider support (Claude, OpenAI, Gemini, \" +\n \"OpenRouter, Copilot, DeepSeek, Groq, Mistral, Ollama). Spawned via \" +\n \"`jcode run --ndjson` in headless mode. No ACP; print/headless arm.\",\n version: \"0.1.0\",\n bin: \"jcode\",\n // `run` is a clap subcommand — it must precede every composed flag, so it\n // lives in the spawn base rather than as a print `prompt_flag` (which\n // would land AFTER `--ndjson`/`--model` and be rejected by jcode).\n bin_args: [\"run\"],\n install: [\n { method: \"brew\", package: \"1jehuang/jcode/jcode\" },\n { method: \"curl\", url: \"https://jcode.sh/install\" },\n { method: \"cargo\", package: \"jcode\" },\n ],\n version_check: {\n cmd: \"jcode --version\",\n parse: \"(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)\",\n range: \">=0.1.0\",\n timeout_ms: 15_000,\n },\n auth: {\n ref: \"./SECRETS.md\",\n state: {\n env: [\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"OPENROUTER_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"DEEPSEEK_API_KEY\",\n \"GROQ_API_KEY\",\n \"MISTRAL_API_KEY\",\n ],\n },\n },\n modelDerivedApiKey: true,\n sandbox: \"./SANDBOX.md\",\n protocol: \"print\",\n print: {\n // No prompt_flag: the message is positional after `run` (in bin_args).\n output_format: [\"--ndjson\"],\n pre_prompt: [],\n resume: { flag: \"--resume\", kind: \"value\" },\n event_schema: \"jcode-ndjson\",\n },\n session: {\n mode: \"ephemeral\",\n idle_timeout_ms: 1_800_000,\n context_carryover: false,\n },\n routeSelection: \"derived-from-model\",\n models: {\n default: \"anthropic/claude-sonnet-4-5\",\n allowed: buildJcodeModelMenu(),\n env: {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n groq: \"GROQ_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n },\n },\n capabilities: {\n streaming: true,\n tool_calls: true,\n sub_agents: true,\n file_io: true,\n multimodal: false,\n resumable: true,\n bidirectional: false,\n },\n options: [\n {\n id: \"model\",\n type: \"string\",\n description:\n \"Model id for this run (e.g. `claude-sonnet-4-5`). Forwarded to `--model`.\",\n bin_args_template: [\"--model\", \"{value}\"],\n },\n {\n id: \"provider\",\n type: \"string\",\n description:\n \"Provider override (e.g. `claude`, `openai`, `gemini`). Forwarded to `--provider`.\",\n bin_args_template: [\"--provider\", \"{value}\"],\n },\n {\n id: \"provider_profile\",\n type: \"string\",\n description:\n \"Named provider profile for multi-account setups. Forwarded to `--provider-profile`.\",\n bin_args_template: [\"--provider-profile\", \"{value}\"],\n },\n ],\n continuation: {\n default: \"none\",\n supported: [\"none\", \"transcript\", \"native-resume\"],\n },\n metadata: {\n acp: {\n checked: \"2026-08-11\",\n result:\n \"jcode has no documented ACP mode. The CLI exposes `jcode serve` \" +\n \"(background server) and `jcode connect` (client attach), but neither \" +\n \"speaks ACP over stdio. Adapter stays print/headless until ACP ships.\",\n },\n swarm: {\n checked: \"2026-08-11\",\n result:\n \"jcode supports multi-agent swarm coordination: automatic conflict \" +\n \"detection, inter-agent messaging (DM + broadcast), and repo-scoped \" +\n \"collaboration. Not yet wired into the adapter.\",\n },\n },\n tags: [\"jcode\", \"rust\", \"print\", \"agent-runtime\", \"coding\", \"multi-provider\"],\n})\n\nexport function jcodeRuntime(): AgentCliRuntime {\n return createAgentCliRuntime(jcode)\n}\n\nfunction apiModeForProvider(id: string): ProviderCapability[\"apiMode\"] {\n if (id === \"anthropic\") return \"anthropic\"\n if (\n id === \"openai\" ||\n id === \"openrouter\" ||\n id === \"deepseek\" ||\n id === \"groq\" ||\n id === \"mistral\"\n )\n return \"chat_completions\"\n return undefined\n}\n\nexport const jcodeCapabilities: CapabilityStrategy = async (def, ctx) => {\n const base = deriveDeclaredCapabilities(def)\n const providers: ProviderCapability[] = base.providers.map((p) => ({\n ...p,\n apiMode: apiModeForProvider(p.id),\n cred: {\n ...p.cred,\n present: !!ctx.env[p.cred.source.kind === \"env\" ? p.cred.source.var : \"\"],\n },\n }))\n return {\n ...base,\n source: \"discovered\",\n discoverable: \"live\",\n providers,\n application: { modelApply: \"arg\", postureApply: \"arg\", coupled: false },\n }\n}\n\nexport type { AgentCliHandle, AgentCliRuntime }\n"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @agentproto/adapter-jcode — AIP-45 adapter for 1jehuang/jcode.\n *\n * jcode is a RAM-efficient Rust coding agent with multi-provider support\n * (Claude, OpenAI, Gemini, OpenRouter, Copilot, DeepSeek, Groq, Mistral,\n * Ollama, and OpenAI-compatible endpoints). No ACP mode is documented, so\n * this is a `protocol: \"print\"` (headless) arm: we spawn `jcode run\n * --ndjson \"<prompt>\"` per turn and map its NDJSON stream (see the\n * `jcode-ndjson` mapper in the driver's print-arm).\n *\n * Argv order matters: `run` is a clap SUBCOMMAND, so it lives in\n * `bin_args` (the spawn base) — every composed flag (`--ndjson`,\n * `--model`, `--resume`) must come AFTER it or jcode rejects the argv\n * (`error: unexpected argument '--json' found`). The prompt is\n * positional, not a flag.\n *\n * import { jcode, jcodeRuntime } from \"@agentproto/adapter-jcode\"\n * const session = await jcodeRuntime().start({\n * env: { ANTHROPIC_API_KEY: \"sk-...\" },\n * })\n * for await (const evt of session.send({ role: \"user\", content: \"...\" })) {\n * console.log(evt)\n * }\n * await session.close()\n */\n\nimport {\n createAgentCliRuntime,\n defineAgentCli,\n type AgentCliHandle,\n type AgentCliRuntime,\n} from \"@agentproto/driver-agent-cli\"\nimport { listModels } from \"@agentproto/model-catalog\"\nimport {\n deriveDeclaredCapabilities,\n type CapabilityStrategy,\n type ProviderCapability,\n} from \"@agentproto/provider-kit\"\n\n/**\n * Build jcode's model menu from the shared provider catalog. jcode accepts\n * bare model ids via `--model`; the provider is inferred from the id or\n * specified explicitly via `--provider`.\n */\nfunction buildJcodeModelMenu(): Array<{ id: string; provider: string }> {\n const supported = [\n { provider: \"anthropic\", prefix: \"anthropic\" },\n { provider: \"openai\", prefix: \"openai\" },\n { provider: \"openrouter\", prefix: \"openrouter\" },\n { provider: \"google\", prefix: \"google\" },\n { provider: \"deepseek\", prefix: \"deepseek\" },\n { provider: \"groq\", prefix: \"groq\" },\n { provider: \"mistral\", prefix: \"mistral\" },\n ] as const\n\n const seen = new Set<string>()\n const out: Array<{ id: string; provider: string }> = []\n\n for (const { provider, prefix } of supported) {\n for (const model of listModels({ kind: \"llm\", provider })) {\n const bareId = model.id\n const canonicalId = bareId.includes(\"/\") ? bareId : `${prefix}/${bareId}`\n const id =\n provider === \"openrouter\" ? `openrouter/${bareId}` : canonicalId\n if (seen.has(id)) continue\n seen.add(id)\n out.push({ id, provider })\n }\n }\n\n return out.sort((a, b) => {\n if (a.provider !== b.provider) return a.provider.localeCompare(b.provider)\n return a.id.localeCompare(b.id)\n })\n}\n\nexport const jcode: AgentCliHandle = defineAgentCli({\n name: \"jcode\",\n id: \"jcode\",\n description:\n \"1jehuang/jcode — RAM-efficient Rust coding agent with semantic memory, \" +\n \"multi-agent swarm, and broad provider support (Claude, OpenAI, Gemini, \" +\n \"OpenRouter, Copilot, DeepSeek, Groq, Mistral, Ollama). Spawned via \" +\n \"`jcode run --ndjson` in headless mode. No ACP; print/headless arm.\",\n version: \"0.1.0\",\n bin: \"jcode\",\n // `run` is a clap subcommand — it must precede every composed flag, so it\n // lives in the spawn base rather than as a print `prompt_flag` (which\n // would land AFTER `--ndjson`/`--model` and be rejected by jcode).\n bin_args: [\"run\"],\n install: [\n { method: \"brew\", package: \"1jehuang/jcode/jcode\" },\n { method: \"curl\", url: \"https://jcode.sh/install\" },\n { method: \"cargo\", package: \"jcode\" },\n ],\n version_check: {\n cmd: \"jcode --version\",\n parse: \"(\\\\d+\\\\.\\\\d+\\\\.\\\\d+)\",\n range: \">=0.1.0\",\n timeout_ms: 15_000,\n },\n auth: {\n ref: \"./SECRETS.md\",\n state: {\n env: [\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"OPENROUTER_API_KEY\",\n \"GOOGLE_API_KEY\",\n \"DEEPSEEK_API_KEY\",\n \"GROQ_API_KEY\",\n \"MISTRAL_API_KEY\",\n ],\n },\n },\n modelDerivedApiKey: true,\n sandbox: \"./SANDBOX.md\",\n protocol: \"print\",\n print: {\n // No prompt_flag: the message is positional after `run` (in bin_args).\n output_format: [\"--ndjson\"],\n pre_prompt: [],\n resume: { flag: \"--resume\", kind: \"value\" },\n event_schema: \"jcode-ndjson\",\n },\n session: {\n mode: \"ephemeral\",\n idle_timeout_ms: 1_800_000,\n context_carryover: false,\n },\n routeSelection: \"derived-from-model\",\n models: {\n default: \"anthropic/claude-sonnet-4-5\",\n allowed: buildJcodeModelMenu(),\n env: {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n google: \"GOOGLE_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n groq: \"GROQ_API_KEY\",\n mistral: \"MISTRAL_API_KEY\",\n },\n },\n capabilities: {\n streaming: true,\n tool_calls: true,\n sub_agents: true,\n file_io: true,\n multimodal: false,\n resumable: true,\n bidirectional: false,\n },\n options: [\n {\n id: \"model\",\n type: \"string\",\n description:\n \"Model id for this run (e.g. `claude-sonnet-4-5`). Forwarded to `--model`. \" +\n \"An id jcode can't resolve makes its CLI silently fall back to its OWN \" +\n \"default model — the print arm detects that from the NDJSON `start` \" +\n \"line's reported model and aborts the turn loudly instead \" +\n \"(derived-from-model guard; see PrintArmOptions.expectedModel).\",\n bin_args_template: [\"--model\", \"{value}\"],\n },\n {\n id: \"provider\",\n type: \"string\",\n description:\n \"Provider override (e.g. `claude`, `openai`, `gemini`). Forwarded to `--provider`.\",\n bin_args_template: [\"--provider\", \"{value}\"],\n },\n {\n id: \"provider_profile\",\n type: \"string\",\n description:\n \"Named provider profile for multi-account setups. Forwarded to `--provider-profile`.\",\n bin_args_template: [\"--provider-profile\", \"{value}\"],\n },\n ],\n continuation: {\n default: \"none\",\n supported: [\"none\", \"transcript\", \"native-resume\"],\n },\n metadata: {\n acp: {\n checked: \"2026-08-11\",\n result:\n \"jcode has no documented ACP mode. The CLI exposes `jcode serve` \" +\n \"(background server) and `jcode connect` (client attach), but neither \" +\n \"speaks ACP over stdio. Adapter stays print/headless until ACP ships.\",\n },\n swarm: {\n checked: \"2026-08-11\",\n result:\n \"jcode supports multi-agent swarm coordination: automatic conflict \" +\n \"detection, inter-agent messaging (DM + broadcast), and repo-scoped \" +\n \"collaboration. Not yet wired into the adapter.\",\n },\n },\n tags: [\"jcode\", \"rust\", \"print\", \"agent-runtime\", \"coding\", \"multi-provider\"],\n})\n\nexport function jcodeRuntime(): AgentCliRuntime {\n return createAgentCliRuntime(jcode)\n}\n\nfunction apiModeForProvider(id: string): ProviderCapability[\"apiMode\"] {\n if (id === \"anthropic\") return \"anthropic\"\n if (\n id === \"openai\" ||\n id === \"openrouter\" ||\n id === \"deepseek\" ||\n id === \"groq\" ||\n id === \"mistral\"\n )\n return \"chat_completions\"\n return undefined\n}\n\nexport const jcodeCapabilities: CapabilityStrategy = async (def, ctx) => {\n const base = deriveDeclaredCapabilities(def)\n const providers: ProviderCapability[] = base.providers.map((p) => ({\n ...p,\n apiMode: apiModeForProvider(p.id),\n cred: {\n ...p.cred,\n present: !!ctx.env[p.cred.source.kind === \"env\" ? p.cred.source.var : \"\"],\n },\n }))\n return {\n ...base,\n source: \"discovered\",\n discoverable: \"live\",\n providers,\n application: { modelApply: \"arg\", postureApply: \"arg\", coupled: false },\n }\n}\n\nexport type { AgentCliHandle, AgentCliRuntime }\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentproto/adapter-jcode",
3
- "version": "0.2.1",
3
+ "version": "0.2.4",
4
4
  "description": "@agentproto/adapter-jcode — AIP-45 adapter for 1jehuang/jcode, a RAM-efficient Rust coding agent. Spawns `jcode run` in headless mode.",
5
5
  "keywords": [
6
6
  "agentproto",
@@ -41,9 +41,9 @@
41
41
  "access": "public"
42
42
  },
43
43
  "dependencies": {
44
- "@agentproto/driver-agent-cli": "2.3.0",
45
- "@agentproto/model-catalog": "0.8.3",
46
- "@agentproto/provider-kit": "0.4.1"
44
+ "@agentproto/driver-agent-cli": "2.4.0",
45
+ "@agentproto/model-catalog": "0.9.0",
46
+ "@agentproto/provider-kit": "0.4.2"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@types/node": "^25.6.2",