@getpaseo/server 0.1.71 → 0.1.73
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/server/agent/agent-archive.d.ts +11 -0
- package/dist/server/server/agent/agent-archive.d.ts.map +1 -0
- package/dist/server/server/agent/agent-archive.js +16 -0
- package/dist/server/server/agent/agent-archive.js.map +1 -0
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +3 -23
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +2 -1
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/create-agent-title.d.ts +8 -0
- package/dist/server/server/agent/create-agent-title.d.ts.map +1 -0
- package/dist/server/server/agent/create-agent-title.js +29 -0
- package/dist/server/server/agent/create-agent-title.js.map +1 -0
- package/dist/server/server/agent/import-sessions.d.ts +20 -1
- package/dist/server/server/agent/import-sessions.d.ts.map +1 -1
- package/dist/server/server/agent/import-sessions.js +101 -0
- package/dist/server/server/agent/import-sessions.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +1 -0
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +2 -1
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +25 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js +183 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +31 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +172 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js.map +1 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +1 -21
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +2 -171
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode/runtime.d.ts +27 -0
- package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/runtime.js +5 -0
- package/dist/server/server/agent/providers/opencode/runtime.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +55 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +255 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js +28 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts +75 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js +169 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +1 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +38 -36
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +556 -267
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts +8 -3
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.js +44 -34
- package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
- package/dist/server/server/bootstrap.d.ts +2 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +45 -8
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/checkout/status-projection.d.ts +19 -0
- package/dist/server/server/checkout/status-projection.d.ts.map +1 -0
- package/dist/server/server/checkout/status-projection.js +98 -0
- package/dist/server/server/checkout/status-projection.js.map +1 -0
- package/dist/server/server/file-explorer/service.d.ts.map +1 -1
- package/dist/server/server/file-explorer/service.js +84 -67
- package/dist/server/server/file-explorer/service.js.map +1 -1
- package/dist/server/server/paseo-worktree-service.d.ts +2 -1
- package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-service.js +30 -3
- package/dist/server/server/paseo-worktree-service.js.map +1 -1
- package/dist/server/server/push/notifications.d.ts +9 -0
- package/dist/server/server/push/notifications.d.ts.map +1 -0
- package/dist/server/server/push/notifications.js +15 -0
- package/dist/server/server/push/notifications.js.map +1 -0
- package/dist/server/server/push/push-service.d.ts +1 -2
- package/dist/server/server/push/push-service.d.ts.map +1 -1
- package/dist/server/server/relay-transport.d.ts +7 -1
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +10 -5
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/session.d.ts +1 -17
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +24 -233
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/websocket/runtime-metrics.d.ts +71 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts.map +1 -0
- package/dist/server/server/websocket/runtime-metrics.js +148 -0
- package/dist/server/server/websocket/runtime-metrics.js.map +1 -0
- package/dist/server/server/websocket-server.d.ts +4 -21
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +28 -137
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-directory.d.ts +0 -2
- package/dist/server/server/workspace-directory.d.ts.map +1 -1
- package/dist/server/server/workspace-directory.js +9 -26
- package/dist/server/server/workspace-directory.js.map +1 -1
- package/dist/server/shared/agent-state-bucket.d.ts +13 -0
- package/dist/server/shared/agent-state-bucket.d.ts.map +1 -0
- package/dist/server/shared/agent-state-bucket.js +41 -0
- package/dist/server/shared/agent-state-bucket.js.map +1 -0
- package/dist/server/shared/connection-offer.d.ts +6 -6
- package/dist/server/shared/connection-offer.js +1 -1
- package/dist/server/shared/connection-offer.js.map +1 -1
- package/dist/server/shared/git-remote.d.ts +16 -0
- package/dist/server/shared/git-remote.d.ts.map +1 -0
- package/dist/server/shared/git-remote.js +72 -0
- package/dist/server/shared/git-remote.js.map +1 -0
- package/dist/server/utils/checkout-git.d.ts +1 -0
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +3 -0
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/github-remote.d.ts +3 -7
- package/dist/server/utils/github-remote.d.ts.map +1 -1
- package/dist/server/utils/github-remote.js +4 -70
- package/dist/server/utils/github-remote.js.map +1 -1
- package/dist/server/utils/run-git-command.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.js +1 -0
- package/dist/server/utils/run-git-command.js.map +1 -1
- package/dist/src/server/agent/provider-launch-config.js +1 -0
- package/dist/src/server/agent/provider-launch-config.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export function buildCheckoutStatusPayloadFromSnapshot({ cwd, requestId, snapshot, }) {
|
|
2
|
+
if (!snapshot.git.isGit) {
|
|
3
|
+
return {
|
|
4
|
+
cwd,
|
|
5
|
+
isGit: false,
|
|
6
|
+
repoRoot: null,
|
|
7
|
+
currentBranch: null,
|
|
8
|
+
isDirty: null,
|
|
9
|
+
baseRef: null,
|
|
10
|
+
aheadBehind: null,
|
|
11
|
+
aheadOfOrigin: null,
|
|
12
|
+
behindOfOrigin: null,
|
|
13
|
+
hasRemote: false,
|
|
14
|
+
remoteUrl: null,
|
|
15
|
+
isPaseoOwnedWorktree: false,
|
|
16
|
+
error: null,
|
|
17
|
+
requestId,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (snapshot.git.repoRoot === null || snapshot.git.isDirty === null) {
|
|
21
|
+
throw new Error("Workspace git snapshot is missing required checkout status fields");
|
|
22
|
+
}
|
|
23
|
+
if (snapshot.git.isPaseoOwnedWorktree) {
|
|
24
|
+
if (snapshot.git.mainRepoRoot === null || snapshot.git.baseRef === null) {
|
|
25
|
+
throw new Error("Workspace git snapshot is missing required worktree status fields");
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
cwd,
|
|
29
|
+
isGit: true,
|
|
30
|
+
repoRoot: snapshot.git.repoRoot,
|
|
31
|
+
mainRepoRoot: snapshot.git.mainRepoRoot,
|
|
32
|
+
currentBranch: snapshot.git.currentBranch ?? null,
|
|
33
|
+
isDirty: snapshot.git.isDirty,
|
|
34
|
+
baseRef: snapshot.git.baseRef,
|
|
35
|
+
aheadBehind: snapshot.git.aheadBehind ?? null,
|
|
36
|
+
aheadOfOrigin: snapshot.git.aheadOfOrigin ?? null,
|
|
37
|
+
behindOfOrigin: snapshot.git.behindOfOrigin ?? null,
|
|
38
|
+
hasRemote: snapshot.git.hasRemote,
|
|
39
|
+
remoteUrl: snapshot.git.remoteUrl,
|
|
40
|
+
isPaseoOwnedWorktree: true,
|
|
41
|
+
error: null,
|
|
42
|
+
requestId,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
cwd,
|
|
47
|
+
isGit: true,
|
|
48
|
+
repoRoot: snapshot.git.repoRoot,
|
|
49
|
+
mainRepoRoot: snapshot.git.mainRepoRoot,
|
|
50
|
+
currentBranch: snapshot.git.currentBranch ?? null,
|
|
51
|
+
isDirty: snapshot.git.isDirty,
|
|
52
|
+
baseRef: snapshot.git.baseRef ?? null,
|
|
53
|
+
aheadBehind: snapshot.git.aheadBehind ?? null,
|
|
54
|
+
aheadOfOrigin: snapshot.git.aheadOfOrigin ?? null,
|
|
55
|
+
behindOfOrigin: snapshot.git.behindOfOrigin ?? null,
|
|
56
|
+
hasRemote: snapshot.git.hasRemote,
|
|
57
|
+
remoteUrl: snapshot.git.remoteUrl,
|
|
58
|
+
isPaseoOwnedWorktree: false,
|
|
59
|
+
error: null,
|
|
60
|
+
requestId,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function buildCheckoutPrStatusPayloadFromSnapshot({ cwd, requestId, snapshot, }) {
|
|
64
|
+
return {
|
|
65
|
+
cwd,
|
|
66
|
+
status: normalizeCheckoutPrStatusPayload(snapshot.github.pullRequest),
|
|
67
|
+
githubFeaturesEnabled: snapshot.github.featuresEnabled,
|
|
68
|
+
error: snapshot.github.error
|
|
69
|
+
? {
|
|
70
|
+
code: "UNKNOWN",
|
|
71
|
+
message: snapshot.github.error.message,
|
|
72
|
+
}
|
|
73
|
+
: null,
|
|
74
|
+
requestId,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function normalizeCheckoutPrStatusPayload(status) {
|
|
78
|
+
if (!status) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
number: status.number,
|
|
83
|
+
url: status.url,
|
|
84
|
+
title: status.title,
|
|
85
|
+
state: status.state,
|
|
86
|
+
repoOwner: status.repoOwner,
|
|
87
|
+
repoName: status.repoName,
|
|
88
|
+
baseRefName: status.baseRefName,
|
|
89
|
+
headRefName: status.headRefName,
|
|
90
|
+
isMerged: status.isMerged,
|
|
91
|
+
isDraft: status.isDraft ?? false,
|
|
92
|
+
mergeable: status.mergeable ?? "UNKNOWN",
|
|
93
|
+
checks: status.checks ?? [],
|
|
94
|
+
checksStatus: status.checksStatus,
|
|
95
|
+
reviewDecision: status.reviewDecision,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=status-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-projection.js","sourceRoot":"","sources":["../../../../src/server/checkout/status-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/server/file-explorer/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/server/file-explorer/service.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,CAAC;AACrD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE3D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAsCD,wBAAsB,oBAAoB,CAAC,EACzC,IAAI,EACJ,YAAkB,GACnB,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6CtD;AAED,wBAAsB,gBAAgB,CAAC,EACrC,IAAI,EACJ,YAAY,GACb,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmC5C;AAED,wBAAsB,qBAAqB,CAAC,EAC1C,IAAI,EACJ,YAAY,GACb,EAAE,cAAc,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAiDjD;AAED,wBAAsB,uBAAuB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC;IAC7F,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAkCD"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { promises as fs } from "fs";
|
|
1
|
+
import { constants, promises as fs } from "fs";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import { resolvePathFromBase } from "../path-utils.js";
|
|
4
4
|
const TEXT_MIME_TYPES = {
|
|
5
5
|
".json": "application/json",
|
|
6
6
|
};
|
|
7
7
|
const DEFAULT_TEXT_MIME_TYPE = "text/plain";
|
|
8
|
+
const FILE_TYPE_SAMPLE_BYTES = 8192;
|
|
9
|
+
const READ_FILE_OPEN_FLAGS = process.platform === "win32" ? constants.O_RDONLY : constants.O_RDONLY | constants.O_NOFOLLOW;
|
|
10
|
+
const ACCESS_OUTSIDE_WORKSPACE_MESSAGE = "Access outside of workspace is not allowed";
|
|
8
11
|
const IMAGE_MIME_TYPES = {
|
|
9
12
|
".png": "image/png",
|
|
10
13
|
".jpg": "image/jpeg",
|
|
@@ -15,13 +18,13 @@ const IMAGE_MIME_TYPES = {
|
|
|
15
18
|
};
|
|
16
19
|
export async function listDirectoryEntries({ root, relativePath = ".", }) {
|
|
17
20
|
const directoryPath = await resolveScopedPath({ root, relativePath });
|
|
18
|
-
const stats = await fs.stat(directoryPath);
|
|
21
|
+
const stats = await fs.stat(directoryPath.resolvedPath);
|
|
19
22
|
if (!stats.isDirectory()) {
|
|
20
23
|
throw new Error("Requested path is not a directory");
|
|
21
24
|
}
|
|
22
|
-
const dirents = await fs.readdir(directoryPath, { withFileTypes: true });
|
|
25
|
+
const dirents = await fs.readdir(directoryPath.resolvedPath, { withFileTypes: true });
|
|
23
26
|
const entriesWithNulls = await Promise.all(dirents.map(async (dirent) => {
|
|
24
|
-
const targetPath = path.join(directoryPath, dirent.name);
|
|
27
|
+
const targetPath = path.join(directoryPath.requestedPath, dirent.name);
|
|
25
28
|
const kind = dirent.isDirectory() ? "directory" : "file";
|
|
26
29
|
try {
|
|
27
30
|
return await buildEntryPayload({
|
|
@@ -34,7 +37,7 @@ export async function listDirectoryEntries({ root, relativePath = ".", }) {
|
|
|
34
37
|
catch (error) {
|
|
35
38
|
// Directories can contain dangling links (e.g. AGENTS.md -> CLAUDE.md).
|
|
36
39
|
// Skip entries whose targets disappeared instead of failing the whole listing.
|
|
37
|
-
if (isMissingEntryError(error)) {
|
|
40
|
+
if (isMissingEntryError(error) || isOutsideWorkspaceError(error)) {
|
|
38
41
|
return null;
|
|
39
42
|
}
|
|
40
43
|
throw error;
|
|
@@ -49,7 +52,7 @@ export async function listDirectoryEntries({ root, relativePath = ".", }) {
|
|
|
49
52
|
return a.name.localeCompare(b.name);
|
|
50
53
|
});
|
|
51
54
|
return {
|
|
52
|
-
path: normalizeRelativePath({ root, targetPath: directoryPath }),
|
|
55
|
+
path: normalizeRelativePath({ root, targetPath: directoryPath.requestedPath }),
|
|
53
56
|
entries,
|
|
54
57
|
};
|
|
55
58
|
}
|
|
@@ -88,103 +91,114 @@ export async function readExplorerFile({ root, relativePath, }) {
|
|
|
88
91
|
}
|
|
89
92
|
export async function readExplorerFileBytes({ root, relativePath, }) {
|
|
90
93
|
const filePath = await resolveScopedPath({ root, relativePath });
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const buffer = await fs.readFile(filePath);
|
|
103
|
-
return {
|
|
104
|
-
...basePayload,
|
|
105
|
-
kind: "image",
|
|
106
|
-
encoding: "binary",
|
|
107
|
-
bytes: buffer,
|
|
108
|
-
mimeType: IMAGE_MIME_TYPES[ext],
|
|
94
|
+
const handle = await openFileForRead(filePath.resolvedPath);
|
|
95
|
+
try {
|
|
96
|
+
const stats = await handle.stat();
|
|
97
|
+
if (!stats.isFile()) {
|
|
98
|
+
throw new Error("Requested path is not a file");
|
|
99
|
+
}
|
|
100
|
+
const ext = path.extname(filePath.resolvedPath).toLowerCase();
|
|
101
|
+
const basePayload = {
|
|
102
|
+
path: normalizeRelativePath({ root, targetPath: filePath.requestedPath }),
|
|
103
|
+
size: stats.size,
|
|
104
|
+
modifiedAt: stats.mtime.toISOString(),
|
|
109
105
|
};
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
106
|
+
const buffer = await handle.readFile();
|
|
107
|
+
if (ext in IMAGE_MIME_TYPES) {
|
|
108
|
+
return {
|
|
109
|
+
...basePayload,
|
|
110
|
+
kind: "image",
|
|
111
|
+
encoding: "binary",
|
|
112
|
+
bytes: buffer,
|
|
113
|
+
mimeType: IMAGE_MIME_TYPES[ext],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (isLikelyBinary(buffer)) {
|
|
117
|
+
return {
|
|
118
|
+
...basePayload,
|
|
119
|
+
kind: "binary",
|
|
120
|
+
encoding: "binary",
|
|
121
|
+
bytes: buffer,
|
|
122
|
+
mimeType: "application/octet-stream",
|
|
123
|
+
};
|
|
124
|
+
}
|
|
113
125
|
return {
|
|
114
126
|
...basePayload,
|
|
115
|
-
kind: "
|
|
116
|
-
encoding: "
|
|
127
|
+
kind: "text",
|
|
128
|
+
encoding: "utf-8",
|
|
117
129
|
bytes: buffer,
|
|
118
|
-
mimeType:
|
|
130
|
+
mimeType: textMimeTypeForExtension(ext),
|
|
119
131
|
};
|
|
120
132
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
encoding: "utf-8",
|
|
125
|
-
bytes: buffer,
|
|
126
|
-
mimeType: textMimeTypeForExtension(ext),
|
|
127
|
-
};
|
|
133
|
+
finally {
|
|
134
|
+
await handle.close();
|
|
135
|
+
}
|
|
128
136
|
}
|
|
129
137
|
export async function getDownloadableFileInfo({ root, relativePath }) {
|
|
130
138
|
const filePath = await resolveScopedPath({ root, relativePath });
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
mimeType =
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
try {
|
|
139
|
+
const handle = await openFileForRead(filePath.resolvedPath);
|
|
140
|
+
try {
|
|
141
|
+
const stats = await handle.stat();
|
|
142
|
+
if (!stats.isFile()) {
|
|
143
|
+
throw new Error("Requested path is not a file");
|
|
144
|
+
}
|
|
145
|
+
const ext = path.extname(filePath.resolvedPath).toLowerCase();
|
|
146
|
+
let mimeType = "application/octet-stream";
|
|
147
|
+
if (ext in IMAGE_MIME_TYPES) {
|
|
148
|
+
mimeType = IMAGE_MIME_TYPES[ext];
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
const sample = Buffer.alloc(FILE_TYPE_SAMPLE_BYTES);
|
|
145
152
|
const { bytesRead } = await handle.read(sample, 0, sample.length, 0);
|
|
146
153
|
const chunk = bytesRead < sample.length ? sample.subarray(0, bytesRead) : sample;
|
|
147
154
|
if (!isLikelyBinary(chunk)) {
|
|
148
155
|
mimeType = textMimeTypeForExtension(ext);
|
|
149
156
|
}
|
|
150
157
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
158
|
+
return {
|
|
159
|
+
path: normalizeRelativePath({ root, targetPath: filePath.requestedPath }),
|
|
160
|
+
absolutePath: filePath.resolvedPath,
|
|
161
|
+
fileName: path.basename(filePath.requestedPath),
|
|
162
|
+
mimeType,
|
|
163
|
+
size: stats.size,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
await handle.close();
|
|
154
168
|
}
|
|
155
|
-
return {
|
|
156
|
-
path: normalizeRelativePath({ root, targetPath: filePath }),
|
|
157
|
-
absolutePath: filePath,
|
|
158
|
-
fileName: path.basename(filePath),
|
|
159
|
-
mimeType,
|
|
160
|
-
size: stats.size,
|
|
161
|
-
};
|
|
162
169
|
}
|
|
163
|
-
async function resolveScopedPath({ root, relativePath = "." }) {
|
|
170
|
+
async function resolveScopedPath({ root, relativePath = ".", }) {
|
|
164
171
|
const normalizedRoot = path.resolve(root);
|
|
165
172
|
const requestedPath = resolvePathFromBase(normalizedRoot, relativePath);
|
|
166
173
|
const relative = path.relative(normalizedRoot, requestedPath);
|
|
167
174
|
if (relative !== "" && (relative.startsWith("..") || path.isAbsolute(relative))) {
|
|
168
|
-
throw new Error(
|
|
175
|
+
throw new Error(ACCESS_OUTSIDE_WORKSPACE_MESSAGE);
|
|
169
176
|
}
|
|
170
177
|
const realRoot = await fs.realpath(normalizedRoot);
|
|
171
178
|
try {
|
|
172
179
|
const realPath = await fs.realpath(requestedPath);
|
|
173
180
|
const realRelative = path.relative(realRoot, realPath);
|
|
174
181
|
if (realRelative !== "" && (realRelative.startsWith("..") || path.isAbsolute(realRelative))) {
|
|
175
|
-
throw new Error(
|
|
182
|
+
throw new Error(ACCESS_OUTSIDE_WORKSPACE_MESSAGE);
|
|
176
183
|
}
|
|
177
|
-
return requestedPath;
|
|
184
|
+
return { requestedPath, resolvedPath: realPath };
|
|
178
185
|
}
|
|
179
186
|
catch (error) {
|
|
180
187
|
if (isMissingEntryError(error)) {
|
|
181
|
-
return requestedPath;
|
|
188
|
+
return { requestedPath, resolvedPath: requestedPath };
|
|
182
189
|
}
|
|
183
190
|
throw error;
|
|
184
191
|
}
|
|
185
192
|
}
|
|
193
|
+
async function openFileForRead(filePath) {
|
|
194
|
+
return fs.open(filePath, READ_FILE_OPEN_FLAGS);
|
|
195
|
+
}
|
|
186
196
|
async function buildEntryPayload({ root, targetPath, name, kind, }) {
|
|
187
|
-
const
|
|
197
|
+
const entryPath = await resolveScopedPath({
|
|
198
|
+
root,
|
|
199
|
+
relativePath: normalizeRelativePath({ root, targetPath }),
|
|
200
|
+
});
|
|
201
|
+
const stats = await fs.stat(entryPath.resolvedPath);
|
|
188
202
|
return {
|
|
189
203
|
name,
|
|
190
204
|
path: normalizeRelativePath({ root, targetPath }),
|
|
@@ -197,6 +211,9 @@ function isMissingEntryError(error) {
|
|
|
197
211
|
const code = error?.code;
|
|
198
212
|
return code === "ENOENT" || code === "ENOTDIR" || code === "ELOOP";
|
|
199
213
|
}
|
|
214
|
+
function isOutsideWorkspaceError(error) {
|
|
215
|
+
return error instanceof Error && error.message === ACCESS_OUTSIDE_WORKSPACE_MESSAGE;
|
|
216
|
+
}
|
|
200
217
|
function normalizeRelativePath({ root, targetPath }) {
|
|
201
218
|
const normalizedRoot = path.resolve(root);
|
|
202
219
|
const normalizedTarget = path.resolve(targetPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/server/file-explorer/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../src/server/file-explorer/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { WorkspaceGitService } from "./workspace-git-service.js";
|
|
|
2
2
|
import { type PersistedWorkspaceRecord, type ProjectRegistry, type WorkspaceRegistry } from "./workspace-registry.js";
|
|
3
3
|
import { type CreateWorktreeCoreDeps, type CreateWorktreeCoreInput } from "./worktree-core.js";
|
|
4
4
|
import { type WorktreeConfig } from "../utils/worktree.js";
|
|
5
|
-
import { getCurrentBranch, renameCurrentBranch } from "../utils/checkout-git.js";
|
|
5
|
+
import { getCurrentBranch, localBranchExists, renameCurrentBranch } from "../utils/checkout-git.js";
|
|
6
6
|
import type { WorktreeCreationIntent } from "./resolve-worktree-creation-intent.js";
|
|
7
7
|
import type { FirstAgentContext } from "../shared/messages.js";
|
|
8
8
|
export type CreatePaseoWorktreeInput = CreateWorktreeCoreInput;
|
|
@@ -36,5 +36,6 @@ export declare function attemptFirstAgentBranchAutoName(options: {
|
|
|
36
36
|
}) => Promise<string | null>;
|
|
37
37
|
getCurrentBranch?: typeof getCurrentBranch;
|
|
38
38
|
renameCurrentBranch?: typeof renameCurrentBranch;
|
|
39
|
+
localBranchExists?: typeof localBranchExists;
|
|
39
40
|
}): Promise<AttemptFirstAgentBranchAutoNameResult>;
|
|
40
41
|
//# sourceMappingURL=paseo-worktree-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paseo-worktree-service.d.ts","sourceRoot":"","sources":["../../../src/server/paseo-worktree-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"paseo-worktree-service.d.ts","sourceRoot":"","sources":["../../../src/server/paseo-worktree-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAGvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMpG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAEpF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,MAAM,wBAAwB,GAAG,uBAAuB,CAAC;AAE/D,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,SAAS,EAAE,wBAAwB,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,KAAK,EAAE,wBAAwB,EAC/B,OAAO,CAAC,EAAE;IACR,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D,KACE,OAAO,CAAC,yBAAyB,CAAC,CAAC;AAExC,MAAM,WAAW,qCAAqC;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;IACzD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;IACtE,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,EAC/B,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,yBAAyB,CAAC,CAmBpC;AAED,wBAAsB,+BAA+B,CAAC,OAAO,EAAE;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACjD,6BAA6B,EAAE,CAAC,KAAK,EAAE;QACrC,GAAG,EAAE,MAAM,CAAC;QACZ,iBAAiB,EAAE,iBAAiB,CAAC;KACtC,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC3C,mBAAmB,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACjD,iBAAiB,CAAC,EAAE,OAAO,iBAAiB,CAAC;CAC9C,GAAG,OAAO,CAAC,qCAAqC,CAAC,CA8DjD"}
|
|
@@ -2,7 +2,7 @@ import { createPersistedProjectRecord, createPersistedWorkspaceRecord, } from ".
|
|
|
2
2
|
import { deriveProjectGroupingName, normalizeWorkspaceId } from "./workspace-registry-model.js";
|
|
3
3
|
import { createWorktreeCore, } from "./worktree-core.js";
|
|
4
4
|
import { validateBranchSlug } from "../utils/worktree.js";
|
|
5
|
-
import { getCurrentBranch, renameCurrentBranch } from "../utils/checkout-git.js";
|
|
5
|
+
import { getCurrentBranch, localBranchExists, renameCurrentBranch } from "../utils/checkout-git.js";
|
|
6
6
|
import { markPaseoWorktreeFirstAgentBranchAutoNameAttempted, readPaseoWorktreeMetadata, writePaseoWorktreeFirstAgentBranchAutoNameMetadata, } from "../utils/worktree-metadata.js";
|
|
7
7
|
import { buildAgentBranchNameSeed } from "./agent/prompt-attachments.js";
|
|
8
8
|
export async function createPaseoWorktree(input, deps) {
|
|
@@ -61,14 +61,41 @@ export async function attemptFirstAgentBranchAutoName(options) {
|
|
|
61
61
|
if ((await getCurrentBranchImpl(options.cwd)) !== placeholderBranchName) {
|
|
62
62
|
return { attempted: true, renamed: false, branchName: null };
|
|
63
63
|
}
|
|
64
|
+
const localBranchExistsImpl = options.localBranchExists ?? localBranchExists;
|
|
65
|
+
const targetName = await findAvailableBranchName({
|
|
66
|
+
cwd: options.cwd,
|
|
67
|
+
desiredName: branchName,
|
|
68
|
+
placeholderBranchName,
|
|
69
|
+
localBranchExists: localBranchExistsImpl,
|
|
70
|
+
});
|
|
71
|
+
if (!targetName) {
|
|
72
|
+
return { attempted: true, renamed: false, branchName: null };
|
|
73
|
+
}
|
|
64
74
|
const renameCurrentBranchImpl = options.renameCurrentBranch ?? renameCurrentBranch;
|
|
65
|
-
const renamedBranch = await renameCurrentBranchImpl(options.cwd,
|
|
75
|
+
const renamedBranch = await renameCurrentBranchImpl(options.cwd, targetName);
|
|
66
76
|
return {
|
|
67
77
|
attempted: true,
|
|
68
78
|
renamed: true,
|
|
69
|
-
branchName: renamedBranch.currentBranch ??
|
|
79
|
+
branchName: renamedBranch.currentBranch ?? targetName,
|
|
70
80
|
};
|
|
71
81
|
}
|
|
82
|
+
const MAX_BRANCH_NAME_SUFFIX_ATTEMPTS = 50;
|
|
83
|
+
async function findAvailableBranchName(options) {
|
|
84
|
+
const { cwd, desiredName, placeholderBranchName } = options;
|
|
85
|
+
if (!(await options.localBranchExists(cwd, desiredName))) {
|
|
86
|
+
return desiredName;
|
|
87
|
+
}
|
|
88
|
+
for (let suffix = 2; suffix <= MAX_BRANCH_NAME_SUFFIX_ATTEMPTS; suffix++) {
|
|
89
|
+
const candidate = `${desiredName}-${suffix}`;
|
|
90
|
+
if (candidate === placeholderBranchName) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (!(await options.localBranchExists(cwd, candidate))) {
|
|
94
|
+
return candidate;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
72
99
|
function maybeMarkFirstAgentBranchAutoNameEligible(options) {
|
|
73
100
|
const { createdWorktree } = options;
|
|
74
101
|
if (!createdWorktree.created || createdWorktree.intent.kind !== "branch-off") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paseo-worktree-service.js","sourceRoot":"","sources":["../../../src/server/paseo-worktree-service.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAuB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"paseo-worktree-service.js","sourceRoot":"","sources":["../../../src/server/paseo-worktree-service.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAChG,OAAO,EACL,kBAAkB,GAGnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAuB,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpG,OAAO,EACL,kDAAkD,EAClD,yBAAyB,EACzB,kDAAkD,GACnD,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAgCzE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAA+B,EAC/B,IAA6B;IAE7B,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9D,yCAAyC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,0BAA0B,CAAC;QACjD,QAAQ,EAAE,KAAK,CAAC,GAAG;QACnB,QAAQ,EAAE,eAAe,CAAC,QAAQ;QAClC,QAAQ,EAAE,eAAe,CAAC,QAAQ;QAClC,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,eAAe,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAEvE,OAAO;QACL,QAAQ,EAAE,eAAe,CAAC,QAAQ;QAClC,MAAM,EAAE,eAAe,CAAC,MAAM;QAC9B,SAAS;QACT,QAAQ,EAAE,eAAe,CAAC,QAAQ;QAClC,OAAO,EAAE,eAAe,CAAC,OAAO;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,OAUrD;IACC,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACpD,IAAI,CAAC,iBAAiB,IAAI,CAAC,wBAAwB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IAED,IAAI,QAAsD,CAAC;IAC3D,IAAI,CAAC;QACH,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IACD,IACE,CAAC,QAAQ;QACT,QAAQ,CAAC,OAAO,KAAK,CAAC;QACtB,QAAQ,CAAC,wBAAwB,EAAE,MAAM,KAAK,SAAS,EACvD,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IAED,MAAM,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;IAC1E,MAAM,qBAAqB,GAAG,QAAQ,CAAC,wBAAwB,CAAC,qBAAqB,CAAC;IACtF,IAAI,CAAC,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;QACxE,kDAAkD,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,kDAAkD,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,6BAA6B,CAAC;QAC7D,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,iBAAiB;KAClB,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,KAAK,qBAAqB,EAAE,CAAC;QAC9D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,MAAM,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;QACxE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,qBAAqB,GAAG,OAAO,CAAC,iBAAiB,IAAI,iBAAiB,CAAC;IAC7E,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC;QAC/C,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,UAAU;QACvB,qBAAqB;QACrB,iBAAiB,EAAE,qBAAqB;KACzC,CAAC,CAAC;IACH,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,IAAI,mBAAmB,CAAC;IACnF,MAAM,aAAa,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7E,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,aAAa,CAAC,aAAa,IAAI,UAAU;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAE3C,KAAK,UAAU,uBAAuB,CAAC,OAKtC;IACC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC;IAC5D,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,+BAA+B,EAAE,MAAM,EAAE,EAAE,CAAC;QACzE,MAAM,SAAS,GAAG,GAAG,WAAW,IAAI,MAAM,EAAE,CAAC;QAC7C,IAAI,SAAS,KAAK,qBAAqB,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yCAAyC,CAAC,OAElD;IACC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACpC,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC7E,OAAO;IACT,CAAC;IAED,kDAAkD,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,EAAE;QACxF,qBAAqB,EAAE,eAAe,CAAC,QAAQ,CAAC,UAAU;KAC3D,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,OAKzC;IACC,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC1E,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,MAAM,wBAAwB,CACtD,aAAa,EACb,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAC/B,CAAC;IACF,MAAM,aAAa,GAAG,MAAM,+BAA+B,CAAC;QAC1D,QAAQ,EAAE,kBAAkB;QAC5B,QAAQ,EAAE,kBAAkB;QAC5B,iBAAiB;QACjB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,aAAa,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CACvC,4BAA4B,CAAC;QAC3B,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,WAAW,EAAE,aAAa,CAAC,WAAW;QACtC,SAAS,EAAE,aAAa,CAAC,SAAS,IAAI,GAAG;QACzC,SAAS,EAAE,GAAG;QACd,UAAU,EAAE,IAAI;KACjB,CAAC,CACH,CAAC;IAEF,MAAM,SAAS,GAAG,8BAA8B,CAAC;QAC/C,WAAW;QACX,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,GAAG,EAAE,aAAa;QAClB,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,IAAI,aAAa;QACzD,SAAS,EAAE,iBAAiB,EAAE,SAAS,IAAI,GAAG;QAC9C,SAAS,EAAE,GAAG;QACd,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,SAAS,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,+BAA+B,CAAC,OAK9C;IAOC,MAAM,eAAe,GACnB,OAAO,CAAC,iBAAiB;QACzB,CAAC,MAAM,sBAAsB,CAAC;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB;SAClD,CAAC,CAAC,CAAC;IACN,MAAM,aAAa,GAAG,eAAe;QACnC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC;QACnE,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO;YACL,SAAS,EAAE,eAAe,CAAC,SAAS;YACpC,QAAQ,EAAE,aAAa,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ;YACrD,IAAI,EAAE,KAAK;YACX,WAAW,EACT,aAAa,EAAE,WAAW,IAAI,yBAAyB,CAAC,eAAe,CAAC,SAAS,CAAC;YACpF,SAAS,EAAE,aAAa,EAAE,SAAS,IAAI,IAAI;SAC5C,CAAC;IACJ,CAAC;IAED,MAAM,uBAAuB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzF,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ;QAC/D,IAAI,EAAE,KAAK;QACX,WAAW,EACT,uBAAuB,EAAE,WAAW,IAAI,yBAAyB,CAAC,OAAO,CAAC,QAAQ,CAAC;QACrF,SAAS,EAAE,uBAAuB,EAAE,SAAS,IAAI,IAAI;KACtD,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,OAIrC;IACC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAC1D,OAAO,CACL,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC3F,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC3F,IAAI,CACL,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,GAAW,EACX,iBAAkD;IAElD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type pino from "pino";
|
|
2
|
+
import { type PushPayload } from "./push-service.js";
|
|
3
|
+
import type { PushTokenStore } from "./token-store.js";
|
|
4
|
+
export type { PushPayload };
|
|
5
|
+
export interface PushNotificationSender {
|
|
6
|
+
send(payload: PushPayload): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createPushNotificationSender(logger: pino.Logger, tokenStore: PushTokenStore): PushNotificationSender;
|
|
9
|
+
//# sourceMappingURL=notifications.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../../../src/server/push/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,UAAU,EAAE,cAAc,GACzB,sBAAsB,CAcxB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PushService } from "./push-service.js";
|
|
2
|
+
export function createPushNotificationSender(logger, tokenStore) {
|
|
3
|
+
const pushService = new PushService(logger, tokenStore);
|
|
4
|
+
return {
|
|
5
|
+
async send(payload) {
|
|
6
|
+
const tokens = tokenStore.getAllTokens();
|
|
7
|
+
logger.info({ tokenCount: tokens.length }, "Sending push notification");
|
|
8
|
+
if (tokens.length === 0) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
await pushService.sendPush(tokens, payload);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../../../src/server/push/notifications.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AASlE,MAAM,UAAU,4BAA4B,CAC1C,MAAmB,EACnB,UAA0B;IAE1B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAExD,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,OAAO;YAChB,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC;YACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PushTokenStore } from "./token-store.js";
|
|
2
2
|
import type pino from "pino";
|
|
3
|
-
interface PushPayload {
|
|
3
|
+
export interface PushPayload {
|
|
4
4
|
title: string;
|
|
5
5
|
body: string;
|
|
6
6
|
data?: Record<string, unknown>;
|
|
@@ -17,5 +17,4 @@ export declare class PushService {
|
|
|
17
17
|
private sendBatch;
|
|
18
18
|
private handleTickets;
|
|
19
19
|
}
|
|
20
|
-
export {};
|
|
21
20
|
//# sourceMappingURL=push-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push-service.d.ts","sourceRoot":"","sources":["../../../../src/server/push/push-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,
|
|
1
|
+
{"version":3,"file":"push-service.d.ts","sourceRoot":"","sources":["../../../../src/server/push/push-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAoBD;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAEhC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc;IAKrD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAsBvD,SAAS;IA0BvB,OAAO,CAAC,aAAa;CAqBtB"}
|
|
@@ -8,6 +8,7 @@ interface RelayTransportOptions {
|
|
|
8
8
|
relayUseTls: boolean;
|
|
9
9
|
serverId: string;
|
|
10
10
|
daemonKeyPair?: KeyPair;
|
|
11
|
+
createWebSocket?: RelayWebSocketFactory;
|
|
11
12
|
}
|
|
12
13
|
export interface RelayTransportController {
|
|
13
14
|
stop: () => Promise<void>;
|
|
@@ -19,6 +20,11 @@ interface RelaySocketLike {
|
|
|
19
20
|
on: (event: "message" | "close" | "error", listener: (...args: unknown[]) => void) => void;
|
|
20
21
|
once: (event: "close" | "error", listener: (...args: unknown[]) => void) => void;
|
|
21
22
|
}
|
|
22
|
-
|
|
23
|
+
interface RelayWebSocketLike extends RelaySocketLike {
|
|
24
|
+
terminate: () => void;
|
|
25
|
+
on: (event: "open" | "message" | "close" | "error", listener: (...args: unknown[]) => void) => void;
|
|
26
|
+
}
|
|
27
|
+
type RelayWebSocketFactory = (url: string) => RelayWebSocketLike;
|
|
28
|
+
export declare function startRelayTransport({ logger, attachSocket, relayEndpoint, relayUseTls, serverId, daemonKeyPair, createWebSocket, }: RelayTransportOptions): RelayTransportController;
|
|
23
29
|
export {};
|
|
24
30
|
//# sourceMappingURL=relay-transport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-transport.d.ts","sourceRoot":"","sources":["../../../src/server/relay-transport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,UAAU,qBAAqB;IAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-transport.d.ts","sourceRoot":"","sources":["../../../src/server/relay-transport.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,UAAU,qBAAqB;IAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,UAAU,eAAe;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,KAAK,IAAI,CAAC;IACxD,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;IAC3F,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CAClF;AAED,UAAU,kBAAmB,SAAQ,eAAe;IAClD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,EAAE,EAAE,CACF,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,EAC7C,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KACnC,IAAI,CAAC;CACX;AAED,KAAK,qBAAqB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,kBAAkB,CAAC;AA0EjE,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,YAAY,EACZ,aAAa,EACb,WAAW,EACX,QAAQ,EACR,aAAa,EACb,eAA6C,GAC9C,EAAE,qBAAqB,GAAG,wBAAwB,CAgSlD"}
|