llm-cli-gateway 2.13.2 → 2.14.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.
Files changed (79) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +68 -29
  3. package/dist/acp/client.d.ts +29 -1
  4. package/dist/acp/client.js +78 -4
  5. package/dist/acp/errors.d.ts +9 -1
  6. package/dist/acp/errors.js +19 -0
  7. package/dist/acp/event-normalizer.d.ts +12 -0
  8. package/dist/acp/event-normalizer.js +16 -0
  9. package/dist/acp/flight-redaction.d.ts +3 -0
  10. package/dist/acp/flight-redaction.js +3 -0
  11. package/dist/acp/permission-bridge.js +11 -5
  12. package/dist/acp/process-manager.d.ts +2 -1
  13. package/dist/acp/process-manager.js +43 -4
  14. package/dist/acp/provider-registry.js +19 -11
  15. package/dist/acp/runtime.d.ts +8 -0
  16. package/dist/acp/runtime.js +47 -4
  17. package/dist/acp/types.d.ts +3083 -55
  18. package/dist/acp/types.js +242 -5
  19. package/dist/async-job-manager.d.ts +38 -1
  20. package/dist/async-job-manager.js +287 -20
  21. package/dist/codex-json-parser.d.ts +1 -0
  22. package/dist/codex-json-parser.js +6 -0
  23. package/dist/config.d.ts +19 -0
  24. package/dist/config.js +84 -1
  25. package/dist/flight-recorder.d.ts +2 -0
  26. package/dist/flight-recorder.js +20 -0
  27. package/dist/gemini-json-parser.d.ts +2 -0
  28. package/dist/gemini-json-parser.js +45 -8
  29. package/dist/grok-json-parser.d.ts +14 -0
  30. package/dist/grok-json-parser.js +156 -0
  31. package/dist/index.d.ts +47 -2
  32. package/dist/index.js +504 -122
  33. package/dist/job-store.d.ts +119 -11
  34. package/dist/job-store.js +372 -42
  35. package/dist/model-registry.d.ts +1 -0
  36. package/dist/model-registry.js +46 -0
  37. package/dist/oauth.js +2 -2
  38. package/dist/postgres-job-store-worker.d.ts +1 -0
  39. package/dist/postgres-job-store-worker.js +444 -0
  40. package/dist/pricing.d.ts +3 -2
  41. package/dist/provider-acp-capabilities.d.ts +52 -0
  42. package/dist/provider-acp-capabilities.js +101 -0
  43. package/dist/provider-admin-tools.d.ts +100 -0
  44. package/dist/provider-admin-tools.js +572 -0
  45. package/dist/provider-capability-cache.d.ts +46 -0
  46. package/dist/provider-capability-cache.js +248 -0
  47. package/dist/provider-capability-discovery.d.ts +85 -0
  48. package/dist/provider-capability-discovery.js +461 -0
  49. package/dist/provider-capability-resolver.d.ts +29 -0
  50. package/dist/provider-capability-resolver.js +92 -0
  51. package/dist/provider-definition-assertions.d.ts +9 -0
  52. package/dist/provider-definition-assertions.js +147 -0
  53. package/dist/provider-definitions.d.ts +127 -0
  54. package/dist/provider-definitions.js +758 -0
  55. package/dist/provider-help-parser.d.ts +34 -0
  56. package/dist/provider-help-parser.js +203 -0
  57. package/dist/provider-model-discovery.d.ts +30 -0
  58. package/dist/provider-model-discovery.js +229 -0
  59. package/dist/provider-output-metadata.d.ts +7 -0
  60. package/dist/provider-output-metadata.js +68 -0
  61. package/dist/provider-schema-builder.d.ts +22 -0
  62. package/dist/provider-schema-builder.js +55 -0
  63. package/dist/provider-surface-generator.d.ts +98 -0
  64. package/dist/provider-surface-generator.js +140 -0
  65. package/dist/provider-tool-capabilities.d.ts +3 -2
  66. package/dist/provider-tool-capabilities.js +77 -62
  67. package/dist/request-helpers.d.ts +37 -4
  68. package/dist/request-helpers.js +134 -0
  69. package/dist/resources.d.ts +6 -1
  70. package/dist/resources.js +64 -192
  71. package/dist/session-manager.js +18 -11
  72. package/dist/sqlite-driver.d.ts +1 -1
  73. package/dist/sqlite-driver.js +2 -1
  74. package/dist/stream-json-parser.d.ts +1 -0
  75. package/dist/stream-json-parser.js +3 -0
  76. package/dist/upstream-contracts.d.ts +17 -1
  77. package/dist/upstream-contracts.js +209 -36
  78. package/npm-shrinkwrap.json +2 -2
  79. package/package.json +8 -3
@@ -0,0 +1,147 @@
1
+ import { CLI_TYPES } from "./provider-types.js";
2
+ import { adminSurfaceKind, getAllProviderDefinitions, getProviderDefinition, } from "./provider-definitions.js";
3
+ export function assertNever(x, context = "provider") {
4
+ throw new Error(`Unhandled ${context}: ${JSON.stringify(x)}`);
5
+ }
6
+ export function providerScopeLabel(id) {
7
+ switch (id) {
8
+ case "claude":
9
+ case "codex":
10
+ case "gemini":
11
+ case "grok":
12
+ case "mistral":
13
+ case "devin":
14
+ return "full";
15
+ case "cursor":
16
+ return "maintain-only";
17
+ default:
18
+ return assertNever(id, "CliType");
19
+ }
20
+ }
21
+ export const REQUIRED_PROVIDER_PROJECTIONS = [
22
+ "syncRequestTool",
23
+ "asyncRequestTool",
24
+ "modelsResource",
25
+ "sessionsResource",
26
+ "modelDiscovery",
27
+ "sessionContinuity",
28
+ "capabilityRow",
29
+ "adminDescriptor",
30
+ "upstreamContractRow",
31
+ "docsSummary",
32
+ ];
33
+ export function assertExhaustiveProviderCoverage(defs = getAllProviderDefinitions()) {
34
+ const seen = new Map();
35
+ for (const def of defs) {
36
+ seen.set(def.id, (seen.get(def.id) ?? 0) + 1);
37
+ }
38
+ const missing = CLI_TYPES.filter(id => !seen.has(id));
39
+ if (missing.length > 0) {
40
+ throw new Error(`Provider definitions missing for CLI_TYPES member(s): ${missing.join(", ")}`);
41
+ }
42
+ const duplicates = [...seen.entries()].filter(([, count]) => count > 1).map(([id]) => id);
43
+ if (duplicates.length > 0) {
44
+ throw new Error(`Duplicate provider definition(s): ${duplicates.join(", ")}`);
45
+ }
46
+ const extra = [...seen.keys()].filter(id => !CLI_TYPES.includes(id));
47
+ if (extra.length > 0) {
48
+ throw new Error(`Provider definition(s) not in CLI_TYPES: ${extra.join(", ")}`);
49
+ }
50
+ for (const id of CLI_TYPES) {
51
+ if (getProviderDefinition(id).id !== id) {
52
+ throw new Error(`Provider definition key/id mismatch for ${id}`);
53
+ }
54
+ }
55
+ }
56
+ export function assertProviderProjectionsProducible(def) {
57
+ const producible = new Set();
58
+ const fail = (projection, reason) => {
59
+ throw new Error(`Provider "${def.id}" cannot produce ${projection}: ${reason}`);
60
+ };
61
+ if (!def.requestSurface.sync || !def.requestSurface.syncToolName.endsWith("_request")) {
62
+ fail("syncRequestTool", "requestSurface.sync must be true with a *_request tool name");
63
+ }
64
+ producible.add("syncRequestTool");
65
+ if (!def.requestSurface.async || !def.requestSurface.asyncToolName.endsWith("_request_async")) {
66
+ fail("asyncRequestTool", "requestSurface.async must be true with a *_request_async tool name");
67
+ }
68
+ producible.add("asyncRequestTool");
69
+ if (!def.resourcePolicy.exposesModelsResource) {
70
+ fail("modelsResource", "resourcePolicy.exposesModelsResource must be true");
71
+ }
72
+ producible.add("modelsResource");
73
+ if (!def.resourcePolicy.exposesSessionsResource) {
74
+ fail("sessionsResource", "resourcePolicy.exposesSessionsResource must be true");
75
+ }
76
+ producible.add("sessionsResource");
77
+ const md = def.discovery.modelDiscovery;
78
+ if (md.evidence.trim().length === 0) {
79
+ fail("modelDiscovery", "modelDiscovery.evidence is required");
80
+ }
81
+ if (md.strategy === "native-command") {
82
+ if (md.argv.length === 0) {
83
+ fail("modelDiscovery", "native-command strategy requires a non-empty argv");
84
+ }
85
+ if (md.parse === "config-or-env" || md.parse === "curated-catalog") {
86
+ fail("modelDiscovery", "native-command strategy requires a native parse dialect");
87
+ }
88
+ }
89
+ else if (md.argv.length !== 0) {
90
+ fail("modelDiscovery", "non-native strategy must have an empty argv");
91
+ }
92
+ producible.add("modelDiscovery");
93
+ if (def.discovery.sessionContinuity.flags.length === 0) {
94
+ fail("sessionContinuity", "at least one continuity flag is required");
95
+ }
96
+ producible.add("sessionContinuity");
97
+ if (def.displayName.trim().length === 0 || def.executables.length === 0) {
98
+ fail("capabilityRow", "displayName and at least one executable are required");
99
+ }
100
+ if (def.primaryExecutable !== def.executables[0]) {
101
+ fail("capabilityRow", "primaryExecutable must equal executables[0]");
102
+ }
103
+ producible.add("capabilityRow");
104
+ if (!Array.isArray(def.adminSubcommands)) {
105
+ fail("adminDescriptor", "adminSubcommands must be an array");
106
+ }
107
+ for (const family of def.adminSubcommands) {
108
+ if (adminSurfaceKind(family) === "config-projection" && family.safety !== "read-only") {
109
+ fail("adminDescriptor", `config-projection family "${family.family}" must be read-only`);
110
+ }
111
+ }
112
+ producible.add("adminDescriptor");
113
+ if (def.upstreamContract.targetVersion.trim().length === 0) {
114
+ fail("upstreamContractRow", "upstreamContract.targetVersion is required");
115
+ }
116
+ producible.add("upstreamContractRow");
117
+ if (def.docs.primary.length === 0) {
118
+ fail("docsSummary", "at least one primary docs URL is required");
119
+ }
120
+ producible.add("docsSummary");
121
+ if (def.acp.classification === "native") {
122
+ if (def.acp.entrypoint === null || def.acp.nativeEntrypoint === null) {
123
+ fail("capabilityRow", "native ACP classification requires a non-null entrypoint");
124
+ }
125
+ if (def.acp.probeArgv.length === 0) {
126
+ fail("capabilityRow", "native ACP provider must declare a safe (non-live) probe argv");
127
+ }
128
+ const liveArgs = (def.acp.entrypoint?.args ?? []).join(" ");
129
+ for (const probe of def.acp.probeArgv) {
130
+ if (probe.join(" ") === liveArgs) {
131
+ fail("capabilityRow", "ACP probe argv must differ from the live entrypoint argv");
132
+ }
133
+ }
134
+ }
135
+ else {
136
+ if (def.acp.entrypoint !== null || def.acp.nativeEntrypoint !== null) {
137
+ fail("capabilityRow", "non-native ACP classification must have a null entrypoint");
138
+ }
139
+ }
140
+ return producible;
141
+ }
142
+ export function assertRegistryIntegrity(defs = getAllProviderDefinitions()) {
143
+ assertExhaustiveProviderCoverage(defs);
144
+ for (const def of defs) {
145
+ assertProviderProjectionsProducible(def);
146
+ }
147
+ }
@@ -0,0 +1,127 @@
1
+ import { CLI_TYPES, type CliType } from "./provider-types.js";
2
+ export { CLI_TYPES, type CliType };
3
+ export type ProviderId = CliType;
4
+ export type RequestTransport = "cli";
5
+ export type AcpClassification = "native" | "none";
6
+ export type AdminSafetyClass = "read-only" | "mutating-gated";
7
+ export type AdminSurfaceKind = "cli-subcommand" | "cli-flag" | "config-projection";
8
+ export type ModelDiscoveryStrategy = "native-command" | "config-inspection" | "env-inspection" | "static-catalog";
9
+ export type CapabilityScope = "full" | "maintain-only";
10
+ export interface ProviderProbe {
11
+ readonly argv: readonly string[];
12
+ readonly purpose: "version" | "root-help" | "subcommand-help" | "model-catalog";
13
+ readonly executable?: string;
14
+ }
15
+ export type ModelCatalogParseFormat = "codex-debug-json" | "grok-models-text" | "agy-models-text" | "config-or-env" | "curated-catalog";
16
+ export type ModelFallbackPolicy = "live-catalog-primary" | "config-active-model" | "cli-owned-surface-only" | "curated-static-catalog";
17
+ export interface ProviderModelConfigSource {
18
+ readonly kind: "env" | "config-file";
19
+ readonly keys: readonly string[];
20
+ readonly path?: string;
21
+ readonly note: string;
22
+ }
23
+ export interface ProviderModelFacts {
24
+ readonly effortLevels: readonly string[];
25
+ readonly supportsFallbackModelChain: boolean;
26
+ readonly aliases: readonly string[];
27
+ readonly agentProfiles: readonly string[];
28
+ }
29
+ export interface ProviderModelDiscovery {
30
+ readonly strategy: ModelDiscoveryStrategy;
31
+ readonly argv: readonly string[];
32
+ readonly parse: ModelCatalogParseFormat;
33
+ readonly fallbackPolicy: ModelFallbackPolicy;
34
+ readonly configSources: readonly ProviderModelConfigSource[];
35
+ readonly facts: ProviderModelFacts;
36
+ readonly evidence: string;
37
+ }
38
+ export interface ProviderSessionContinuity {
39
+ readonly continue: boolean;
40
+ readonly resume: boolean;
41
+ readonly fork: boolean;
42
+ readonly sessionIdSelection: boolean;
43
+ readonly flags: readonly string[];
44
+ readonly evidence: string;
45
+ }
46
+ export interface ProviderDiscovery {
47
+ readonly version: ProviderProbe;
48
+ readonly rootHelp: ProviderProbe;
49
+ readonly subcommandHelp: readonly ProviderProbe[];
50
+ readonly modelDiscovery: ProviderModelDiscovery;
51
+ readonly sessionContinuity: ProviderSessionContinuity;
52
+ }
53
+ export interface ProviderAdminFamily {
54
+ readonly family: string;
55
+ readonly safety: AdminSafetyClass;
56
+ readonly kind?: AdminSurfaceKind;
57
+ readonly evidence: string;
58
+ }
59
+ export declare function adminSurfaceKind(family: ProviderAdminFamily): AdminSurfaceKind;
60
+ export interface ProviderAcpEntrypoint {
61
+ readonly command: string;
62
+ readonly args: readonly string[];
63
+ }
64
+ export interface ProviderAcpAgentType {
65
+ readonly id: string;
66
+ readonly description: string;
67
+ }
68
+ export declare const DEVIN_ACP_AGENT_TYPES: readonly ["summarizer", "review"];
69
+ export type DevinAcpAgentType = (typeof DEVIN_ACP_AGENT_TYPES)[number];
70
+ export interface ProviderAcpMetadata {
71
+ readonly classification: AcpClassification;
72
+ readonly nativeEntrypoint: string | null;
73
+ readonly entrypoint: ProviderAcpEntrypoint | null;
74
+ readonly probeArgv: readonly (readonly string[])[];
75
+ readonly agentTypes?: readonly ProviderAcpAgentType[];
76
+ readonly evidence: string;
77
+ }
78
+ export interface ProviderSafetyModes {
79
+ readonly sandbox: boolean;
80
+ readonly permissionMode: boolean;
81
+ readonly approvalMode: boolean;
82
+ readonly trust: boolean;
83
+ readonly flags: readonly string[];
84
+ }
85
+ export interface ProviderResourcePolicy {
86
+ readonly exposesModelsResource: boolean;
87
+ readonly exposesSessionsResource: boolean;
88
+ }
89
+ export interface ProviderUpstreamLinkage {
90
+ readonly targetVersion: string;
91
+ readonly helpChecksumRef: string | null;
92
+ }
93
+ export interface ProviderRequestSurface {
94
+ readonly sync: boolean;
95
+ readonly async: boolean;
96
+ readonly transport: RequestTransport;
97
+ readonly acpCapable: boolean;
98
+ readonly syncToolName: string;
99
+ readonly asyncToolName: string;
100
+ }
101
+ export interface ProviderDefinition {
102
+ readonly id: ProviderId;
103
+ readonly displayName: string;
104
+ readonly sessionLabel: string;
105
+ readonly icon: string;
106
+ readonly executables: readonly string[];
107
+ readonly primaryExecutable: string;
108
+ readonly requestSurface: ProviderRequestSurface;
109
+ readonly docs: {
110
+ readonly primary: readonly string[];
111
+ };
112
+ readonly discovery: ProviderDiscovery;
113
+ readonly adminSubcommands: readonly ProviderAdminFamily[];
114
+ readonly acp: ProviderAcpMetadata;
115
+ readonly safetyModes: ProviderSafetyModes;
116
+ readonly outputFormats: readonly string[];
117
+ readonly streamingFormats: readonly string[];
118
+ readonly resourcePolicy: ProviderResourcePolicy;
119
+ readonly upstreamContract: ProviderUpstreamLinkage;
120
+ readonly capabilityScope: CapabilityScope;
121
+ }
122
+ export declare const PROVIDER_DEFINITIONS_BY_ID: Readonly<Record<CliType, ProviderDefinition>>;
123
+ export declare function getAllProviderDefinitions(): readonly ProviderDefinition[];
124
+ export declare function getProviderDefinition(id: CliType): ProviderDefinition;
125
+ export declare function listProviderIds(): readonly CliType[];
126
+ export declare function getProviderDisplayName(id: CliType): string;
127
+ export declare function getProviderSessionLabel(id: CliType): string;