factory-factory 0.1.2 → 0.1.4
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/dist/client/assets/{_basePickBy-DlAy2gPt.js → _basePickBy-BfkcpkDt.js} +1 -1
- package/dist/client/assets/{_baseUniq-CPsiGaG0.js → _baseUniq-D_Jw298d.js} +1 -1
- package/dist/client/assets/{arc-1JZNjpJ_.js → arc--NK6Lv-6.js} +1 -1
- package/dist/client/assets/{architectureDiagram-VXUJARFQ-CQPIcyoO.js → architectureDiagram-VXUJARFQ-2FN12b81.js} +1 -1
- package/dist/client/assets/{blockDiagram-VD42YOAC-MmcBB068.js → blockDiagram-VD42YOAC-BR0DePXf.js} +1 -1
- package/dist/client/assets/{c4Diagram-YG6GDRKO-rLEwaSli.js → c4Diagram-YG6GDRKO-CdZ1W1J8.js} +1 -1
- package/dist/client/assets/channel-CWwf6EWM.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-BpP3xHzh.js → chunk-4BX2VUAB-DFtrC-95.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-bhNSTzRt.js → chunk-55IACEB6-B8yEQkiz.js} +1 -1
- package/dist/client/assets/{chunk-B4BG7PRW-C0Ij7L-8.js → chunk-B4BG7PRW-CXxn0vQT.js} +1 -1
- package/dist/client/assets/{chunk-DI55MBZ5-BlzMN1zE.js → chunk-DI55MBZ5-B9BwI511.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-C8tat_tr.js → chunk-FMBD7UC4-uWA6QAjR.js} +1 -1
- package/dist/client/assets/{chunk-QN33PNHL-Dny9DeCO.js → chunk-QN33PNHL-hbS33Gxf.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-DQ2zbmnL.js → chunk-QZHKN3VN-BgEZOIiV.js} +1 -1
- package/dist/client/assets/{chunk-TZMSLE5B-BjcTEJG5.js → chunk-TZMSLE5B-CPZC4T1D.js} +1 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-D6t6-UGx.js +1 -0
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-D6t6-UGx.js +1 -0
- package/dist/client/assets/clone-C2myIo1k.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-fICTsOTb.js → cose-bilkent-S5V4N54A-C1m-OXuQ.js} +1 -1
- package/dist/client/assets/{dagre-6UL2VRFP-DobOTWu6.js → dagre-6UL2VRFP-CTIRZvSK.js} +1 -1
- package/dist/client/assets/{diagram-PSM6KHXK-DBWTqTcE.js → diagram-PSM6KHXK-BAneBOeM.js} +1 -1
- package/dist/client/assets/{diagram-QEK2KX5R-qi6alECI.js → diagram-QEK2KX5R-C6X9MF0x.js} +1 -1
- package/dist/client/assets/{diagram-S2PKOQOG-D5EcU6AG.js → diagram-S2PKOQOG-BM9QHRm6.js} +1 -1
- package/dist/client/assets/{erDiagram-Q2GNP2WA-Dih4JIt2.js → erDiagram-Q2GNP2WA-hHyIcMsq.js} +1 -1
- package/dist/client/assets/{flowDiagram-NV44I4VS-CuDCTnxh.js → flowDiagram-NV44I4VS-xQ3Zw9iq.js} +1 -1
- package/dist/client/assets/{ganttDiagram-JELNMOA3-CPzDHErk.js → ganttDiagram-JELNMOA3-BWf8m_5c.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-NY62KEGX-Cv1AvbyZ.js → gitGraphDiagram-NY62KEGX-BJyKp7ph.js} +1 -1
- package/dist/client/assets/{graph-Cc4gWRmw.js → graph-C2MjKvS2.js} +1 -1
- package/dist/client/assets/index-8pJrtQCo.css +1 -0
- package/dist/client/assets/{index-5MJv0jou.js → index-ByYpjY6f.js} +130 -130
- package/dist/client/assets/{infoDiagram-WHAUD3N6-Btdw0Tyi.js → infoDiagram-WHAUD3N6-DKyVppde.js} +1 -1
- package/dist/client/assets/{journeyDiagram-XKPGCS4Q-DVUAsZwf.js → journeyDiagram-XKPGCS4Q-BsRhXWyy.js} +1 -1
- package/dist/client/assets/{kanban-definition-3W4ZIXB7-CpcsqtK2.js → kanban-definition-3W4ZIXB7-DmGMIBzh.js} +1 -1
- package/dist/client/assets/{layout-yaIlj2KI.js → layout-BuXhP2oy.js} +1 -1
- package/dist/client/assets/{linear-BJc8M4HU.js → linear-DGzKUskJ.js} +1 -1
- package/dist/client/assets/{mindmap-definition-VGOIOE7T-D6H5ND7O.js → mindmap-definition-VGOIOE7T-DfheNVdE.js} +1 -1
- package/dist/client/assets/{pieDiagram-ADFJNKIX-yVvC2gSi.js → pieDiagram-ADFJNKIX-HkgURnkF.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CgVAxGtA.js → quadrantDiagram-AYHSOK5B-BxdUp1Jb.js} +1 -1
- package/dist/client/assets/{requirementDiagram-UZGBJVZJ-GaSyCgqs.js → requirementDiagram-UZGBJVZJ-8eg1-JV8.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-TZEHDZUN-DJxErFxm.js → sankeyDiagram-TZEHDZUN-2fGautLa.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-WL72ISMW-CVYhq23p.js → sequenceDiagram-WL72ISMW-_OrMvjLv.js} +1 -1
- package/dist/client/assets/{stateDiagram-FKZM4ZOC-BWNn_HOS.js → stateDiagram-FKZM4ZOC-0IWyshyF.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DmfuLiCD.js +1 -0
- package/dist/client/assets/{terminal-instance-Zu1T5dur.js → terminal-instance-ocXLZR1-.js} +1 -1
- package/dist/client/assets/{timeline-definition-IT6M3QCI-toe2Q26C.js → timeline-definition-IT6M3QCI-xoZGxhcU.js} +1 -1
- package/dist/client/assets/{treemap-KMMF4GRG-CrSa1h0j.js → treemap-KMMF4GRG-C_2uoG3G.js} +1 -1
- package/dist/client/assets/{xychartDiagram-PRI3JC2R-Dnal04rK.js → xychartDiagram-PRI3JC2R-hF-OwQo_.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/sounds/workspace-complete.mp3 +0 -0
- package/dist/src/backend/claude/index.d.ts +29 -1
- package/dist/src/backend/claude/index.d.ts.map +1 -1
- package/dist/src/backend/claude/index.js +100 -2
- package/dist/src/backend/claude/index.js.map +1 -1
- package/dist/src/backend/claude/permissions.d.ts +1 -0
- package/dist/src/backend/claude/permissions.d.ts.map +1 -1
- package/dist/src/backend/claude/permissions.js +15 -2
- package/dist/src/backend/claude/permissions.js.map +1 -1
- package/dist/src/backend/claude/protocol.d.ts +5 -1
- package/dist/src/backend/claude/protocol.d.ts.map +1 -1
- package/dist/src/backend/claude/protocol.js +29 -1
- package/dist/src/backend/claude/protocol.js.map +1 -1
- package/dist/src/backend/claude/session.d.ts +0 -1
- package/dist/src/backend/claude/session.d.ts.map +1 -1
- package/dist/src/backend/claude/session.js +0 -58
- package/dist/src/backend/claude/session.js.map +1 -1
- package/dist/src/backend/claude/types.d.ts +108 -6
- package/dist/src/backend/claude/types.d.ts.map +1 -1
- package/dist/src/backend/claude/types.js +27 -0
- package/dist/src/backend/claude/types.js.map +1 -1
- package/dist/src/backend/claude/types.test.js +108 -1
- package/dist/src/backend/claude/types.test.js.map +1 -1
- package/dist/src/backend/interceptors/branch-rename.interceptor.d.ts.map +1 -1
- package/dist/src/backend/interceptors/branch-rename.interceptor.js +3 -2
- package/dist/src/backend/interceptors/branch-rename.interceptor.js.map +1 -1
- package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts.map +1 -1
- package/dist/src/backend/interceptors/pr-detection.interceptor.js +2 -1
- package/dist/src/backend/interceptors/pr-detection.interceptor.js.map +1 -1
- package/dist/src/backend/lib/git-helpers.js +1 -1
- package/dist/src/backend/lib/git-helpers.js.map +1 -1
- package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
- package/dist/src/backend/routers/websocket/chat.handler.js +1 -0
- package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
- package/dist/src/backend/schemas/tool-inputs.schema.d.ts +88 -0
- package/dist/src/backend/schemas/tool-inputs.schema.d.ts.map +1 -0
- package/dist/src/backend/schemas/tool-inputs.schema.js +89 -0
- package/dist/src/backend/schemas/tool-inputs.schema.js.map +1 -0
- package/dist/src/backend/schemas/tool-inputs.schema.test.d.ts +2 -0
- package/dist/src/backend/schemas/tool-inputs.schema.test.d.ts.map +1 -0
- package/dist/src/backend/schemas/tool-inputs.schema.test.js +402 -0
- package/dist/src/backend/schemas/tool-inputs.schema.test.js.map +1 -0
- package/dist/src/backend/schemas/websocket/chat-message.schema.d.ts +12 -0
- package/dist/src/backend/schemas/websocket/chat-message.schema.d.ts.map +1 -1
- package/dist/src/backend/schemas/websocket/chat-message.schema.js +8 -0
- package/dist/src/backend/schemas/websocket/chat-message.schema.js.map +1 -1
- package/dist/src/backend/schemas/websocket/index.d.ts +1 -1
- package/dist/src/backend/schemas/websocket/index.d.ts.map +1 -1
- package/dist/src/backend/schemas/websocket/index.js.map +1 -1
- package/dist/src/backend/server.js +1 -2
- package/dist/src/backend/server.js.map +1 -1
- package/dist/src/backend/services/chat-event-forwarder.service.d.ts +3 -0
- package/dist/src/backend/services/chat-event-forwarder.service.d.ts.map +1 -1
- package/dist/src/backend/services/chat-event-forwarder.service.js +253 -11
- package/dist/src/backend/services/chat-event-forwarder.service.js.map +1 -1
- package/dist/src/backend/services/chat-message-handlers.service.d.ts +3 -0
- package/dist/src/backend/services/chat-message-handlers.service.d.ts.map +1 -1
- package/dist/src/backend/services/chat-message-handlers.service.js +109 -18
- package/dist/src/backend/services/chat-message-handlers.service.js.map +1 -1
- package/dist/src/backend/services/config.service.d.ts +5 -0
- package/dist/src/backend/services/config.service.d.ts.map +1 -1
- package/dist/src/backend/services/config.service.js +6 -0
- package/dist/src/backend/services/config.service.js.map +1 -1
- package/dist/src/backend/services/event-compression.service.d.ts +36 -0
- package/dist/src/backend/services/event-compression.service.d.ts.map +1 -0
- package/dist/src/backend/services/event-compression.service.js +232 -0
- package/dist/src/backend/services/event-compression.service.js.map +1 -0
- package/dist/src/backend/services/event-compression.service.test.d.ts +2 -0
- package/dist/src/backend/services/event-compression.service.test.d.ts.map +1 -0
- package/dist/src/backend/services/event-compression.service.test.js +336 -0
- package/dist/src/backend/services/event-compression.service.test.js.map +1 -0
- package/dist/src/backend/services/index.d.ts +1 -0
- package/dist/src/backend/services/index.d.ts.map +1 -1
- package/dist/src/backend/services/index.js +1 -0
- package/dist/src/backend/services/index.js.map +1 -1
- package/dist/src/backend/services/message-state.service.d.ts +3 -0
- package/dist/src/backend/services/message-state.service.d.ts.map +1 -1
- package/dist/src/backend/services/message-state.service.js +24 -1
- package/dist/src/backend/services/message-state.service.js.map +1 -1
- package/dist/src/backend/services/message-state.service.test.js +15 -26
- package/dist/src/backend/services/message-state.service.test.js.map +1 -1
- package/dist/src/backend/services/notification.service.d.ts +1 -0
- package/dist/src/backend/services/notification.service.d.ts.map +1 -1
- package/dist/src/backend/services/notification.service.js +6 -0
- package/dist/src/backend/services/notification.service.js.map +1 -1
- package/dist/src/backend/services/workspace-activity.service.d.ts +13 -0
- package/dist/src/backend/services/workspace-activity.service.d.ts.map +1 -0
- package/dist/src/backend/services/workspace-activity.service.js +74 -0
- package/dist/src/backend/services/workspace-activity.service.js.map +1 -0
- package/dist/src/backend/trpc/index.d.ts +25 -25
- package/dist/src/backend/trpc/project.trpc.d.ts +2 -2
- package/dist/src/backend/trpc/session.trpc.d.ts +11 -11
- package/dist/src/backend/trpc/user-settings.trpc.d.ts +1 -1
- package/dist/src/backend/trpc/workspace/init.trpc.d.ts +2 -2
- package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +3 -3
- package/dist/src/backend/trpc/workspace.trpc.d.ts +11 -11
- package/dist/src/lib/claude-types.d.ts +47 -2
- package/dist/src/lib/claude-types.d.ts.map +1 -1
- package/dist/src/lib/claude-types.js +1 -0
- package/dist/src/lib/claude-types.js.map +1 -1
- package/dist/tsconfig.backend.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/scripts/postinstall.mjs +44 -13
- package/dist/client/assets/channel-NbT5TRpd.js +0 -1
- package/dist/client/assets/classDiagram-2ON5EDUG-DsshYhcN.js +0 -1
- package/dist/client/assets/classDiagram-v2-WZHVMYZB-DsshYhcN.js +0 -1
- package/dist/client/assets/clone-Cvh2OAuU.js +0 -1
- package/dist/client/assets/index-YQ6vfX-S.css +0 -1
- package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BAVRa6EM.js +0 -1
|
@@ -82,6 +82,7 @@ export function handleChatUpgrade(request, socket, head, url, wss, wsAliveMap) {
|
|
|
82
82
|
connectionId,
|
|
83
83
|
dbSessionId,
|
|
84
84
|
});
|
|
85
|
+
chatEventForwarderService.setupWorkspaceNotifications();
|
|
85
86
|
wsAliveMap.set(ws, true);
|
|
86
87
|
ws.on('pong', () => wsAliveMap.set(ws, true));
|
|
87
88
|
if (dbSessionId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.handler.js","sourceRoot":"","sources":["../../../../../src/backend/routers/websocket/chat.handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chat.handler.js","sourceRoot":"","sources":["../../../../../src/backend/routers/websocket/chat.handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export interface ValidationLogger {
|
|
3
|
+
warn: (msg: string, ctx?: Record<string, unknown>) => void;
|
|
4
|
+
}
|
|
5
|
+
export declare const AllowedPromptSchema: z.ZodObject<{
|
|
6
|
+
tool: z.ZodString;
|
|
7
|
+
prompt: z.ZodString;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
export declare const ExitPlanModeInputSchema: z.ZodObject<{
|
|
10
|
+
plan: z.ZodOptional<z.ZodString>;
|
|
11
|
+
planFile: z.ZodOptional<z.ZodString>;
|
|
12
|
+
allowedPrompts: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
13
|
+
tool: z.ZodString;
|
|
14
|
+
prompt: z.ZodString;
|
|
15
|
+
}, z.core.$strip>>>;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export type ExitPlanModeInput = z.infer<typeof ExitPlanModeInputSchema>;
|
|
18
|
+
export declare const AskUserQuestionOptionSchema: z.ZodObject<{
|
|
19
|
+
label: z.ZodString;
|
|
20
|
+
description: z.ZodString;
|
|
21
|
+
}, z.core.$strip>;
|
|
22
|
+
export declare const AskUserQuestionItemSchema: z.ZodObject<{
|
|
23
|
+
question: z.ZodString;
|
|
24
|
+
header: z.ZodOptional<z.ZodString>;
|
|
25
|
+
options: z.ZodArray<z.ZodObject<{
|
|
26
|
+
label: z.ZodString;
|
|
27
|
+
description: z.ZodString;
|
|
28
|
+
}, z.core.$strip>>;
|
|
29
|
+
multiSelect: z.ZodOptional<z.ZodBoolean>;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export declare const AskUserQuestionInputSchema: z.ZodObject<{
|
|
32
|
+
questions: z.ZodArray<z.ZodObject<{
|
|
33
|
+
question: z.ZodString;
|
|
34
|
+
header: z.ZodOptional<z.ZodString>;
|
|
35
|
+
options: z.ZodArray<z.ZodObject<{
|
|
36
|
+
label: z.ZodString;
|
|
37
|
+
description: z.ZodString;
|
|
38
|
+
}, z.core.$strip>>;
|
|
39
|
+
multiSelect: z.ZodOptional<z.ZodBoolean>;
|
|
40
|
+
}, z.core.$strip>>;
|
|
41
|
+
}, z.core.$strip>;
|
|
42
|
+
export type AskUserQuestionInput = z.infer<typeof AskUserQuestionInputSchema>;
|
|
43
|
+
export declare const TaskToolInputSchema: z.ZodObject<{
|
|
44
|
+
subagent_type: z.ZodOptional<z.ZodString>;
|
|
45
|
+
description: z.ZodOptional<z.ZodString>;
|
|
46
|
+
prompt: z.ZodOptional<z.ZodString>;
|
|
47
|
+
model: z.ZodOptional<z.ZodString>;
|
|
48
|
+
max_turns: z.ZodOptional<z.ZodNumber>;
|
|
49
|
+
run_in_background: z.ZodOptional<z.ZodBoolean>;
|
|
50
|
+
resume: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, z.core.$strip>;
|
|
52
|
+
export type TaskToolInput = z.infer<typeof TaskToolInputSchema>;
|
|
53
|
+
export declare const CommandToolInputSchema: z.ZodObject<{
|
|
54
|
+
command: z.ZodOptional<z.ZodString>;
|
|
55
|
+
description: z.ZodOptional<z.ZodString>;
|
|
56
|
+
timeout: z.ZodOptional<z.ZodNumber>;
|
|
57
|
+
}, z.core.$strip>;
|
|
58
|
+
export type CommandToolInput = z.infer<typeof CommandToolInputSchema>;
|
|
59
|
+
export declare const HookCallbackInputSchema: z.ZodObject<{
|
|
60
|
+
session_id: z.ZodString;
|
|
61
|
+
transcript_path: z.ZodString;
|
|
62
|
+
cwd: z.ZodString;
|
|
63
|
+
permission_mode: z.ZodString;
|
|
64
|
+
hook_event_name: z.ZodString;
|
|
65
|
+
tool_name: z.ZodOptional<z.ZodString>;
|
|
66
|
+
tool_input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
67
|
+
tool_use_id: z.ZodOptional<z.ZodString>;
|
|
68
|
+
stop_hook_active: z.ZodOptional<z.ZodBoolean>;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
export type HookCallbackInput = z.infer<typeof HookCallbackInputSchema>;
|
|
71
|
+
export declare const CanUseToolInputSchema: z.ZodObject<{
|
|
72
|
+
tool_name: z.ZodOptional<z.ZodString>;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
export type CanUseToolInput = z.infer<typeof CanUseToolInputSchema>;
|
|
75
|
+
export interface ParseSuccess<T> {
|
|
76
|
+
success: true;
|
|
77
|
+
data: T;
|
|
78
|
+
}
|
|
79
|
+
export interface ParseFailure {
|
|
80
|
+
success: false;
|
|
81
|
+
data: null;
|
|
82
|
+
}
|
|
83
|
+
export type SafeParseResult<T> = ParseSuccess<T> | ParseFailure;
|
|
84
|
+
export declare function safeParseToolInput<T>(schema: z.ZodSchema<T>, input: unknown, toolName: string, logger?: ValidationLogger): SafeParseResult<T>;
|
|
85
|
+
export declare function extractInputValue<T>(input: Record<string, unknown>, key: string, typeGuard: (v: unknown) => v is T, toolName: string, logger?: ValidationLogger): T | undefined;
|
|
86
|
+
export declare function isString(v: unknown): v is string;
|
|
87
|
+
export declare function isArray(v: unknown): v is unknown[];
|
|
88
|
+
//# sourceMappingURL=tool-inputs.schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-inputs.schema.d.ts","sourceRoot":"","sources":["../../../../src/backend/schemas/tool-inputs.schema.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC5D;AASD,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAMH,eAAO,MAAM,uBAAuB;;;;;;;iBAIlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AASxE,eAAO,MAAM,2BAA2B;;;iBAGtC,CAAC;AAKH,eAAO,MAAM,yBAAyB;;;;;;;;iBAKpC,CAAC;AAKH,eAAO,MAAM,0BAA0B;;;;;;;;;;iBAErC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAS9E,eAAO,MAAM,mBAAmB;;;;;;;;iBAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAShE,eAAO,MAAM,sBAAsB;;;;iBAIjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAStE,eAAO,MAAM,uBAAuB;;;;;;;;;;iBAUlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AASxE,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AASpE,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;CACT;AAKD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;CACZ;AAKD,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;AAWhE,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,gBAAgB,GACxB,eAAe,CAAC,CAAC,CAAC,CAapB;AAYD,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EACjC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,gBAAgB,GACxB,CAAC,GAAG,SAAS,CAgBf;AAKD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAEhD;AAKD,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,OAAO,EAAE,CAElD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const AllowedPromptSchema = z.object({
|
|
3
|
+
tool: z.string(),
|
|
4
|
+
prompt: z.string(),
|
|
5
|
+
});
|
|
6
|
+
export const ExitPlanModeInputSchema = z.object({
|
|
7
|
+
plan: z.string().optional(),
|
|
8
|
+
planFile: z.string().optional(),
|
|
9
|
+
allowedPrompts: z.array(AllowedPromptSchema).optional(),
|
|
10
|
+
});
|
|
11
|
+
export const AskUserQuestionOptionSchema = z.object({
|
|
12
|
+
label: z.string(),
|
|
13
|
+
description: z.string(),
|
|
14
|
+
});
|
|
15
|
+
export const AskUserQuestionItemSchema = z.object({
|
|
16
|
+
question: z.string(),
|
|
17
|
+
header: z.string().optional(),
|
|
18
|
+
options: z.array(AskUserQuestionOptionSchema),
|
|
19
|
+
multiSelect: z.boolean().optional(),
|
|
20
|
+
});
|
|
21
|
+
export const AskUserQuestionInputSchema = z.object({
|
|
22
|
+
questions: z.array(AskUserQuestionItemSchema),
|
|
23
|
+
});
|
|
24
|
+
export const TaskToolInputSchema = z.object({
|
|
25
|
+
subagent_type: z.string().optional(),
|
|
26
|
+
description: z.string().optional(),
|
|
27
|
+
prompt: z.string().optional(),
|
|
28
|
+
model: z.string().optional(),
|
|
29
|
+
max_turns: z.number().optional(),
|
|
30
|
+
run_in_background: z.boolean().optional(),
|
|
31
|
+
resume: z.string().optional(),
|
|
32
|
+
});
|
|
33
|
+
export const CommandToolInputSchema = z.object({
|
|
34
|
+
command: z.string().optional(),
|
|
35
|
+
description: z.string().optional(),
|
|
36
|
+
timeout: z.number().optional(),
|
|
37
|
+
});
|
|
38
|
+
export const HookCallbackInputSchema = z.object({
|
|
39
|
+
session_id: z.string(),
|
|
40
|
+
transcript_path: z.string(),
|
|
41
|
+
cwd: z.string(),
|
|
42
|
+
permission_mode: z.string(),
|
|
43
|
+
hook_event_name: z.string(),
|
|
44
|
+
tool_name: z.string().optional(),
|
|
45
|
+
tool_input: z.record(z.string(), z.unknown()).optional(),
|
|
46
|
+
tool_use_id: z.string().optional(),
|
|
47
|
+
stop_hook_active: z.boolean().optional(),
|
|
48
|
+
});
|
|
49
|
+
export const CanUseToolInputSchema = z.object({
|
|
50
|
+
tool_name: z.string().optional(),
|
|
51
|
+
});
|
|
52
|
+
export function safeParseToolInput(schema, input, toolName, logger) {
|
|
53
|
+
const result = schema.safeParse(input);
|
|
54
|
+
if (!result.success) {
|
|
55
|
+
if (logger) {
|
|
56
|
+
logger.warn(`[Tool Input] ${toolName} input validation failed`, {
|
|
57
|
+
toolName,
|
|
58
|
+
errors: result.error.issues.map((i) => ({ path: i.path, message: i.message })),
|
|
59
|
+
inputKeys: input && typeof input === 'object' ? Object.keys(input) : [],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return { success: false, data: null };
|
|
63
|
+
}
|
|
64
|
+
return { success: true, data: result.data };
|
|
65
|
+
}
|
|
66
|
+
export function extractInputValue(input, key, typeGuard, toolName, logger) {
|
|
67
|
+
if (!(key in input)) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const value = input[key];
|
|
71
|
+
if (!typeGuard(value)) {
|
|
72
|
+
if (logger) {
|
|
73
|
+
logger.warn(`[Tool Input] ${toolName}.${key} has unexpected type`, {
|
|
74
|
+
toolName,
|
|
75
|
+
key,
|
|
76
|
+
actualType: typeof value,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return value;
|
|
82
|
+
}
|
|
83
|
+
export function isString(v) {
|
|
84
|
+
return typeof v === 'string';
|
|
85
|
+
}
|
|
86
|
+
export function isArray(v) {
|
|
87
|
+
return Array.isArray(v);
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=tool-inputs.schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-inputs.schema.js","sourceRoot":"","sources":["../../../../src/backend/schemas/tool-inputs.schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-inputs.schema.test.d.ts","sourceRoot":"","sources":["../../../../src/backend/schemas/tool-inputs.schema.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { AskUserQuestionInputSchema, CommandToolInputSchema, ExitPlanModeInputSchema, extractInputValue, HookCallbackInputSchema, isArray, isString, safeParseToolInput, TaskToolInputSchema, } from './tool-inputs.schema.js';
|
|
3
|
+
describe('ExitPlanModeInputSchema', () => {
|
|
4
|
+
it('accepts inline plan content (SDK format)', () => {
|
|
5
|
+
const input = {
|
|
6
|
+
plan: '# My Plan\n\n## Steps\n1. Do this\n2. Do that',
|
|
7
|
+
allowedPrompts: [{ tool: 'Bash', prompt: 'run tests' }],
|
|
8
|
+
};
|
|
9
|
+
const result = ExitPlanModeInputSchema.safeParse(input);
|
|
10
|
+
expect(result.success).toBe(true);
|
|
11
|
+
if (result.success) {
|
|
12
|
+
expect(result.data.plan).toBe('# My Plan\n\n## Steps\n1. Do this\n2. Do that');
|
|
13
|
+
expect(result.data.planFile).toBeUndefined();
|
|
14
|
+
expect(result.data.allowedPrompts).toHaveLength(1);
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
it('accepts planFile path (CLI format)', () => {
|
|
18
|
+
const input = {
|
|
19
|
+
planFile: '/Users/dev/.claude/plans/example.md',
|
|
20
|
+
allowedPrompts: [{ tool: 'Bash', prompt: 'install dependencies' }],
|
|
21
|
+
};
|
|
22
|
+
const result = ExitPlanModeInputSchema.safeParse(input);
|
|
23
|
+
expect(result.success).toBe(true);
|
|
24
|
+
if (result.success) {
|
|
25
|
+
expect(result.data.planFile).toBe('/Users/dev/.claude/plans/example.md');
|
|
26
|
+
expect(result.data.plan).toBeUndefined();
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
it('accepts both plan and planFile (edge case)', () => {
|
|
30
|
+
const input = {
|
|
31
|
+
plan: 'inline content',
|
|
32
|
+
planFile: '/path/to/file.md',
|
|
33
|
+
};
|
|
34
|
+
const result = ExitPlanModeInputSchema.safeParse(input);
|
|
35
|
+
expect(result.success).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('accepts empty input', () => {
|
|
38
|
+
const result = ExitPlanModeInputSchema.safeParse({});
|
|
39
|
+
expect(result.success).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
it('accepts allowedPrompts without plan content', () => {
|
|
42
|
+
const input = {
|
|
43
|
+
allowedPrompts: [
|
|
44
|
+
{ tool: 'Bash', prompt: 'run tests' },
|
|
45
|
+
{ tool: 'Bash', prompt: 'build project' },
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
const result = ExitPlanModeInputSchema.safeParse(input);
|
|
49
|
+
expect(result.success).toBe(true);
|
|
50
|
+
if (result.success) {
|
|
51
|
+
expect(result.data.allowedPrompts).toHaveLength(2);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
it('rejects invalid allowedPrompts structure', () => {
|
|
55
|
+
const input = {
|
|
56
|
+
plan: 'content',
|
|
57
|
+
allowedPrompts: [{ invalidKey: 'value' }],
|
|
58
|
+
};
|
|
59
|
+
const result = ExitPlanModeInputSchema.safeParse(input);
|
|
60
|
+
expect(result.success).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('AskUserQuestionInputSchema', () => {
|
|
64
|
+
it('validates questions array', () => {
|
|
65
|
+
const input = {
|
|
66
|
+
questions: [
|
|
67
|
+
{
|
|
68
|
+
question: 'Which framework do you prefer?',
|
|
69
|
+
header: 'Framework',
|
|
70
|
+
options: [
|
|
71
|
+
{ label: 'React', description: 'Popular UI library' },
|
|
72
|
+
{ label: 'Vue', description: 'Progressive framework' },
|
|
73
|
+
],
|
|
74
|
+
multiSelect: false,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
const result = AskUserQuestionInputSchema.safeParse(input);
|
|
79
|
+
expect(result.success).toBe(true);
|
|
80
|
+
if (result.success) {
|
|
81
|
+
expect(result.data.questions).toHaveLength(1);
|
|
82
|
+
expect(result.data.questions[0].question).toBe('Which framework do you prefer?');
|
|
83
|
+
expect(result.data.questions[0].options).toHaveLength(2);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
it('requires label and description on options', () => {
|
|
87
|
+
const input = {
|
|
88
|
+
questions: [
|
|
89
|
+
{
|
|
90
|
+
question: 'Test?',
|
|
91
|
+
options: [{ label: 'Option 1' }],
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
const result = AskUserQuestionInputSchema.safeParse(input);
|
|
96
|
+
expect(result.success).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
it('accepts questions without optional fields', () => {
|
|
99
|
+
const input = {
|
|
100
|
+
questions: [
|
|
101
|
+
{
|
|
102
|
+
question: 'Choose one:',
|
|
103
|
+
options: [
|
|
104
|
+
{ label: 'A', description: 'First option' },
|
|
105
|
+
{ label: 'B', description: 'Second option' },
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
const result = AskUserQuestionInputSchema.safeParse(input);
|
|
111
|
+
expect(result.success).toBe(true);
|
|
112
|
+
if (result.success) {
|
|
113
|
+
expect(result.data.questions[0].header).toBeUndefined();
|
|
114
|
+
expect(result.data.questions[0].multiSelect).toBeUndefined();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
it('accepts multiple questions', () => {
|
|
118
|
+
const input = {
|
|
119
|
+
questions: [
|
|
120
|
+
{
|
|
121
|
+
question: 'First question?',
|
|
122
|
+
options: [{ label: 'Yes', description: 'Affirmative' }],
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
question: 'Second question?',
|
|
126
|
+
options: [{ label: 'No', description: 'Negative' }],
|
|
127
|
+
multiSelect: true,
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
const result = AskUserQuestionInputSchema.safeParse(input);
|
|
132
|
+
expect(result.success).toBe(true);
|
|
133
|
+
if (result.success) {
|
|
134
|
+
expect(result.data.questions).toHaveLength(2);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
it('rejects missing questions array', () => {
|
|
138
|
+
const result = AskUserQuestionInputSchema.safeParse({});
|
|
139
|
+
expect(result.success).toBe(false);
|
|
140
|
+
});
|
|
141
|
+
it('accepts empty questions array (validation passes, but callers should check length)', () => {
|
|
142
|
+
const result = AskUserQuestionInputSchema.safeParse({ questions: [] });
|
|
143
|
+
expect(result.success).toBe(true);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('TaskToolInputSchema', () => {
|
|
147
|
+
it('accepts full task input', () => {
|
|
148
|
+
const input = {
|
|
149
|
+
subagent_type: 'Explore',
|
|
150
|
+
description: 'Find all test files',
|
|
151
|
+
prompt: 'Search for test files in the codebase',
|
|
152
|
+
model: 'sonnet',
|
|
153
|
+
max_turns: 10,
|
|
154
|
+
run_in_background: true,
|
|
155
|
+
resume: 'agent-123',
|
|
156
|
+
};
|
|
157
|
+
const result = TaskToolInputSchema.safeParse(input);
|
|
158
|
+
expect(result.success).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
it('accepts minimal task input', () => {
|
|
161
|
+
const result = TaskToolInputSchema.safeParse({});
|
|
162
|
+
expect(result.success).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
it('accepts partial task input', () => {
|
|
165
|
+
const input = {
|
|
166
|
+
subagent_type: 'Plan',
|
|
167
|
+
prompt: 'Plan the implementation',
|
|
168
|
+
};
|
|
169
|
+
const result = TaskToolInputSchema.safeParse(input);
|
|
170
|
+
expect(result.success).toBe(true);
|
|
171
|
+
if (result.success) {
|
|
172
|
+
expect(result.data.subagent_type).toBe('Plan');
|
|
173
|
+
expect(result.data.prompt).toBe('Plan the implementation');
|
|
174
|
+
expect(result.data.model).toBeUndefined();
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('CommandToolInputSchema', () => {
|
|
179
|
+
it('accepts full command input', () => {
|
|
180
|
+
const input = {
|
|
181
|
+
command: 'npm test',
|
|
182
|
+
description: 'Run test suite',
|
|
183
|
+
timeout: 60_000,
|
|
184
|
+
};
|
|
185
|
+
const result = CommandToolInputSchema.safeParse(input);
|
|
186
|
+
expect(result.success).toBe(true);
|
|
187
|
+
if (result.success) {
|
|
188
|
+
expect(result.data.command).toBe('npm test');
|
|
189
|
+
expect(result.data.description).toBe('Run test suite');
|
|
190
|
+
expect(result.data.timeout).toBe(60_000);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
it('accepts command-only input', () => {
|
|
194
|
+
const input = { command: 'git status' };
|
|
195
|
+
const result = CommandToolInputSchema.safeParse(input);
|
|
196
|
+
expect(result.success).toBe(true);
|
|
197
|
+
});
|
|
198
|
+
it('accepts empty input', () => {
|
|
199
|
+
const result = CommandToolInputSchema.safeParse({});
|
|
200
|
+
expect(result.success).toBe(true);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
describe('HookCallbackInputSchema', () => {
|
|
204
|
+
it('validates complete hook callback input', () => {
|
|
205
|
+
const input = {
|
|
206
|
+
session_id: 'sess-123',
|
|
207
|
+
transcript_path: '/path/to/transcript.jsonl',
|
|
208
|
+
cwd: '/project',
|
|
209
|
+
permission_mode: 'default',
|
|
210
|
+
hook_event_name: 'PreToolUse',
|
|
211
|
+
tool_name: 'Bash',
|
|
212
|
+
tool_input: { command: 'ls -la' },
|
|
213
|
+
tool_use_id: 'tool-456',
|
|
214
|
+
stop_hook_active: false,
|
|
215
|
+
};
|
|
216
|
+
const result = HookCallbackInputSchema.safeParse(input);
|
|
217
|
+
expect(result.success).toBe(true);
|
|
218
|
+
});
|
|
219
|
+
it('validates minimal required fields', () => {
|
|
220
|
+
const input = {
|
|
221
|
+
session_id: 'sess-123',
|
|
222
|
+
transcript_path: '/path/to/transcript.jsonl',
|
|
223
|
+
cwd: '/project',
|
|
224
|
+
permission_mode: 'default',
|
|
225
|
+
hook_event_name: 'Stop',
|
|
226
|
+
};
|
|
227
|
+
const result = HookCallbackInputSchema.safeParse(input);
|
|
228
|
+
expect(result.success).toBe(true);
|
|
229
|
+
if (result.success) {
|
|
230
|
+
expect(result.data.tool_name).toBeUndefined();
|
|
231
|
+
expect(result.data.tool_input).toBeUndefined();
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
it('rejects missing required fields', () => {
|
|
235
|
+
const input = {
|
|
236
|
+
session_id: 'sess-123',
|
|
237
|
+
};
|
|
238
|
+
const result = HookCallbackInputSchema.safeParse(input);
|
|
239
|
+
expect(result.success).toBe(false);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
describe('safeParseToolInput', () => {
|
|
243
|
+
const mockLogger = {
|
|
244
|
+
warn: vi.fn(),
|
|
245
|
+
};
|
|
246
|
+
beforeEach(() => {
|
|
247
|
+
vi.clearAllMocks();
|
|
248
|
+
});
|
|
249
|
+
it('returns success with valid input', () => {
|
|
250
|
+
const input = { command: 'npm test' };
|
|
251
|
+
const result = safeParseToolInput(CommandToolInputSchema, input, 'Bash', mockLogger);
|
|
252
|
+
expect(result.success).toBe(true);
|
|
253
|
+
expect(result.data).toEqual({ command: 'npm test' });
|
|
254
|
+
expect(mockLogger.warn).not.toHaveBeenCalled();
|
|
255
|
+
});
|
|
256
|
+
it('returns failure with invalid input and logs warning', () => {
|
|
257
|
+
const input = {
|
|
258
|
+
questions: 'invalid',
|
|
259
|
+
};
|
|
260
|
+
const result = safeParseToolInput(AskUserQuestionInputSchema, input, 'AskUserQuestion', mockLogger);
|
|
261
|
+
expect(result.success).toBe(false);
|
|
262
|
+
expect(result.data).toBeNull();
|
|
263
|
+
expect(mockLogger.warn).toHaveBeenCalledOnce();
|
|
264
|
+
expect(mockLogger.warn).toHaveBeenCalledWith('[Tool Input] AskUserQuestion input validation failed', expect.objectContaining({
|
|
265
|
+
toolName: 'AskUserQuestion',
|
|
266
|
+
errors: expect.any(Array),
|
|
267
|
+
inputKeys: expect.any(Array),
|
|
268
|
+
}));
|
|
269
|
+
});
|
|
270
|
+
it('works without logger', () => {
|
|
271
|
+
const input = { invalid: true };
|
|
272
|
+
const result = safeParseToolInput(HookCallbackInputSchema, input, 'HookCallback');
|
|
273
|
+
expect(result.success).toBe(false);
|
|
274
|
+
expect(result.data).toBeNull();
|
|
275
|
+
});
|
|
276
|
+
it('handles non-object input', () => {
|
|
277
|
+
const result = safeParseToolInput(CommandToolInputSchema, 'not an object', 'Bash', mockLogger);
|
|
278
|
+
expect(result.success).toBe(false);
|
|
279
|
+
expect(mockLogger.warn).toHaveBeenCalled();
|
|
280
|
+
});
|
|
281
|
+
it('handles null input', () => {
|
|
282
|
+
const result = safeParseToolInput(CommandToolInputSchema, null, 'Bash', mockLogger);
|
|
283
|
+
expect(result.success).toBe(false);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('extractInputValue', () => {
|
|
287
|
+
const mockLogger = {
|
|
288
|
+
warn: vi.fn(),
|
|
289
|
+
};
|
|
290
|
+
beforeEach(() => {
|
|
291
|
+
vi.clearAllMocks();
|
|
292
|
+
});
|
|
293
|
+
it('extracts string value correctly', () => {
|
|
294
|
+
const input = { command: 'npm test', timeout: 5000 };
|
|
295
|
+
const result = extractInputValue(input, 'command', isString, 'Bash', mockLogger);
|
|
296
|
+
expect(result).toBe('npm test');
|
|
297
|
+
expect(mockLogger.warn).not.toHaveBeenCalled();
|
|
298
|
+
});
|
|
299
|
+
it('returns undefined for missing key', () => {
|
|
300
|
+
const input = { command: 'npm test' };
|
|
301
|
+
const result = extractInputValue(input, 'description', isString, 'Bash', mockLogger);
|
|
302
|
+
expect(result).toBeUndefined();
|
|
303
|
+
expect(mockLogger.warn).not.toHaveBeenCalled();
|
|
304
|
+
});
|
|
305
|
+
it('returns undefined and logs warning for wrong type', () => {
|
|
306
|
+
const input = { command: 123 };
|
|
307
|
+
const result = extractInputValue(input, 'command', isString, 'Bash', mockLogger);
|
|
308
|
+
expect(result).toBeUndefined();
|
|
309
|
+
expect(mockLogger.warn).toHaveBeenCalledWith('[Tool Input] Bash.command has unexpected type', expect.objectContaining({
|
|
310
|
+
toolName: 'Bash',
|
|
311
|
+
key: 'command',
|
|
312
|
+
actualType: 'number',
|
|
313
|
+
}));
|
|
314
|
+
});
|
|
315
|
+
it('extracts array value correctly', () => {
|
|
316
|
+
const input = { items: [1, 2, 3] };
|
|
317
|
+
const result = extractInputValue(input, 'items', isArray, 'Test', mockLogger);
|
|
318
|
+
expect(result).toEqual([1, 2, 3]);
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
describe('Type Guards', () => {
|
|
322
|
+
describe('isString', () => {
|
|
323
|
+
it('returns true for strings', () => {
|
|
324
|
+
expect(isString('hello')).toBe(true);
|
|
325
|
+
expect(isString('')).toBe(true);
|
|
326
|
+
});
|
|
327
|
+
it('returns false for non-strings', () => {
|
|
328
|
+
expect(isString(123)).toBe(false);
|
|
329
|
+
expect(isString(null)).toBe(false);
|
|
330
|
+
expect(isString(undefined)).toBe(false);
|
|
331
|
+
expect(isString({})).toBe(false);
|
|
332
|
+
expect(isString([])).toBe(false);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
describe('isArray', () => {
|
|
336
|
+
it('returns true for arrays', () => {
|
|
337
|
+
expect(isArray([])).toBe(true);
|
|
338
|
+
expect(isArray([1, 2, 3])).toBe(true);
|
|
339
|
+
expect(isArray(['a', 'b'])).toBe(true);
|
|
340
|
+
});
|
|
341
|
+
it('returns false for non-arrays', () => {
|
|
342
|
+
expect(isArray('string')).toBe(false);
|
|
343
|
+
expect(isArray(123)).toBe(false);
|
|
344
|
+
expect(isArray(null)).toBe(false);
|
|
345
|
+
expect(isArray(undefined)).toBe(false);
|
|
346
|
+
expect(isArray({})).toBe(false);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
describe('Real-World Input Formats', () => {
|
|
351
|
+
it('handles SDK ExitPlanMode format with inline plan', () => {
|
|
352
|
+
const sdkInput = {
|
|
353
|
+
plan: `# Implementation Plan
|
|
354
|
+
|
|
355
|
+
## Summary
|
|
356
|
+
Implementing feature X
|
|
357
|
+
|
|
358
|
+
## Steps
|
|
359
|
+
1. Create component
|
|
360
|
+
2. Add tests
|
|
361
|
+
3. Update docs`,
|
|
362
|
+
allowedPrompts: [
|
|
363
|
+
{ tool: 'Bash', prompt: 'run tests' },
|
|
364
|
+
{ tool: 'Bash', prompt: 'install dependencies' },
|
|
365
|
+
],
|
|
366
|
+
};
|
|
367
|
+
const result = ExitPlanModeInputSchema.safeParse(sdkInput);
|
|
368
|
+
expect(result.success).toBe(true);
|
|
369
|
+
if (result.success) {
|
|
370
|
+
expect(result.data.plan).toContain('# Implementation Plan');
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
it('handles CLI ExitPlanMode format with file path', () => {
|
|
374
|
+
const cliInput = {
|
|
375
|
+
planFile: '/Users/developer/.claude/plans/feature-x.md',
|
|
376
|
+
allowedPrompts: [{ tool: 'Bash', prompt: 'run tests' }],
|
|
377
|
+
};
|
|
378
|
+
const result = ExitPlanModeInputSchema.safeParse(cliInput);
|
|
379
|
+
expect(result.success).toBe(true);
|
|
380
|
+
if (result.success) {
|
|
381
|
+
expect(result.data.planFile).toBe('/Users/developer/.claude/plans/feature-x.md');
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
it('handles PreToolUse hook callback', () => {
|
|
385
|
+
const hookInput = {
|
|
386
|
+
session_id: 'abc-123-def-456',
|
|
387
|
+
transcript_path: '/Users/dev/.claude/projects/-Users-dev-myproject/transcript.jsonl',
|
|
388
|
+
cwd: '/Users/dev/myproject',
|
|
389
|
+
permission_mode: 'default',
|
|
390
|
+
hook_event_name: 'PreToolUse',
|
|
391
|
+
tool_name: 'Bash',
|
|
392
|
+
tool_input: {
|
|
393
|
+
command: 'rm -rf node_modules && npm install',
|
|
394
|
+
description: 'Clean install dependencies',
|
|
395
|
+
},
|
|
396
|
+
tool_use_id: 'toolu_01ABC123',
|
|
397
|
+
};
|
|
398
|
+
const result = HookCallbackInputSchema.safeParse(hookInput);
|
|
399
|
+
expect(result.success).toBe(true);
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
//# sourceMappingURL=tool-inputs.schema.test.js.map
|