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.
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/managers/aiManager.d.ts.map +1 -1
- package/dist/managers/aiManager.js +24 -0
- package/dist/managers/backgroundTaskManager.d.ts.map +1 -1
- package/dist/managers/backgroundTaskManager.js +1 -0
- package/dist/managers/hookManager.d.ts +1 -1
- package/dist/managers/hookManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.d.ts +2 -0
- package/dist/managers/permissionManager.d.ts.map +1 -1
- package/dist/managers/permissionManager.js +54 -0
- package/dist/managers/slashCommandManager.d.ts +1 -0
- package/dist/managers/slashCommandManager.d.ts.map +1 -1
- package/dist/managers/slashCommandManager.js +40 -0
- package/dist/managers/subagentManager.d.ts +6 -1
- package/dist/managers/subagentManager.d.ts.map +1 -1
- package/dist/managers/subagentManager.js +11 -8
- package/dist/services/authService.d.ts +28 -0
- package/dist/services/authService.d.ts.map +1 -0
- package/dist/services/authService.js +175 -0
- package/dist/services/configurationService.d.ts +5 -1
- package/dist/services/configurationService.d.ts.map +1 -1
- package/dist/services/configurationService.js +37 -1
- package/dist/tools/bashTool.d.ts.map +1 -1
- package/dist/tools/bashTool.js +1 -0
- package/dist/types/auth.d.ts +4 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +1 -0
- package/dist/types/hooks.d.ts +2 -2
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/utils/containerSetup.d.ts.map +1 -1
- package/dist/utils/containerSetup.js +5 -0
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/managers/aiManager.ts +34 -0
- package/src/managers/backgroundTaskManager.ts +1 -0
- package/src/managers/hookManager.ts +1 -1
- package/src/managers/permissionManager.ts +67 -0
- package/src/managers/slashCommandManager.ts +59 -0
- package/src/managers/subagentManager.ts +16 -9
- package/src/services/authService.ts +234 -0
- package/src/services/configurationService.ts +43 -1
- package/src/tools/bashTool.ts +1 -0
- package/src/types/auth.ts +3 -0
- package/src/types/hooks.ts +2 -2
- package/src/types/index.ts +1 -0
- package/src/utils/containerSetup.ts +6 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configurationService.d.ts","sourceRoot":"","sources":["../../src/services/configurationService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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,
|
|
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"}
|
package/dist/tools/bashTool.js
CHANGED
|
@@ -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 {};
|
package/dist/types/hooks.d.ts
CHANGED
|
@@ -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" | "
|
|
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":"AAAA;;;;;GAKG;AAEH,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,MAAM,GACN,cAAc,GACd,mBAAmB,GACnB,gBAAgB,GAChB,gBAAgB,GAChB,cAAc,GACd,YAAY,CAAC;AAGjB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAGD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAGD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAGD,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,WAAW,EAAE,MAAM;aACnB,aAAa,EAAE,KAAK;aACpB,OAAO,EAAE,oBAAoB;gBAF7B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,KAAK,EACpB,OAAO,EAAE,oBAAoB;CAKhD;AAGD,qBAAa,sBAAuB,SAAQ,KAAK;aAE7B,UAAU,EAAE,MAAM;aAClB,gBAAgB,EAAE,MAAM,EAAE;gBAD1B,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EAAE;CAO7C;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/types/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/types/index.js
CHANGED
|
@@ -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;
|
|
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
package/src/index.ts
CHANGED
|
@@ -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(
|
|
@@ -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" | "
|
|
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
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
|