@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.
Files changed (105) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +15 -8
  3. package/dist/activity.d.ts +10 -0
  4. package/dist/activity.js +10 -0
  5. package/dist/activity.js.map +1 -0
  6. package/dist/adapters/claude.d.ts +4 -0
  7. package/dist/adapters/claude.js +279 -0
  8. package/dist/adapters/claude.js.map +1 -0
  9. package/dist/adapters/codex.d.ts +16 -0
  10. package/dist/adapters/codex.js +410 -0
  11. package/dist/adapters/codex.js.map +1 -0
  12. package/dist/adapters/common.d.ts +80 -0
  13. package/dist/adapters/common.js +249 -0
  14. package/dist/adapters/common.js.map +1 -0
  15. package/dist/adapters/cursor.d.ts +4 -0
  16. package/dist/adapters/cursor.js +240 -0
  17. package/dist/adapters/cursor.js.map +1 -0
  18. package/dist/adapters/vscode.d.ts +4 -0
  19. package/dist/adapters/vscode.js +240 -0
  20. package/dist/adapters/vscode.js.map +1 -0
  21. package/dist/agent-policy.d.ts +50 -0
  22. package/dist/agent-policy.js +83 -0
  23. package/dist/agent-policy.js.map +1 -0
  24. package/dist/client.d.ts +69 -10
  25. package/dist/client.js +247 -24
  26. package/dist/client.js.map +1 -1
  27. package/dist/constants.d.ts +12 -2
  28. package/dist/constants.js +7 -1
  29. package/dist/constants.js.map +1 -1
  30. package/dist/contracts.d.ts +53 -0
  31. package/dist/contracts.js +68 -0
  32. package/dist/contracts.js.map +1 -0
  33. package/dist/delivery.d.ts +80 -0
  34. package/dist/delivery.js +304 -0
  35. package/dist/delivery.js.map +1 -0
  36. package/dist/findings.d.ts +12 -0
  37. package/dist/findings.js +41 -0
  38. package/dist/findings.js.map +1 -0
  39. package/dist/help.d.ts +1 -0
  40. package/dist/help.js +53 -0
  41. package/dist/help.js.map +1 -0
  42. package/dist/index.js +370 -72
  43. package/dist/index.js.map +1 -1
  44. package/dist/integrations.d.ts +126 -0
  45. package/dist/integrations.js +173 -0
  46. package/dist/integrations.js.map +1 -0
  47. package/dist/legacy-compat.d.ts +45 -0
  48. package/dist/legacy-compat.js +149 -0
  49. package/dist/legacy-compat.js.map +1 -0
  50. package/dist/lifecycle.d.ts +50 -0
  51. package/dist/lifecycle.js +146 -0
  52. package/dist/lifecycle.js.map +1 -0
  53. package/dist/locator.d.ts +58 -0
  54. package/dist/locator.js +233 -0
  55. package/dist/locator.js.map +1 -0
  56. package/dist/mcp.d.ts +12 -2
  57. package/dist/mcp.js +194 -48
  58. package/dist/mcp.js.map +1 -1
  59. package/dist/modes.d.ts +37 -0
  60. package/dist/modes.js +32 -0
  61. package/dist/modes.js.map +1 -0
  62. package/dist/outbox.d.ts +9 -0
  63. package/dist/outbox.js +188 -0
  64. package/dist/outbox.js.map +1 -0
  65. package/dist/parser.d.ts +10 -0
  66. package/dist/parser.js +99 -0
  67. package/dist/parser.js.map +1 -0
  68. package/dist/pulse.d.ts +122 -0
  69. package/dist/pulse.js +412 -0
  70. package/dist/pulse.js.map +1 -0
  71. package/dist/release-manifest.d.ts +123 -0
  72. package/dist/release-manifest.js +226 -0
  73. package/dist/release-manifest.js.map +1 -0
  74. package/dist/release.d.ts +1 -1
  75. package/dist/response.d.ts +17 -0
  76. package/dist/response.js +15 -0
  77. package/dist/response.js.map +1 -1
  78. package/dist/rollout.d.ts +8 -0
  79. package/dist/rollout.js +27 -0
  80. package/dist/rollout.js.map +1 -0
  81. package/dist/runtime.d.ts +60 -0
  82. package/dist/runtime.js +276 -0
  83. package/dist/runtime.js.map +1 -0
  84. package/dist/secure-store.d.ts +36 -0
  85. package/dist/secure-store.js +284 -0
  86. package/dist/secure-store.js.map +1 -0
  87. package/dist/setup.d.ts +159 -0
  88. package/dist/setup.js +629 -0
  89. package/dist/setup.js.map +1 -0
  90. package/dist/state.d.ts +98 -0
  91. package/dist/state.js +226 -0
  92. package/dist/state.js.map +1 -0
  93. package/dist/status.d.ts +282 -0
  94. package/dist/status.js +213 -0
  95. package/dist/status.js.map +1 -0
  96. package/dist/store.d.ts +44 -2
  97. package/dist/store.js +222 -44
  98. package/dist/store.js.map +1 -1
  99. package/dist/update.d.ts +33 -1
  100. package/dist/update.js +88 -16
  101. package/dist/update.js.map +1 -1
  102. package/dist/write-journal.d.ts +71 -0
  103. package/dist/write-journal.js +175 -0
  104. package/dist/write-journal.js.map +1 -0
  105. package/package.json +7 -2
@@ -0,0 +1,146 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { consentPolicyDigest, renderAgentPolicy } from './agent-policy.js';
4
+ import { defaultDeliveryBinding } from './delivery.js';
5
+ import { loadIntegrationManifest, validateAdapterEntryId } from './integrations.js';
6
+ import { defaultConfig, loadBoundConfig } from './store.js';
7
+ import { atomicWriteJson, ensureStateRoot, withStateLock, issueLocalId } from './state.js';
8
+ import { canonicalStateRoot, readActiveRoot, validateStateRoot } from './locator.js';
9
+ function hookStatePath(root, adapterEntryId) {
10
+ if (!validateAdapterEntryId(adapterEntryId))
11
+ throw new Error('invalid_adapter_entry_id');
12
+ return join(root, 'hook-state', `${adapterEntryId}.json`);
13
+ }
14
+ function validHookState(value) {
15
+ if (!value || typeof value !== 'object' || Array.isArray(value))
16
+ return false;
17
+ const item = value;
18
+ return Object.keys(item).length === 8
19
+ && item.schema_version === 'hook-state-v1'
20
+ && typeof item.client_family === 'string' && ['codex', 'claude_code', 'cursor', 'vscode'].includes(item.client_family)
21
+ && validateAdapterEntryId(item.adapter_entry_id)
22
+ && item.policy_version === 'agent-policy-v1'
23
+ && ['lookup_auto_gate__sharing_auto_gate', 'lookup_auto_gate__sharing_explicit', 'lookup_auto_gate__sharing_off', 'lookup_on_demand__sharing_explicit', 'paused'].includes(String(item.policy_variant))
24
+ && /^sha256:[0-9a-f]{64}$/u.test(String(item.policy_checksum))
25
+ && /^sha256:[0-9a-f]{64}$/u.test(String(item.integration_manifest_digest))
26
+ && typeof item.executed_at === 'string' && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/u.test(item.executed_at) && Number.isFinite(Date.parse(item.executed_at));
27
+ }
28
+ export function readHookState(root, adapterEntryId) {
29
+ try {
30
+ const value = JSON.parse(readFileSync(hookStatePath(root, adapterEntryId), 'utf8'));
31
+ return validHookState(value) ? value : null;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ function matchingEntry(options) {
38
+ const manifest = loadIntegrationManifest(options.stateRoot);
39
+ if (!validateAdapterEntryId(options.adapterEntryId))
40
+ throw new Error('invalid_adapter_entry_id');
41
+ const entry = manifest.entries.find(item => item.adapter_entry_id === options.adapterEntryId);
42
+ if (!entry || entry.client_family !== options.client || entry.integration_binding_digest !== options.integrationManifestDigest)
43
+ throw new Error('integration_binding_mismatch');
44
+ return entry;
45
+ }
46
+ function configIsBound(config, options) {
47
+ if (config.stateRoot && canonicalStateRoot(config.stateRoot) !== canonicalStateRoot(options.stateRoot))
48
+ throw new Error('state_root_mismatch');
49
+ if (config.schema_version !== 'vectle-config-v2' || !config.installation || config.installation.consent_policy_digest !== consentPolicyDigest())
50
+ throw new Error('consent_contract_mismatch');
51
+ if (config.installation.approved_api_origin !== config.endpoint.replace(/\/$/u, ''))
52
+ throw new Error('endpoint_mismatch');
53
+ if (config.mode === 'off' || config.mode === 'revocation_pending' || config.mode === 'unconfigured')
54
+ throw new Error('local_mode_blocked');
55
+ if (config.installation.automatic_lookup !== true)
56
+ throw new Error('automatic_lookup_not_authorized');
57
+ if (options.policyChecksum !== config.policyChecksum && config.policyChecksum)
58
+ throw new Error('policy_binding_mismatch');
59
+ }
60
+ function policyFor(config, client, capability) {
61
+ return renderAgentPolicy({
62
+ mode: config.mode ?? 'paused',
63
+ clientFamily: client,
64
+ integrationCapability: capability,
65
+ approvedBehaviorCeiling: capability === 'full_lifecycle' && config.installation
66
+ ? { consentVersion: 2, startupPulse: config.installation.automatic_lookup ? 'automatic' : 'on_demand', sharingAndCorrection: config.installation.automatic_sharing ? 'automatic' : 'explicit_only' }
67
+ : null,
68
+ approvalPersistence: { read: capability === 'full_lifecycle' ? 'promptless' : 'unsupported', write: capability === 'full_lifecycle' ? 'promptless' : 'unsupported' },
69
+ tools: { startupPulse: capability === 'full_lifecycle' && Boolean(config.installation), shareFinding: capability === 'full_lifecycle' && Boolean(config.installation), correctFinding: capability === 'full_lifecycle' && Boolean(config.installation) },
70
+ });
71
+ }
72
+ function closedFallback(options, reason, config) {
73
+ const policy = policyFor(config, options.client, 'authorized_only');
74
+ return {
75
+ schema_version: 'lifecycle-gate-v1',
76
+ status: 'blocked',
77
+ client_family: options.client,
78
+ adapter_entry_id: null,
79
+ policy_variant: policy.variant,
80
+ policy_checksum: policy.checksum,
81
+ hook_state: null,
82
+ reason_code: /^[A-Za-z0-9_.-]{1,80}$/u.test(reason) ? reason : 'lifecycle_unavailable',
83
+ instructions: policy.text,
84
+ };
85
+ }
86
+ async function ensureCompletionNotice(root, config, entry, policy, now) {
87
+ const binding = defaultDeliveryBinding(config, root);
88
+ await withStateLock(root, state => {
89
+ if (state.adapter_entry_id !== binding.adapterEntryId && state.generation === 0)
90
+ state.adapter_entry_id = binding.adapterEntryId;
91
+ if (state.integration_binding_digest !== binding.integrationBindingDigest && state.generation === 0)
92
+ state.integration_binding_digest = binding.integrationBindingDigest;
93
+ if (state.policy_checksum !== binding.policyChecksum && state.generation === 0)
94
+ state.policy_checksum = binding.policyChecksum;
95
+ if (state.adapter_entry_id !== entry.adapter_entry_id || state.integration_binding_digest !== entry.integration_binding_digest || state.policy_checksum !== policy.checksum)
96
+ throw new Error('delivery_binding_mismatch');
97
+ const alreadyKnown = state.pending_notices.some(notice => notice.schema_version === 'completion-notice-v1' && notice.adapter_entry_id === entry.adapter_entry_id && notice.integration_binding_digest === entry.integration_binding_digest && notice.policy_checksum === policy.checksum);
98
+ if (!alreadyKnown) {
99
+ state.pending_notices.push({ schema_version: 'completion-notice-v1', notice_id: issueLocalId('vwn'), adapter_entry_id: entry.adapter_entry_id, integration_binding_digest: entry.integration_binding_digest, policy_checksum: policy.checksum, copy_variant: 'integration_verified', status: 'pending', created_at: new Date(now()).toISOString(), lease_expires_at: null, acknowledged_at: null });
100
+ state.pending_notices = state.pending_notices.slice(-100);
101
+ }
102
+ }, { ...binding, adapterEntryId: entry.adapter_entry_id, integrationBindingDigest: entry.integration_binding_digest, policyChecksum: policy.checksum });
103
+ }
104
+ export async function runLifecycle(options) {
105
+ if (!/^sha256:[0-9a-f]{64}$/u.test(options.integrationManifestDigest) || options.policyChecksum !== undefined && !/^sha256:[0-9a-f]{64}$/u.test(options.policyChecksum))
106
+ throw new Error('invalid_integration_binding');
107
+ const config = options.config ?? loadBoundConfig(options.stateRoot) ?? { ...defaultConfig(), endpoint: 'https://vectle.com', clientFamily: options.client, mode: 'off', installation: null };
108
+ try {
109
+ validateStateRoot(options.stateRoot, { allowCreate: false });
110
+ ensureStateRoot(options.stateRoot);
111
+ const entry = matchingEntry(options);
112
+ const policyChecksum = options.policyChecksum ?? entry.policy_checksum;
113
+ configIsBound(config, { ...options, policyChecksum });
114
+ const policy = policyFor(config, options.client, 'full_lifecycle');
115
+ if (policy.checksum !== policyChecksum || entry.policy_checksum !== policyChecksum)
116
+ throw new Error('policy_binding_mismatch');
117
+ const marker = { schema_version: 'hook-state-v1', client_family: options.client, adapter_entry_id: entry.adapter_entry_id, policy_version: 'agent-policy-v1', policy_variant: policy.variant, policy_checksum: policy.checksum, integration_manifest_digest: entry.integration_binding_digest, executed_at: new Date((options.now ?? Date.now)()).toISOString() };
118
+ const operationalRoot = options.stateRoot;
119
+ await ensureCompletionNotice(operationalRoot, { ...config, stateRoot: operationalRoot, adapterEntryId: entry.adapter_entry_id, integrationBindingDigest: entry.integration_binding_digest, policyChecksum: policy.checksum }, entry, policy, options.now ?? Date.now);
120
+ atomicWriteJson(hookStatePath(options.stateRoot, entry.adapter_entry_id), marker);
121
+ return { schema_version: 'lifecycle-gate-v1', status: 'invoked', client_family: options.client, adapter_entry_id: entry.adapter_entry_id, policy_variant: policy.variant, policy_checksum: policy.checksum, hook_state: marker, instructions: policy.text };
122
+ }
123
+ catch (error) {
124
+ if (error instanceof Error && error.message === 'invalid_adapter_entry_id')
125
+ throw error;
126
+ return closedFallback(options, error instanceof Error ? error.message : 'lifecycle_unavailable', config);
127
+ }
128
+ }
129
+ export function validateManagedMcpBinding(options) {
130
+ if (!validateAdapterEntryId(options.adapterEntryId) || !/^sha256:[0-9a-f]{64}$/u.test(options.integrationManifestDigest))
131
+ throw new Error('invalid_integration_binding');
132
+ const root = validateStateRoot(options.stateRoot, { allowCreate: false });
133
+ if (options.config.stateRoot && canonicalStateRoot(options.config.stateRoot) !== canonicalStateRoot(root))
134
+ throw new Error('state_root_mismatch');
135
+ const activeRoot = readActiveRoot();
136
+ if (activeRoot && activeRoot.state_root !== root)
137
+ throw new Error('state_root_mismatch');
138
+ const manifest = loadIntegrationManifest(root);
139
+ const entry = manifest.entries.find(candidate => candidate.adapter_entry_id === options.adapterEntryId);
140
+ if (!entry || entry.client_family !== options.client || entry.integration_binding_digest !== options.integrationManifestDigest)
141
+ throw new Error('integration_binding_mismatch');
142
+ if (options.config.schema_version !== 'vectle-config-v2' || !options.config.installation || options.config.installation.approved_api_origin !== options.config.endpoint.replace(/\/$/u, ''))
143
+ throw new Error('integration_binding_mismatch');
144
+ return entry;
145
+ }
146
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export declare const ACTIVE_ROOT_SCHEMA: "active-root-v1";
2
+ export declare const ACTIVE_ROOT_LOCATOR_DIR = "locator";
3
+ export type ActiveRootLocator = {
4
+ schema_version: typeof ACTIVE_ROOT_SCHEMA;
5
+ state_root: string;
6
+ locator_digest: `sha256:${string}`;
7
+ };
8
+ export declare class LocatorError extends Error {
9
+ readonly code: 'state_root_mismatch' | 'state_root_conflict' | 'unsafe_state_root' | 'native_identity_unavailable';
10
+ constructor(code: 'state_root_mismatch' | 'state_root_conflict' | 'unsafe_state_root' | 'native_identity_unavailable', message?: string);
11
+ }
12
+ export declare function canonicalLocatorPreimage(stateRoot: string): string;
13
+ export declare function locatorDigest(stateRoot: string): `sha256:${string}`;
14
+ /**
15
+ * Resolve the native per-user anchor. The optional arguments make platform
16
+ * fixtures deterministic; production callers use the current OS and account
17
+ * database home. Environment-selected config roots are intentionally absent.
18
+ */
19
+ export declare function locatorAnchor(platform?: NodeJS.Platform, accountHome?: string): string;
20
+ /** The pre-1.1 data root. This is only for the finite legacy migration set. */
21
+ export declare function legacyDefaultRoot(platform?: NodeJS.Platform, environment?: NodeJS.ProcessEnv, accountHome?: string): string;
22
+ export declare function standardDataRoot(platform?: NodeJS.Platform, environment?: NodeJS.ProcessEnv, accountHome?: string): string;
23
+ export declare function locatorPath(platform?: NodeJS.Platform, accountHome?: string): string;
24
+ export declare function canonicalStateRoot(input: string, options?: {
25
+ platform?: NodeJS.Platform;
26
+ mustExist?: boolean;
27
+ }): string;
28
+ export declare function validateStateRoot(input: string, options?: {
29
+ allowCreate?: boolean;
30
+ platform?: NodeJS.Platform;
31
+ }): string;
32
+ export declare function readActiveRoot(options?: {
33
+ platform?: NodeJS.Platform;
34
+ accountHome?: string;
35
+ }): ActiveRootLocator | null;
36
+ export declare function writeActiveRoot(stateRoot: string, options?: {
37
+ platform?: NodeJS.Platform;
38
+ accountHome?: string;
39
+ }): ActiveRootLocator;
40
+ export declare function removeActiveRootIfOwned(stateRoot: string, options?: {
41
+ platform?: NodeJS.Platform;
42
+ accountHome?: string;
43
+ }): boolean;
44
+ export type RootResolution = {
45
+ stateRoot: string;
46
+ source: 'requested' | 'locator' | 'default' | 'legacy';
47
+ anchored: boolean;
48
+ };
49
+ export declare function resolveSetupRoot(options?: {
50
+ requestedRoot?: string;
51
+ allowCustomStateRoot?: boolean;
52
+ platform?: NodeJS.Platform;
53
+ accountHome?: string;
54
+ legacyRoot?: string;
55
+ }): RootResolution;
56
+ export declare function setupCommitPath(stateRoot: string): string;
57
+ export declare function setupStatePath(stateRoot: string): string;
58
+ export declare function setupLockPath(stateRoot: string): string;
@@ -0,0 +1,233 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { chmodSync, closeSync, existsSync, lstatSync, mkdirSync, openSync, readFileSync, realpathSync, renameSync, statSync, unlinkSync, writeFileSync, fsyncSync } from 'node:fs';
3
+ import { homedir, userInfo } from 'node:os';
4
+ import { dirname, isAbsolute, join, normalize, resolve } from 'node:path';
5
+ export const ACTIVE_ROOT_SCHEMA = 'active-root-v1';
6
+ export const ACTIVE_ROOT_LOCATOR_DIR = 'locator';
7
+ export class LocatorError extends Error {
8
+ code;
9
+ constructor(code, message = code) {
10
+ super(message);
11
+ this.code = code;
12
+ this.name = 'LocatorError';
13
+ }
14
+ }
15
+ function digest(value) {
16
+ return `sha256:${createHash('sha256').update(value, 'utf8').digest('hex')}`;
17
+ }
18
+ export function canonicalLocatorPreimage(stateRoot) {
19
+ return JSON.stringify({ schema_version: ACTIVE_ROOT_SCHEMA, state_root: stateRoot });
20
+ }
21
+ export function locatorDigest(stateRoot) {
22
+ return digest(canonicalLocatorPreimage(stateRoot));
23
+ }
24
+ /**
25
+ * Resolve the native per-user anchor. The optional arguments make platform
26
+ * fixtures deterministic; production callers use the current OS and account
27
+ * database home. Environment-selected config roots are intentionally absent.
28
+ */
29
+ export function locatorAnchor(platform = process.platform, accountHome = homedir()) {
30
+ if (!accountHome || !isAbsolute(accountHome))
31
+ throw new LocatorError('native_identity_unavailable', 'The native user identity could not be resolved safely.');
32
+ if (platform === 'darwin')
33
+ return join(accountHome, 'Library', 'Application Support', 'Vectle', ACTIVE_ROOT_LOCATOR_DIR);
34
+ if (platform === 'win32')
35
+ return join(accountHome, 'AppData', 'Local', 'Vectle', 'Locator');
36
+ return join(accountHome, '.local', 'state', 'vectle-locator');
37
+ }
38
+ function legacyAccountHome() {
39
+ try {
40
+ const nativeHome = userInfo().homedir;
41
+ if (nativeHome && isAbsolute(nativeHome))
42
+ return nativeHome;
43
+ }
44
+ catch { /* fall back to Node's legacy home resolution */ }
45
+ return homedir();
46
+ }
47
+ /** The pre-1.1 data root. This is only for the finite legacy migration set. */
48
+ export function legacyDefaultRoot(platform = process.platform, environment = process.env, accountHome = legacyAccountHome()) {
49
+ if (!accountHome || !isAbsolute(accountHome))
50
+ throw new LocatorError('native_identity_unavailable', 'The native user identity could not be resolved safely.');
51
+ if (environment.VECTLE_CONFIG_DIR?.trim())
52
+ return environment.VECTLE_CONFIG_DIR.trim();
53
+ if (platform === 'win32')
54
+ return join(environment.APPDATA?.trim() || accountHome, 'Vectle');
55
+ return join(environment.XDG_CONFIG_HOME?.trim() || join(accountHome, '.config'), 'vectle');
56
+ }
57
+ export function standardDataRoot(platform = process.platform, environment = process.env, accountHome = legacyAccountHome()) {
58
+ if (!accountHome || !isAbsolute(accountHome))
59
+ throw new LocatorError('native_identity_unavailable', 'The native user identity could not be resolved safely.');
60
+ if (platform === 'win32')
61
+ return join(environment.APPDATA?.trim() || accountHome, 'Vectle');
62
+ return join(environment.XDG_CONFIG_HOME?.trim() || join(accountHome, '.config'), 'vectle');
63
+ }
64
+ export function locatorPath(platform = process.platform, accountHome = homedir()) {
65
+ return join(locatorAnchor(platform, accountHome), 'active-root.json');
66
+ }
67
+ function stripTrailingSeparator(value) {
68
+ const normalized = value.replace(/[\\/]+$/u, '');
69
+ return normalized || value.slice(0, 1);
70
+ }
71
+ export function canonicalStateRoot(input, options = {}) {
72
+ if (typeof input !== 'string' || !isAbsolute(input))
73
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root must be an absolute path.');
74
+ const platform = options.platform ?? process.platform;
75
+ const normalizedInput = normalize(input).normalize('NFC');
76
+ if (normalizedInput === dirname(normalizedInput))
77
+ throw new LocatorError('unsafe_state_root', 'The filesystem root is not a Vectle state root.');
78
+ if (options.mustExist === false && !existsSync(normalizedInput))
79
+ return stripTrailingSeparator(normalizedInput);
80
+ if (!existsSync(normalizedInput))
81
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root does not exist.');
82
+ let stats;
83
+ try {
84
+ stats = lstatSync(normalizedInput);
85
+ }
86
+ catch {
87
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root cannot be inspected.');
88
+ }
89
+ if (stats.isSymbolicLink() || !stats.isDirectory())
90
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root must be a real directory.');
91
+ let finalPath;
92
+ try {
93
+ finalPath = realpathSync(normalizedInput).normalize('NFC');
94
+ }
95
+ catch {
96
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root cannot be canonicalized.');
97
+ }
98
+ if (platform === 'win32') {
99
+ finalPath = finalPath.replace(/^\\\\\?\\/u, '').replaceAll('\\', '/');
100
+ if (/^[a-z]:/u.test(finalPath))
101
+ finalPath = finalPath[0].toUpperCase() + finalPath.slice(1);
102
+ }
103
+ return stripTrailingSeparator(finalPath);
104
+ }
105
+ function assertPrivateDirectory(path) {
106
+ try {
107
+ const stats = statSync(path);
108
+ if (!stats.isDirectory())
109
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root is not a directory.');
110
+ if (process.platform !== 'win32' && typeof process.getuid === 'function' && stats.uid !== process.getuid())
111
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root is not owned by the current user.');
112
+ if (process.platform !== 'win32' && (stats.mode & 0o077) !== 0)
113
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root is not private.');
114
+ }
115
+ catch (error) {
116
+ if (error instanceof LocatorError)
117
+ throw error;
118
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root cannot be verified.');
119
+ }
120
+ }
121
+ export function validateStateRoot(input, options = {}) {
122
+ const preliminary = canonicalStateRoot(input, { platform: options.platform, mustExist: options.allowCreate !== true });
123
+ if (options.allowCreate === true && !existsSync(preliminary))
124
+ mkdirSync(preliminary, { recursive: true, mode: 0o700 });
125
+ const root = canonicalStateRoot(preliminary, { platform: options.platform });
126
+ assertPrivateDirectory(root);
127
+ const userHome = resolve(homedir());
128
+ if (root === userHome || root === dirname(userHome))
129
+ throw new LocatorError('unsafe_state_root', 'The Vectle state root is too broad.');
130
+ return root;
131
+ }
132
+ function readJson(path) {
133
+ try {
134
+ return JSON.parse(readFileSync(path, 'utf8'));
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ function validLocator(value) {
141
+ if (!value || typeof value !== 'object' || Array.isArray(value))
142
+ return false;
143
+ const record = value;
144
+ return Object.keys(record).length === 3
145
+ && record.schema_version === ACTIVE_ROOT_SCHEMA
146
+ && typeof record.state_root === 'string'
147
+ && isAbsolute(record.state_root)
148
+ && /^sha256:[0-9a-f]{64}$/u.test(String(record.locator_digest));
149
+ }
150
+ export function readActiveRoot(options = {}) {
151
+ const path = locatorPath(options.platform, options.accountHome);
152
+ if (!existsSync(path))
153
+ return null;
154
+ const value = readJson(path);
155
+ if (!validLocator(value))
156
+ throw new LocatorError('state_root_mismatch', 'The active Vectle root locator is invalid.');
157
+ let canonical;
158
+ try {
159
+ canonical = canonicalStateRoot(value.state_root);
160
+ }
161
+ catch {
162
+ throw new LocatorError('state_root_mismatch', 'The active Vectle root locator does not match its target.');
163
+ }
164
+ if (canonical !== value.state_root || locatorDigest(canonical) !== value.locator_digest)
165
+ throw new LocatorError('state_root_mismatch', 'The active Vectle root locator does not match its target.');
166
+ assertPrivateDirectory(canonical);
167
+ return value;
168
+ }
169
+ function atomicWrite(path, value) {
170
+ mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
171
+ const temporary = `${path}.tmp-${randomBytes(8).toString('hex')}`;
172
+ const fd = openSync(temporary, 'wx', 0o600);
173
+ try {
174
+ writeFileSync(fd, value, { encoding: 'utf8' });
175
+ fsyncSync(fd);
176
+ }
177
+ finally {
178
+ closeSync(fd);
179
+ }
180
+ renameSync(temporary, path);
181
+ chmodSync(path, 0o600);
182
+ try {
183
+ const directoryFd = openSync(dirname(path), 'r');
184
+ fsyncSync(directoryFd);
185
+ closeSync(directoryFd);
186
+ }
187
+ catch { /* Windows does not fsync directories. */ }
188
+ }
189
+ export function writeActiveRoot(stateRoot, options = {}) {
190
+ const canonical = validateStateRoot(stateRoot, { platform: options.platform, allowCreate: false });
191
+ const value = { schema_version: ACTIVE_ROOT_SCHEMA, state_root: canonical, locator_digest: locatorDigest(canonical) };
192
+ atomicWrite(locatorPath(options.platform, options.accountHome), `${JSON.stringify(value)}\n`);
193
+ return value;
194
+ }
195
+ export function removeActiveRootIfOwned(stateRoot, options = {}) {
196
+ const current = readActiveRoot(options);
197
+ if (!current)
198
+ return false;
199
+ const canonical = canonicalStateRoot(stateRoot);
200
+ if (canonical !== current.state_root)
201
+ return false;
202
+ try {
203
+ unlinkSync(locatorPath(options.platform, options.accountHome));
204
+ return true;
205
+ }
206
+ catch {
207
+ return false;
208
+ }
209
+ }
210
+ export function resolveSetupRoot(options = {}) {
211
+ if (options.requestedRoot !== undefined) {
212
+ if (!options.allowCustomStateRoot)
213
+ throw new LocatorError('unsafe_state_root', 'A new custom state root requires --allow-custom-state-root.');
214
+ const stateRoot = validateStateRoot(options.requestedRoot, { allowCreate: true, platform: options.platform });
215
+ return { stateRoot, source: 'requested', anchored: false };
216
+ }
217
+ const current = readActiveRoot(options);
218
+ if (current)
219
+ return { stateRoot: current.state_root, source: 'locator', anchored: true };
220
+ const legacy = options.legacyRoot;
221
+ if (legacy && existsSync(legacy)) {
222
+ const stateRoot = validateStateRoot(legacy, { allowCreate: false, platform: options.platform });
223
+ return { stateRoot, source: 'legacy', anchored: false };
224
+ }
225
+ const standard = standardDataRoot(options.platform, process.env, legacyAccountHome());
226
+ mkdirSync(standard, { recursive: true, mode: 0o700 });
227
+ const stateRoot = validateStateRoot(standard, { allowCreate: false, platform: options.platform });
228
+ return { stateRoot, source: 'default', anchored: false };
229
+ }
230
+ export function setupCommitPath(stateRoot) { return join(stateRoot, 'setup-state.json.commit'); }
231
+ export function setupStatePath(stateRoot) { return join(stateRoot, 'setup-state.json'); }
232
+ export function setupLockPath(stateRoot) { return join(stateRoot, 'setup.lock'); }
233
+ //# sourceMappingURL=locator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locator.js","sourceRoot":"","sources":["../src/locator.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts CHANGED
@@ -1,11 +1,21 @@
1
1
  import { type VectleClient } from './client.js';
2
+ import { type VectleConfig } from './store.js';
3
+ import type { IntegrationManifestEntry } from './integrations.js';
2
4
  type ToolDefinition = {
3
5
  name: string;
4
6
  description: string;
5
7
  inputSchema: Record<string, unknown>;
8
+ annotations?: Record<string, boolean>;
6
9
  };
7
10
  export declare const mcpTools: ToolDefinition[];
8
- export declare function callTool(client: VectleClient, name: string, args: Record<string, unknown>): Promise<{
11
+ type McpContext = {
12
+ managed: boolean;
13
+ entry?: IntegrationManifestEntry;
14
+ };
15
+ export declare function callTool(client: VectleClient, name: string, args: Record<string, unknown>, options?: {
16
+ config?: VectleConfig;
17
+ context?: McpContext;
18
+ }): Promise<{
9
19
  content: {
10
20
  type: string;
11
21
  text: string;
@@ -13,5 +23,5 @@ export declare function callTool(client: VectleClient, name: string, args: Recor
13
23
  structuredContent: unknown;
14
24
  isError: boolean;
15
25
  }>;
16
- export declare function runMcp(client: VectleClient): Promise<void>;
26
+ export declare function runMcp(client: VectleClient, suppliedConfig?: VectleConfig, managedEntry?: IntegrationManifestEntry): Promise<void>;
17
27
  export {};