expandai 0.0.2 → 0.0.3
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/README.md +42 -5
- package/build/dts/ApiClient.d.ts +128 -194
- package/build/dts/ApiClient.d.ts.map +1 -1
- package/build/dts/Auth/Domain.d.ts +95 -0
- package/build/dts/Auth/Domain.d.ts.map +1 -0
- package/build/dts/Auth/ManualAuthorization.d.ts +107 -0
- package/build/dts/Auth/ManualAuthorization.d.ts.map +1 -0
- package/build/dts/Auth/PendingInit.d.ts +35 -0
- package/build/dts/Auth/PendingInit.d.ts.map +1 -0
- package/build/dts/Auth/Pkce.d.ts +10 -0
- package/build/dts/Auth/Pkce.d.ts.map +1 -0
- package/build/dts/Auth/SetupGrantAuthorization.d.ts +34 -0
- package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +1 -0
- package/build/dts/Authentication.d.ts +10 -9
- package/build/dts/Authentication.d.ts.map +1 -1
- package/build/dts/BrowserOAuth.d.ts +7 -7
- package/build/dts/BrowserOAuth.d.ts.map +1 -1
- package/build/dts/CommandPath.d.ts +2 -0
- package/build/dts/CommandPath.d.ts.map +1 -0
- package/build/dts/Commands/Fetch.d.ts.map +1 -1
- package/build/dts/Commands/Hook.d.ts +5 -5
- package/build/dts/Commands/Init.d.ts +55 -0
- package/build/dts/Commands/Init.d.ts.map +1 -0
- package/build/dts/Commands/Mcp.d.ts +6 -6
- package/build/dts/Commands/Search.d.ts.map +1 -1
- package/build/dts/Commands/Skill.d.ts +4 -4
- package/build/dts/Commands/Status.d.ts +27 -0
- package/build/dts/Commands/Status.d.ts.map +1 -0
- package/build/dts/Commands/Telemetry.d.ts +7 -0
- package/build/dts/Commands/Telemetry.d.ts.map +1 -0
- package/build/dts/Commands/Uninstall.d.ts +4 -4
- package/build/dts/Config.d.ts +108 -17
- package/build/dts/Config.d.ts.map +1 -1
- package/build/dts/Hook/SnapshotNote.d.ts +8 -4
- package/build/dts/Hook/SnapshotNote.d.ts.map +1 -1
- package/build/dts/Init/ClaudeAdapter.d.ts +61 -0
- package/build/dts/Init/ClaudeAdapter.d.ts.map +1 -0
- package/build/dts/Init/ClaudeProfile.d.ts +78 -0
- package/build/dts/Init/ClaudeProfile.d.ts.map +1 -0
- package/build/dts/Init/Domain.d.ts +139 -0
- package/build/dts/Init/Domain.d.ts.map +1 -0
- package/build/dts/Init/HarnessAdapter.d.ts +33 -0
- package/build/dts/Init/HarnessAdapter.d.ts.map +1 -0
- package/build/dts/Init/HarnessDetector.d.ts +19 -0
- package/build/dts/Init/HarnessDetector.d.ts.map +1 -0
- package/build/dts/Init/HarnessRegistry.d.ts +50 -0
- package/build/dts/Init/HarnessRegistry.d.ts.map +1 -0
- package/build/dts/Init/MutationTransaction.d.ts +96 -0
- package/build/dts/Init/MutationTransaction.d.ts.map +1 -0
- package/build/dts/Init/Service.d.ts +72 -0
- package/build/dts/Init/Service.d.ts.map +1 -0
- package/build/dts/Init/StandardAdapters.d.ts +42 -0
- package/build/dts/Init/StandardAdapters.d.ts.map +1 -0
- package/build/dts/Init/Status.d.ts +149 -0
- package/build/dts/Init/Status.d.ts.map +1 -0
- package/build/dts/Install/Claude/Hook.d.ts +85 -25
- package/build/dts/Install/Claude/Hook.d.ts.map +1 -1
- package/build/dts/Install/Claude/Mcp.d.ts +21 -18
- package/build/dts/Install/Claude/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Claude/Skill.d.ts +14 -15
- package/build/dts/Install/Claude/Skill.d.ts.map +1 -1
- package/build/dts/Install/Codex/Mcp.d.ts +14 -8
- package/build/dts/Install/Codex/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Codex/Skill.d.ts +4 -2
- package/build/dts/Install/Codex/Skill.d.ts.map +1 -1
- package/build/dts/Install/Cursor/Mcp.d.ts +13 -13
- package/build/dts/Install/Cursor/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Cursor/Skill.d.ts +4 -2
- package/build/dts/Install/Cursor/Skill.d.ts.map +1 -1
- package/build/dts/Install/Domain.d.ts +35 -5
- package/build/dts/Install/Domain.d.ts.map +1 -1
- package/build/dts/Install/Hook.d.ts +4 -4
- package/build/dts/Install/Hook.d.ts.map +1 -1
- package/build/dts/Install/Mcp.d.ts +5 -5
- package/build/dts/Install/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Opencode/Hook.d.ts +4 -3
- package/build/dts/Install/Opencode/Hook.d.ts.map +1 -1
- package/build/dts/Install/Opencode/Mcp.d.ts +11 -11
- package/build/dts/Install/Opencode/Mcp.d.ts.map +1 -1
- package/build/dts/Install/Opencode/Skill.d.ts +4 -2
- package/build/dts/Install/Opencode/Skill.d.ts.map +1 -1
- package/build/dts/Install/Skill.d.ts +3 -3
- package/build/dts/Install/Uninstall.d.ts +6 -6
- package/build/dts/Install/Uninstall.d.ts.map +1 -1
- package/build/dts/MarkdownAnsi.d.ts +29 -0
- package/build/dts/MarkdownAnsi.d.ts.map +1 -0
- package/build/dts/Mcp/ExpandDocs.d.ts +17 -5
- package/build/dts/Mcp/ExpandDocs.d.ts.map +1 -1
- package/build/dts/Mcp/Server.d.ts +1 -1
- package/build/dts/Mcp/Server.d.ts.map +1 -1
- package/build/dts/Mcp/tools/Citations.d.ts +100 -71
- package/build/dts/Mcp/tools/Citations.d.ts.map +1 -1
- package/build/dts/Mcp/tools/Fetch.d.ts +16 -15
- package/build/dts/Mcp/tools/Fetch.d.ts.map +1 -1
- package/build/dts/SecureFile.d.ts +23 -0
- package/build/dts/SecureFile.d.ts.map +1 -0
- package/build/dts/Snippets.d.ts +11 -12
- package/build/dts/Snippets.d.ts.map +1 -1
- package/build/dts/Telemetry.d.ts +30 -0
- package/build/dts/Telemetry.d.ts.map +1 -0
- package/build/dts/Version.d.ts +2 -0
- package/build/dts/Version.d.ts.map +1 -0
- package/build/dts/Xdg.d.ts +11 -0
- package/build/dts/Xdg.d.ts.map +1 -0
- package/build/esm/ApiClient.js +133 -10
- package/build/esm/ApiClient.js.map +1 -1
- package/build/esm/Auth/Domain.js +56 -0
- package/build/esm/Auth/Domain.js.map +1 -0
- package/build/esm/Auth/ManualAuthorization.js +253 -0
- package/build/esm/Auth/ManualAuthorization.js.map +1 -0
- package/build/esm/Auth/PendingInit.js +267 -0
- package/build/esm/Auth/PendingInit.js.map +1 -0
- package/build/esm/Auth/Pkce.js +23 -0
- package/build/esm/Auth/Pkce.js.map +1 -0
- package/build/esm/Auth/SetupGrantAuthorization.js +91 -0
- package/build/esm/Auth/SetupGrantAuthorization.js.map +1 -0
- package/build/esm/Authentication.js +38 -7
- package/build/esm/Authentication.js.map +1 -1
- package/build/esm/BrowserOAuth.js +7 -10
- package/build/esm/BrowserOAuth.js.map +1 -1
- package/build/esm/CommandPath.js +31 -0
- package/build/esm/CommandPath.js.map +1 -0
- package/build/esm/Commands/Fetch.js +30 -6
- package/build/esm/Commands/Fetch.js.map +1 -1
- package/build/esm/Commands/Init.js +371 -0
- package/build/esm/Commands/Init.js.map +1 -0
- package/build/esm/Commands/Search.js +6 -3
- package/build/esm/Commands/Search.js.map +1 -1
- package/build/esm/Commands/Status.js +186 -0
- package/build/esm/Commands/Status.js.map +1 -0
- package/build/esm/Commands/Telemetry.js +23 -0
- package/build/esm/Commands/Telemetry.js.map +1 -0
- package/build/esm/Config.js +502 -28
- package/build/esm/Config.js.map +1 -1
- package/build/esm/Hook/Claude.js +1 -1
- package/build/esm/Hook/Claude.js.map +1 -1
- package/build/esm/Hook/SnapshotNote.js +54 -7
- package/build/esm/Hook/SnapshotNote.js.map +1 -1
- package/build/esm/Init/ClaudeAdapter.js +137 -0
- package/build/esm/Init/ClaudeAdapter.js.map +1 -0
- package/build/esm/Init/ClaudeProfile.js +380 -0
- package/build/esm/Init/ClaudeProfile.js.map +1 -0
- package/build/esm/Init/Domain.js +118 -0
- package/build/esm/Init/Domain.js.map +1 -0
- package/build/esm/Init/HarnessAdapter.js +21 -0
- package/build/esm/Init/HarnessAdapter.js.map +1 -0
- package/build/esm/Init/HarnessDetector.js +65 -0
- package/build/esm/Init/HarnessDetector.js.map +1 -0
- package/build/esm/Init/HarnessRegistry.js +58 -0
- package/build/esm/Init/HarnessRegistry.js.map +1 -0
- package/build/esm/Init/MutationTransaction.js +494 -0
- package/build/esm/Init/MutationTransaction.js.map +1 -0
- package/build/esm/Init/Service.js +319 -0
- package/build/esm/Init/Service.js.map +1 -0
- package/build/esm/Init/StandardAdapters.js +116 -0
- package/build/esm/Init/StandardAdapters.js.map +1 -0
- package/build/esm/Init/Status.js +215 -0
- package/build/esm/Init/Status.js.map +1 -0
- package/build/esm/Install/Claude/Hook.js +182 -50
- package/build/esm/Install/Claude/Hook.js.map +1 -1
- package/build/esm/Install/Claude/Mcp.js +56 -26
- package/build/esm/Install/Claude/Mcp.js.map +1 -1
- package/build/esm/Install/Claude/Skill.js +49 -27
- package/build/esm/Install/Claude/Skill.js.map +1 -1
- package/build/esm/Install/Codex/Mcp.js +9 -4
- package/build/esm/Install/Codex/Mcp.js.map +1 -1
- package/build/esm/Install/Codex/Skill.js +4 -1
- package/build/esm/Install/Codex/Skill.js.map +1 -1
- package/build/esm/Install/Cursor/Mcp.js +7 -4
- package/build/esm/Install/Cursor/Mcp.js.map +1 -1
- package/build/esm/Install/Cursor/Skill.js +4 -1
- package/build/esm/Install/Cursor/Skill.js.map +1 -1
- package/build/esm/Install/Domain.js +60 -3
- package/build/esm/Install/Domain.js.map +1 -1
- package/build/esm/Install/Hook.js.map +1 -1
- package/build/esm/Install/Mcp.js +1 -1
- package/build/esm/Install/Mcp.js.map +1 -1
- package/build/esm/Install/Opencode/Hook.js +1 -1
- package/build/esm/Install/Opencode/Hook.js.map +1 -1
- package/build/esm/Install/Opencode/Mcp.js +6 -3
- package/build/esm/Install/Opencode/Mcp.js.map +1 -1
- package/build/esm/Install/Opencode/Skill.js +4 -1
- package/build/esm/Install/Opencode/Skill.js.map +1 -1
- package/build/esm/Install/Opencode/expandai-webfetch.js +27 -9
- package/build/esm/Install/Skill.js.map +1 -1
- package/build/esm/Install/Uninstall.js +2 -2
- package/build/esm/Install/Uninstall.js.map +1 -1
- package/build/esm/MarkdownAnsi.js +142 -0
- package/build/esm/MarkdownAnsi.js.map +1 -0
- package/build/esm/Mcp/ExpandDocs.js +44 -52
- package/build/esm/Mcp/ExpandDocs.js.map +1 -1
- package/build/esm/Mcp/RequestHeaders.js.map +1 -1
- package/build/esm/Mcp/Server.js +2 -1
- package/build/esm/Mcp/Server.js.map +1 -1
- package/build/esm/Mcp/tools/Citations.js +109 -8
- package/build/esm/Mcp/tools/Citations.js.map +1 -1
- package/build/esm/Mcp/tools/Fetch.js +36 -12
- package/build/esm/Mcp/tools/Fetch.js.map +1 -1
- package/build/esm/SecureFile.js +36 -0
- package/build/esm/SecureFile.js.map +1 -0
- package/build/esm/Snippets.js +12 -1
- package/build/esm/Snippets.js.map +1 -1
- package/build/esm/Telemetry.js +157 -0
- package/build/esm/Telemetry.js.map +1 -0
- package/build/esm/Version.js +4 -0
- package/build/esm/Version.js.map +1 -0
- package/build/esm/Xdg.js +15 -0
- package/build/esm/Xdg.js.map +1 -0
- package/build/esm/main.js +122 -14
- package/build/esm/main.js.map +1 -1
- package/build/skills/expandai/SKILL.md +26 -3
- package/package.json +4 -4
- package/src/ApiClient.ts +206 -13
- package/src/Auth/Domain.ts +63 -0
- package/src/Auth/ManualAuthorization.ts +296 -0
- package/src/Auth/PendingInit.ts +338 -0
- package/src/Auth/Pkce.ts +26 -0
- package/src/Auth/SetupGrantAuthorization.ts +116 -0
- package/src/Authentication.ts +49 -11
- package/src/BrowserOAuth.ts +10 -12
- package/src/CommandPath.ts +30 -0
- package/src/Commands/Fetch.ts +42 -11
- package/src/Commands/Init.ts +489 -0
- package/src/Commands/Search.ts +8 -3
- package/src/Commands/Status.ts +228 -0
- package/src/Commands/Telemetry.ts +42 -0
- package/src/Config.ts +695 -50
- package/src/Hook/Claude.ts +1 -1
- package/src/Hook/SnapshotNote.ts +55 -7
- package/src/Init/ClaudeAdapter.ts +191 -0
- package/src/Init/ClaudeProfile.ts +496 -0
- package/src/Init/Domain.ts +153 -0
- package/src/Init/HarnessAdapter.ts +35 -0
- package/src/Init/HarnessDetector.ts +77 -0
- package/src/Init/HarnessRegistry.ts +87 -0
- package/src/Init/MutationTransaction.ts +747 -0
- package/src/Init/Service.ts +385 -0
- package/src/Init/StandardAdapters.ts +141 -0
- package/src/Init/Status.ts +253 -0
- package/src/Install/Claude/Hook.ts +234 -81
- package/src/Install/Claude/Mcp.ts +80 -33
- package/src/Install/Claude/Skill.ts +70 -37
- package/src/Install/Codex/Mcp.ts +14 -9
- package/src/Install/Codex/Skill.ts +9 -5
- package/src/Install/Cursor/Mcp.ts +12 -9
- package/src/Install/Cursor/Skill.ts +9 -5
- package/src/Install/Domain.ts +77 -4
- package/src/Install/Hook.ts +3 -3
- package/src/Install/Mcp.ts +6 -6
- package/src/Install/Opencode/Hook.ts +5 -5
- package/src/Install/Opencode/Mcp.ts +11 -8
- package/src/Install/Opencode/Skill.ts +9 -5
- package/src/Install/Opencode/expandai-webfetch.js +27 -9
- package/src/Install/Skill.ts +3 -3
- package/src/Install/Uninstall.ts +3 -3
- package/src/MarkdownAnsi.ts +162 -0
- package/src/Mcp/ExpandDocs.ts +46 -55
- package/src/Mcp/Server.ts +2 -1
- package/src/Mcp/tools/Citations.ts +117 -8
- package/src/Mcp/tools/Fetch.ts +40 -14
- package/src/SecureFile.ts +70 -0
- package/src/Snippets.ts +19 -12
- package/src/Telemetry.ts +186 -0
- package/src/Version.ts +3 -0
- package/src/Xdg.ts +18 -0
- package/src/main.ts +171 -12
- package/build/dts/DeviceAuth.d.ts +0 -87
- package/build/dts/DeviceAuth.d.ts.map +0 -1
- package/build/esm/DeviceAuth.js +0 -127
- package/build/esm/DeviceAuth.js.map +0 -1
- package/src/DeviceAuth.ts +0 -193
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { DateTime, Effect, Option, Schema } from 'effect';
|
|
2
|
+
import { CLI_AUTHORIZATION_CLIENT_ID, PendingInitCorrupt, } from '../Auth/Domain.js';
|
|
3
|
+
import { PendingInitStore } from '../Auth/PendingInit.js';
|
|
4
|
+
import { authMethodState } from '../Authentication.js';
|
|
5
|
+
import { ConfigManager, ConfigParseError, CredentialStoreInsecure, NotAuthenticated } from '../Config.js';
|
|
6
|
+
import { CLI_VERSION } from '../Version.js';
|
|
7
|
+
import { CLAUDE_POLICY_READ_ONLY } from './ClaudeProfile.js';
|
|
8
|
+
import { InitHarness, InitScope } from './Domain.js';
|
|
9
|
+
import { HarnessRegistry } from './HarnessRegistry.js';
|
|
10
|
+
const VERSION_PATTERN = /^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u;
|
|
11
|
+
const BoundedVersion = Schema.String.pipe(Schema.minLength(1), Schema.maxLength(64), Schema.pattern(VERSION_PATTERN));
|
|
12
|
+
export class StatusRequest extends Schema.Class('StatusRequest')({
|
|
13
|
+
harness: InitHarness,
|
|
14
|
+
scope: InitScope,
|
|
15
|
+
}) {
|
|
16
|
+
}
|
|
17
|
+
const StatusAuth = Schema.Struct({
|
|
18
|
+
// `healthy` means a call would authenticate right now. An expired access
|
|
19
|
+
// token with a refresh token on disk reports `refresh_required`, because the
|
|
20
|
+
// renewal has not happened and can fail.
|
|
21
|
+
state: Schema.Literal('absent', 'unusable', 'refresh_required', 'healthy'),
|
|
22
|
+
healthy: Schema.Boolean,
|
|
23
|
+
});
|
|
24
|
+
const PendingAuthorization = Schema.Union(Schema.Struct({ state: Schema.Literal('none'), count: Schema.Literal(0) }), Schema.Struct({
|
|
25
|
+
state: Schema.Literal('approval_pending'),
|
|
26
|
+
count: Schema.Literal(1),
|
|
27
|
+
approvalExpiresAt: Schema.DateTimeUtc,
|
|
28
|
+
}));
|
|
29
|
+
const StatusInstallation = Schema.Struct({
|
|
30
|
+
configured: Schema.Boolean,
|
|
31
|
+
integrationVersion: Schema.optional(BoundedVersion),
|
|
32
|
+
components: Schema.Struct({
|
|
33
|
+
webfetchHook: Schema.Boolean,
|
|
34
|
+
runtimeSkill: Schema.Boolean,
|
|
35
|
+
mcp: Schema.Boolean,
|
|
36
|
+
}),
|
|
37
|
+
runtimeState: Schema.Literal('unverified', 'reload_required', 'blocked'),
|
|
38
|
+
reloadState: Schema.Literal('not_required', 'required'),
|
|
39
|
+
consentState: Schema.Literal('not_required', 'may_be_required'),
|
|
40
|
+
policyState: Schema.Literal('unverified', 'blocked'),
|
|
41
|
+
policyCodes: Schema.Array(Schema.Literal('managed_policy_blocked', 'target_read_only')).pipe(Schema.maxItems(1)),
|
|
42
|
+
});
|
|
43
|
+
export class StatusResult extends Schema.Class('StatusResult')({
|
|
44
|
+
schemaVersion: Schema.Literal(1),
|
|
45
|
+
status: Schema.Literal('ok'),
|
|
46
|
+
harness: InitHarness,
|
|
47
|
+
scope: InitScope,
|
|
48
|
+
cli: Schema.Struct({ version: BoundedVersion }),
|
|
49
|
+
auth: StatusAuth,
|
|
50
|
+
pendingAuthorization: PendingAuthorization,
|
|
51
|
+
installation: StatusInstallation,
|
|
52
|
+
}) {
|
|
53
|
+
}
|
|
54
|
+
export const StatusServiceErrorCode = Schema.Literal('credential_config_malformed', 'credential_storage_insecure', 'credential_health_failed', 'pending_state_malformed', 'pending_state_unavailable', 'harness_inspection_failed', 'invalid_status_result');
|
|
55
|
+
export class StatusServiceError extends Schema.TaggedError()('StatusServiceError', {
|
|
56
|
+
code: StatusServiceErrorCode,
|
|
57
|
+
recoverable: Schema.Boolean,
|
|
58
|
+
}) {
|
|
59
|
+
get message() {
|
|
60
|
+
switch (this.code) {
|
|
61
|
+
case 'credential_config_malformed':
|
|
62
|
+
return 'Stored credential configuration is malformed.';
|
|
63
|
+
case 'credential_storage_insecure':
|
|
64
|
+
return 'Credential storage is not secure enough to inspect.';
|
|
65
|
+
case 'credential_health_failed':
|
|
66
|
+
return 'Stored credentials could not be inspected safely.';
|
|
67
|
+
case 'pending_state_malformed':
|
|
68
|
+
return 'Pending authorization state is malformed.';
|
|
69
|
+
case 'pending_state_unavailable':
|
|
70
|
+
return 'Pending authorization state could not be inspected safely.';
|
|
71
|
+
case 'harness_inspection_failed':
|
|
72
|
+
return 'The harness configuration could not be inspected safely.';
|
|
73
|
+
case 'invalid_status_result':
|
|
74
|
+
return 'Local diagnostics returned an invalid result.';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function statusError(code, recoverable) {
|
|
79
|
+
return new StatusServiceError({ code, recoverable });
|
|
80
|
+
}
|
|
81
|
+
function mapCredentialError(error) {
|
|
82
|
+
if (error instanceof ConfigParseError)
|
|
83
|
+
return statusError('credential_config_malformed', false);
|
|
84
|
+
if (error instanceof CredentialStoreInsecure)
|
|
85
|
+
return statusError('credential_storage_insecure', false);
|
|
86
|
+
return statusError('credential_health_failed', false);
|
|
87
|
+
}
|
|
88
|
+
function mapPendingError(error) {
|
|
89
|
+
if (error instanceof CredentialStoreInsecure)
|
|
90
|
+
return statusError('credential_storage_insecure', false);
|
|
91
|
+
return error instanceof PendingInitCorrupt
|
|
92
|
+
? statusError('pending_state_malformed', true)
|
|
93
|
+
: statusError('pending_state_unavailable', true);
|
|
94
|
+
}
|
|
95
|
+
function authStatus(configManager) {
|
|
96
|
+
return Effect.gen(function* () {
|
|
97
|
+
const loaded = yield* Effect.either(configManager.loadConfig());
|
|
98
|
+
if (loaded._tag === 'Left') {
|
|
99
|
+
if (loaded.left instanceof NotAuthenticated)
|
|
100
|
+
return { state: 'absent', healthy: false };
|
|
101
|
+
return yield* mapCredentialError(loaded.left);
|
|
102
|
+
}
|
|
103
|
+
const now = yield* DateTime.now;
|
|
104
|
+
const state = authMethodState(loaded.right.authMethod, now);
|
|
105
|
+
return { state, healthy: state === 'healthy' };
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function pendingStatus(record) {
|
|
109
|
+
return Effect.gen(function* () {
|
|
110
|
+
if (Option.isNone(record))
|
|
111
|
+
return { state: 'none', count: 0 };
|
|
112
|
+
const now = DateTime.toEpochMillis(yield* DateTime.now);
|
|
113
|
+
if (DateTime.toEpochMillis(record.value.approvalExpiresAt) <= now) {
|
|
114
|
+
return { state: 'none', count: 0 };
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
state: 'approval_pending',
|
|
118
|
+
count: 1,
|
|
119
|
+
approvalExpiresAt: DateTime.formatIso(record.value.approvalExpiresAt),
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
function validateInspection(harness, inspection) {
|
|
124
|
+
const componentSet = new Set(inspection.components);
|
|
125
|
+
// Only the harnesses with a web-fetch hook install three components; cursor
|
|
126
|
+
// and codex are complete with two. Demanding three of them reported a
|
|
127
|
+
// correctly configured machine as an invalid result.
|
|
128
|
+
const expectsHook = harness === 'claude-code' || harness === 'opencode';
|
|
129
|
+
const allComponents = componentSet.has('runtime-skill') &&
|
|
130
|
+
componentSet.has('mcp') &&
|
|
131
|
+
(expectsHook ? componentSet.has('webfetch-hook') && componentSet.size === 3 : componentSet.size === 2);
|
|
132
|
+
const versionValid = inspection.integrationVersion === undefined ||
|
|
133
|
+
(inspection.integrationVersion.length <= 64 && VERSION_PATTERN.test(inspection.integrationVersion));
|
|
134
|
+
const configuredValid = inspection.configured === allComponents;
|
|
135
|
+
const runtimeValid = inspection.runtimeState !== 'observed';
|
|
136
|
+
return componentSet.size === inspection.components.length && versionValid && configuredValid && runtimeValid
|
|
137
|
+
? Effect.succeed(inspection)
|
|
138
|
+
: statusError('invalid_status_result', false);
|
|
139
|
+
}
|
|
140
|
+
function installationStatus(inspection, scope) {
|
|
141
|
+
const components = new Set(inspection.components);
|
|
142
|
+
const policyBlocked = inspection.policyBlock !== undefined || inspection.runtimeState === 'blocked';
|
|
143
|
+
const policyCodes = inspection.policyBlock === CLAUDE_POLICY_READ_ONLY
|
|
144
|
+
? ['target_read_only']
|
|
145
|
+
: policyBlocked
|
|
146
|
+
? ['managed_policy_blocked']
|
|
147
|
+
: [];
|
|
148
|
+
const reloadRequired = !policyBlocked && inspection.runtimeState === 'reload_required';
|
|
149
|
+
return {
|
|
150
|
+
configured: inspection.configured,
|
|
151
|
+
...(inspection.integrationVersion === undefined ? {} : { integrationVersion: inspection.integrationVersion }),
|
|
152
|
+
components: {
|
|
153
|
+
webfetchHook: components.has('webfetch-hook'),
|
|
154
|
+
runtimeSkill: components.has('runtime-skill'),
|
|
155
|
+
mcp: components.has('mcp'),
|
|
156
|
+
},
|
|
157
|
+
runtimeState: policyBlocked
|
|
158
|
+
? 'blocked'
|
|
159
|
+
: reloadRequired
|
|
160
|
+
? 'reload_required'
|
|
161
|
+
: 'unverified',
|
|
162
|
+
reloadState: reloadRequired ? 'required' : 'not_required',
|
|
163
|
+
consentState: scope === 'project' ? 'may_be_required' : 'not_required',
|
|
164
|
+
policyState: policyBlocked ? 'blocked' : 'unverified',
|
|
165
|
+
policyCodes,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
export class StatusService extends Effect.Service()('@expandai/cli/Init/StatusService', {
|
|
169
|
+
dependencies: [ConfigManager.Default, PendingInitStore.Default, HarnessRegistry.Default],
|
|
170
|
+
effect: Effect.gen(function* () {
|
|
171
|
+
const configManager = yield* ConfigManager;
|
|
172
|
+
const pendingStore = yield* PendingInitStore;
|
|
173
|
+
const registry = yield* HarnessRegistry;
|
|
174
|
+
const run = Effect.fn('StatusService.run')(function* (request) {
|
|
175
|
+
yield* Effect.annotateCurrentSpan({ harness: request.harness, scope: request.scope });
|
|
176
|
+
return yield* Effect.gen(function* () {
|
|
177
|
+
yield* configManager
|
|
178
|
+
.inspectSecureStorage()
|
|
179
|
+
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapCredentialError));
|
|
180
|
+
const auth = yield* authStatus(configManager).pipe(Effect.withTracerEnabled(false));
|
|
181
|
+
const apiUrl = yield* configManager
|
|
182
|
+
.getApiUrl()
|
|
183
|
+
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapCredentialError));
|
|
184
|
+
const canonicalScopeRoot = yield* pendingStore
|
|
185
|
+
.canonicalScopeRoot(request.scope)
|
|
186
|
+
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapPendingError));
|
|
187
|
+
const key = {
|
|
188
|
+
apiOrigin: apiUrl.origin,
|
|
189
|
+
clientId: CLI_AUTHORIZATION_CLIENT_ID,
|
|
190
|
+
harness: 'agent-harnesses',
|
|
191
|
+
scope: request.scope,
|
|
192
|
+
canonicalScopeRoot,
|
|
193
|
+
};
|
|
194
|
+
const pending = yield* pendingStore
|
|
195
|
+
.peek(key)
|
|
196
|
+
.pipe(Effect.withTracerEnabled(false), Effect.mapError(mapPendingError));
|
|
197
|
+
const inspection = yield* registry.inspect(request.harness, request.scope).pipe(Effect.withTracerEnabled(false), Effect.mapError(() => statusError('harness_inspection_failed', true)), Effect.flatMap((inspection) => validateInspection(request.harness, inspection)));
|
|
198
|
+
const candidate = {
|
|
199
|
+
schemaVersion: 1,
|
|
200
|
+
status: 'ok',
|
|
201
|
+
harness: request.harness,
|
|
202
|
+
scope: request.scope,
|
|
203
|
+
cli: { version: CLI_VERSION },
|
|
204
|
+
auth,
|
|
205
|
+
pendingAuthorization: yield* pendingStatus(pending),
|
|
206
|
+
installation: installationStatus(inspection, request.scope),
|
|
207
|
+
};
|
|
208
|
+
return yield* Schema.decodeUnknown(StatusResult)(candidate).pipe(Effect.mapError(() => statusError('invalid_status_result', false)));
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
return { run };
|
|
212
|
+
}),
|
|
213
|
+
}) {
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=Status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Status.js","sourceRoot":"","sources":["../../../src/Init/Status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,158 @@
|
|
|
1
1
|
import { homedir } from 'node:os';
|
|
2
2
|
import { Array, Config, Console, Effect, Match, Schema } from 'effect';
|
|
3
|
-
import {
|
|
3
|
+
import { CLI_VERSION } from '../../Version.js';
|
|
4
|
+
import { ConfigIo, cliShellCommand, DIRECT_CLI } from '../Domain.js';
|
|
5
|
+
/** Claude Code WebFetch hook invocation persisted in harness settings. */
|
|
6
|
+
export const HOOK_INVOCATION = 'expandai hook claude-code';
|
|
7
|
+
export const HOOK_COMMAND = HOOK_INVOCATION;
|
|
8
|
+
const HOOK_ARGS = ['hook', 'claude-code'];
|
|
4
9
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
10
|
+
* The hook line for a resolved CLI. Defaults to the bare `expandai` command;
|
|
11
|
+
* when the CLI is not on PATH — an `npx expandai init` with no global install —
|
|
12
|
+
* `CliInvocation` resolves to the npx form and the written hook stays runnable.
|
|
8
13
|
*/
|
|
9
|
-
export
|
|
14
|
+
export function hookCommandFor(cli = DIRECT_CLI) {
|
|
15
|
+
return cliShellCommand(cli, HOOK_ARGS);
|
|
16
|
+
}
|
|
10
17
|
export const WEBFETCH_MATCHER = 'WebFetch';
|
|
11
18
|
export const HookCommandEntry = Schema.Struct({
|
|
12
19
|
type: Schema.Literal('command'),
|
|
13
20
|
command: Schema.String,
|
|
14
|
-
|
|
21
|
+
expandaiProfileVersion: Schema.optional(Schema.String),
|
|
22
|
+
/** Whether this install added the `WebFetch` deny rule — see `makeExpandaiMatcher`. */
|
|
23
|
+
expandaiManagedDeny: Schema.optional(Schema.Boolean),
|
|
24
|
+
}, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
15
25
|
export const HookMatcher = Schema.Struct({
|
|
16
26
|
matcher: Schema.optional(Schema.String),
|
|
17
27
|
hooks: Schema.Array(HookCommandEntry),
|
|
18
|
-
});
|
|
28
|
+
}, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
19
29
|
const HooksSection = Schema.Struct({ PreToolUse: Schema.optional(Schema.Array(HookMatcher)) }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
20
|
-
|
|
21
|
-
export const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
30
|
+
const PermissionsSection = Schema.Struct({ deny: Schema.optional(Schema.Array(Schema.String)) }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
|
|
31
|
+
export const SettingsSchema = Schema.parseJson(Schema.Struct({
|
|
32
|
+
hooks: Schema.optionalWith(HooksSection, { default: () => ({}) }),
|
|
33
|
+
permissions: Schema.optional(PermissionsSection),
|
|
34
|
+
}, Schema.Record({ key: Schema.String, value: Schema.Unknown })), { space: 2 });
|
|
35
|
+
export function isExpandaiHookCommand(command) {
|
|
36
|
+
const value = command.trim();
|
|
37
|
+
const invocation = String.raw `expandai(?:\.exe)?\s+hook\s+(?:claude-code|claude)`;
|
|
38
|
+
const direct = new RegExp(String.raw `^(?:npx\s+-y\s+)?${invocation}$`, 'u');
|
|
39
|
+
const absolute = new RegExp(String.raw `^(?:"(?:[A-Za-z]:\\|/)[^"]*[\\/]expandai(?:\.exe)?"|'(?:[A-Za-z]:\\|/)[^']*[\\/]expandai(?:\.exe)?'|(?:[A-Za-z]:\\|/)[^\s]*[\\/]expandai(?:\.exe)?)\s+hook\s+(?:claude-code|claude)$`, 'u');
|
|
40
|
+
const shellFallback = /^if\s+command\s+-v\s+expandai\s+>\/dev\/null\s+2>&1;\s*then\s+expandai\s+hook\s+(?:claude-code|claude);\s*else\s+npx\s+-y\s+expandai\s+hook\s+(?:claude-code|claude);\s*fi$/u;
|
|
41
|
+
return direct.test(value) || absolute.test(value) || shellFallback.test(value);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* `expandaiManagedDeny` records whether *we* added `WebFetch` to
|
|
45
|
+
* `permissions.deny`, so uninstall can tell our entry from an identical one the
|
|
46
|
+
* user set first. A deny entry is a bare string with nowhere to carry that, and
|
|
47
|
+
* "our hook is present" is not the same claim: installing over a settings file
|
|
48
|
+
* that already denied `WebFetch` leaves the hook without us having written the
|
|
49
|
+
* rule, and removing it then revokes a control its owner chose.
|
|
50
|
+
*/
|
|
51
|
+
export function makeExpandaiMatcher(profileVersion, cli = DIRECT_CLI, managedDeny = true) {
|
|
52
|
+
return {
|
|
53
|
+
matcher: WEBFETCH_MATCHER,
|
|
54
|
+
hooks: [
|
|
55
|
+
{
|
|
56
|
+
type: 'command',
|
|
57
|
+
command: hookCommandFor(cli),
|
|
58
|
+
expandaiProfileVersion: profileVersion,
|
|
59
|
+
expandaiManagedDeny: managedDeny,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** True only when our own hook entry says we wrote the deny rule. */
|
|
65
|
+
export function expandaiOwnsWebFetchDeny(settings) {
|
|
66
|
+
return (settings.hooks.PreToolUse ?? []).some((entry) => entry.hooks.some((hook) => isExpandaiHookCommand(hook.command) && hook.expandaiManagedDeny === true));
|
|
67
|
+
}
|
|
68
|
+
function webFetchAlreadyDenied(settings) {
|
|
69
|
+
return (settings.permissions?.deny ?? []).includes(WEBFETCH_MATCHER);
|
|
70
|
+
}
|
|
71
|
+
export const expandaiMatcher = makeExpandaiMatcher(CLI_VERSION);
|
|
72
|
+
function stripExpandaiHooks(entries) {
|
|
73
|
+
return Array.flatMap(entries, (entry) => {
|
|
74
|
+
const hooks = Array.filter(entry.hooks, (hook) => !isExpandaiHookCommand(hook.command));
|
|
75
|
+
return hooks.length === 0 && hooks.length !== entry.hooks.length ? [] : [{ ...entry, hooks }];
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Denying `WebFetch` removes it from the toolset rather than blocking it per call,
|
|
80
|
+
* so the agent reaches for Expand's tool instead of being refused. That difference
|
|
81
|
+
* is the whole point: a hook can only answer a WebFetch call with `deny`, which
|
|
82
|
+
* Claude Code renders to the user as `Error:` on every single fetch.
|
|
83
|
+
*
|
|
84
|
+
* The hook stays installed as the fallback. With the deny rule in force WebFetch is
|
|
85
|
+
* never called, so the hook never fires; if the rule is ever absent or overridden,
|
|
86
|
+
* the hook still intercepts — with the red line, but correctly.
|
|
87
|
+
*/
|
|
88
|
+
export function planClaudeWebFetchDeny(settings) {
|
|
89
|
+
const deny = settings.permissions?.deny ?? [];
|
|
90
|
+
if (deny.includes(WEBFETCH_MATCHER))
|
|
91
|
+
return { changed: false, settings };
|
|
92
|
+
return {
|
|
93
|
+
changed: true,
|
|
94
|
+
settings: {
|
|
95
|
+
...settings,
|
|
96
|
+
permissions: { ...(settings.permissions ?? {}), deny: [...deny, WEBFETCH_MATCHER] },
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Drops the `WebFetch` entry; anything else the user denied is left alone.
|
|
102
|
+
*
|
|
103
|
+
* A deny entry is a bare string with nowhere to record who wrote it, so this
|
|
104
|
+
* cannot tell our rule from an identical one the user added themselves. The
|
|
105
|
+
* caller supplies that evidence — see `uninstall`.
|
|
106
|
+
*/
|
|
107
|
+
export function planClaudeWebFetchDenyRemoval(settings) {
|
|
108
|
+
const deny = settings.permissions?.deny;
|
|
109
|
+
if (deny === undefined || !deny.includes(WEBFETCH_MATCHER))
|
|
110
|
+
return { changed: false, settings };
|
|
111
|
+
const remaining = deny.filter((entry) => entry !== WEBFETCH_MATCHER);
|
|
112
|
+
const permissions = { ...settings.permissions, deny: remaining };
|
|
113
|
+
return { changed: true, settings: { ...settings, permissions } };
|
|
114
|
+
}
|
|
115
|
+
export function planClaudeHook(settings, profileVersion = CLI_VERSION, cli = DIRECT_CLI) {
|
|
116
|
+
const preToolUse = settings.hooks.PreToolUse ?? [];
|
|
117
|
+
const owned = preToolUse.flatMap((entry) => entry.hooks.filter((hook) => isExpandaiHookCommand(hook.command)).map((hook) => ({ entry, hook })));
|
|
118
|
+
// The marker records history — did *this* install add the rule — so once it is
|
|
119
|
+
// written it must be preserved, not recomputed. Recomputing it from present
|
|
120
|
+
// state makes the plan disagree with what it just wrote: after we add the deny
|
|
121
|
+
// rule, `webFetchAlreadyDenied` is true, so a second plan would decide the rule
|
|
122
|
+
// was never ours and rewrite the hook forever.
|
|
123
|
+
const existingMarker = owned[0]?.hook.expandaiManagedDeny;
|
|
124
|
+
const managedDeny = existingMarker ?? !webFetchAlreadyDenied(settings);
|
|
125
|
+
const current = owned.length === 1 &&
|
|
126
|
+
owned[0]?.entry.matcher === WEBFETCH_MATCHER &&
|
|
127
|
+
owned[0]?.hook.command === hookCommandFor(cli) &&
|
|
128
|
+
owned[0]?.hook.expandaiProfileVersion === profileVersion &&
|
|
129
|
+
owned[0]?.hook.expandaiManagedDeny === managedDeny;
|
|
130
|
+
if (current)
|
|
131
|
+
return { changed: false, settings };
|
|
132
|
+
return {
|
|
133
|
+
changed: true,
|
|
134
|
+
settings: {
|
|
135
|
+
...settings,
|
|
136
|
+
hooks: {
|
|
137
|
+
...settings.hooks,
|
|
138
|
+
PreToolUse: [...stripExpandaiHooks(preToolUse), makeExpandaiMatcher(profileVersion, cli, managedDeny)],
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export function planClaudeHookRemoval(settings) {
|
|
144
|
+
const preToolUse = settings.hooks.PreToolUse ?? [];
|
|
145
|
+
const changed = preToolUse.some((entry) => entry.hooks.some((hook) => isExpandaiHookCommand(hook.command)));
|
|
146
|
+
return changed
|
|
147
|
+
? {
|
|
148
|
+
changed,
|
|
149
|
+
settings: {
|
|
150
|
+
...settings,
|
|
151
|
+
hooks: { ...settings.hooks, PreToolUse: stripExpandaiHooks(preToolUse) },
|
|
152
|
+
},
|
|
153
|
+
}
|
|
154
|
+
: { changed, settings };
|
|
155
|
+
}
|
|
25
156
|
export class ClaudeHook extends Effect.Service()('@expandai/cli/Install/Claude/Hook', {
|
|
26
157
|
dependencies: [ConfigIo.Default],
|
|
27
158
|
effect: Effect.gen(function* () {
|
|
@@ -34,55 +165,56 @@ export class ClaudeHook extends Effect.Service()('@expandai/cli/Install/Claude/H
|
|
|
34
165
|
const install = Effect.fn('ClaudeHook.install')(function* (scope) {
|
|
35
166
|
const target = yield* pathFor(scope);
|
|
36
167
|
const settings = yield* io.read(target, SettingsSchema);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
168
|
+
// Both halves, exactly as `init` writes them. This used to install the hook
|
|
169
|
+
// alone, which left the deny rule to `init` only — and made `uninstall`'s
|
|
170
|
+
// ownership rule false: it treats our hook as evidence that we wrote the
|
|
171
|
+
// deny entry, so a rule the user added after a bare `hook install` was
|
|
172
|
+
// deleted as if it were ours.
|
|
173
|
+
const hookPlan = planClaudeHook(settings);
|
|
174
|
+
const plan = planClaudeWebFetchDeny(hookPlan.settings);
|
|
175
|
+
if (!hookPlan.changed && !plan.changed) {
|
|
40
176
|
yield* Console.log(`expandai WebFetch hook already installed at ${target}`);
|
|
41
177
|
return;
|
|
42
178
|
}
|
|
43
|
-
yield* io.write(target,
|
|
44
|
-
|
|
45
|
-
hooks: {
|
|
46
|
-
...settings.hooks,
|
|
47
|
-
PreToolUse: [...preToolUse, expandaiMatcher],
|
|
48
|
-
},
|
|
49
|
-
}, SettingsSchema);
|
|
50
|
-
yield* Console.log(`Installed expandai WebFetch hook at ${target}`);
|
|
179
|
+
yield* io.write(target, plan.settings, SettingsSchema);
|
|
180
|
+
yield* Console.log(`Installed expandai WebFetch hook and deny rule at ${target}`);
|
|
51
181
|
});
|
|
52
182
|
const uninstall = Effect.fn('ClaudeHook.uninstall')(function* (scope) {
|
|
53
183
|
const target = yield* pathFor(scope);
|
|
54
|
-
|
|
55
|
-
if (!exists) {
|
|
184
|
+
if (!(yield* io.exists(target)))
|
|
56
185
|
return;
|
|
57
|
-
}
|
|
58
186
|
const settings = yield* io.read(target, SettingsSchema);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
const after = yield* countCommands(updatedPreToolUse);
|
|
73
|
-
if (before === after) {
|
|
187
|
+
// Uninstall has to undo both halves, or `WebFetch` stays denied with nothing
|
|
188
|
+
// left to serve the fetch — worse than never having installed us.
|
|
189
|
+
//
|
|
190
|
+
// But only the halves we wrote. `expandaiManagedDeny` on our hook records
|
|
191
|
+
// whether this install added the deny rule; without it, the rule is either
|
|
192
|
+
// the user's own or from an install predating the marker, and those are
|
|
193
|
+
// indistinguishable. Guessing "ours" revokes a control its owner chose;
|
|
194
|
+
// guessing "theirs" leaves `WebFetch` denied with nothing serving fetches.
|
|
195
|
+
// So leave it and say so — `uninstall` also fans out over both scopes, and
|
|
196
|
+
// would otherwise reach into a global settings file a project-scoped
|
|
197
|
+
// install never touched.
|
|
198
|
+
const hookPlan = planClaudeHookRemoval(settings);
|
|
199
|
+
if (!hookPlan.changed)
|
|
74
200
|
return;
|
|
201
|
+
// Read the marker off the hook before it is stripped.
|
|
202
|
+
const owned = expandaiOwnsWebFetchDeny(settings);
|
|
203
|
+
const denyPlan = owned ? planClaudeWebFetchDenyRemoval(hookPlan.settings) : hookPlan;
|
|
204
|
+
const strandedDeny = !owned && (settings.permissions?.deny ?? []).includes(WEBFETCH_MATCHER);
|
|
205
|
+
yield* io.write(target, denyPlan.settings, SettingsSchema);
|
|
206
|
+
// `denyPlan` is the hook plan itself when we do not own the rule, so its
|
|
207
|
+
// `changed` flag reports the hook removal — not a deny removal that never
|
|
208
|
+
// happened.
|
|
209
|
+
const removedDeny = owned && denyPlan.changed;
|
|
210
|
+
yield* Console.log(removedDeny
|
|
211
|
+
? `Removed expandai WebFetch hook and deny rule from ${target}`
|
|
212
|
+
: `Removed expandai WebFetch hook from ${target}`);
|
|
213
|
+
if (strandedDeny) {
|
|
214
|
+
yield* Console.log(`Left "WebFetch" in permissions.deny at ${target} — expandai could not confirm it added that rule. Remove it by hand if you want Claude Code's built-in WebFetch back.`);
|
|
75
215
|
}
|
|
76
|
-
yield* io.write(target, {
|
|
77
|
-
...settings,
|
|
78
|
-
hooks: {
|
|
79
|
-
...settings.hooks,
|
|
80
|
-
PreToolUse: updatedPreToolUse,
|
|
81
|
-
},
|
|
82
|
-
}, SettingsSchema);
|
|
83
|
-
yield* Console.log(`Removed expandai WebFetch hook from ${target}`);
|
|
84
216
|
});
|
|
85
|
-
return { install, uninstall };
|
|
217
|
+
return { install, uninstall, pathFor };
|
|
86
218
|
}),
|
|
87
219
|
}) {
|
|
88
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Hook.ts"],"names":[],"mappings":"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"}
|