@vectle/cli 1.0.0 → 1.1.1
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 +22 -0
- package/README.md +15 -8
- package/dist/activity.d.ts +10 -0
- package/dist/activity.js +10 -0
- package/dist/activity.js.map +1 -0
- package/dist/adapters/claude.d.ts +4 -0
- package/dist/adapters/claude.js +279 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex.d.ts +16 -0
- package/dist/adapters/codex.js +410 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/common.d.ts +80 -0
- package/dist/adapters/common.js +249 -0
- package/dist/adapters/common.js.map +1 -0
- package/dist/adapters/cursor.d.ts +4 -0
- package/dist/adapters/cursor.js +240 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/vscode.d.ts +4 -0
- package/dist/adapters/vscode.js +240 -0
- package/dist/adapters/vscode.js.map +1 -0
- package/dist/agent-policy.d.ts +50 -0
- package/dist/agent-policy.js +83 -0
- package/dist/agent-policy.js.map +1 -0
- package/dist/client.d.ts +69 -10
- package/dist/client.js +247 -24
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +12 -2
- package/dist/constants.js +7 -1
- package/dist/constants.js.map +1 -1
- package/dist/contracts.d.ts +53 -0
- package/dist/contracts.js +68 -0
- package/dist/contracts.js.map +1 -0
- package/dist/delivery.d.ts +80 -0
- package/dist/delivery.js +304 -0
- package/dist/delivery.js.map +1 -0
- package/dist/findings.d.ts +12 -0
- package/dist/findings.js +41 -0
- package/dist/findings.js.map +1 -0
- package/dist/help.d.ts +1 -0
- package/dist/help.js +53 -0
- package/dist/help.js.map +1 -0
- package/dist/index.js +370 -72
- package/dist/index.js.map +1 -1
- package/dist/integrations.d.ts +126 -0
- package/dist/integrations.js +173 -0
- package/dist/integrations.js.map +1 -0
- package/dist/legacy-compat.d.ts +45 -0
- package/dist/legacy-compat.js +149 -0
- package/dist/legacy-compat.js.map +1 -0
- package/dist/lifecycle.d.ts +50 -0
- package/dist/lifecycle.js +146 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/locator.d.ts +58 -0
- package/dist/locator.js +233 -0
- package/dist/locator.js.map +1 -0
- package/dist/mcp.d.ts +12 -2
- package/dist/mcp.js +194 -48
- package/dist/mcp.js.map +1 -1
- package/dist/modes.d.ts +37 -0
- package/dist/modes.js +32 -0
- package/dist/modes.js.map +1 -0
- package/dist/outbox.d.ts +9 -0
- package/dist/outbox.js +188 -0
- package/dist/outbox.js.map +1 -0
- package/dist/parser.d.ts +10 -0
- package/dist/parser.js +99 -0
- package/dist/parser.js.map +1 -0
- package/dist/pulse.d.ts +122 -0
- package/dist/pulse.js +412 -0
- package/dist/pulse.js.map +1 -0
- package/dist/release-manifest.d.ts +123 -0
- package/dist/release-manifest.js +226 -0
- package/dist/release-manifest.js.map +1 -0
- package/dist/release.d.ts +1 -1
- package/dist/response.d.ts +17 -0
- package/dist/response.js +15 -0
- package/dist/response.js.map +1 -1
- package/dist/rollout.d.ts +8 -0
- package/dist/rollout.js +27 -0
- package/dist/rollout.js.map +1 -0
- package/dist/runtime.d.ts +60 -0
- package/dist/runtime.js +276 -0
- package/dist/runtime.js.map +1 -0
- package/dist/secure-store.d.ts +36 -0
- package/dist/secure-store.js +284 -0
- package/dist/secure-store.js.map +1 -0
- package/dist/setup.d.ts +159 -0
- package/dist/setup.js +629 -0
- package/dist/setup.js.map +1 -0
- package/dist/state.d.ts +98 -0
- package/dist/state.js +226 -0
- package/dist/state.js.map +1 -0
- package/dist/status.d.ts +282 -0
- package/dist/status.js +213 -0
- package/dist/status.js.map +1 -0
- package/dist/store.d.ts +44 -2
- package/dist/store.js +222 -44
- package/dist/store.js.map +1 -1
- package/dist/update.d.ts +33 -1
- package/dist/update.js +88 -16
- package/dist/update.js.map +1 -1
- package/dist/write-journal.d.ts +71 -0
- package/dist/write-journal.js +175 -0
- package/dist/write-journal.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { type ClientFamily } from './store.js';
|
|
2
|
+
import type { VectleConfig } from './store.js';
|
|
3
|
+
type IntegrationCapability = 'full_lifecycle' | 'policy_and_mcp' | 'mcp_only' | 'authorized_only' | 'disconnected' | 'conflict';
|
|
4
|
+
type AdapterOption = {
|
|
5
|
+
client_family: ClientFamily;
|
|
6
|
+
profile_label: string;
|
|
7
|
+
adapter_entry_id: string | null;
|
|
8
|
+
};
|
|
9
|
+
type ClientSelection = {
|
|
10
|
+
schema_version: 'client-selection-v1';
|
|
11
|
+
status: 'not_required' | 'selected' | 'choice_required' | 'none_detected';
|
|
12
|
+
reason: 'all_requested' | 'managed_invocation' | 'explicit_family' | 'single_detected' | 'multiple_detected' | 'same_family_multiple_profiles' | 'no_supported_client';
|
|
13
|
+
options: AdapterOption[];
|
|
14
|
+
};
|
|
15
|
+
export type SupportedClientFamily = Exclude<ClientFamily, 'terminal' | 'unknown'>;
|
|
16
|
+
export declare const SUPPORTED_CLIENTS: readonly SupportedClientFamily[];
|
|
17
|
+
export type DetectionResult = {
|
|
18
|
+
client: SupportedClientFamily;
|
|
19
|
+
state: 'active_invocation' | 'managed_existing' | 'configured_unmanaged' | 'installed_only' | 'absent';
|
|
20
|
+
confidence: 'authoritative' | 'high' | 'weak' | 'none';
|
|
21
|
+
profileKey: string | null;
|
|
22
|
+
profileLabel: string;
|
|
23
|
+
adapterEntryId: string | null;
|
|
24
|
+
evidence: Array<{
|
|
25
|
+
source: 'explicit_flag' | 'managed_manifest' | 'immediate_parent' | 'documented_host_marker' | 'exact_config_entry' | 'executable';
|
|
26
|
+
safeCode: string;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
export type IntegrationManifestEntry = {
|
|
30
|
+
adapter_entry_id: string;
|
|
31
|
+
client_family: SupportedClientFamily;
|
|
32
|
+
profile_label: string;
|
|
33
|
+
integration_capability: IntegrationCapability;
|
|
34
|
+
policy_checksum: `sha256:${string}`;
|
|
35
|
+
integration_binding_digest: `sha256:${string}`;
|
|
36
|
+
managed: true;
|
|
37
|
+
config_digest: `sha256:${string}` | null;
|
|
38
|
+
hook_digest: `sha256:${string}` | null;
|
|
39
|
+
installed_at: string;
|
|
40
|
+
updated_at: string;
|
|
41
|
+
};
|
|
42
|
+
export type IntegrationManifest = {
|
|
43
|
+
schema_version: 'integrations-v1';
|
|
44
|
+
entries: IntegrationManifestEntry[];
|
|
45
|
+
};
|
|
46
|
+
export declare function emptyIntegrationManifest(): IntegrationManifest;
|
|
47
|
+
export declare function validateAdapterEntryId(value: unknown): value is string;
|
|
48
|
+
export declare function loadIntegrationManifest(root?: string): IntegrationManifest;
|
|
49
|
+
export declare function saveIntegrationManifest(manifest: IntegrationManifest, root?: string): void;
|
|
50
|
+
export declare function removeIntegrationEntries(families?: readonly SupportedClientFamily[], root?: string): number;
|
|
51
|
+
export type DetectionOptions = {
|
|
52
|
+
explicit?: ClientFamily | 'auto' | 'all';
|
|
53
|
+
trustedInvocation?: SupportedClientFamily;
|
|
54
|
+
home?: string;
|
|
55
|
+
manifest?: IntegrationManifest;
|
|
56
|
+
configEvidence?: Partial<Record<SupportedClientFamily, string[]>>;
|
|
57
|
+
};
|
|
58
|
+
export declare function detectClients(options?: DetectionOptions): DetectionResult[];
|
|
59
|
+
export declare function chooseClient(options?: DetectionOptions): {
|
|
60
|
+
selection: ClientSelection;
|
|
61
|
+
selected: DetectionResult | null;
|
|
62
|
+
candidates: DetectionResult[];
|
|
63
|
+
};
|
|
64
|
+
export declare function newIntegrationEntry(client: SupportedClientFamily, profileLabel: string, policyChecksum: `sha256:${string}`, integrationBindingDigest: `sha256:${string}`, capability?: IntegrationCapability): IntegrationManifestEntry;
|
|
65
|
+
export type IntegrationBindingDetails = {
|
|
66
|
+
clientFamily: SupportedClientFamily;
|
|
67
|
+
profileKey: string;
|
|
68
|
+
stateRoot: string;
|
|
69
|
+
nodePath: string;
|
|
70
|
+
nodeSha256: `sha256:${string}`;
|
|
71
|
+
cliEntry: string;
|
|
72
|
+
cliSha256: `sha256:${string}`;
|
|
73
|
+
policyBaseVersion: string;
|
|
74
|
+
policyVariant: string;
|
|
75
|
+
policyChecksum: `sha256:${string}`;
|
|
76
|
+
ownedTargetIdentifiers: string[];
|
|
77
|
+
managedCommandArgumentVectors: string[][];
|
|
78
|
+
};
|
|
79
|
+
export declare function canonicalIntegrationBinding(value: Record<string, unknown>): string;
|
|
80
|
+
export declare function integrationBindingProjection(config: Pick<VectleConfig, 'endpoint' | 'installation'>, adapterEntryId: string, details?: IntegrationBindingDetails): {
|
|
81
|
+
schema_version: string;
|
|
82
|
+
adapter_entry_id: string;
|
|
83
|
+
client_family: string;
|
|
84
|
+
profile_key: string;
|
|
85
|
+
state_root: string;
|
|
86
|
+
approved_api_origin: string;
|
|
87
|
+
cli_version: string;
|
|
88
|
+
runtime: {
|
|
89
|
+
node_path: string;
|
|
90
|
+
node_sha256: string;
|
|
91
|
+
cli_entry: string;
|
|
92
|
+
cli_sha256: string;
|
|
93
|
+
};
|
|
94
|
+
policy: {
|
|
95
|
+
base_version: string;
|
|
96
|
+
variant: string;
|
|
97
|
+
checksum: string;
|
|
98
|
+
};
|
|
99
|
+
owned_target_identifiers: never[];
|
|
100
|
+
managed_command_argument_vectors: never[];
|
|
101
|
+
} | {
|
|
102
|
+
schema_version: string;
|
|
103
|
+
adapter_entry_id: string;
|
|
104
|
+
client_family: SupportedClientFamily;
|
|
105
|
+
profile_key: string;
|
|
106
|
+
state_root: string;
|
|
107
|
+
approved_api_origin: string;
|
|
108
|
+
cli_version: string;
|
|
109
|
+
runtime: {
|
|
110
|
+
node_path: string;
|
|
111
|
+
node_sha256: `sha256:${string}`;
|
|
112
|
+
cli_entry: string;
|
|
113
|
+
cli_sha256: `sha256:${string}`;
|
|
114
|
+
};
|
|
115
|
+
policy: {
|
|
116
|
+
base_version: string;
|
|
117
|
+
variant: string;
|
|
118
|
+
checksum: `sha256:${string}`;
|
|
119
|
+
};
|
|
120
|
+
owned_target_identifiers: string[];
|
|
121
|
+
managed_command_argument_vectors: string[][];
|
|
122
|
+
};
|
|
123
|
+
export declare function integrationBindingDigest(config: Pick<VectleConfig, 'endpoint' | 'installation'>, adapterEntryId: string, details?: IntegrationBindingDetails): `sha256:${string}`;
|
|
124
|
+
export declare function managedMcpArguments(client: SupportedClientFamily, adapterEntryId: string, stateRoot: string, bindingDigest: string): string[];
|
|
125
|
+
export declare function integrationPathForTests(root?: string): string;
|
|
126
|
+
export {};
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { isAbsolute, join } from 'node:path';
|
|
4
|
+
import { CLI_VERSION } from './constants.js';
|
|
5
|
+
import { atomicWriteJson, digestLocal, issueLocalId } from './state.js';
|
|
6
|
+
import { configDirectory } from './store.js';
|
|
7
|
+
export const SUPPORTED_CLIENTS = ['codex', 'claude_code', 'cursor', 'vscode'];
|
|
8
|
+
const integrationPath = (root = configDirectory()) => join(root, 'integrations.json');
|
|
9
|
+
const clientRoots = {
|
|
10
|
+
codex: '.codex',
|
|
11
|
+
claude_code: '.claude',
|
|
12
|
+
cursor: '.cursor',
|
|
13
|
+
vscode: '.copilot',
|
|
14
|
+
};
|
|
15
|
+
const clientMarkers = {
|
|
16
|
+
codex: ['config.toml', 'hooks.json', 'AGENTS.md', 'AGENTS.override.md'],
|
|
17
|
+
claude_code: ['settings.json', 'CLAUDE.md'],
|
|
18
|
+
cursor: ['mcp.json', 'hooks.json'],
|
|
19
|
+
vscode: ['mcp-config.json', 'instructions', 'hooks'],
|
|
20
|
+
};
|
|
21
|
+
function safeProfile(value) {
|
|
22
|
+
return /^[A-Za-z0-9][A-Za-z0-9 _.-]{0,79}$/u.test(value) ? value : 'default';
|
|
23
|
+
}
|
|
24
|
+
function validEntry(value) {
|
|
25
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
26
|
+
return false;
|
|
27
|
+
const item = value;
|
|
28
|
+
return Object.keys(item).length === 11
|
|
29
|
+
&& typeof item.adapter_entry_id === 'string' && /^vai_[A-Za-z0-9_-]{22}$/u.test(item.adapter_entry_id)
|
|
30
|
+
&& typeof item.client_family === 'string' && SUPPORTED_CLIENTS.includes(item.client_family)
|
|
31
|
+
&& typeof item.profile_label === 'string' && safeProfile(item.profile_label) === item.profile_label
|
|
32
|
+
&& ['full_lifecycle', 'policy_and_mcp', 'mcp_only', 'authorized_only', 'disconnected', 'conflict'].includes(String(item.integration_capability))
|
|
33
|
+
&& typeof item.policy_checksum === 'string' && /^sha256:[0-9a-f]{64}$/u.test(item.policy_checksum)
|
|
34
|
+
&& typeof item.integration_binding_digest === 'string' && /^sha256:[0-9a-f]{64}$/u.test(item.integration_binding_digest)
|
|
35
|
+
&& item.managed === true
|
|
36
|
+
&& (item.config_digest === null || typeof item.config_digest === 'string' && /^sha256:[0-9a-f]{64}$/u.test(item.config_digest))
|
|
37
|
+
&& (item.hook_digest === null || typeof item.hook_digest === 'string' && /^sha256:[0-9a-f]{64}$/u.test(item.hook_digest))
|
|
38
|
+
&& typeof item.installed_at === 'string' && Number.isFinite(Date.parse(item.installed_at))
|
|
39
|
+
&& typeof item.updated_at === 'string' && Number.isFinite(Date.parse(item.updated_at));
|
|
40
|
+
}
|
|
41
|
+
export function emptyIntegrationManifest() { return { schema_version: 'integrations-v1', entries: [] }; }
|
|
42
|
+
export function validateAdapterEntryId(value) {
|
|
43
|
+
if (typeof value !== 'string' || !/^vai_[A-Za-z0-9_-]{22}$/u.test(value))
|
|
44
|
+
return false;
|
|
45
|
+
const encoded = value.slice(4);
|
|
46
|
+
try {
|
|
47
|
+
return Buffer.from(encoded, 'base64url').byteLength === 16 && Buffer.from(encoded, 'base64url').toString('base64url') === encoded;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function loadIntegrationManifest(root) {
|
|
54
|
+
try {
|
|
55
|
+
const value = JSON.parse(readFileSync(integrationPath(root), 'utf8'));
|
|
56
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
57
|
+
return emptyIntegrationManifest();
|
|
58
|
+
const record = value;
|
|
59
|
+
if (Object.keys(record).length !== 2 || record.schema_version !== 'integrations-v1' || !Array.isArray(record.entries) || record.entries.length > 8 || record.entries.some(entry => !validEntry(entry)))
|
|
60
|
+
return emptyIntegrationManifest();
|
|
61
|
+
return { schema_version: 'integrations-v1', entries: record.entries };
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return emptyIntegrationManifest();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function saveIntegrationManifest(manifest, root) {
|
|
68
|
+
if (manifest.entries.length > 8 || manifest.entries.some(entry => !validEntry(entry)))
|
|
69
|
+
throw new Error('invalid_integration_manifest');
|
|
70
|
+
atomicWriteJson(integrationPath(root), manifest);
|
|
71
|
+
}
|
|
72
|
+
export function removeIntegrationEntries(families, root) {
|
|
73
|
+
const current = loadIntegrationManifest(root);
|
|
74
|
+
const keep = families ? current.entries.filter(entry => !families.includes(entry.client_family)) : [];
|
|
75
|
+
saveIntegrationManifest({ schema_version: 'integrations-v1', entries: keep }, root);
|
|
76
|
+
return current.entries.length - keep.length;
|
|
77
|
+
}
|
|
78
|
+
function exactConfigEvidence(family, home = homedir()) {
|
|
79
|
+
const root = join(home, clientRoots[family]);
|
|
80
|
+
const present = clientMarkers[family].filter(marker => existsSync(join(root, marker)));
|
|
81
|
+
return present.length ? present : null;
|
|
82
|
+
}
|
|
83
|
+
export function detectClients(options = {}) {
|
|
84
|
+
const manifest = options.manifest ?? loadIntegrationManifest();
|
|
85
|
+
if (options.explicit && options.explicit !== 'auto' && options.explicit !== 'all' && options.explicit !== 'terminal' && options.explicit !== 'unknown') {
|
|
86
|
+
const existing = manifest.entries.find(entry => entry.client_family === options.explicit);
|
|
87
|
+
return [{ client: options.explicit, state: existing ? 'managed_existing' : 'active_invocation', confidence: 'authoritative', profileKey: existing?.profile_label ?? null, profileLabel: existing?.profile_label ?? 'default', adapterEntryId: existing?.adapter_entry_id ?? null, evidence: [{ source: 'explicit_flag', safeCode: 'client_explicit' }] }];
|
|
88
|
+
}
|
|
89
|
+
if (options.trustedInvocation) {
|
|
90
|
+
const existing = manifest.entries.find(entry => entry.client_family === options.trustedInvocation);
|
|
91
|
+
return [{ client: options.trustedInvocation, state: 'active_invocation', confidence: 'authoritative', profileKey: existing?.profile_label ?? null, profileLabel: existing?.profile_label ?? 'default', adapterEntryId: existing?.adapter_entry_id ?? null, evidence: [{ source: 'documented_host_marker', safeCode: 'trusted_invocation' }] }];
|
|
92
|
+
}
|
|
93
|
+
const results = [];
|
|
94
|
+
for (const client of SUPPORTED_CLIENTS) {
|
|
95
|
+
const existing = manifest.entries.filter(entry => entry.client_family === client);
|
|
96
|
+
const evidence = options.configEvidence?.[client] ?? exactConfigEvidence(client, options.home);
|
|
97
|
+
if (existing.length) {
|
|
98
|
+
for (const entry of existing)
|
|
99
|
+
results.push({ client, state: 'managed_existing', confidence: 'high', profileKey: entry.profile_label, profileLabel: entry.profile_label, adapterEntryId: entry.adapter_entry_id, evidence: [{ source: 'managed_manifest', safeCode: 'managed_entry' }] });
|
|
100
|
+
}
|
|
101
|
+
else if (evidence?.length) {
|
|
102
|
+
results.push({ client, state: 'configured_unmanaged', confidence: 'weak', profileKey: null, profileLabel: 'default', adapterEntryId: null, evidence: evidence.slice(0, 4).map(safeCode => ({ source: 'exact_config_entry', safeCode: `marker_${safeCode.replace(/[^A-Za-z0-9_-]/gu, '_')}` })) });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return results;
|
|
106
|
+
}
|
|
107
|
+
export function chooseClient(options = {}) {
|
|
108
|
+
if (options.explicit === 'all') {
|
|
109
|
+
const candidates = detectClients({ ...options, explicit: 'auto' });
|
|
110
|
+
const optionsList = candidates.map(candidateOption).slice(0, 8);
|
|
111
|
+
return { selection: { schema_version: 'client-selection-v1', status: 'not_required', reason: 'all_requested', options: optionsList }, selected: null, candidates };
|
|
112
|
+
}
|
|
113
|
+
const candidates = detectClients(options);
|
|
114
|
+
if (options.explicit && options.explicit !== 'auto' && options.explicit !== 'terminal' && options.explicit !== 'unknown') {
|
|
115
|
+
const selected = candidates[0] ?? null;
|
|
116
|
+
return { selection: { schema_version: 'client-selection-v1', status: 'selected', reason: 'explicit_family', options: selected ? [candidateOption(selected)] : [] }, selected, candidates };
|
|
117
|
+
}
|
|
118
|
+
const strong = candidates.filter(candidate => candidate.confidence === 'authoritative' || candidate.confidence === 'high');
|
|
119
|
+
if (strong.length === 1)
|
|
120
|
+
return { selection: { schema_version: 'client-selection-v1', status: 'selected', reason: strong[0].state === 'managed_existing' ? 'managed_invocation' : 'single_detected', options: [candidateOption(strong[0])] }, selected: strong[0], candidates };
|
|
121
|
+
if (strong.length > 1)
|
|
122
|
+
return { selection: { schema_version: 'client-selection-v1', status: 'choice_required', reason: new Set(strong.map(item => item.client)).size === 1 ? 'same_family_multiple_profiles' : 'multiple_detected', options: strong.map(candidateOption).slice(0, 8) }, selected: null, candidates };
|
|
123
|
+
return { selection: { schema_version: 'client-selection-v1', status: 'none_detected', reason: 'no_supported_client', options: [] }, selected: null, candidates };
|
|
124
|
+
}
|
|
125
|
+
function candidateOption(value) {
|
|
126
|
+
return { client_family: value.client, profile_label: safeProfile(value.profileLabel), adapter_entry_id: value.adapterEntryId };
|
|
127
|
+
}
|
|
128
|
+
export function newIntegrationEntry(client, profileLabel, policyChecksum, integrationBindingDigest, capability = 'mcp_only') {
|
|
129
|
+
const now = new Date().toISOString();
|
|
130
|
+
return { adapter_entry_id: issueLocalId('vai'), client_family: client, profile_label: safeProfile(profileLabel), integration_capability: capability, policy_checksum: policyChecksum, integration_binding_digest: integrationBindingDigest, managed: true, config_digest: null, hook_digest: null, installed_at: now, updated_at: now };
|
|
131
|
+
}
|
|
132
|
+
function canonicalBindingValue(value) {
|
|
133
|
+
if (typeof value === 'string')
|
|
134
|
+
return value.normalize('NFC');
|
|
135
|
+
if (Array.isArray(value))
|
|
136
|
+
return value.map(canonicalBindingValue);
|
|
137
|
+
if (value && typeof value === 'object')
|
|
138
|
+
return Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, child]) => [key.normalize('NFC'), canonicalBindingValue(child)]));
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
export function canonicalIntegrationBinding(value) {
|
|
142
|
+
return JSON.stringify(canonicalBindingValue(value));
|
|
143
|
+
}
|
|
144
|
+
export function integrationBindingProjection(config, adapterEntryId, details) {
|
|
145
|
+
if (!validateAdapterEntryId(adapterEntryId))
|
|
146
|
+
throw new Error('invalid_adapter_entry_id');
|
|
147
|
+
const endpoint = config.endpoint.replace(/\/$/u, '');
|
|
148
|
+
if (!details)
|
|
149
|
+
return {
|
|
150
|
+
schema_version: 'integration-binding-v1', adapter_entry_id: adapterEntryId, client_family: 'unknown', profile_key: 'default', state_root: '', approved_api_origin: endpoint, cli_version: CLI_VERSION,
|
|
151
|
+
runtime: { node_path: '', node_sha256: `sha256:${'0'.repeat(64)}`, cli_entry: '', cli_sha256: `sha256:${'0'.repeat(64)}` },
|
|
152
|
+
policy: { base_version: 'agent-policy-v1', variant: 'lookup_on_demand__sharing_explicit', checksum: `sha256:${'0'.repeat(64)}` },
|
|
153
|
+
owned_target_identifiers: [], managed_command_argument_vectors: [],
|
|
154
|
+
};
|
|
155
|
+
if (details.stateRoot && !isAbsolute(details.stateRoot) || !isAbsolute(details.nodePath) || !isAbsolute(details.cliEntry))
|
|
156
|
+
throw new Error('invalid_integration_binding');
|
|
157
|
+
return {
|
|
158
|
+
schema_version: 'integration-binding-v1', adapter_entry_id: adapterEntryId, client_family: details.clientFamily, profile_key: details.profileKey, state_root: details.stateRoot, approved_api_origin: endpoint, cli_version: CLI_VERSION,
|
|
159
|
+
runtime: { node_path: details.nodePath, node_sha256: details.nodeSha256, cli_entry: details.cliEntry, cli_sha256: details.cliSha256 },
|
|
160
|
+
policy: { base_version: details.policyBaseVersion, variant: details.policyVariant, checksum: details.policyChecksum },
|
|
161
|
+
owned_target_identifiers: [...details.ownedTargetIdentifiers], managed_command_argument_vectors: details.managedCommandArgumentVectors.map(vector => [...vector]),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
export function integrationBindingDigest(config, adapterEntryId, details) {
|
|
165
|
+
return digestLocal(canonicalIntegrationBinding(integrationBindingProjection(config, adapterEntryId, details)));
|
|
166
|
+
}
|
|
167
|
+
export function managedMcpArguments(client, adapterEntryId, stateRoot, bindingDigest) {
|
|
168
|
+
if (!validateAdapterEntryId(adapterEntryId) || !/^sha256:[0-9a-f]{64}$/u.test(bindingDigest) || !isAbsolute(stateRoot))
|
|
169
|
+
throw new Error('invalid_integration_binding');
|
|
170
|
+
return ['mcp', '--client', client, '--adapter-entry-id', adapterEntryId, '--state-root', stateRoot, '--integration-manifest-digest', bindingDigest];
|
|
171
|
+
}
|
|
172
|
+
export function integrationPathForTests(root) { return integrationPath(root); }
|
|
173
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.js","sourceRoot":"","sources":["../src/integrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type CredentialBackend, type VectleConfig } from './store.js';
|
|
2
|
+
export type LegacyCredentialSource = 'macos_keychain' | 'linux_secret_service' | 'windows_credential_manager' | 'file' | 'environment';
|
|
3
|
+
export type LegacyOriginBinding = {
|
|
4
|
+
credential_handle: `sha256:${string}`;
|
|
5
|
+
credential_source: LegacyCredentialSource;
|
|
6
|
+
selected_root_digest: `sha256:${string}`;
|
|
7
|
+
origin: string;
|
|
8
|
+
pinned_by: 'compiled_official_endpoint';
|
|
9
|
+
state: 'active' | 'superseded';
|
|
10
|
+
created_at: string;
|
|
11
|
+
};
|
|
12
|
+
export type LegacyOriginBindings = {
|
|
13
|
+
schema_version: 'legacy-origin-bindings-v1';
|
|
14
|
+
entries: LegacyOriginBinding[];
|
|
15
|
+
};
|
|
16
|
+
export type LegacyCompatibility = {
|
|
17
|
+
schema_version: 'legacy-compatibility-v1';
|
|
18
|
+
source_config_digest: `sha256:${string}`;
|
|
19
|
+
state: 'legacy_v1' | 'upgraded_v2';
|
|
20
|
+
contributor_id: string | null;
|
|
21
|
+
display_name: string | null;
|
|
22
|
+
identity_scope: 'project' | 'global' | null;
|
|
23
|
+
client_family: VectleConfig['clientFamily'];
|
|
24
|
+
credential_backend: CredentialBackend | null;
|
|
25
|
+
authorization_mode: 'standing' | 'per_write' | null;
|
|
26
|
+
authorization_expires_at: string | null;
|
|
27
|
+
last_update_notice_version: string | null;
|
|
28
|
+
last_update_notice_at: string | null;
|
|
29
|
+
};
|
|
30
|
+
export declare function legacyOriginBindingsPath(root?: string): string;
|
|
31
|
+
export declare function legacyCompatibilityPath(root?: string): string;
|
|
32
|
+
export declare function legacyRootDigest(root: string): `sha256:${string}`;
|
|
33
|
+
export declare function legacyCredentialHandle(source: LegacyCredentialSource, token: string): `sha256:${string}`;
|
|
34
|
+
export declare function legacySource(backend: CredentialBackend | undefined, platform?: NodeJS.Platform, environment?: NodeJS.ProcessEnv): LegacyCredentialSource;
|
|
35
|
+
export declare function compiledOfficialOrigin(value: string): string;
|
|
36
|
+
/** Pin a legacy credential before any authenticated request is allowed. */
|
|
37
|
+
export declare function ensureLegacyOriginBinding(input: {
|
|
38
|
+
root?: string;
|
|
39
|
+
token: string;
|
|
40
|
+
source: LegacyCredentialSource;
|
|
41
|
+
endpoint: string;
|
|
42
|
+
now?: string;
|
|
43
|
+
}): LegacyOriginBinding;
|
|
44
|
+
export declare function readLegacyCompatibility(root?: string): LegacyCompatibility | null;
|
|
45
|
+
export declare function writeLegacyCompatibility(config: VectleConfig, state: 'legacy_v1' | 'upgraded_v2', root?: string): LegacyCompatibility;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { DEFAULT_ENDPOINT } from './constants.js';
|
|
5
|
+
import { atomicWriteJson, digestLocal } from './state.js';
|
|
6
|
+
import { configDirectory, configPath } from './store.js';
|
|
7
|
+
const safeId = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
|
|
8
|
+
const safeDisplay = /^[^\r\n]{1,80}$/u;
|
|
9
|
+
const semver = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u;
|
|
10
|
+
const digestPattern = /^sha256:[0-9a-f]{64}$/u;
|
|
11
|
+
export function legacyOriginBindingsPath(root = configDirectory()) { return join(root, 'legacy-origin-bindings.json'); }
|
|
12
|
+
export function legacyCompatibilityPath(root = configDirectory()) { return join(root, 'legacy-compatibility.json'); }
|
|
13
|
+
function sha(value) { return `sha256:${createHash('sha256').update(value).digest('hex')}`; }
|
|
14
|
+
export function legacyRootDigest(root) { return sha(root.normalize('NFC')); }
|
|
15
|
+
export function legacyCredentialHandle(source, token) {
|
|
16
|
+
if (!/^vctk_[A-Za-z0-9_-]{43}$/u.test(token))
|
|
17
|
+
throw new Error('invalid_legacy_credential');
|
|
18
|
+
return sha(`${source}\0${token}`);
|
|
19
|
+
}
|
|
20
|
+
export function legacySource(backend, platform = process.platform, environment = process.env) {
|
|
21
|
+
if (typeof environment.VECTLE_TOKEN === 'string' && environment.VECTLE_TOKEN.trim())
|
|
22
|
+
return 'environment';
|
|
23
|
+
if (backend === 'file')
|
|
24
|
+
return 'file';
|
|
25
|
+
if (platform === 'darwin')
|
|
26
|
+
return 'macos_keychain';
|
|
27
|
+
if (platform === 'linux')
|
|
28
|
+
return 'linux_secret_service';
|
|
29
|
+
if (platform === 'win32')
|
|
30
|
+
return 'windows_credential_manager';
|
|
31
|
+
return 'file';
|
|
32
|
+
}
|
|
33
|
+
export function compiledOfficialOrigin(value) {
|
|
34
|
+
let origin;
|
|
35
|
+
try {
|
|
36
|
+
const parsed = new URL(value);
|
|
37
|
+
if (parsed.protocol !== 'https:' || parsed.username || parsed.password || parsed.pathname !== '/' || parsed.search || parsed.hash)
|
|
38
|
+
throw new Error('invalid_origin');
|
|
39
|
+
origin = parsed.origin;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error('endpoint_mismatch');
|
|
43
|
+
}
|
|
44
|
+
const official = new URL(DEFAULT_ENDPOINT).origin;
|
|
45
|
+
if (origin !== official)
|
|
46
|
+
throw new Error('endpoint_mismatch');
|
|
47
|
+
return official;
|
|
48
|
+
}
|
|
49
|
+
function validBinding(value) {
|
|
50
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
51
|
+
return false;
|
|
52
|
+
const item = value;
|
|
53
|
+
return Object.keys(item).length === 8
|
|
54
|
+
&& digestPattern.test(String(item.credential_handle))
|
|
55
|
+
&& ['macos_keychain', 'linux_secret_service', 'windows_credential_manager', 'file', 'environment'].includes(String(item.credential_source))
|
|
56
|
+
&& digestPattern.test(String(item.selected_root_digest))
|
|
57
|
+
&& item.origin === new URL(DEFAULT_ENDPOINT).origin
|
|
58
|
+
&& item.pinned_by === 'compiled_official_endpoint'
|
|
59
|
+
&& (item.state === 'active' || item.state === 'superseded')
|
|
60
|
+
&& typeof item.created_at === 'string' && Number.isFinite(Date.parse(item.created_at));
|
|
61
|
+
}
|
|
62
|
+
function readBindings(root) {
|
|
63
|
+
try {
|
|
64
|
+
const value = JSON.parse(readFileSync(legacyOriginBindingsPath(root), 'utf8'));
|
|
65
|
+
if (Object.keys(value).length !== 2 || value.schema_version !== 'legacy-origin-bindings-v1' || !Array.isArray(value.entries) || value.entries.length > 8 || value.entries.some(item => !validBinding(item)))
|
|
66
|
+
throw new Error('legacy_origin_binding_invalid');
|
|
67
|
+
return { schema_version: 'legacy-origin-bindings-v1', entries: value.entries };
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof Error && error.message === 'legacy_origin_binding_invalid')
|
|
71
|
+
throw error;
|
|
72
|
+
return { schema_version: 'legacy-origin-bindings-v1', entries: [] };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Pin a legacy credential before any authenticated request is allowed. */
|
|
76
|
+
export function ensureLegacyOriginBinding(input) {
|
|
77
|
+
const root = input.root ?? configDirectory();
|
|
78
|
+
const origin = compiledOfficialOrigin(input.endpoint);
|
|
79
|
+
const createdAt = input.now ?? new Date().toISOString();
|
|
80
|
+
if (!Number.isFinite(Date.parse(createdAt)))
|
|
81
|
+
throw new Error('invalid_timestamp');
|
|
82
|
+
const entry = { credential_handle: legacyCredentialHandle(input.source, input.token), credential_source: input.source, selected_root_digest: legacyRootDigest(root), origin, pinned_by: 'compiled_official_endpoint', state: 'active', created_at: createdAt };
|
|
83
|
+
const bindings = readBindings(root);
|
|
84
|
+
const matching = bindings.entries.find(item => item.credential_handle === entry.credential_handle);
|
|
85
|
+
if (matching && (matching.origin !== origin || matching.selected_root_digest !== entry.selected_root_digest || matching.credential_source !== entry.credential_source || matching.state !== 'active'))
|
|
86
|
+
throw new Error('legacy_origin_binding_mismatch');
|
|
87
|
+
if (!matching)
|
|
88
|
+
bindings.entries = [...bindings.entries.filter(item => item.credential_source !== 'environment' || input.source === 'environment'), entry].slice(-8);
|
|
89
|
+
atomicWriteJson(legacyOriginBindingsPath(root), bindings);
|
|
90
|
+
return entry;
|
|
91
|
+
}
|
|
92
|
+
function sourceDigest() {
|
|
93
|
+
try {
|
|
94
|
+
return sha(readFileSync(configPath()));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return digestLocal('missing-legacy-config');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function validCompatibility(value) {
|
|
101
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
102
|
+
return false;
|
|
103
|
+
const item = value;
|
|
104
|
+
return Object.keys(item).length === 12
|
|
105
|
+
&& item.schema_version === 'legacy-compatibility-v1'
|
|
106
|
+
&& digestPattern.test(String(item.source_config_digest))
|
|
107
|
+
&& (item.state === 'legacy_v1' || item.state === 'upgraded_v2')
|
|
108
|
+
&& (item.contributor_id === null || typeof item.contributor_id === 'string' && safeId.test(item.contributor_id))
|
|
109
|
+
&& (item.display_name === null || typeof item.display_name === 'string' && safeDisplay.test(item.display_name))
|
|
110
|
+
&& (item.identity_scope === null || item.identity_scope === 'project' || item.identity_scope === 'global')
|
|
111
|
+
&& ['codex', 'claude_code', 'cursor', 'vscode', 'terminal', 'unknown'].includes(String(item.client_family))
|
|
112
|
+
&& (item.credential_backend === null || ['keychain', 'file', 'environment'].includes(String(item.credential_backend)))
|
|
113
|
+
&& (item.authorization_mode === null || item.authorization_mode === 'standing' || item.authorization_mode === 'per_write')
|
|
114
|
+
&& (item.authorization_expires_at === null || typeof item.authorization_expires_at === 'string' && Number.isFinite(Date.parse(item.authorization_expires_at)))
|
|
115
|
+
&& (item.last_update_notice_version === null || typeof item.last_update_notice_version === 'string' && semver.test(item.last_update_notice_version))
|
|
116
|
+
&& (item.last_update_notice_at === null || typeof item.last_update_notice_at === 'string' && Number.isFinite(Date.parse(item.last_update_notice_at)));
|
|
117
|
+
}
|
|
118
|
+
function optionalId(value) { return typeof value === 'string' && safeId.test(value) ? value : null; }
|
|
119
|
+
function optionalDisplay(value) { return typeof value === 'string' && safeDisplay.test(value) ? value : null; }
|
|
120
|
+
function optionalDate(value) { return typeof value === 'string' && Number.isFinite(Date.parse(value)) ? value : null; }
|
|
121
|
+
function optionalSemver(value) { return typeof value === 'string' && semver.test(value) ? value : null; }
|
|
122
|
+
export function readLegacyCompatibility(root = configDirectory()) {
|
|
123
|
+
try {
|
|
124
|
+
const value = JSON.parse(readFileSync(legacyCompatibilityPath(root), 'utf8'));
|
|
125
|
+
return validCompatibility(value) ? value : null;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export function writeLegacyCompatibility(config, state, root = configDirectory()) {
|
|
132
|
+
const value = {
|
|
133
|
+
schema_version: 'legacy-compatibility-v1',
|
|
134
|
+
source_config_digest: sourceDigest(),
|
|
135
|
+
state,
|
|
136
|
+
contributor_id: optionalId(config.contributorId),
|
|
137
|
+
display_name: optionalDisplay(config.displayName),
|
|
138
|
+
identity_scope: config.identityScope === 'project' || config.identityScope === 'global' ? config.identityScope : null,
|
|
139
|
+
client_family: config.clientFamily,
|
|
140
|
+
credential_backend: config.credentialBackend === 'keychain' || config.credentialBackend === 'file' || config.credentialBackend === 'environment' ? config.credentialBackend : null,
|
|
141
|
+
authorization_mode: config.authorizationMode === 'standing' || config.authorizationMode === 'per_write' ? config.authorizationMode : null,
|
|
142
|
+
authorization_expires_at: optionalDate(config.authorizationExpiresAt),
|
|
143
|
+
last_update_notice_version: optionalSemver(config.lastUpdateNoticeVersion),
|
|
144
|
+
last_update_notice_at: optionalDate(config.lastUpdateNoticeAt),
|
|
145
|
+
};
|
|
146
|
+
atomicWriteJson(legacyCompatibilityPath(root), value);
|
|
147
|
+
return value;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=legacy-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-compat.js","sourceRoot":"","sources":["../src/legacy-compat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { renderAgentPolicy } from './agent-policy.js';
|
|
2
|
+
import { type IntegrationManifestEntry, type SupportedClientFamily } from './integrations.js';
|
|
3
|
+
import { type VectleConfig } from './store.js';
|
|
4
|
+
export type LifecycleOptions = {
|
|
5
|
+
client: SupportedClientFamily;
|
|
6
|
+
stateRoot: string;
|
|
7
|
+
adapterEntryId: string;
|
|
8
|
+
integrationManifestDigest: `sha256:${string}`;
|
|
9
|
+
policyChecksum?: `sha256:${string}`;
|
|
10
|
+
config?: VectleConfig;
|
|
11
|
+
now?: () => number;
|
|
12
|
+
};
|
|
13
|
+
export type HookState = {
|
|
14
|
+
schema_version: 'hook-state-v1';
|
|
15
|
+
client_family: SupportedClientFamily;
|
|
16
|
+
adapter_entry_id: string;
|
|
17
|
+
policy_version: 'agent-policy-v1';
|
|
18
|
+
policy_variant: ReturnType<typeof renderAgentPolicy>['variant'];
|
|
19
|
+
policy_checksum: `sha256:${string}`;
|
|
20
|
+
integration_manifest_digest: `sha256:${string}`;
|
|
21
|
+
executed_at: string;
|
|
22
|
+
};
|
|
23
|
+
export declare function readHookState(root: string, adapterEntryId: string): HookState | null;
|
|
24
|
+
export declare function runLifecycle(options: LifecycleOptions): Promise<{
|
|
25
|
+
schema_version: "lifecycle-gate-v1";
|
|
26
|
+
status: "blocked";
|
|
27
|
+
client_family: SupportedClientFamily;
|
|
28
|
+
adapter_entry_id: null;
|
|
29
|
+
policy_variant: import("./agent-policy.js").PolicyVariant;
|
|
30
|
+
policy_checksum: `sha256:${string}`;
|
|
31
|
+
hook_state: null;
|
|
32
|
+
reason_code: string;
|
|
33
|
+
instructions: string;
|
|
34
|
+
} | {
|
|
35
|
+
schema_version: "lifecycle-gate-v1";
|
|
36
|
+
status: "invoked";
|
|
37
|
+
client_family: SupportedClientFamily;
|
|
38
|
+
adapter_entry_id: string;
|
|
39
|
+
policy_variant: import("./agent-policy.js").PolicyVariant;
|
|
40
|
+
policy_checksum: `sha256:${string}`;
|
|
41
|
+
hook_state: HookState;
|
|
42
|
+
instructions: string;
|
|
43
|
+
}>;
|
|
44
|
+
export declare function validateManagedMcpBinding(options: {
|
|
45
|
+
client: SupportedClientFamily;
|
|
46
|
+
stateRoot: string;
|
|
47
|
+
adapterEntryId: string;
|
|
48
|
+
integrationManifestDigest: string;
|
|
49
|
+
config: VectleConfig;
|
|
50
|
+
}): IntegrationManifestEntry;
|