@agentproto/adapter-jcode 0.2.24 → 0.3.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/JCODE.md CHANGED
@@ -43,7 +43,28 @@ jcode reads provider API keys from the environment:
43
43
  | Groq | `GROQ_API_KEY` |
44
44
  | Mistral | `MISTRAL_API_KEY` |
45
45
 
46
- Interactive login is also available: `jcode login --provider <name>`.
46
+ ### Subscription login (Claude Max / ChatGPT)
47
+
48
+ jcode also has native OAuth logins, separate from its API-key routes (checked
49
+ against `jcode` 0.88.0, `jcode login --help`, and the upstream `OAUTH.md` /
50
+ `docs/AUTH_CREDENTIAL_SOURCES.md`):
51
+
52
+ | Login | Command | Stored in |
53
+ |-----------------------------|-----------------------------------|--------------------------|
54
+ | Claude Max (`claude`) | `jcode login --provider claude` | `~/.jcode/auth.json` |
55
+ | ChatGPT / Codex (`openai`) | `jcode login --provider openai` | `~/.jcode/openai-auth.json` |
56
+
57
+ The adapter declares both as external `authSubscription` surfaces (scoped to
58
+ the `anthropic` and `openai` providers): with `auth.mode: "subscription"` the
59
+ runtime checks the login is present, injects no bearer, and scrubs the
60
+ matching API-key env vars so a leftover key cannot take over. `claude` and
61
+ `anthropic-api` (likewise `openai` / `openai-api`) are different jcode
62
+ providers — a Claude Max login does not make the API-key route usable, and
63
+ vice versa. Other jcode logins (Gemini, Copilot, Antigravity) are not
64
+ declared yet.
65
+
66
+ Interactive login: `jcode login --provider <name>`; check with
67
+ `jcode auth status`.
47
68
 
48
69
  ## Capabilities
49
70
 
package/dist/index.mjs CHANGED
@@ -70,6 +70,17 @@ var jcode = defineAgentCli({
70
70
  }
71
71
  },
72
72
  modelDerivedApiKey: true,
73
+ // jcode ships two native OAuth logins, separate from its API-key routes:
74
+ // `jcode login --provider claude` (Claude Max) and `--provider openai`
75
+ // (ChatGPT/Codex), stored in `~/.jcode/auth.json` / `openai-auth.json`.
76
+ // Both are EXTERNAL — the runtime injects no bearer, it verifies the login
77
+ // is present (the `jcode` provision recipe, `<provider>-oauth` methods) and
78
+ // scrubs the matching api-key vars so a leftover key can't win. Each is
79
+ // scoped to its provider, so neither lights up the other's models.
80
+ authSubscription: [
81
+ { external: true, provider: "anthropic" },
82
+ { external: true, provider: "openai" }
83
+ ],
73
84
  sandbox: "./SANDBOX.md",
74
85
  protocol: "print",
75
86
  print: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;AA4CA,SAAS,mBAAA,GAA+D;AACtE,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,EAAE,QAAA,EAAU,WAAA,EAAa,MAAA,EAAQ,WAAA,EAAY;AAAA,IAC7C,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS;AAAA,IACvC,EAAE,QAAA,EAAU,YAAA,EAAc,MAAA,EAAQ,YAAA,EAAa;AAAA,IAC/C,EAAE,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAS;AAAA,IACvC,EAAE,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAW;AAAA,IAC3C,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAO;AAAA,IACnC,EAAE,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,SAAA;AAAU,GAC3C;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAA+C,EAAC;AAEtD,EAAA,KAAA,MAAW,EAAE,QAAA,EAAU,MAAA,EAAO,IAAK,SAAA,EAAW;AAC5C,IAAA,KAAA,MAAW,SAAS,UAAA,CAAW,EAAE,MAAM,KAAA,EAAO,QAAA,EAAU,CAAA,EAAG;AACzD,MAAA,MAAM,SAAS,KAAA,CAAM,EAAA;AACrB,MAAA,MAAM,WAAA,GAAc,OAAO,QAAA,CAAS,GAAG,IAAI,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACvE,MAAA,MAAM,EAAA,GACJ,QAAA,KAAa,YAAA,GAAe,CAAA,WAAA,EAAc,MAAM,CAAA,CAAA,GAAK,WAAA;AACvD,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,QAAA,EAAU,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,IAAA,IAAI,CAAA,CAAE,aAAa,CAAA,CAAE,QAAA,SAAiB,CAAA,CAAE,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA;AACzE,IAAA,OAAO,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAAA,EAChC,CAAC,CAAA;AACH;AAEO,IAAM,QAAwB,cAAA,CAAe;AAAA,EAClD,IAAA,EAAM,OAAA;AAAA,EACN,EAAA,EAAI,OAAA;AAAA,EACJ,WAAA,EACE,0RAAA;AAAA,EAIF,OAAA,EAAS,OAAA;AAAA,EACT,GAAA,EAAK,OAAA;AAAA;AAAA;AAAA;AAAA,EAIL,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,EAChB,OAAA,EAAS;AAAA,IACP,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,sBAAA,EAAuB;AAAA,IAClD,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAA,EAAK,0BAAA,EAA2B;AAAA,IAClD,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,OAAA;AAAQ,GACtC;AAAA,EACA,aAAA,EAAe;AAAA,IACb,GAAA,EAAK,iBAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACd;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO;AAAA,MACL,GAAA,EAAK;AAAA,QACH,mBAAA;AAAA,QACA,gBAAA;AAAA,QACA,oBAAA;AAAA,QACA,gBAAA;AAAA,QACA,kBAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA;AACF;AACF,GACF;AAAA,EACA,kBAAA,EAAoB,IAAA;AAAA,EACpB,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,OAAA;AAAA,EACV,KAAA,EAAO;AAAA;AAAA,IAEL,aAAA,EAAe,CAAC,UAAU,CAAA;AAAA,IAC1B,YAAY,EAAC;AAAA,IACb,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,IAC1C,YAAA,EAAc;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,eAAA,EAAiB,IAAA;AAAA,IACjB,iBAAA,EAAmB;AAAA,GACrB;AAAA,EACA,cAAA,EAAgB,oBAAA;AAAA,EAChB,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,6BAAA;AAAA,IACT,SAAS,mBAAA,EAAoB;AAAA,IAC7B,GAAA,EAAK;AAAA,MACH,SAAA,EAAW,mBAAA;AAAA,MACX,MAAA,EAAQ,gBAAA;AAAA,MACR,UAAA,EAAY,oBAAA;AAAA,MACZ,MAAA,EAAQ,gBAAA;AAAA,MACR,QAAA,EAAU,kBAAA;AAAA,MACV,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,MACE,EAAA,EAAI,OAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EACE,iVAAA;AAAA,MAKF,iBAAA,EAAmB,CAAC,SAAA,EAAW,SAAS;AAAA,KAC1C;AAAA,IACA;AAAA,MACE,EAAA,EAAI,UAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EACE,mFAAA;AAAA,MACF,iBAAA,EAAmB,CAAC,YAAA,EAAc,SAAS;AAAA,KAC7C;AAAA,IACA;AAAA,MACE,EAAA,EAAI,kBAAA;AAAA,MACJ,IAAA,EAAM,QAAA;AAAA,MACN,WAAA,EACE,qFAAA;AAAA,MACF,iBAAA,EAAmB,CAAC,oBAAA,EAAsB,SAAS;AAAA;AACrD,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS,MAAA;AAAA,IACT,SAAA,EAAW,CAAC,MAAA,EAAQ,YAAA,EAAc,eAAe;AAAA,GACnD;AAAA,EACA,QAAA,EAAU;AAAA,IACR,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EACE;AAAA,KAGJ;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,YAAA;AAAA,MACT,MAAA,EACE;AAAA;AAGJ,GACF;AAAA,EACA,MAAM,CAAC,OAAA,EAAS,QAAQ,OAAA,EAAS,eAAA,EAAiB,UAAU,gBAAgB;AAC9E,CAAC;AAEM,SAAS,YAAA,GAAgC;AAC9C,EAAA,OAAO,sBAAsB,KAAK,CAAA;AACpC;AAEA,SAAS,mBAAmB,EAAA,EAA2C;AACrE,EAAA,IAAI,EAAA,KAAO,aAAa,OAAO,WAAA;AAC/B,EAAA,IACE,EAAA,KAAO,YACP,EAAA,KAAO,YAAA,IACP,OAAO,UAAA,IACP,EAAA,KAAO,UACP,EAAA,KAAO,SAAA;AAEP,IAAA,OAAO,kBAAA;AACT,EAAA,OAAO,MAAA;AACT;AAEO,IAAM,iBAAA,GAAwC,OAAO,GAAA,EAAK,GAAA,KAAQ;AACvE,EAAA,MAAM,IAAA,GAAO,2BAA2B,GAAG,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAkC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACjE,GAAG,CAAA;AAAA,IACH,OAAA,EAAS,kBAAA,CAAmB,CAAA,CAAE,EAAE,CAAA;AAAA,IAChC,IAAA,EAAM;AAAA,MACJ,GAAG,CAAA,CAAE,IAAA;AAAA,MACL,OAAA,EAAS,CAAC,CAAC,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE;AAAA;AAC1E,GACF,CAAE,CAAA;AACF,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,MAAA,EAAQ,YAAA;AAAA,IACR,YAAA,EAAc,MAAA;AAAA,IACd,SAAA;AAAA,IACA,aAAa,EAAE,UAAA,EAAY,OAAO,YAAA,EAAc,KAAA,EAAO,SAAS,KAAA;AAAM,GACxE;AACF","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"]}
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 // jcode ships two native OAuth logins, separate from its API-key routes:\n // `jcode login --provider claude` (Claude Max) and `--provider openai`\n // (ChatGPT/Codex), stored in `~/.jcode/auth.json` / `openai-auth.json`.\n // Both are EXTERNAL — the runtime injects no bearer, it verifies the login\n // is present (the `jcode` provision recipe, `<provider>-oauth` methods) and\n // scrubs the matching api-key vars so a leftover key can't win. Each is\n // scoped to its provider, so neither lights up the other's models.\n authSubscription: [\n { external: true, provider: \"anthropic\" },\n { external: true, provider: \"openai\" },\n ],\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.24",
3
+ "version": "0.3.0",
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.7.1",
45
- "@agentproto/model-catalog": "0.11.3",
46
- "@agentproto/provider-kit": "0.4.6"
44
+ "@agentproto/provider-kit": "0.4.6",
45
+ "@agentproto/driver-agent-cli": "2.8.0",
46
+ "@agentproto/model-catalog": "0.11.3"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@types/node": "^25.9.5",