wave-agent-sdk 0.15.7 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/managers/aiManager.d.ts.map +1 -1
  5. package/dist/managers/aiManager.js +24 -0
  6. package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
  7. package/dist/managers/backgroundTaskManager.js +1 -0
  8. package/dist/managers/hookManager.d.ts +1 -1
  9. package/dist/managers/hookManager.d.ts.map +1 -1
  10. package/dist/managers/permissionManager.d.ts +2 -0
  11. package/dist/managers/permissionManager.d.ts.map +1 -1
  12. package/dist/managers/permissionManager.js +54 -0
  13. package/dist/managers/slashCommandManager.d.ts +1 -0
  14. package/dist/managers/slashCommandManager.d.ts.map +1 -1
  15. package/dist/managers/slashCommandManager.js +40 -0
  16. package/dist/managers/subagentManager.d.ts +6 -1
  17. package/dist/managers/subagentManager.d.ts.map +1 -1
  18. package/dist/managers/subagentManager.js +11 -8
  19. package/dist/services/authService.d.ts +28 -0
  20. package/dist/services/authService.d.ts.map +1 -0
  21. package/dist/services/authService.js +175 -0
  22. package/dist/services/configurationService.d.ts +5 -1
  23. package/dist/services/configurationService.d.ts.map +1 -1
  24. package/dist/services/configurationService.js +37 -1
  25. package/dist/tools/bashTool.d.ts.map +1 -1
  26. package/dist/tools/bashTool.js +1 -0
  27. package/dist/types/auth.d.ts +4 -0
  28. package/dist/types/auth.d.ts.map +1 -0
  29. package/dist/types/auth.js +1 -0
  30. package/dist/types/hooks.d.ts +2 -2
  31. package/dist/types/hooks.d.ts.map +1 -1
  32. package/dist/types/index.d.ts +1 -0
  33. package/dist/types/index.d.ts.map +1 -1
  34. package/dist/types/index.js +1 -0
  35. package/dist/utils/containerSetup.d.ts.map +1 -1
  36. package/dist/utils/containerSetup.js +5 -0
  37. package/package.json +1 -1
  38. package/src/index.ts +1 -0
  39. package/src/managers/aiManager.ts +34 -0
  40. package/src/managers/backgroundTaskManager.ts +1 -0
  41. package/src/managers/hookManager.ts +1 -1
  42. package/src/managers/permissionManager.ts +67 -0
  43. package/src/managers/slashCommandManager.ts +59 -0
  44. package/src/managers/subagentManager.ts +16 -9
  45. package/src/services/authService.ts +234 -0
  46. package/src/services/configurationService.ts +43 -1
  47. package/src/tools/bashTool.ts +1 -0
  48. package/src/types/auth.ts +3 -0
  49. package/src/types/hooks.ts +2 -2
  50. package/src/types/index.ts +1 -0
  51. package/src/utils/containerSetup.ts +6 -0
@@ -1 +1 @@
1
- {"version":3,"file":"configurationService.d.ts","sourceRoot":"","sources":["../../src/services/configurationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configurationService.d.ts","sourceRoot":"","sources":["../../src/services/configurationService.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  */
7
7
  import { readFileSync, existsSync, promises as fs } from "fs";
8
8
  import * as path from "path";
9
+ import * as os from "os";
9
10
  import { isValidHookEvent } from "../types/hooks.js";
10
11
  import { logger } from "../utils/globalLogger.js";
11
12
  import { getAllConfigPaths, getExistingConfigPaths, getUserConfigPaths, getProjectConfigPaths, } from "../utils/configPaths.js";
@@ -285,9 +286,27 @@ export class ConfigurationService {
285
286
  // =============================================================================
286
287
  // Configuration Resolution Methods (merged from configResolver.ts)
287
288
  // =============================================================================
289
+ /**
290
+ * Read SSO token from ~/.wave/auth.json
291
+ */
292
+ readSSOToken() {
293
+ const homeDir = os.homedir();
294
+ const authPath = path.join(homeDir, ".wave", "auth.json");
295
+ if (!existsSync(authPath)) {
296
+ return undefined;
297
+ }
298
+ try {
299
+ const content = readFileSync(authPath, "utf-8");
300
+ const authConfig = JSON.parse(content);
301
+ return authConfig.SSO_TOKEN;
302
+ }
303
+ catch {
304
+ return undefined;
305
+ }
306
+ }
288
307
  /**
289
308
  * Resolves gateway configuration from constructor args and environment
290
- * Resolution priority: options > env (from settings.json) > process.env > error
309
+ * Resolution priority: SSO_TOKEN > options > env (from settings.json) > process.env > error
291
310
  * @param apiKey - API key override (optional)
292
311
  * @param baseURL - Base URL override (optional)
293
312
  * @param defaultHeaders - HTTP headers override (optional)
@@ -297,6 +316,23 @@ export class ConfigurationService {
297
316
  * @throws ConfigurationError if required configuration is missing after fallbacks
298
317
  */
299
318
  resolveGatewayConfig(apiKey, baseURL, defaultHeaders, fetchOptions, fetch) {
319
+ // Check for SSO token first - if present, use SSO mode
320
+ const ssoToken = this.readSSOToken();
321
+ if (ssoToken) {
322
+ const adminUrl = process.env.WAVE_ADMIN_URL;
323
+ if (!adminUrl) {
324
+ throw new ConfigurationError(CONFIG_ERRORS.MISSING_BASE_URL, "baseURL", "WAVE_ADMIN_URL is required for SSO authentication");
325
+ }
326
+ return {
327
+ apiKey: ssoToken,
328
+ baseURL: `${adminUrl}/api/v1`,
329
+ defaultHeaders: Object.keys(defaultHeaders || {}).length > 0
330
+ ? defaultHeaders
331
+ : undefined,
332
+ fetchOptions: fetchOptions ?? this.options.fetchOptions,
333
+ fetch: fetch ?? this.options.fetch,
334
+ };
335
+ }
300
336
  // Resolve API key: override > options > env (settings.json) > process.env
301
337
  // Note: Explicitly provided empty strings should be treated as invalid, not fall back to env
302
338
  let resolvedApiKey;
@@ -1 +1 @@
1
- {"version":3,"file":"bashTool.d.ts","sourceRoot":"","sources":["../../src/tools/bashTool.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAwCtE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,UAibtB,CAAC"}
1
+ {"version":3,"file":"bashTool.d.ts","sourceRoot":"","sources":["../../src/tools/bashTool.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAwCtE;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,UAkbtB,CAAC"}
@@ -204,6 +204,7 @@ Use the gh command via the Bash tool for GitHub-related tasks including working
204
204
  const child = spawn(command, {
205
205
  shell: true,
206
206
  stdio: "pipe",
207
+ detached: true,
207
208
  cwd: context.workdir,
208
209
  env: {
209
210
  ...process.env,
@@ -0,0 +1,4 @@
1
+ export interface AuthConfig {
2
+ SSO_TOKEN?: string;
3
+ }
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -53,8 +53,8 @@ export declare class HookConfigurationError extends Error {
53
53
  readonly validationErrors: string[];
54
54
  constructor(configPath: string, validationErrors: string[]);
55
55
  }
56
- export type SessionStartSource = "startup" | "resume" | "compact";
57
- export type SessionEndSource = "exit" | "stop" | "compact";
56
+ export type SessionStartSource = "startup" | "compact" | "clear";
57
+ export type SessionEndSource = "exit" | "stop" | "compact" | "clear";
58
58
  export declare function isValidHookEvent(event: string): event is HookEvent;
59
59
  export declare function isValidHookCommand(cmd: unknown): cmd is HookCommand;
60
60
  export declare function isValidHookEventConfig(config: unknown): config is HookEventConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"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"}
@@ -33,4 +33,5 @@ export * from "./tasks.js";
33
33
  export * from "./agent.js";
34
34
  export * from "./cron.js";
35
35
  export * from "./telemetry.js";
36
+ export * from "./auth.js";
36
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,WAAW,CAAC;AAG1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,cAAc,WAAW,CAAC;AAG1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
@@ -35,3 +35,4 @@ export * from "./tasks.js";
35
35
  export * from "./agent.js";
36
36
  export * from "./cron.js";
37
37
  export * from "./telemetry.js";
38
+ export * from "./auth.js";
@@ -1 +1 @@
1
- {"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwB3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAK3E,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,IAAI,EACJ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAGhB,uBAAuB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,sBAAsB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,wBAAwB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,SAAS,CAuQX"}
1
+ {"version":3,"file":"containerSetup.d.ts","sourceRoot":"","sources":["../../src/utils/containerSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwB3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAM3E,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EACL,IAAI,EACJ,cAAc,EAEf,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAGhB,uBAAuB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;IAC3D,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACvC,sBAAsB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,wBAAwB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzD,iBAAiB,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,0BAA0B,GACvC,SAAS,CA4QX"}
@@ -26,6 +26,7 @@ import { ReversionService } from "../services/reversionService.js";
26
26
  import { MemoryService } from "../services/memory.js";
27
27
  import { AutoMemoryService } from "../services/autoMemoryService.js";
28
28
  import { USER_MEMORY_FILE } from "./constants.js";
29
+ import { getGitMainRepoRoot } from "./gitUtils.js";
29
30
  import { logger } from "./globalLogger.js";
30
31
  export function setupAgentContainer(setupOptions) {
31
32
  const { options, workdir, configurationService, systemPrompt, stream, onBackgroundTasksChange, onTasksChange, onPermissionModeChange, handlePlanModeTransition, setPermissionMode, addPermissionRule, addUsage, } = setupOptions;
@@ -33,6 +34,10 @@ export function setupAgentContainer(setupOptions) {
33
34
  const container = new Container();
34
35
  container.register("AgentOptions", options);
35
36
  container.register("Workdir", workdir);
37
+ if (options.worktreeName) {
38
+ container.register("WorktreeName", options.worktreeName);
39
+ container.register("MainRepoRoot", getGitMainRepoRoot(workdir));
40
+ }
36
41
  const notificationQueue = new NotificationQueue();
37
42
  container.register("NotificationQueue", notificationQueue);
38
43
  const messageQueue = new MessageQueue();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wave-agent-sdk",
3
- "version": "0.15.7",
3
+ "version": "0.16.0",
4
4
  "description": "SDK for building AI-powered development tools and agents",
5
5
  "keywords": [
6
6
  "ai",
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  // Export all services
2
2
  export * from "./core/session.js";
3
+ export * from "./services/authService.js";
3
4
 
4
5
  // Export constants
5
6
  export * from "./constants/tools.js";
@@ -501,6 +501,40 @@ export class AIManager {
501
501
  afterTokens: "1",
502
502
  model: this.getModelConfig().fastModel,
503
503
  }).catch(() => {});
504
+
505
+ // Run SessionStart hooks after compaction to restore context
506
+ if (this.hookManager) {
507
+ try {
508
+ const newSessionId = this.messageManager.getSessionId();
509
+ const sessionStartResult =
510
+ await this.hookManager.executeSessionStartHooks(
511
+ "compact",
512
+ newSessionId,
513
+ this.messageManager.getTranscriptPath(),
514
+ this.subagentType,
515
+ );
516
+
517
+ // Inject additionalContext as a meta user message
518
+ if (sessionStartResult.additionalContext) {
519
+ this.messageManager.addUserMessage({
520
+ content: `<system-reminder>\nSessionStart hook additional context: ${sessionStartResult.additionalContext}\n</system-reminder>`,
521
+ isMeta: true,
522
+ });
523
+ }
524
+
525
+ // Inject initialUserMessage as a meta user message
526
+ if (sessionStartResult.initialUserMessage) {
527
+ this.messageManager.addUserMessage({
528
+ content: sessionStartResult.initialUserMessage,
529
+ isMeta: true,
530
+ });
531
+ }
532
+ } catch (error) {
533
+ logger?.warn(
534
+ `SessionStart hooks on compact failed: ${(error as Error).message}`,
535
+ );
536
+ }
537
+ }
504
538
  } catch (compactError) {
505
539
  this.consecutiveCompactionFailures++;
506
540
  logger?.error(
@@ -66,6 +66,7 @@ export class BackgroundTaskManager {
66
66
  const child = spawn(command, {
67
67
  shell: true,
68
68
  stdio: "pipe",
69
+ detached: true,
69
70
  cwd: this.workdir,
70
71
  env: {
71
72
  ...process.env,
@@ -851,7 +851,7 @@ export class HookManager {
851
851
  * Collects additionalContext and initialUserMessage from hook stdout.
852
852
  */
853
853
  async executeSessionStartHooks(
854
- source: "startup" | "resume" | "compact",
854
+ source: "startup" | "compact" | "clear",
855
855
  sessionId: string,
856
856
  transcriptPath: string,
857
857
  agentType?: string,
@@ -34,6 +34,7 @@ import {
34
34
  } from "../constants/tools.js";
35
35
  import { Container } from "../utils/container.js";
36
36
  import { ConfigurationService } from "../services/configurationService.js";
37
+ import { getCurrentWorktreeSession } from "../utils/worktreeSession.js";
37
38
 
38
39
  const SAFE_COMMANDS = [
39
40
  "cd",
@@ -129,6 +130,8 @@ export class PermissionManager {
129
130
  private systemAdditionalDirectories: string[] = [];
130
131
  private planFilePath?: string;
131
132
  private workdir?: string;
133
+ private worktreeName?: string;
134
+ private mainRepoRoot?: string;
132
135
  private onConfiguredPermissionModeChange?: (mode: PermissionMode) => void;
133
136
  private _logger?: Logger;
134
137
 
@@ -149,6 +152,8 @@ export class PermissionManager {
149
152
  }
150
153
 
151
154
  this.workdir = this.container.get<string>("Workdir");
155
+ this.worktreeName = this.container.get<string | undefined>("WorktreeName");
156
+ this.mainRepoRoot = this.container.get<string | undefined>("MainRepoRoot");
152
157
  }
153
158
 
154
159
  /**
@@ -421,6 +426,68 @@ export class PermissionManager {
421
426
  return { behavior: "allow" };
422
427
  }
423
428
 
429
+ // 1.0 Check worktree safety for Write and Edit tools
430
+ // Support both CLI -w sessions (container-registered) and EnterWorktree mid-session (module-level)
431
+ const worktreeSession = getCurrentWorktreeSession();
432
+ const effectiveWorktreeName =
433
+ this.worktreeName || worktreeSession?.worktreeName;
434
+ const effectiveWorkdir = this.workdir || worktreeSession?.worktreePath;
435
+ const effectiveMainRepoRoot =
436
+ this.mainRepoRoot || worktreeSession?.repoRoot;
437
+
438
+ if (
439
+ effectiveWorktreeName &&
440
+ effectiveMainRepoRoot &&
441
+ effectiveWorkdir &&
442
+ (context.toolName === WRITE_TOOL_NAME ||
443
+ context.toolName === EDIT_TOOL_NAME)
444
+ ) {
445
+ const targetPath = context.toolInput?.file_path as string | undefined;
446
+ if (targetPath) {
447
+ const absoluteTargetPath = path.resolve(effectiveWorkdir, targetPath);
448
+ const isInsideMainRepo = isPathInside(
449
+ absoluteTargetPath,
450
+ effectiveMainRepoRoot,
451
+ );
452
+ const isInsideWorktree = isPathInside(
453
+ absoluteTargetPath,
454
+ effectiveWorkdir,
455
+ );
456
+
457
+ // Allow the plan file even if outside worktree
458
+ if (this.planFilePath) {
459
+ const absolutePlanPath = path.resolve(this.planFilePath);
460
+ if (absoluteTargetPath === absolutePlanPath) {
461
+ // Fall through — plan file is allowed
462
+ } else if (isInsideMainRepo && !isInsideWorktree) {
463
+ logger?.warn("Worktree safety violation", {
464
+ toolName: context.toolName,
465
+ targetPath,
466
+ worktreeName: effectiveWorktreeName,
467
+ mainRepoRoot: effectiveMainRepoRoot,
468
+ workdir: effectiveWorkdir,
469
+ });
470
+ return {
471
+ behavior: "deny",
472
+ message: `Access denied: You are currently in a worktree session ("${effectiveWorktreeName}"). Modifying files in the main repository (outside the worktree) is not allowed. Please only modify files within the worktree directory: ${effectiveWorkdir}`,
473
+ };
474
+ }
475
+ } else if (isInsideMainRepo && !isInsideWorktree) {
476
+ logger?.warn("Worktree safety violation", {
477
+ toolName: context.toolName,
478
+ targetPath,
479
+ worktreeName: effectiveWorktreeName,
480
+ mainRepoRoot: effectiveMainRepoRoot,
481
+ workdir: effectiveWorkdir,
482
+ });
483
+ return {
484
+ behavior: "deny",
485
+ message: `Access denied: You are currently in a worktree session ("${effectiveWorktreeName}"). Modifying files in the main repository (outside the worktree) is not allowed. Please only modify files within the worktree directory: ${effectiveWorkdir}`,
486
+ };
487
+ }
488
+ }
489
+ }
490
+
424
491
  // 1.1 If acceptEdits mode, allow Edit, Write, and mkdir in safe zone
425
492
  if (context.permissionMode === "acceptEdits") {
426
493
  const autoAcceptedTools = [EDIT_TOOL_NAME, WRITE_TOOL_NAME];
@@ -24,6 +24,7 @@ import type { SkillManager } from "./skillManager.js";
24
24
  import type { SkillMetadata } from "../types/skills.js";
25
25
  import type { SubagentManager } from "./subagentManager.js";
26
26
  import type { MemoryService } from "../services/memory.js";
27
+ import type { HookManager } from "./hookManager.js";
27
28
 
28
29
  import { logger } from "../utils/globalLogger.js";
29
30
 
@@ -86,6 +87,10 @@ export class SlashCommandManager {
86
87
  return this.container.get<MemoryService>("MemoryService")!;
87
88
  }
88
89
 
90
+ private get hookManager(): HookManager | undefined {
91
+ return this.container.get<HookManager>("HookManager");
92
+ }
93
+
89
94
  private initializeBuiltinCommands(): void {
90
95
  // Register built-in clear command
91
96
  this.registerCommand({
@@ -94,9 +99,63 @@ export class SlashCommandManager {
94
99
  description: "Clear conversation history and reset session",
95
100
  handler: async () => {
96
101
  this.aiManager.abortAIMessage();
102
+
103
+ // Capture old session info before clearing
104
+ const oldSessionId = this.messageManager.getSessionId();
105
+ const transcriptPath = this.messageManager.getTranscriptPath();
106
+
107
+ // Run SessionEnd hooks (cleanup before clear)
108
+ if (this.hookManager) {
109
+ try {
110
+ await this.hookManager.executeSessionEndHooks(
111
+ "clear",
112
+ oldSessionId,
113
+ transcriptPath,
114
+ );
115
+ } catch (error) {
116
+ logger?.warn(
117
+ `SessionEnd hooks on clear failed: ${(error as Error).message}`,
118
+ );
119
+ }
120
+ }
121
+
122
+ // Clear messages and generate new session
97
123
  this.messageManager.clearMessages();
98
124
  this.memoryService.clearCache();
99
125
  await this.taskManager.syncWithSession();
126
+
127
+ // Run SessionStart hooks (restore context for new session)
128
+ if (this.hookManager) {
129
+ try {
130
+ const newSessionId = this.messageManager.getSessionId();
131
+ const sessionStartResult =
132
+ await this.hookManager.executeSessionStartHooks(
133
+ "clear",
134
+ newSessionId,
135
+ this.messageManager.getTranscriptPath(),
136
+ );
137
+
138
+ // Inject additionalContext as a meta user message
139
+ if (sessionStartResult.additionalContext) {
140
+ this.messageManager.addUserMessage({
141
+ content: `<system-reminder>\nSessionStart hook additional context: ${sessionStartResult.additionalContext}\n</system-reminder>`,
142
+ isMeta: true,
143
+ });
144
+ }
145
+
146
+ // Inject initialUserMessage as a meta user message
147
+ if (sessionStartResult.initialUserMessage) {
148
+ this.messageManager.addUserMessage({
149
+ content: sessionStartResult.initialUserMessage,
150
+ isMeta: true,
151
+ });
152
+ }
153
+ } catch (error) {
154
+ logger?.warn(
155
+ `SessionStart hooks on clear failed: ${(error as Error).message}`,
156
+ );
157
+ }
158
+ }
100
159
  },
101
160
  });
102
161
  }
@@ -66,6 +66,9 @@ export interface SubagentInstance {
66
66
  aiManager: AIManager;
67
67
  messageManager: MessageManager;
68
68
  toolManager: ToolManager;
69
+ permissionManager: PermissionManager;
70
+ backgroundTaskManager: BackgroundTaskManager;
71
+ notificationQueue: NotificationQueue;
69
72
  status: "initializing" | "active" | "completed" | "error" | "aborted";
70
73
  messages: Message[];
71
74
  usedTools: {
@@ -92,7 +95,6 @@ export interface SubagentManagerOptions {
92
95
 
93
96
  export class SubagentManager {
94
97
  private instances = new Map<string, SubagentInstance>();
95
- private subagentPermissionManagers = new Map<string, PermissionManager>();
96
98
  private cachedConfigurations: SubagentConfiguration[] | null = null;
97
99
 
98
100
  private workdir: string;
@@ -154,10 +156,12 @@ export class SubagentManager {
154
156
  const parentPm = this.container.get<PermissionManager>("PermissionManager");
155
157
  if (!parentPm) return;
156
158
 
157
- for (const [, pm] of this.subagentPermissionManagers) {
158
- pm.updateAllowedRules(parentPm.getAllowedRules());
159
- pm.updateDeniedRules(parentPm.getDeniedRules());
160
- pm.updateAdditionalDirectories(parentPm.getAdditionalDirectories());
159
+ for (const instance of this.instances.values()) {
160
+ instance.permissionManager.updateAllowedRules(parentPm.getAllowedRules());
161
+ instance.permissionManager.updateDeniedRules(parentPm.getDeniedRules());
162
+ instance.permissionManager.updateAdditionalDirectories(
163
+ parentPm.getAdditionalDirectories(),
164
+ );
161
165
  }
162
166
  }
163
167
 
@@ -324,9 +328,6 @@ export class SubagentManager {
324
328
  );
325
329
  }
326
330
 
327
- // Track this subagent's PermissionManager for rule sync
328
- this.subagentPermissionManagers.set(subagentId, subagentPermissionManager);
329
-
330
331
  // Add temporary permission rules if provided
331
332
  if (parameters.allowedTools) {
332
333
  logger.debug(
@@ -391,6 +392,9 @@ export class SubagentManager {
391
392
  aiManager,
392
393
  messageManager,
393
394
  toolManager,
395
+ permissionManager: subagentPermissionManager,
396
+ backgroundTaskManager: subagentBackgroundTaskManager,
397
+ notificationQueue: subagentNotificationQueue,
394
398
  status: "initializing",
395
399
  messages: [],
396
400
  usedTools: [], // Initialize usedTools
@@ -732,7 +736,6 @@ export class SubagentManager {
732
736
  instance.status === "aborted")
733
737
  ) {
734
738
  this.instances.delete(subagentId);
735
- this.subagentPermissionManagers.delete(subagentId);
736
739
  }
737
740
  }
738
741
 
@@ -750,6 +753,10 @@ export class SubagentManager {
750
753
  * Clean up all instances (for session end)
751
754
  */
752
755
  cleanup(): void {
756
+ for (const instance of this.instances.values()) {
757
+ instance.aiManager.abortAIMessage();
758
+ instance.backgroundTaskManager.cleanup();
759
+ }
753
760
  this.instances.clear();
754
761
  }
755
762