offrouter-adapter-claude 0.2.1 → 0.2.2
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/{src/hooks/pre-tool-use.ts → dist/hooks/pre-tool-use.d.ts} +4 -8
- package/dist/hooks/pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/pre-tool-use.js +14 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/hooks/user-prompt-submit.d.ts +56 -0
- package/dist/hooks/user-prompt-submit.d.ts.map +1 -0
- package/dist/hooks/user-prompt-submit.js +177 -0
- package/dist/hooks/user-prompt-submit.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +116 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +446 -0
- package/dist/install.js.map +1 -0
- package/dist/rollback.d.ts +23 -0
- package/dist/rollback.d.ts.map +1 -0
- package/dist/rollback.js +245 -0
- package/dist/rollback.js.map +1 -0
- package/package.json +8 -3
- package/src/hooks/user-prompt-submit.test.ts +0 -222
- package/src/hooks/user-prompt-submit.ts +0 -262
- package/src/index.ts +0 -49
- package/src/install.test.ts +0 -589
- package/src/install.ts +0 -595
- package/src/plugin.test.ts +0 -150
- package/src/rollback.ts +0 -329
- package/tsconfig.json +0 -10
|
@@ -4,16 +4,12 @@
|
|
|
4
4
|
* No enforcement behavior is claimed here. Future milestones may add
|
|
5
5
|
* audit/policy guards; V1 only reserves the export surface.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
7
|
export interface PreToolUseHookOutput {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
/** Placeholder: PreToolUse decisions are not produced in V1. */
|
|
9
|
+
continue?: boolean;
|
|
11
10
|
}
|
|
12
|
-
|
|
13
11
|
/**
|
|
14
12
|
* No-op placeholder for the future PreToolUse hook surface.
|
|
15
13
|
*/
|
|
16
|
-
export function handlePreToolUse(input: unknown): PreToolUseHookOutput
|
|
17
|
-
|
|
18
|
-
return {};
|
|
19
|
-
}
|
|
14
|
+
export declare function handlePreToolUse(input: unknown): PreToolUseHookOutput;
|
|
15
|
+
//# sourceMappingURL=pre-tool-use.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-tool-use.d.ts","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAGrE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code PreToolUse hook placeholder for OffRouter V1.
|
|
3
|
+
*
|
|
4
|
+
* No enforcement behavior is claimed here. Future milestones may add
|
|
5
|
+
* audit/policy guards; V1 only reserves the export surface.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* No-op placeholder for the future PreToolUse hook surface.
|
|
9
|
+
*/
|
|
10
|
+
export function handlePreToolUse(input) {
|
|
11
|
+
void input;
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=pre-tool-use.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-tool-use.js","sourceRoot":"","sources":["../../src/hooks/pre-tool-use.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,KAAK,KAAK,CAAC;IACX,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type PolicyConfig, type ProviderCandidate, type RouteConstraints } from "offrouter-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
declare const ClaudeUserPromptSubmitSchema: z.ZodObject<{
|
|
4
|
+
hook_event_name: z.ZodLiteral<"UserPromptSubmit">;
|
|
5
|
+
prompt: z.ZodString;
|
|
6
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
7
|
+
session_id: z.ZodOptional<z.ZodString>;
|
|
8
|
+
transcript_path: z.ZodOptional<z.ZodString>;
|
|
9
|
+
permission_mode: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
11
|
+
hook_event_name: z.ZodLiteral<"UserPromptSubmit">;
|
|
12
|
+
prompt: z.ZodString;
|
|
13
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
14
|
+
session_id: z.ZodOptional<z.ZodString>;
|
|
15
|
+
transcript_path: z.ZodOptional<z.ZodString>;
|
|
16
|
+
permission_mode: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
18
|
+
hook_event_name: z.ZodLiteral<"UserPromptSubmit">;
|
|
19
|
+
prompt: z.ZodString;
|
|
20
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
21
|
+
session_id: z.ZodOptional<z.ZodString>;
|
|
22
|
+
transcript_path: z.ZodOptional<z.ZodString>;
|
|
23
|
+
permission_mode: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
25
|
+
export type ClaudeUserPromptSubmitPayload = z.infer<typeof ClaudeUserPromptSubmitSchema>;
|
|
26
|
+
export interface UserPromptSubmitOptions {
|
|
27
|
+
profile: string;
|
|
28
|
+
policy: PolicyConfig;
|
|
29
|
+
candidates: ProviderCandidate[];
|
|
30
|
+
trustedWorkspace?: boolean;
|
|
31
|
+
routeConstraints?: Partial<RouteConstraints>;
|
|
32
|
+
}
|
|
33
|
+
export interface UserPromptSubmitHookOutput {
|
|
34
|
+
decision?: "block";
|
|
35
|
+
reason?: string;
|
|
36
|
+
hookSpecificOutput?: {
|
|
37
|
+
hookEventName: "UserPromptSubmit";
|
|
38
|
+
additionalContext: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface HookRunResult {
|
|
42
|
+
exitCode: number;
|
|
43
|
+
stdout: string;
|
|
44
|
+
stderr: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Pure UserPromptSubmit handler used by tests and the stdio runner.
|
|
48
|
+
*/
|
|
49
|
+
export declare function handleUserPromptSubmit(input: unknown, options: UserPromptSubmitOptions): UserPromptSubmitHookOutput;
|
|
50
|
+
/**
|
|
51
|
+
* Stdio-style runner: parse stdin JSON, handle, emit a single JSON object on
|
|
52
|
+
* stdout. Always exit 0 so Claude receives structured block/allow decisions.
|
|
53
|
+
*/
|
|
54
|
+
export declare function runUserPromptSubmitHook(stdin: string, options: UserPromptSubmitOptions): Promise<HookRunResult>;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=user-prompt-submit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt-submit.d.ts","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EAEtB,KAAK,gBAAgB,EAGtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,QAAA,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;gCASlB,CAAC;AAEjB,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CACjD,OAAO,4BAA4B,CACpC,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE;QACnB,aAAa,EAAE,kBAAkB,CAAC;QAClC,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAyID;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,uBAAuB,GAC/B,0BAA0B,CA8B5B;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,aAAa,CAAC,CAexB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code UserPromptSubmit hook adapter.
|
|
3
|
+
*
|
|
4
|
+
* V1 boundary: do not claim to intercept or replace Claude Code's primary
|
|
5
|
+
* model. This handler injects audit-safe routing guidance for OffRouter-
|
|
6
|
+
* managed delegation (or blocks profiles OffRouter refuses to serve).
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
import { ROUTE_PROTOCOL_VERSION, routeRequest, } from "offrouter-core";
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
const HONESTY_SENTENCE = "Claude Code's primary model is unchanged in V1; OffRouter routes delegated work.";
|
|
12
|
+
const ClaudeUserPromptSubmitSchema = z
|
|
13
|
+
.object({
|
|
14
|
+
hook_event_name: z.literal("UserPromptSubmit"),
|
|
15
|
+
prompt: z.string().min(1),
|
|
16
|
+
cwd: z.string().optional(),
|
|
17
|
+
session_id: z.string().optional(),
|
|
18
|
+
transcript_path: z.string().optional(),
|
|
19
|
+
permission_mode: z.string().optional(),
|
|
20
|
+
})
|
|
21
|
+
.passthrough();
|
|
22
|
+
function promptDigest(prompt) {
|
|
23
|
+
return `sha256:${createHash("sha256").update(prompt).digest("hex")}`;
|
|
24
|
+
}
|
|
25
|
+
function auditSafePromptPreview(digest, prompt) {
|
|
26
|
+
return `redacted:${digest.replace("sha256:", "").slice(0, 12)} chars=${prompt.length}`;
|
|
27
|
+
}
|
|
28
|
+
function inferTask(prompt) {
|
|
29
|
+
const normalized = prompt.toLowerCase();
|
|
30
|
+
let kind = "other";
|
|
31
|
+
if (/\b(review|pr|diff|audit)\b/.test(normalized)) {
|
|
32
|
+
kind = "review";
|
|
33
|
+
}
|
|
34
|
+
else if (/\b(plan|spec|roadmap|design)\b/.test(normalized)) {
|
|
35
|
+
kind = "plan";
|
|
36
|
+
}
|
|
37
|
+
else if (/\b(implement|code|fix|test|refactor|debug)\b/.test(normalized)) {
|
|
38
|
+
kind = "code";
|
|
39
|
+
}
|
|
40
|
+
else if (/\b(research|latest|look up|web)\b/.test(normalized)) {
|
|
41
|
+
kind = "research";
|
|
42
|
+
}
|
|
43
|
+
else if (/\b(image|screenshot|diagram|draw)\b/.test(normalized)) {
|
|
44
|
+
kind = "image";
|
|
45
|
+
}
|
|
46
|
+
else if (/\b(explain|summari[sz]e)\b/.test(normalized)) {
|
|
47
|
+
kind = "explain";
|
|
48
|
+
}
|
|
49
|
+
let risk = "low";
|
|
50
|
+
if (/\b(production|deploy|delete|migrate|credential|secret|payment|security|auth|database|data loss|rm -rf)\b/.test(normalized)) {
|
|
51
|
+
risk = "high";
|
|
52
|
+
}
|
|
53
|
+
else if (/\b(refactor|install|write|commit|merge|api key|profile|hook)\b/.test(normalized)) {
|
|
54
|
+
risk = "medium";
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
kind,
|
|
58
|
+
risk,
|
|
59
|
+
requiresTools: kind === "code" ||
|
|
60
|
+
kind === "review" ||
|
|
61
|
+
/\b(run|test|build|edit|write|git|shell|command)\b/.test(normalized),
|
|
62
|
+
requiresImages: kind === "image",
|
|
63
|
+
requiresJson: /\b(json|schema|structured)\b/.test(normalized),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function buildRouteRequest(payload, options) {
|
|
67
|
+
const prompt = payload.prompt;
|
|
68
|
+
const digest = promptDigest(prompt);
|
|
69
|
+
const inferredTask = inferTask(prompt);
|
|
70
|
+
return {
|
|
71
|
+
protocolVersion: ROUTE_PROTOCOL_VERSION,
|
|
72
|
+
requestId: `claude_hook_${digest.replace("sha256:", "").slice(0, 12)}`,
|
|
73
|
+
harness: {
|
|
74
|
+
kind: "claude",
|
|
75
|
+
profile: options.profile,
|
|
76
|
+
},
|
|
77
|
+
task: {
|
|
78
|
+
...inferredTask,
|
|
79
|
+
promptPreview: auditSafePromptPreview(digest, prompt),
|
|
80
|
+
promptDigest: digest,
|
|
81
|
+
},
|
|
82
|
+
workspace: {
|
|
83
|
+
cwd: payload.cwd ?? process.cwd(),
|
|
84
|
+
trusted: options.trustedWorkspace === true,
|
|
85
|
+
},
|
|
86
|
+
constraints: {
|
|
87
|
+
subscriptionFirst: options.routeConstraints?.subscriptionFirst ?? true,
|
|
88
|
+
allowApiKeyFallback: options.routeConstraints?.allowApiKeyFallback ?? false,
|
|
89
|
+
maxCostUsd: options.routeConstraints?.maxCostUsd,
|
|
90
|
+
localOnly: options.routeConstraints?.localOnly,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function formatAllowedContext(decision) {
|
|
95
|
+
const lines = [HONESTY_SENTENCE];
|
|
96
|
+
if (decision.route) {
|
|
97
|
+
lines.push(`OffRouter recommended delegated route ${decision.route.provider}/${decision.route.model} (${decision.route.authTier}).`);
|
|
98
|
+
lines.push(`Reason: ${decision.reason}. ${decision.explanation}`.trim());
|
|
99
|
+
}
|
|
100
|
+
else if (decision.needsConfiguration) {
|
|
101
|
+
lines.push("OffRouter needs configuration before it can select a delegated route.");
|
|
102
|
+
lines.push(decision.explanation);
|
|
103
|
+
}
|
|
104
|
+
else if (decision.blocked) {
|
|
105
|
+
// Profile denials are surfaced as decision:block by the caller; other
|
|
106
|
+
// blocked outcomes still provide context rather than claiming primary
|
|
107
|
+
// model substitution.
|
|
108
|
+
lines.push(`OffRouter could not select a delegated route (${decision.reason}).`);
|
|
109
|
+
lines.push(decision.explanation);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
lines.push("OffRouter could not select a delegated route.");
|
|
113
|
+
}
|
|
114
|
+
// Never include raw prompt text; decision fields are already audit-safe.
|
|
115
|
+
return lines.filter(Boolean).join("\n");
|
|
116
|
+
}
|
|
117
|
+
function invalidHookOutput(detail) {
|
|
118
|
+
const reason = detail
|
|
119
|
+
? `Invalid Claude hook JSON: ${detail}`
|
|
120
|
+
: "Invalid Claude hook JSON";
|
|
121
|
+
return {
|
|
122
|
+
decision: "block",
|
|
123
|
+
reason,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function isProfileDenial(decision) {
|
|
127
|
+
return (decision.blocked === true &&
|
|
128
|
+
(decision.policyDenials ?? []).some((d) => d.code === "work_profile_denied" ||
|
|
129
|
+
d.code === "profile_not_allowlisted"));
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Pure UserPromptSubmit handler used by tests and the stdio runner.
|
|
133
|
+
*/
|
|
134
|
+
export function handleUserPromptSubmit(input, options) {
|
|
135
|
+
const parsed = ClaudeUserPromptSubmitSchema.safeParse(input);
|
|
136
|
+
if (!parsed.success) {
|
|
137
|
+
return invalidHookOutput("payload did not match UserPromptSubmit schema");
|
|
138
|
+
}
|
|
139
|
+
const request = buildRouteRequest(parsed.data, options);
|
|
140
|
+
const decision = routeRequest(request, options.candidates, options.policy);
|
|
141
|
+
// Denied / disallowed profiles block closed at the hook boundary.
|
|
142
|
+
if (isProfileDenial(decision)) {
|
|
143
|
+
const denial = (decision.policyDenials ?? []).find((d) => d.code === "work_profile_denied" ||
|
|
144
|
+
d.code === "profile_not_allowlisted");
|
|
145
|
+
return {
|
|
146
|
+
decision: "block",
|
|
147
|
+
reason: denial?.message ??
|
|
148
|
+
`Profile ${options.profile} is denied by OffRouter policy.`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
hookSpecificOutput: {
|
|
153
|
+
hookEventName: "UserPromptSubmit",
|
|
154
|
+
additionalContext: formatAllowedContext(decision),
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Stdio-style runner: parse stdin JSON, handle, emit a single JSON object on
|
|
160
|
+
* stdout. Always exit 0 so Claude receives structured block/allow decisions.
|
|
161
|
+
*/
|
|
162
|
+
export async function runUserPromptSubmitHook(stdin, options) {
|
|
163
|
+
let output;
|
|
164
|
+
try {
|
|
165
|
+
const raw = JSON.parse(stdin);
|
|
166
|
+
output = handleUserPromptSubmit(raw, options);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
output = invalidHookOutput();
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
exitCode: 0,
|
|
173
|
+
stdout: JSON.stringify(output),
|
|
174
|
+
stderr: "",
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=user-prompt-submit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt-submit.js","sourceRoot":"","sources":["../../src/hooks/user-prompt-submit.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* offrouter-adapter-claude public surface.
|
|
3
|
+
* Hook handlers for Claude Code personal profiles.
|
|
4
|
+
*/
|
|
5
|
+
export declare const ADAPTER_CLAUDE_PACKAGE: "offrouter-adapter-claude";
|
|
6
|
+
export { handleUserPromptSubmit, runUserPromptSubmitHook, } from "./hooks/user-prompt-submit.js";
|
|
7
|
+
export type { ClaudeUserPromptSubmitPayload, HookRunResult, UserPromptSubmitHookOutput, UserPromptSubmitOptions, } from "./hooks/user-prompt-submit.js";
|
|
8
|
+
export { handlePreToolUse } from "./hooks/pre-tool-use.js";
|
|
9
|
+
export type { PreToolUseHookOutput } from "./hooks/pre-tool-use.js";
|
|
10
|
+
export { CLAUDE_INSTALL_STATE_REL, ClaudeInstallStateSchema, defaultPluginSourceDir, evaluateInstallProfilePolicy, formatInstallDiffText, installClaudeProfile, INSTALLED_PLUGIN_REL, isClaudeHarnessProfile, isSafeProfileId, isWorkLikeProfile, listAllowlistedPersonalClaudeProfiles, resolveClaudeProfileDir, } from "./install.js";
|
|
11
|
+
export type { ClaudeInstallOptions, ClaudeInstallResult, ClaudeInstallState, InstallChangeKind, InstallFileChange, ResolveClaudeProfileDirOptions, } from "./install.js";
|
|
12
|
+
export { rollbackClaudeProfile } from "./rollback.js";
|
|
13
|
+
export type { ClaudeRollbackOptions, ClaudeRollbackResult, } from "./rollback.js";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,sBAAsB,EAAG,0BAAmC,CAAC;AAE1E,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,6BAA6B,EAC7B,aAAa,EACb,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,qCAAqC,EACrC,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,8BAA8B,GAC/B,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* offrouter-adapter-claude public surface.
|
|
3
|
+
* Hook handlers for Claude Code personal profiles.
|
|
4
|
+
*/
|
|
5
|
+
export const ADAPTER_CLAUDE_PACKAGE = "offrouter-adapter-claude";
|
|
6
|
+
export { handleUserPromptSubmit, runUserPromptSubmitHook, } from "./hooks/user-prompt-submit.js";
|
|
7
|
+
export { handlePreToolUse } from "./hooks/pre-tool-use.js";
|
|
8
|
+
export { CLAUDE_INSTALL_STATE_REL, ClaudeInstallStateSchema, defaultPluginSourceDir, evaluateInstallProfilePolicy, formatInstallDiffText, installClaudeProfile, INSTALLED_PLUGIN_REL, isClaudeHarnessProfile, isSafeProfileId, isWorkLikeProfile, listAllowlistedPersonalClaudeProfiles, resolveClaudeProfileDir, } from "./install.js";
|
|
9
|
+
export { rollbackClaudeProfile } from "./rollback.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAAmC,CAAC;AAE1E,OAAO,EACL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,+BAA+B,CAAC;AAQvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,qCAAqC,EACrC,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAUtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { type OffRouterConfig, type PolicyDenialCode } from "offrouter-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
export declare const CLAUDE_INSTALL_STATE_REL: ".offrouter/claude-install-state.json";
|
|
4
|
+
export declare const INSTALLED_PLUGIN_REL: "skills/offrouter";
|
|
5
|
+
export declare const ClaudeInstallStateSchema: z.ZodObject<{
|
|
6
|
+
version: z.ZodLiteral<1>;
|
|
7
|
+
profile: z.ZodString;
|
|
8
|
+
harness: z.ZodLiteral<"claude">;
|
|
9
|
+
installedAt: z.ZodString;
|
|
10
|
+
pluginRootRelative: z.ZodString;
|
|
11
|
+
files: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
12
|
+
previous: z.ZodNullable<z.ZodString>;
|
|
13
|
+
hash: z.ZodOptional<z.ZodString>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
previous: string | null;
|
|
16
|
+
hash?: string | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
previous: string | null;
|
|
19
|
+
hash?: string | undefined;
|
|
20
|
+
}>>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
version: 1;
|
|
23
|
+
profile: string;
|
|
24
|
+
harness: "claude";
|
|
25
|
+
installedAt: string;
|
|
26
|
+
pluginRootRelative: string;
|
|
27
|
+
files: Record<string, {
|
|
28
|
+
previous: string | null;
|
|
29
|
+
hash?: string | undefined;
|
|
30
|
+
}>;
|
|
31
|
+
}, {
|
|
32
|
+
version: 1;
|
|
33
|
+
profile: string;
|
|
34
|
+
harness: "claude";
|
|
35
|
+
installedAt: string;
|
|
36
|
+
pluginRootRelative: string;
|
|
37
|
+
files: Record<string, {
|
|
38
|
+
previous: string | null;
|
|
39
|
+
hash?: string | undefined;
|
|
40
|
+
}>;
|
|
41
|
+
}>;
|
|
42
|
+
export type ClaudeInstallState = z.infer<typeof ClaudeInstallStateSchema>;
|
|
43
|
+
export type InstallChangeKind = "create" | "update" | "unchanged" | "remove";
|
|
44
|
+
export interface InstallFileChange {
|
|
45
|
+
path: string;
|
|
46
|
+
relativePath: string;
|
|
47
|
+
kind: InstallChangeKind;
|
|
48
|
+
/** Diff-like summary line for human output. */
|
|
49
|
+
summary: string;
|
|
50
|
+
}
|
|
51
|
+
export interface ClaudeInstallOptions {
|
|
52
|
+
profile: string;
|
|
53
|
+
config: OffRouterConfig;
|
|
54
|
+
env?: NodeJS.ProcessEnv;
|
|
55
|
+
homedir?: () => string;
|
|
56
|
+
dryRun?: boolean;
|
|
57
|
+
/** Override source plugin directory (tests). Defaults to repo plugins/claude-offrouter. */
|
|
58
|
+
pluginSourceDir?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface ClaudeInstallResult {
|
|
61
|
+
ok: boolean;
|
|
62
|
+
dryRun: boolean;
|
|
63
|
+
profile: string;
|
|
64
|
+
profileDir: string;
|
|
65
|
+
changes: InstallFileChange[];
|
|
66
|
+
message: string;
|
|
67
|
+
errorCode?: PolicyDenialCode | "install_error";
|
|
68
|
+
statePath?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface ResolveClaudeProfileDirOptions {
|
|
71
|
+
env?: NodeJS.ProcessEnv;
|
|
72
|
+
homedir?: () => string;
|
|
73
|
+
}
|
|
74
|
+
export declare function isSafeProfileId(profile: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Resolve the on-disk Claude profile directory for a OffRouter profile id.
|
|
77
|
+
*
|
|
78
|
+
* - When OFFROUTER_CLAUDE_PROFILES_DIR is set: $DIR/<profile>
|
|
79
|
+
* - profile id `claude` -> ~/.claude (the only path that may touch global Claude)
|
|
80
|
+
* - otherwise -> ~/.<profile> (e.g. claude-personal -> ~/.claude-personal)
|
|
81
|
+
*/
|
|
82
|
+
export declare function resolveClaudeProfileDir(profile: string, options?: ResolveClaudeProfileDirOptions): string;
|
|
83
|
+
/**
|
|
84
|
+
* Personal Claude profiles only: id starts with "claude" or is exactly "claude",
|
|
85
|
+
* not a work profile by default pattern.
|
|
86
|
+
*/
|
|
87
|
+
export declare function isClaudeHarnessProfile(profile: string): boolean;
|
|
88
|
+
export declare function isWorkLikeProfile(profile: string): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Allowlisted personal Claude profiles eligible for install --all-personal.
|
|
91
|
+
*/
|
|
92
|
+
export declare function listAllowlistedPersonalClaudeProfiles(config: OffRouterConfig): string[];
|
|
93
|
+
/**
|
|
94
|
+
* Default plugin source: monorepo plugins/claude-offrouter relative to this package.
|
|
95
|
+
*/
|
|
96
|
+
export declare function defaultPluginSourceDir(): string;
|
|
97
|
+
/**
|
|
98
|
+
* Use routeRequest with empty candidates so work/unallowlisted profile denials
|
|
99
|
+
* reuse the same core policy codes users see from route explain / hooks.
|
|
100
|
+
*/
|
|
101
|
+
export declare function evaluateInstallProfilePolicy(profile: string, config: OffRouterConfig): {
|
|
102
|
+
allowed: boolean;
|
|
103
|
+
errorCode?: PolicyDenialCode;
|
|
104
|
+
message?: string;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* Install the OffRouter Claude plugin into a single profile directory.
|
|
108
|
+
*/
|
|
109
|
+
export declare function installClaudeProfile(options: ClaudeInstallOptions): Promise<ClaudeInstallResult>;
|
|
110
|
+
/**
|
|
111
|
+
* Human-readable diff-like text for an install/uninstall result matrix.
|
|
112
|
+
*/
|
|
113
|
+
export declare function formatInstallDiffText(results: ClaudeInstallResult[], headline?: string): string;
|
|
114
|
+
/** Copy helper retained for future link-mode installs. */
|
|
115
|
+
export declare function copyPluginFile(source: string, dest: string): Promise<void>;
|
|
116
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAsBA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAEtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB,EACnC,sCAA+C,CAAC;AAElD,eAAO,MAAM,oBAAoB,EAAG,kBAA2B,CAAC;AAOhE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnC,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAE1E,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE7E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,iBAAiB,CAAC;IACxB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,eAAe,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2FAA2F;IAC3F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;CACxB;AAKD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAExD;AAUD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,8BAAmC,GAC3C,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,eAAe,GACtB,MAAM,EAAE,CAaV;AAkDD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAI/C;AAqBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,GACtB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAuCtE;AAsED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA6L9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,mBAAmB,EAAE,EAC9B,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CA4BR;AAED,0DAA0D;AAC1D,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAGf"}
|