agent-cli-runtime 0.1.0-alpha.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/CHANGELOG.md +51 -0
- package/CONTRIBUTING.md +60 -0
- package/LICENSE +202 -0
- package/README.md +573 -0
- package/README.zh-CN.md +571 -0
- package/SECURITY.md +35 -0
- package/dist/adapters/adapter-types.d.ts +138 -0
- package/dist/adapters/adapter-types.js +2 -0
- package/dist/adapters/adapter-types.js.map +1 -0
- package/dist/adapters/claude.d.ts +2 -0
- package/dist/adapters/claude.js +97 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.js +120 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/opencode.d.ts +4 -0
- package/dist/adapters/opencode.js +111 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/registry.d.ts +9 -0
- package/dist/adapters/registry.js +23 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +978 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/core/async-queue.d.ts +10 -0
- package/dist/core/async-queue.js +49 -0
- package/dist/core/async-queue.js.map +1 -0
- package/dist/core/diagnostics.d.ts +20 -0
- package/dist/core/diagnostics.js +4 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-contract.d.ts +32 -0
- package/dist/core/event-contract.js +128 -0
- package/dist/core/event-contract.js.map +1 -0
- package/dist/core/events.d.ts +147 -0
- package/dist/core/events.js +4 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/ids.d.ts +1 -0
- package/dist/core/ids.js +5 -0
- package/dist/core/ids.js.map +1 -0
- package/dist/core/redaction.d.ts +4 -0
- package/dist/core/redaction.js +51 -0
- package/dist/core/redaction.js.map +1 -0
- package/dist/core/runtime.d.ts +41 -0
- package/dist/core/runtime.js +83 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/schema-contract.d.ts +55 -0
- package/dist/core/schema-contract.js +143 -0
- package/dist/core/schema-contract.js.map +1 -0
- package/dist/detection/detect.d.ts +14 -0
- package/dist/detection/detect.js +293 -0
- package/dist/detection/detect.js.map +1 -0
- package/dist/detection/env.d.ts +2 -0
- package/dist/detection/env.js +15 -0
- package/dist/detection/env.js.map +1 -0
- package/dist/detection/executable-resolution.d.ts +12 -0
- package/dist/detection/executable-resolution.js +50 -0
- package/dist/detection/executable-resolution.js.map +1 -0
- package/dist/detection/invocation.d.ts +9 -0
- package/dist/detection/invocation.js +22 -0
- package/dist/detection/invocation.js.map +1 -0
- package/dist/goals/goal-scheduler.d.ts +31 -0
- package/dist/goals/goal-scheduler.js +518 -0
- package/dist/goals/goal-scheduler.js.map +1 -0
- package/dist/goals/goal-store.d.ts +37 -0
- package/dist/goals/goal-store.js +300 -0
- package/dist/goals/goal-store.js.map +1 -0
- package/dist/goals/goal-types.d.ts +103 -0
- package/dist/goals/goal-types.js +2 -0
- package/dist/goals/goal-types.js.map +1 -0
- package/dist/goals/planner-prompts.d.ts +3 -0
- package/dist/goals/planner-prompts.js +26 -0
- package/dist/goals/planner-prompts.js.map +1 -0
- package/dist/goals/task-graph.d.ts +9 -0
- package/dist/goals/task-graph.js +229 -0
- package/dist/goals/task-graph.js.map +1 -0
- package/dist/goals/validation-runner.d.ts +7 -0
- package/dist/goals/validation-runner.js +63 -0
- package/dist/goals/validation-runner.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/claude-stream-json.d.ts +11 -0
- package/dist/parsers/claude-stream-json.js +102 -0
- package/dist/parsers/claude-stream-json.js.map +1 -0
- package/dist/parsers/codex-json.d.ts +8 -0
- package/dist/parsers/codex-json.js +107 -0
- package/dist/parsers/codex-json.js.map +1 -0
- package/dist/parsers/line-buffer.d.ts +7 -0
- package/dist/parsers/line-buffer.js +28 -0
- package/dist/parsers/line-buffer.js.map +1 -0
- package/dist/parsers/opencode-json.d.ts +8 -0
- package/dist/parsers/opencode-json.js +72 -0
- package/dist/parsers/opencode-json.js.map +1 -0
- package/dist/parsers/plain-lines.d.ts +6 -0
- package/dist/parsers/plain-lines.js +9 -0
- package/dist/parsers/plain-lines.js.map +1 -0
- package/dist/public-types.d.ts +143 -0
- package/dist/public-types.js +2 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runs/process-runner.d.ts +35 -0
- package/dist/runs/process-runner.js +97 -0
- package/dist/runs/process-runner.js.map +1 -0
- package/dist/runs/prompt-transport.d.ts +10 -0
- package/dist/runs/prompt-transport.js +43 -0
- package/dist/runs/prompt-transport.js.map +1 -0
- package/dist/runs/run-result.d.ts +9 -0
- package/dist/runs/run-result.js +22 -0
- package/dist/runs/run-result.js.map +1 -0
- package/dist/runs/run-scheduler.d.ts +25 -0
- package/dist/runs/run-scheduler.js +552 -0
- package/dist/runs/run-scheduler.js.map +1 -0
- package/dist/runs/run-store.d.ts +42 -0
- package/dist/runs/run-store.js +297 -0
- package/dist/runs/run-store.js.map +1 -0
- package/dist/runs/run-types.d.ts +59 -0
- package/dist/runs/run-types.js +2 -0
- package/dist/runs/run-types.js.map +1 -0
- package/dist/smoke/parser-samples.d.ts +17 -0
- package/dist/smoke/parser-samples.js +186 -0
- package/dist/smoke/parser-samples.js.map +1 -0
- package/dist/storage/file-storage.d.ts +35 -0
- package/dist/storage/file-storage.js +271 -0
- package/dist/storage/file-storage.js.map +1 -0
- package/dist/storage/jsonl-store.d.ts +9 -0
- package/dist/storage/jsonl-store.js +138 -0
- package/dist/storage/jsonl-store.js.map +1 -0
- package/dist/storage/manifest-validation.d.ts +11 -0
- package/dist/storage/manifest-validation.js +102 -0
- package/dist/storage/manifest-validation.js.map +1 -0
- package/dist/storage/storage-lease.d.ts +40 -0
- package/dist/storage/storage-lease.js +223 -0
- package/dist/storage/storage-lease.js.map +1 -0
- package/dist/storage/storage-types.d.ts +55 -0
- package/dist/storage/storage-types.js +2 -0
- package/dist/storage/storage-types.js.map +1 -0
- package/dist/storage/store-inspection.d.ts +28 -0
- package/dist/storage/store-inspection.js +941 -0
- package/dist/storage/store-inspection.js.map +1 -0
- package/docs/api-schema-contract.md +92 -0
- package/docs/compatibility.md +832 -0
- package/docs/daemon-ready-contract.md +283 -0
- package/docs/production-readiness.md +281 -0
- package/docs/release-checklist.md +257 -0
- package/docs/release-publish-runbook.md +201 -0
- package/docs/release-report.md +517 -0
- package/docs/ssot.md +1257 -0
- package/examples/cli-dogfood.md +113 -0
- package/examples/library-goal.js +94 -0
- package/examples/library-run.js +84 -0
- package/package.json +79 -0
- package/scripts/dogfood.mjs +243 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { AdapterRegistry } from "../adapters/registry.js";
|
|
2
|
+
import { detectAgents, detectAgentsStream } from "../detection/detect.js";
|
|
3
|
+
import { GoalScheduler } from "../goals/goal-scheduler.js";
|
|
4
|
+
import { GoalStore } from "../goals/goal-store.js";
|
|
5
|
+
import { RunScheduler } from "../runs/run-scheduler.js";
|
|
6
|
+
import { RunStore } from "../runs/run-store.js";
|
|
7
|
+
import { JsonFileStorage } from "../storage/file-storage.js";
|
|
8
|
+
import { exportDiagnosticsBundle, inspectStoreDirectory, } from "../storage/store-inspection.js";
|
|
9
|
+
import { DEFAULT_LEASE_STALE_MS, StorageLease } from "../storage/storage-lease.js";
|
|
10
|
+
export function createAgentRuntime(options = {}) {
|
|
11
|
+
const registry = new AdapterRegistry(options.adapters);
|
|
12
|
+
const lease = options.storageDir ? StorageLease.acquire(options.storageDir) : undefined;
|
|
13
|
+
let currentOwner = lease?.currentOwner();
|
|
14
|
+
const ownerProvider = () => currentOwner;
|
|
15
|
+
const storage = options.storageDir
|
|
16
|
+
? new JsonFileStorage(options.storageDir, {
|
|
17
|
+
durability: options.storage?.durability,
|
|
18
|
+
canWrite: () => lease?.ownsCurrentLock() ?? true,
|
|
19
|
+
})
|
|
20
|
+
: undefined;
|
|
21
|
+
const runStore = new RunStore(2_000, storage, { owner: ownerProvider, staleMs: DEFAULT_LEASE_STALE_MS });
|
|
22
|
+
const runScheduler = new RunScheduler(registry, runStore, {
|
|
23
|
+
env: options.env,
|
|
24
|
+
searchPath: options.searchPath,
|
|
25
|
+
});
|
|
26
|
+
const goalStore = new GoalStore(storage, { owner: ownerProvider, staleMs: DEFAULT_LEASE_STALE_MS });
|
|
27
|
+
const goalScheduler = new GoalScheduler(runScheduler, goalStore, {
|
|
28
|
+
maxConcurrentTasks: options.maxConcurrentTasks,
|
|
29
|
+
});
|
|
30
|
+
const heartbeat = lease
|
|
31
|
+
? setInterval(() => {
|
|
32
|
+
const heartbeatOwner = lease.heartbeat();
|
|
33
|
+
if (!heartbeatOwner) {
|
|
34
|
+
currentOwner = undefined;
|
|
35
|
+
if (heartbeat)
|
|
36
|
+
clearInterval(heartbeat);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
currentOwner = heartbeatOwner;
|
|
40
|
+
runStore.heartbeatActive(currentOwner);
|
|
41
|
+
goalStore.heartbeatActive(currentOwner);
|
|
42
|
+
}, 1_000)
|
|
43
|
+
: undefined;
|
|
44
|
+
heartbeat?.unref?.();
|
|
45
|
+
return {
|
|
46
|
+
detect: (detectOptions) => detectAgents({ adapters: registry.list(), env: options.env, searchPath: options.searchPath }, detectOptions),
|
|
47
|
+
detectStream: (detectOptions) => detectAgentsStream({ adapters: registry.list(), env: options.env, searchPath: options.searchPath }, detectOptions),
|
|
48
|
+
run: (request) => runScheduler.startRun(request),
|
|
49
|
+
createGoal: (request) => goalScheduler.createGoal(request),
|
|
50
|
+
cancelRun: (runId) => runScheduler.cancelRun(runId),
|
|
51
|
+
cancelGoal: (goalId) => goalScheduler.cancelGoal(goalId),
|
|
52
|
+
shutdown: async (reason) => {
|
|
53
|
+
await goalScheduler.shutdown(reason);
|
|
54
|
+
await runScheduler.shutdown(reason);
|
|
55
|
+
if (heartbeat)
|
|
56
|
+
clearInterval(heartbeat);
|
|
57
|
+
if (lease) {
|
|
58
|
+
currentOwner = lease.close();
|
|
59
|
+
if (currentOwner) {
|
|
60
|
+
runStore.heartbeatActive(currentOwner);
|
|
61
|
+
goalStore.heartbeatActive(currentOwner);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
getRun: async (runId) => runStore.get(runId),
|
|
66
|
+
replayRunEvents: async (runId, eventOptions) => runStore.replay(runId, eventOptions?.afterEventId),
|
|
67
|
+
getRunEvents: async (runId, eventOptions) => runStore.replay(runId, eventOptions?.afterEventId),
|
|
68
|
+
listRuns: async (listOptions) => runStore.list(listOptions),
|
|
69
|
+
getGoal: async (goalId) => goalStore.get(goalId),
|
|
70
|
+
replayGoalEvents: async (goalId, eventOptions) => goalStore.replay(goalId, eventOptions?.afterEventId),
|
|
71
|
+
getGoalEvents: async (goalId, eventOptions) => goalStore.replay(goalId, eventOptions?.afterEventId),
|
|
72
|
+
listGoals: async (listOptions) => goalStore.list(listOptions),
|
|
73
|
+
inspectStore: async (inspectOptions) => inspectStoreDirectory(requiredStorageDir(inspectOptions?.storageDir ?? options.storageDir)),
|
|
74
|
+
exportDiagnostics: async (request) => exportDiagnosticsBundle(request, requiredStorageDir(request.storageDir ?? options.storageDir)),
|
|
75
|
+
getAdapter: (id) => registry.get(id),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function requiredStorageDir(storageDir) {
|
|
79
|
+
if (!storageDir)
|
|
80
|
+
throw new Error("storageDir is required for store inspection and diagnostics export");
|
|
81
|
+
return storageDir;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/core/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface CliSchemaContract {
|
|
2
|
+
schemaVersion: string;
|
|
3
|
+
requiredTopLevelFields: readonly string[];
|
|
4
|
+
classificationFields: readonly string[];
|
|
5
|
+
redactionRules: readonly string[];
|
|
6
|
+
}
|
|
7
|
+
export declare const EVENT_TERMINAL_REASONS: readonly ["success", "failed", "timeout", "canceled", "interrupted", "validation_failed", "execution_failed", "unavailable", "auth_missing", "task_graph_invalid"];
|
|
8
|
+
export declare const SMOKE_CONFORMANCE_CLASSIFICATIONS: readonly ["success", "real_run_skipped", "auth_missing", "unavailable_executable", "unsupported_flag", "needs_verification", "unexpected_output", "cwd_mutated", "timeout", "failed"];
|
|
9
|
+
export type SmokeConformanceClassification = (typeof SMOKE_CONFORMANCE_CLASSIFICATIONS)[number];
|
|
10
|
+
export declare const CLI_SCHEMA_INVENTORY: readonly [{
|
|
11
|
+
readonly schemaVersion: "agent-runtime.event.v1";
|
|
12
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "id", "sequence", "timestamp", "scope", "event"];
|
|
13
|
+
readonly classificationFields: readonly ["terminal.result", "terminal.reason"];
|
|
14
|
+
readonly redactionRules: readonly ["event payloads must use runtime redaction before CLI emission", "no prompt text", "no token values", "no Bearer values", "no auth environment assignment values", "no private absolute cwd paths"];
|
|
15
|
+
}, {
|
|
16
|
+
readonly schemaVersion: "agent-runtime.diagnostics.v1";
|
|
17
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "exportedAt", "subject", "manifest", "events", "diagnostics", "storageDiagnostics", "consistencyWarnings", "supervisorSummary", "adapterSummary"];
|
|
18
|
+
readonly classificationFields: readonly ["supervisorSummary.terminalReason", "diagnostics[].code"];
|
|
19
|
+
readonly redactionRules: readonly ["no raw event payload dump", "no raw corrupt JSONL lines", "no prompt text", "no token values", "no Bearer values", "no auth environment assignment values", "no private absolute cwd paths"];
|
|
20
|
+
}, {
|
|
21
|
+
readonly schemaVersion: "agent-runtime.conformance.v1";
|
|
22
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "ok", "mode", "agents"];
|
|
23
|
+
readonly classificationFields: readonly ["agents[].runClassification", "agents[].skippedReason", "agents[].failureReason"];
|
|
24
|
+
readonly redactionRules: readonly ["observedTextTail is bounded and redacted", "diagnostics are redacted", "no prompt text", "no token values", "no Bearer values", "no auth environment assignment values", "no private absolute cwd paths"];
|
|
25
|
+
}, {
|
|
26
|
+
readonly schemaVersion: "agent-runtime.realSmoke.v1";
|
|
27
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "type", "ok", "mode", "adapter", "version", "auth", "modelsSource", "runClassification", "expectedTextRequired", "expectedTextMatched", "observedTextDeltaCount", "observedTextTail", "cwdMutationChecked", "cwdMutated", "diagnosticsCount", "diagnostics", "skippedReason", "failureReason"];
|
|
28
|
+
readonly classificationFields: readonly ["runClassification", "skippedReason", "failureReason"];
|
|
29
|
+
readonly redactionRules: readonly ["no final run record", "observedTextTail is bounded and redacted", "no prompt text", "no token values", "no Bearer values", "no auth environment assignment values", "no private absolute cwd paths"];
|
|
30
|
+
}, {
|
|
31
|
+
readonly schemaVersion: "agent-runtime.storeHealth.v1";
|
|
32
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "ok", "checkedAt", "lock", "totals", "corruptManifests", "corruptEventLogs", "partialTails", "activeRecords", "activeInterrupted", "warnings", "storageDiagnostics", "diagnostics"];
|
|
33
|
+
readonly classificationFields: readonly ["ok", "lock.status", "diagnostics.byCode"];
|
|
34
|
+
readonly redactionRules: readonly ["no raw corrupt JSONL lines", "no prompt text", "no token values", "no Bearer values", "no auth environment assignment values", "no private absolute cwd paths"];
|
|
35
|
+
}, {
|
|
36
|
+
readonly schemaVersion: "agent-runtime.storeRepair.v1";
|
|
37
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "storageDir", "checkedAt", "dryRun", "applied", "ok", "actions", "diagnostics"];
|
|
38
|
+
readonly classificationFields: readonly ["ok", "blockedReason", "actions[].action", "diagnostics.byCode"];
|
|
39
|
+
readonly redactionRules: readonly ["backup paths are redacted before CLI emission", "no raw corrupt JSONL lines", "no prompt text", "no token values", "no Bearer values", "no auth environment assignment values", "no private absolute cwd paths"];
|
|
40
|
+
}, {
|
|
41
|
+
readonly schemaVersion: "agent-runtime.cliError.v1";
|
|
42
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "ok", "error"];
|
|
43
|
+
readonly classificationFields: readonly ["error.code"];
|
|
44
|
+
readonly redactionRules: readonly ["error.message is short and redacted", "no prompt text", "no token values", "no Bearer values", "no auth environment assignment values", "no private absolute cwd paths"];
|
|
45
|
+
}, {
|
|
46
|
+
readonly schemaVersion: "agent-cli-runtime.releaseVerification.v1";
|
|
47
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "ok", "checkedFiles", "tarball", "diagnostics", "artifactNames", "gateEvidence", "packageName", "version"];
|
|
48
|
+
readonly classificationFields: readonly ["ok", "diagnostics[].code"];
|
|
49
|
+
readonly redactionRules: readonly ["diagnostics are redacted", "no private package paths", "no token-looking values", "no npm token references"];
|
|
50
|
+
}, {
|
|
51
|
+
readonly schemaVersion: "agent-cli-runtime.releaseGateEvidence.v1";
|
|
52
|
+
readonly requiredTopLevelFields: readonly ["schemaVersion", "generatedAt", "gates", "noAuthenticatedRealRun", "noNpmPublish", "noNpmToken"];
|
|
53
|
+
readonly classificationFields: readonly ["gates[].ok", "gates[].outputSchemaVersion", "gates[].packageSource"];
|
|
54
|
+
readonly redactionRules: readonly ["no authenticated real run output", "no npm token references", "no private temp paths"];
|
|
55
|
+
}];
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export const EVENT_TERMINAL_REASONS = [
|
|
2
|
+
"success",
|
|
3
|
+
"failed",
|
|
4
|
+
"timeout",
|
|
5
|
+
"canceled",
|
|
6
|
+
"interrupted",
|
|
7
|
+
"validation_failed",
|
|
8
|
+
"execution_failed",
|
|
9
|
+
"unavailable",
|
|
10
|
+
"auth_missing",
|
|
11
|
+
"task_graph_invalid",
|
|
12
|
+
];
|
|
13
|
+
export const SMOKE_CONFORMANCE_CLASSIFICATIONS = [
|
|
14
|
+
"success",
|
|
15
|
+
"real_run_skipped",
|
|
16
|
+
"auth_missing",
|
|
17
|
+
"unavailable_executable",
|
|
18
|
+
"unsupported_flag",
|
|
19
|
+
"needs_verification",
|
|
20
|
+
"unexpected_output",
|
|
21
|
+
"cwd_mutated",
|
|
22
|
+
"timeout",
|
|
23
|
+
"failed",
|
|
24
|
+
];
|
|
25
|
+
const commonRedactionRules = [
|
|
26
|
+
"no prompt text",
|
|
27
|
+
"no token values",
|
|
28
|
+
"no Bearer values",
|
|
29
|
+
"no auth environment assignment values",
|
|
30
|
+
"no private absolute cwd paths",
|
|
31
|
+
];
|
|
32
|
+
export const CLI_SCHEMA_INVENTORY = [
|
|
33
|
+
{
|
|
34
|
+
schemaVersion: "agent-runtime.event.v1",
|
|
35
|
+
requiredTopLevelFields: ["schemaVersion", "id", "sequence", "timestamp", "scope", "event"],
|
|
36
|
+
classificationFields: ["terminal.result", "terminal.reason"],
|
|
37
|
+
redactionRules: ["event payloads must use runtime redaction before CLI emission", ...commonRedactionRules],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
schemaVersion: "agent-runtime.diagnostics.v1",
|
|
41
|
+
requiredTopLevelFields: [
|
|
42
|
+
"schemaVersion",
|
|
43
|
+
"exportedAt",
|
|
44
|
+
"subject",
|
|
45
|
+
"manifest",
|
|
46
|
+
"events",
|
|
47
|
+
"diagnostics",
|
|
48
|
+
"storageDiagnostics",
|
|
49
|
+
"consistencyWarnings",
|
|
50
|
+
"supervisorSummary",
|
|
51
|
+
"adapterSummary",
|
|
52
|
+
],
|
|
53
|
+
classificationFields: ["supervisorSummary.terminalReason", "diagnostics[].code"],
|
|
54
|
+
redactionRules: ["no raw event payload dump", "no raw corrupt JSONL lines", ...commonRedactionRules],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
schemaVersion: "agent-runtime.conformance.v1",
|
|
58
|
+
requiredTopLevelFields: ["schemaVersion", "ok", "mode", "agents"],
|
|
59
|
+
classificationFields: ["agents[].runClassification", "agents[].skippedReason", "agents[].failureReason"],
|
|
60
|
+
redactionRules: ["observedTextTail is bounded and redacted", "diagnostics are redacted", ...commonRedactionRules],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
schemaVersion: "agent-runtime.realSmoke.v1",
|
|
64
|
+
requiredTopLevelFields: [
|
|
65
|
+
"schemaVersion",
|
|
66
|
+
"type",
|
|
67
|
+
"ok",
|
|
68
|
+
"mode",
|
|
69
|
+
"adapter",
|
|
70
|
+
"version",
|
|
71
|
+
"auth",
|
|
72
|
+
"modelsSource",
|
|
73
|
+
"runClassification",
|
|
74
|
+
"expectedTextRequired",
|
|
75
|
+
"expectedTextMatched",
|
|
76
|
+
"observedTextDeltaCount",
|
|
77
|
+
"observedTextTail",
|
|
78
|
+
"cwdMutationChecked",
|
|
79
|
+
"cwdMutated",
|
|
80
|
+
"diagnosticsCount",
|
|
81
|
+
"diagnostics",
|
|
82
|
+
"skippedReason",
|
|
83
|
+
"failureReason",
|
|
84
|
+
],
|
|
85
|
+
classificationFields: ["runClassification", "skippedReason", "failureReason"],
|
|
86
|
+
redactionRules: ["no final run record", "observedTextTail is bounded and redacted", ...commonRedactionRules],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
schemaVersion: "agent-runtime.storeHealth.v1",
|
|
90
|
+
requiredTopLevelFields: [
|
|
91
|
+
"schemaVersion",
|
|
92
|
+
"ok",
|
|
93
|
+
"checkedAt",
|
|
94
|
+
"lock",
|
|
95
|
+
"totals",
|
|
96
|
+
"corruptManifests",
|
|
97
|
+
"corruptEventLogs",
|
|
98
|
+
"partialTails",
|
|
99
|
+
"activeRecords",
|
|
100
|
+
"activeInterrupted",
|
|
101
|
+
"warnings",
|
|
102
|
+
"storageDiagnostics",
|
|
103
|
+
"diagnostics",
|
|
104
|
+
],
|
|
105
|
+
classificationFields: ["ok", "lock.status", "diagnostics.byCode"],
|
|
106
|
+
redactionRules: ["no raw corrupt JSONL lines", ...commonRedactionRules],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
schemaVersion: "agent-runtime.storeRepair.v1",
|
|
110
|
+
requiredTopLevelFields: ["schemaVersion", "storageDir", "checkedAt", "dryRun", "applied", "ok", "actions", "diagnostics"],
|
|
111
|
+
classificationFields: ["ok", "blockedReason", "actions[].action", "diagnostics.byCode"],
|
|
112
|
+
redactionRules: ["backup paths are redacted before CLI emission", "no raw corrupt JSONL lines", ...commonRedactionRules],
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
schemaVersion: "agent-runtime.cliError.v1",
|
|
116
|
+
requiredTopLevelFields: ["schemaVersion", "ok", "error"],
|
|
117
|
+
classificationFields: ["error.code"],
|
|
118
|
+
redactionRules: ["error.message is short and redacted", ...commonRedactionRules],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
schemaVersion: "agent-cli-runtime.releaseVerification.v1",
|
|
122
|
+
requiredTopLevelFields: [
|
|
123
|
+
"schemaVersion",
|
|
124
|
+
"ok",
|
|
125
|
+
"checkedFiles",
|
|
126
|
+
"tarball",
|
|
127
|
+
"diagnostics",
|
|
128
|
+
"artifactNames",
|
|
129
|
+
"gateEvidence",
|
|
130
|
+
"packageName",
|
|
131
|
+
"version",
|
|
132
|
+
],
|
|
133
|
+
classificationFields: ["ok", "diagnostics[].code"],
|
|
134
|
+
redactionRules: ["diagnostics are redacted", "no private package paths", "no token-looking values", "no npm token references"],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
schemaVersion: "agent-cli-runtime.releaseGateEvidence.v1",
|
|
138
|
+
requiredTopLevelFields: ["schemaVersion", "generatedAt", "gates", "noAuthenticatedRealRun", "noNpmPublish", "noNpmToken"],
|
|
139
|
+
classificationFields: ["gates[].ok", "gates[].outputSchemaVersion", "gates[].packageSource"],
|
|
140
|
+
redactionRules: ["no authenticated real run output", "no npm token references", "no private temp paths"],
|
|
141
|
+
},
|
|
142
|
+
];
|
|
143
|
+
//# sourceMappingURL=schema-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-contract.js","sourceRoot":"","sources":["../../src/core/schema-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentAdapterDef, DetectedAgent } from "../adapters/adapter-types.js";
|
|
2
|
+
import type { RuntimeEnvironment } from "../public-types.js";
|
|
3
|
+
export interface DetectOptions {
|
|
4
|
+
envByAgent?: Record<string, Record<string, string>>;
|
|
5
|
+
includeUnavailable?: boolean;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface DetectionContext {
|
|
9
|
+
adapters: AgentAdapterDef[];
|
|
10
|
+
env?: RuntimeEnvironment;
|
|
11
|
+
searchPath?: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function detectAgents(context: DetectionContext, options?: DetectOptions): Promise<DetectedAgent[]>;
|
|
14
|
+
export declare function detectAgentsStream(context: DetectionContext, options?: DetectOptions): AsyncIterable<DetectedAgent>;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { accessSync, constants, existsSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { diagnostic } from "../core/diagnostics.js";
|
|
4
|
+
import { redactText } from "../core/redaction.js";
|
|
5
|
+
import { resolveExecutable } from "./executable-resolution.js";
|
|
6
|
+
import { execProbe } from "./invocation.js";
|
|
7
|
+
import { mergeEnv } from "./env.js";
|
|
8
|
+
export async function detectAgents(context, options = {}) {
|
|
9
|
+
const agents = await Promise.all(context.adapters.map((adapter) => safeDetectAdapter(adapter, context, options)));
|
|
10
|
+
return options.includeUnavailable ? agents : agents.filter((agent) => agent.available);
|
|
11
|
+
}
|
|
12
|
+
export async function* detectAgentsStream(context, options = {}) {
|
|
13
|
+
const probes = context.adapters.map((adapter, index) => safeDetectAdapter(adapter, context, options).then((agent) => ({ index, agent })));
|
|
14
|
+
const pending = new Set(probes.keys());
|
|
15
|
+
while (pending.size > 0) {
|
|
16
|
+
const { index, agent } = await Promise.race(probes.filter((_, probeIndex) => pending.has(probeIndex)));
|
|
17
|
+
pending.delete(index);
|
|
18
|
+
if (options.includeUnavailable || agent.available)
|
|
19
|
+
yield agent;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function safeDetectAdapter(adapter, context, options) {
|
|
23
|
+
try {
|
|
24
|
+
return await detectAdapter(adapter, context, options);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return unavailable(adapter, [
|
|
28
|
+
diagnostic("AGENT_UNAVAILABLE", `Detection failed for ${adapter.id}`, {
|
|
29
|
+
agentId: adapter.id,
|
|
30
|
+
stderrTail: redactText(error instanceof Error ? error.message : String(error)),
|
|
31
|
+
}),
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function detectAdapter(adapter, context, options) {
|
|
36
|
+
const configuredEnv = options.envByAgent?.[adapter.id] ?? {};
|
|
37
|
+
const env = mergeEnv(context.env ?? process.env, adapter.env, configuredEnv);
|
|
38
|
+
const resolution = resolveExecutable(adapter, { env, searchPath: context.searchPath });
|
|
39
|
+
if (!resolution.selectedPath) {
|
|
40
|
+
const notExecutablePath = notExecutableCandidatePath(adapter, env, resolution.searchedLocations);
|
|
41
|
+
if (notExecutablePath) {
|
|
42
|
+
return unavailable(adapter, [
|
|
43
|
+
diagnostic("not_executable", `${adapter.displayName} executable is not executable`, {
|
|
44
|
+
agentId: adapter.id,
|
|
45
|
+
path: notExecutablePath,
|
|
46
|
+
searchedLocations: resolution.searchedLocations,
|
|
47
|
+
}),
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
return unavailable(adapter, [
|
|
51
|
+
diagnostic("not_installed", `${adapter.displayName} executable was not found`, {
|
|
52
|
+
agentId: adapter.id,
|
|
53
|
+
searchedLocations: resolution.searchedLocations,
|
|
54
|
+
}),
|
|
55
|
+
]);
|
|
56
|
+
}
|
|
57
|
+
let version = null;
|
|
58
|
+
const versionDiagnostics = [];
|
|
59
|
+
try {
|
|
60
|
+
const probe = await execProbe(resolution.selectedPath, adapter.versionArgs, {
|
|
61
|
+
env,
|
|
62
|
+
timeoutMs: options.timeoutMs ?? 3_000,
|
|
63
|
+
});
|
|
64
|
+
version = probe.stdout.trim().split(/\r?\n/u)[0] || null;
|
|
65
|
+
if (version && adapter.compatibility?.versionOutputPattern && !new RegExp(adapter.compatibility.versionOutputPattern, "iu").test(version)) {
|
|
66
|
+
versionDiagnostics.push(diagnostic("needs_verification", `${adapter.displayName} version output shape is not in the tracked compatibility profile`, {
|
|
67
|
+
agentId: adapter.id,
|
|
68
|
+
path: resolution.selectedPath,
|
|
69
|
+
probe: "version",
|
|
70
|
+
stdoutTail: redactText(tail(version)),
|
|
71
|
+
actionableHints: [
|
|
72
|
+
"Verify this CLI version output manually before adding or trusting new flags.",
|
|
73
|
+
"Keep unknown flags in needsVerification until a real local observation proves the profile.",
|
|
74
|
+
],
|
|
75
|
+
retryable: false,
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return unavailable(adapter, [
|
|
81
|
+
probeDiagnostic("version", error, `${adapter.displayName} could not be invoked`, {
|
|
82
|
+
agentId: adapter.id,
|
|
83
|
+
path: resolution.selectedPath,
|
|
84
|
+
}),
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
const capabilityDiagnostics = await probeCapabilities(adapter, resolution.selectedPath, env);
|
|
88
|
+
const models = await probeModels(adapter, resolution.selectedPath, env);
|
|
89
|
+
const authStatus = await probeAuth(adapter, resolution.selectedPath, env);
|
|
90
|
+
return {
|
|
91
|
+
id: adapter.id,
|
|
92
|
+
displayName: adapter.displayName,
|
|
93
|
+
available: true,
|
|
94
|
+
path: resolution.selectedPath,
|
|
95
|
+
version,
|
|
96
|
+
authStatus: authStatus.status,
|
|
97
|
+
models: models.models,
|
|
98
|
+
modelsSource: models.source,
|
|
99
|
+
capabilities: {
|
|
100
|
+
streaming: adapter.capabilities?.streaming ?? true,
|
|
101
|
+
tools: adapter.capabilities?.tools ?? false,
|
|
102
|
+
models: adapter.capabilities?.models ?? Boolean(adapter.listModels),
|
|
103
|
+
authProbe: Boolean(adapter.authProbe),
|
|
104
|
+
prompt: [adapter.promptTransport.kind],
|
|
105
|
+
},
|
|
106
|
+
diagnostics: [...versionDiagnostics, ...capabilityDiagnostics, ...models.diagnostics, ...authStatus.diagnostics],
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async function probeCapabilities(adapter, command, env) {
|
|
110
|
+
if (!adapter.helpArgs && !adapter.capabilityFlags)
|
|
111
|
+
return [];
|
|
112
|
+
if (!adapter.helpArgs) {
|
|
113
|
+
return [
|
|
114
|
+
diagnostic("probe_failed", `${adapter.displayName} declares capability flags without a help probe`, {
|
|
115
|
+
agentId: adapter.id,
|
|
116
|
+
path: command,
|
|
117
|
+
probe: "capabilities",
|
|
118
|
+
retryable: false,
|
|
119
|
+
}),
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
const probe = await execProbe(command, adapter.helpArgs, { env, timeoutMs: 3_000 });
|
|
124
|
+
const output = `${probe.stdout}\n${probe.stderr}`;
|
|
125
|
+
return Object.keys(adapter.capabilityFlags ?? {})
|
|
126
|
+
.filter((flag) => !output.includes(flag))
|
|
127
|
+
.map((flag) => diagnostic("unsupported_flag", `${adapter.displayName} capability flag is not present in help output: ${flag}`, {
|
|
128
|
+
agentId: adapter.id,
|
|
129
|
+
path: command,
|
|
130
|
+
probe: "capabilities",
|
|
131
|
+
stdoutTail: probe.stdout ? redactText(tail(probe.stdout)) : undefined,
|
|
132
|
+
stderrTail: probe.stderr ? redactText(tail(probe.stderr)) : undefined,
|
|
133
|
+
actionableHints: [
|
|
134
|
+
"The installed CLI help output does not contain a flag tracked by this adapter profile.",
|
|
135
|
+
"Do not guess a replacement flag; mark the capability as needs_verification until verified locally.",
|
|
136
|
+
],
|
|
137
|
+
retryable: false,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
return [probeDiagnostic("capabilities", error, `${adapter.displayName} capability probe failed`, { agentId: adapter.id, path: command })];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function probeModels(adapter, command, env) {
|
|
145
|
+
if (!adapter.listModels) {
|
|
146
|
+
return { models: adapter.fallbackModels ?? [], source: adapter.fallbackModels?.length ? "fallback" : "none", diagnostics: [] };
|
|
147
|
+
}
|
|
148
|
+
const diagnostics = [];
|
|
149
|
+
try {
|
|
150
|
+
const probe = await execProbe(command, adapter.listModels.args, { env, timeoutMs: adapter.listModels.timeoutMs ?? 5_000 });
|
|
151
|
+
const parsed = adapter.listModels.parse(probe.stdout, probe.stderr);
|
|
152
|
+
if (parsed?.length)
|
|
153
|
+
return { models: parsed, source: "live", diagnostics };
|
|
154
|
+
diagnostics.push(probeDiagnostic("models", { stdout: probe.stdout, stderr: probe.stderr }, `${adapter.displayName} model probe produced no supported model lines`, { agentId: adapter.id, path: command }));
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
diagnostics.push(probeDiagnostic("models", error, `${adapter.displayName} model probe failed`, { agentId: adapter.id, path: command }));
|
|
158
|
+
// Fallback model hints are part of the public detection contract.
|
|
159
|
+
}
|
|
160
|
+
return { models: adapter.fallbackModels ?? [], source: adapter.fallbackModels?.length ? "fallback" : "none", diagnostics };
|
|
161
|
+
}
|
|
162
|
+
async function probeAuth(adapter, command, env) {
|
|
163
|
+
if (!adapter.authProbe)
|
|
164
|
+
return { status: "unknown", diagnostics: [] };
|
|
165
|
+
try {
|
|
166
|
+
const probe = await execProbe(command, adapter.authProbe.args, { env, timeoutMs: adapter.authProbe.timeoutMs ?? 3_000 });
|
|
167
|
+
const status = adapter.authProbe.parse?.(probe.stdout, probe.stderr) ?? "unknown";
|
|
168
|
+
return {
|
|
169
|
+
status,
|
|
170
|
+
diagnostics: status === "missing" || status === "expired" ? [probeDiagnostic("auth", { stdout: probe.stdout, stderr: probe.stderr, authStatus: status }, `${adapter.displayName} auth is ${status}`, { agentId: adapter.id, path: command })] : [],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const stdout = typeof error.stdout === "string" ? error.stdout : "";
|
|
175
|
+
const stderr = typeof error.stderr === "string" ? error.stderr : "";
|
|
176
|
+
const parsed = stdout || stderr ? adapter.authProbe.parse?.(stdout, stderr) : undefined;
|
|
177
|
+
const status = parsed === "missing" || parsed === "expired" ? parsed : isAuthMissingText(`${stdout}\n${stderr}`) ? "missing" : "unknown";
|
|
178
|
+
const diagnosticInput = error && typeof error === "object" ? { ...error, authStatus: status } : { authStatus: status, stderr: String(error) };
|
|
179
|
+
return {
|
|
180
|
+
status,
|
|
181
|
+
diagnostics: [probeDiagnostic("auth", diagnosticInput, status === "missing" ? `${adapter.displayName} auth is missing` : `${adapter.displayName} auth probe failed`, { agentId: adapter.id, path: command })],
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function probeDiagnostic(probe, error, fallbackMessage, init = {}) {
|
|
186
|
+
const stdout = stringField(error, "stdout");
|
|
187
|
+
const stderr = stringField(error, "stderr");
|
|
188
|
+
const text = `${stdout}\n${stderr}\n${error instanceof Error ? error.message : String(error)}`;
|
|
189
|
+
const code = classifyProbeError(probe, error, text);
|
|
190
|
+
return diagnostic(code, redactText(messageForProbe(code, fallbackMessage)), {
|
|
191
|
+
...init,
|
|
192
|
+
probe,
|
|
193
|
+
exitCode: numberField(error, "code"),
|
|
194
|
+
signal: stringField(error, "signal"),
|
|
195
|
+
stdoutTail: stdout ? redactText(tail(stdout)) : undefined,
|
|
196
|
+
stderrTail: stderr ? redactText(tail(stderr)) : redactText(errorMessage(error)),
|
|
197
|
+
retryable: code === "network_error" || code === "probe_failed",
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
function classifyProbeError(probe, error, text) {
|
|
201
|
+
const errCode = stringField(error, "code");
|
|
202
|
+
if (errCode === "ENOENT")
|
|
203
|
+
return "not_installed";
|
|
204
|
+
if (errCode === "EACCES" || errCode === "EPERM")
|
|
205
|
+
return "not_executable";
|
|
206
|
+
if (probe === "auth" && (isAuthMissingText(text) || stringField(error, "authStatus") === "missing"))
|
|
207
|
+
return "auth_missing";
|
|
208
|
+
if (/ENOTFOUND|ECONNRESET|ECONNREFUSED|ETIMEDOUT|network|fetch failed|socket hang up/i.test(text))
|
|
209
|
+
return "network_error";
|
|
210
|
+
if (/unknown (option|flag)|unrecognized (option|flag)|unsupported (option|flag)|invalid (option|flag)|unknown argument/i.test(text))
|
|
211
|
+
return "unsupported_flag";
|
|
212
|
+
return "probe_failed";
|
|
213
|
+
}
|
|
214
|
+
function messageForProbe(code, fallback) {
|
|
215
|
+
if (code === "auth_missing")
|
|
216
|
+
return "Auth is missing or expired for this CLI";
|
|
217
|
+
if (code === "network_error")
|
|
218
|
+
return "Probe failed because of a network error";
|
|
219
|
+
if (code === "unsupported_flag")
|
|
220
|
+
return "Probe failed because the installed CLI does not support the requested flag or command";
|
|
221
|
+
if (code === "not_installed")
|
|
222
|
+
return "CLI executable was not found";
|
|
223
|
+
if (code === "not_executable")
|
|
224
|
+
return "CLI executable is not executable";
|
|
225
|
+
return fallback;
|
|
226
|
+
}
|
|
227
|
+
function isAuthMissingText(text) {
|
|
228
|
+
return /auth(entication)? required|not authenticated|not logged in|login required|please log in|unauthorized|invalid api key/i.test(text);
|
|
229
|
+
}
|
|
230
|
+
function stringField(value, key) {
|
|
231
|
+
const raw = value && typeof value === "object" ? value[key] : undefined;
|
|
232
|
+
return typeof raw === "string" ? raw : "";
|
|
233
|
+
}
|
|
234
|
+
function numberField(value, key) {
|
|
235
|
+
const raw = value && typeof value === "object" ? value[key] : undefined;
|
|
236
|
+
return typeof raw === "number" ? raw : null;
|
|
237
|
+
}
|
|
238
|
+
function tail(value, max = 4_000) {
|
|
239
|
+
return value.length > max ? value.slice(value.length - max) : value;
|
|
240
|
+
}
|
|
241
|
+
function errorMessage(error) {
|
|
242
|
+
if (error instanceof Error)
|
|
243
|
+
return error.message;
|
|
244
|
+
const message = stringField(error, "message");
|
|
245
|
+
if (message)
|
|
246
|
+
return message;
|
|
247
|
+
return typeof error === "string" ? error : "";
|
|
248
|
+
}
|
|
249
|
+
function notExecutableCandidatePath(adapter, env, searchedLocations) {
|
|
250
|
+
const configured = configuredNotExecutablePath(adapter, env);
|
|
251
|
+
if (configured)
|
|
252
|
+
return configured;
|
|
253
|
+
return searchedLocations.find((candidate) => isNotExecutableFile(candidate)) ?? null;
|
|
254
|
+
}
|
|
255
|
+
function configuredNotExecutablePath(adapter, env) {
|
|
256
|
+
if (!adapter.binEnvVar)
|
|
257
|
+
return null;
|
|
258
|
+
const raw = env[adapter.binEnvVar];
|
|
259
|
+
if (typeof raw !== "string" || !path.isAbsolute(raw))
|
|
260
|
+
return null;
|
|
261
|
+
return isNotExecutableFile(raw) ? raw : null;
|
|
262
|
+
}
|
|
263
|
+
function isNotExecutableFile(candidate) {
|
|
264
|
+
try {
|
|
265
|
+
if (!existsSync(candidate) || !statSync(candidate).isFile())
|
|
266
|
+
return false;
|
|
267
|
+
if (process.platform === "win32")
|
|
268
|
+
return false;
|
|
269
|
+
accessSync(candidate, constants.X_OK);
|
|
270
|
+
return false;
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function unavailable(adapter, diagnostics = []) {
|
|
277
|
+
return {
|
|
278
|
+
id: adapter.id,
|
|
279
|
+
displayName: adapter.displayName,
|
|
280
|
+
available: false,
|
|
281
|
+
models: adapter.fallbackModels ?? [],
|
|
282
|
+
modelsSource: adapter.fallbackModels?.length ? "fallback" : "none",
|
|
283
|
+
capabilities: {
|
|
284
|
+
streaming: adapter.capabilities?.streaming ?? true,
|
|
285
|
+
tools: adapter.capabilities?.tools ?? false,
|
|
286
|
+
models: adapter.capabilities?.models ?? Boolean(adapter.listModels),
|
|
287
|
+
authProbe: Boolean(adapter.authProbe),
|
|
288
|
+
prompt: [adapter.promptTransport.kind],
|
|
289
|
+
},
|
|
290
|
+
diagnostics,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/detection/detect.ts"],"names":[],"mappings":"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"}
|