@junctionpanel/server 0.1.101 → 0.1.102
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/server/client/daemon-client.d.ts +12 -1
- package/dist/server/client/daemon-client.d.ts.map +1 -1
- package/dist/server/client/daemon-client.js +27 -0
- package/dist/server/client/daemon-client.js.map +1 -1
- package/dist/server/server/exports.d.ts +1 -1
- package/dist/server/server/exports.d.ts.map +1 -1
- package/dist/server/server/exports.js +1 -1
- package/dist/server/server/exports.js.map +1 -1
- package/dist/server/server/session.d.ts +9 -0
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +107 -3
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/shared/messages.d.ts +578 -0
- package/dist/server/shared/messages.d.ts.map +1 -1
- package/dist/server/shared/messages.js +38 -0
- package/dist/server/shared/messages.js.map +1 -1
- package/dist/server/shared/switchboard.d.ts +4 -4
- package/dist/server/shared/switchboard.d.ts.map +1 -1
- package/dist/server/shared/switchboard.js +29 -50
- package/dist/server/shared/switchboard.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
-
import { existsSync, statSync, watch } from 'node:fs';
|
|
2
|
+
import { existsSync, mkdirSync, statSync, watch, writeFileSync } from 'node:fs';
|
|
3
3
|
import { exec, execFile } from 'child_process';
|
|
4
4
|
import { promisify } from 'util';
|
|
5
|
-
import { resolve, sep, basename, dirname, parse as parsePath } from 'path';
|
|
5
|
+
import { resolve, sep, basename, dirname, isAbsolute, parse as parsePath, posix, win32 } from 'path';
|
|
6
6
|
import { homedir, hostname } from 'node:os';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { serializeAgentStreamEvent, AgentSnapshotPayloadSchema, } from './messages.js';
|
|
@@ -20,7 +20,7 @@ import { projectTimelineRows, selectTimelineWindowByProjectedLimit, } from './ag
|
|
|
20
20
|
import { DEFAULT_STRUCTURED_GENERATION_PROVIDERS, StructuredAgentFallbackError, StructuredAgentResponseError, generateStructuredAgentResponseWithFallback, resolveStructuredGenerationPreferredProviderForCwd, resolveStructuredGenerationProviders, } from './agent/agent-response-loop.js';
|
|
21
21
|
import { isValidAgentProvider, AGENT_PROVIDER_IDS } from './agent/provider-manifest.js';
|
|
22
22
|
import { listDirectoryEntries, readExplorerFile, getDownloadableFileInfo, isWorkspaceExplorerMissingPathError, } from './file-explorer/service.js';
|
|
23
|
-
import { slugify, validateBranchSlug, listJunctionWorktrees, deleteJunctionWorktree, isJunctionOwnedWorktreeCwd, resolveJunctionWorktreeRootForCwd, createInRepoWorktree, attachInRepoWorktree, restoreInRepoWorktree, } from '../utils/worktree.js';
|
|
23
|
+
import { slugify, validateBranchSlug, listJunctionWorktrees, deleteJunctionWorktree, isJunctionOwnedWorktreeCwd, resolveJunctionWorktreeRootForCwd, createInRepoWorktree, attachInRepoWorktree, restoreInRepoWorktree, createWorktree, } from '../utils/worktree.js';
|
|
24
24
|
import { readJunctionWorktreeMetadata } from '../utils/worktree-metadata.js';
|
|
25
25
|
import { runAsyncWorktreeBootstrap } from './worktree-bootstrap.js';
|
|
26
26
|
import { getCheckoutDiff, getCheckoutStatus, getCheckoutStatusLite, listBranchSuggestions, NotGitRepoError, MergeConflictError, MergeFromBaseConflictError, commitChanges, mergeToBase, mergeFromBase, pushCurrentBranch, createPullRequest, getPullRequestFailureLogs, getPullRequestSnapshot, getPullRequestStatus, invalidatePullRequestCache, searchPullRequests, listGitRemotes, mergePullRequest, resolveMergeToBaseOperationCwd, resolveBaseRefWithSource, } from '../utils/checkout-git.js';
|
|
@@ -74,6 +74,28 @@ function maybeUnrefTimer(timer) {
|
|
|
74
74
|
timer.unref();
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
|
+
function usesWindowsPathSemantics(pathValue) {
|
|
78
|
+
return /^[A-Za-z]:[\\/]/.test(pathValue) || pathValue.includes('\\');
|
|
79
|
+
}
|
|
80
|
+
export function resolveWorkspaceRelativeFilePath(rootPath, filePath) {
|
|
81
|
+
if (isAbsolute(filePath)) {
|
|
82
|
+
throw new Error('Path must be relative and cannot be absolute');
|
|
83
|
+
}
|
|
84
|
+
const pathApi = usesWindowsPathSemantics(rootPath) ? win32 : posix;
|
|
85
|
+
const segments = filePath.split(/[\\/]+/).filter(Boolean);
|
|
86
|
+
if (segments.includes('..')) {
|
|
87
|
+
throw new Error('Path must be relative and cannot contain ".."');
|
|
88
|
+
}
|
|
89
|
+
const normalizedRoot = pathApi.resolve(rootPath);
|
|
90
|
+
const resolvedPath = pathApi.resolve(normalizedRoot, filePath);
|
|
91
|
+
const relativePath = pathApi.relative(normalizedRoot, resolvedPath);
|
|
92
|
+
if (relativePath === '..'
|
|
93
|
+
|| relativePath.startsWith(`..${pathApi.sep}`)
|
|
94
|
+
|| pathApi.isAbsolute(relativePath)) {
|
|
95
|
+
throw new Error('Path must be within the workspace directory');
|
|
96
|
+
}
|
|
97
|
+
return resolvedPath;
|
|
98
|
+
}
|
|
77
99
|
const PROVIDER_CHILD_THREADS_PERSISTED_LIST_INITIAL_LIMIT = 500;
|
|
78
100
|
const PROVIDER_CHILD_THREADS_PERSISTED_LIST_MAX_LIMIT = 50000;
|
|
79
101
|
const TERMINAL_STREAM_WINDOW_BYTES = 256 * 1024;
|
|
@@ -1420,6 +1442,12 @@ export class Session {
|
|
|
1420
1442
|
case 'workspace_file_explorer_request':
|
|
1421
1443
|
await this.handleWorkspaceFileExplorerRequest(msg);
|
|
1422
1444
|
break;
|
|
1445
|
+
case 'workspace_file_write_request':
|
|
1446
|
+
await this.handleWorkspaceFileWriteRequest(msg);
|
|
1447
|
+
break;
|
|
1448
|
+
case 'workspace_create_worktree_request':
|
|
1449
|
+
await this.handleWorkspaceCreateWorktreeRequest(msg);
|
|
1450
|
+
break;
|
|
1423
1451
|
case 'project_icon_request':
|
|
1424
1452
|
await this.handleProjectIconRequest(msg);
|
|
1425
1453
|
break;
|
|
@@ -5790,6 +5818,82 @@ export class Session {
|
|
|
5790
5818
|
});
|
|
5791
5819
|
}
|
|
5792
5820
|
}
|
|
5821
|
+
/**
|
|
5822
|
+
* Handle workspace file write request
|
|
5823
|
+
*/
|
|
5824
|
+
async handleWorkspaceFileWriteRequest(request) {
|
|
5825
|
+
const { cwd, path: filePath, content, requestId } = request;
|
|
5826
|
+
const root = expandTilde(cwd);
|
|
5827
|
+
try {
|
|
5828
|
+
const resolvedPath = resolveWorkspaceRelativeFilePath(root, filePath);
|
|
5829
|
+
mkdirSync(dirname(resolvedPath), { recursive: true });
|
|
5830
|
+
writeFileSync(resolvedPath, content, 'utf-8');
|
|
5831
|
+
this.emit({
|
|
5832
|
+
type: 'workspace_file_write_response',
|
|
5833
|
+
payload: {
|
|
5834
|
+
cwd,
|
|
5835
|
+
path: filePath,
|
|
5836
|
+
success: true,
|
|
5837
|
+
error: null,
|
|
5838
|
+
requestId,
|
|
5839
|
+
},
|
|
5840
|
+
});
|
|
5841
|
+
}
|
|
5842
|
+
catch (error) {
|
|
5843
|
+
const message = error instanceof Error ? error.message : 'Failed to write file';
|
|
5844
|
+
this.sessionLogger.error({ err: error, cwd, path: filePath }, 'Failed to write workspace file');
|
|
5845
|
+
this.emit({
|
|
5846
|
+
type: 'workspace_file_write_response',
|
|
5847
|
+
payload: {
|
|
5848
|
+
cwd,
|
|
5849
|
+
path: filePath,
|
|
5850
|
+
success: false,
|
|
5851
|
+
error: message,
|
|
5852
|
+
requestId,
|
|
5853
|
+
},
|
|
5854
|
+
});
|
|
5855
|
+
}
|
|
5856
|
+
}
|
|
5857
|
+
/**
|
|
5858
|
+
* Handle workspace create worktree request
|
|
5859
|
+
*/
|
|
5860
|
+
async handleWorkspaceCreateWorktreeRequest(request) {
|
|
5861
|
+
const { cwd, branchName, baseBranch, remoteName, requestId } = request;
|
|
5862
|
+
const root = expandTilde(cwd);
|
|
5863
|
+
try {
|
|
5864
|
+
const result = await createWorktree({
|
|
5865
|
+
cwd: root,
|
|
5866
|
+
branchName,
|
|
5867
|
+
baseBranch: baseBranch ?? 'main',
|
|
5868
|
+
remoteName,
|
|
5869
|
+
worktreeSlug: branchName,
|
|
5870
|
+
runSetup: false,
|
|
5871
|
+
junctionHome: this.junctionHome,
|
|
5872
|
+
});
|
|
5873
|
+
this.emit({
|
|
5874
|
+
type: 'workspace_create_worktree_response',
|
|
5875
|
+
payload: {
|
|
5876
|
+
worktreePath: result.worktreePath,
|
|
5877
|
+
branchName: result.branchName,
|
|
5878
|
+
error: null,
|
|
5879
|
+
requestId,
|
|
5880
|
+
},
|
|
5881
|
+
});
|
|
5882
|
+
}
|
|
5883
|
+
catch (error) {
|
|
5884
|
+
const message = error instanceof Error ? error.message : 'Failed to create worktree';
|
|
5885
|
+
this.sessionLogger.error({ err: error, cwd, branchName }, 'Failed to create config worktree');
|
|
5886
|
+
this.emit({
|
|
5887
|
+
type: 'workspace_create_worktree_response',
|
|
5888
|
+
payload: {
|
|
5889
|
+
worktreePath: '',
|
|
5890
|
+
branchName: '',
|
|
5891
|
+
error: message,
|
|
5892
|
+
requestId,
|
|
5893
|
+
},
|
|
5894
|
+
});
|
|
5895
|
+
}
|
|
5896
|
+
}
|
|
5793
5897
|
/**
|
|
5794
5898
|
* Handle project icon request for a given cwd
|
|
5795
5899
|
*/
|