@covro/covro 0.2.0-beta.1 → 0.2.1-beta.1
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/README.md +30 -11
- package/README.zh-CN.md +30 -11
- package/dist/cli/background.js +103 -0
- package/dist/cli/background.js.map +7 -0
- package/dist/cli/daemon.js +6 -1
- package/dist/cli/daemon.js.map +2 -2
- package/dist/cli/doctor.js +92 -0
- package/dist/cli/doctor.js.map +7 -0
- package/dist/cli/launch-environment.js +85 -0
- package/dist/cli/launch-environment.js.map +7 -0
- package/dist/cli/launchd.js +172 -0
- package/dist/cli/launchd.js.map +7 -0
- package/dist/cli/main.js +7 -35
- package/dist/cli/main.js.map +2 -2
- package/dist/cli/service.js +23 -49
- package/dist/cli/service.js.map +2 -2
- package/dist/codex/adapter.js +76 -2
- package/dist/codex/adapter.js.map +2 -2
- package/dist/drizzle/0005_session_workspaces.sql +24 -0
- package/dist/drizzle/meta/0005_snapshot.json +480 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/server/auth.js +1 -1
- package/dist/server/auth.js.map +2 -2
- package/dist/server/db/operations.js +14 -1
- package/dist/server/db/operations.js.map +2 -2
- package/dist/server/db/schema.js +9 -1
- package/dist/server/db/schema.js.map +2 -2
- package/dist/server/http.js +46 -0
- package/dist/server/http.js.map +2 -2
- package/dist/server/local-files.js +2 -2
- package/dist/server/local-files.js.map +2 -2
- package/dist/server/main.js +1 -0
- package/dist/server/main.js.map +2 -2
- package/dist/server/service.js +111 -51
- package/dist/server/service.js.map +2 -2
- package/dist/server/workspaces.js +138 -0
- package/dist/server/workspaces.js.map +7 -0
- package/dist/shared/workspace-scope.js +9 -0
- package/dist/shared/workspace-scope.js.map +7 -0
- package/dist/update-worker.cjs +419 -168
- package/dist/updates/worker.js +7 -61
- package/dist/updates/worker.js.map +2 -2
- package/dist/web/assets/abnfDiagram-WEYOIA3C-B3om3w2y.js +1 -0
- package/dist/web/assets/arc-hdxlL3Om.js +1 -0
- package/dist/web/assets/architecture-WOLXFQ4H-FZOiLQD-.js +1 -0
- package/dist/web/assets/architectureDiagram-ZHVYKT53-DjatMTKS.js +36 -0
- package/dist/web/assets/array-BifhSqXX.js +1 -0
- package/dist/web/assets/blockDiagram-RJAE7QA3-Bu6LTv0p.js +140 -0
- package/dist/web/assets/c4Diagram-XDPPPE54-BGFHYP5H.js +38 -0
- package/dist/web/assets/channel-DmN_FTbE.js +1 -0
- package/dist/web/assets/chunk-2E7WHVMD-k8528aQZ.js +88 -0
- package/dist/web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/assets/chunk-4EMNKR2T-CCkntZuJ.js +1 -0
- package/dist/web/assets/chunk-55XCU76K-Br-Kelsg.js +1 -0
- package/dist/web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/assets/chunk-7S6XSTFO-C3W_8ji8.js +2 -0
- package/dist/web/assets/chunk-AQDTSKZB-DZQV76Iu.js +72 -0
- package/dist/web/assets/chunk-DSNLSHJZ-BRfUxqaq.js +129 -0
- package/dist/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/web/assets/chunk-HAGFOTED-BD5jLT7f.js +62 -0
- package/dist/web/assets/chunk-HNE4Q36P-iJGu5Gi6.js +1 -0
- package/dist/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/assets/chunk-NGNAAXSQ-C2Wy9Xmz.js +136 -0
- package/dist/web/assets/chunk-NQOKRVIF-D-yS8zxU.js +213 -0
- package/dist/web/assets/chunk-UHW7PFBP-Dnu0oPmA.js +1 -0
- package/dist/web/assets/chunk-VQ5W62QI-CzZ8zHjp.js +1 -0
- package/dist/web/assets/chunk-WQQL4CDK-Cu4nebs6.js +10 -0
- package/dist/web/assets/chunk-XXDRQBXY-DgtjWyl3.js +1 -0
- package/dist/web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/assets/chunk-YZO67HFG-CGApWL5X.js +1 -0
- package/dist/web/assets/chunk-ZAUX2LTX-D5DhZJoE.js +1 -0
- package/dist/web/assets/chunk-ZCHMQSOR-BC0ITpUM.js +2 -0
- package/dist/web/assets/classDiagram-v2-4MYWR3UA-Budj7a3U.js +217 -0
- package/dist/web/assets/cose-bilkent-JH36ORCC-DIHNUNHx.js +1 -0
- package/dist/web/assets/cynefin-EF2NZ3EQ-BRluapvc.js +1 -0
- package/dist/web/assets/cynefinDiagram-WF24UDRP-CATBOOnO.js +62 -0
- package/dist/web/assets/cytoscape.esm-BegBNzOV.js +321 -0
- package/dist/web/assets/dagre-NK4GIZVX-B8DaH0ao.js +4 -0
- package/dist/web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/assets/diagram-CBK3MWTC-C6HHNKIg.js +24 -0
- package/dist/web/assets/diagram-I5XIIV2D-BftOP4e2.js +24 -0
- package/dist/web/assets/diagram-ODIL2UCW-CCO6wwvD.js +30 -0
- package/dist/web/assets/diagram-PFBEJUXE-y6w_y2UD.js +3 -0
- package/dist/web/assets/diagram-RJA3I4VV-gsgGHcdI.js +41 -0
- package/dist/web/assets/diagram-TYUNFSNR-BFuCHkk0.js +200 -0
- package/dist/web/assets/dist-DLTSHXmk.js +1 -0
- package/dist/web/assets/ebnfDiagram-V4P3TTPT-B6_sRdDs.js +1 -0
- package/dist/web/assets/elk-QONTBCTQ-BtVt8qRm.js +27 -0
- package/dist/web/assets/erDiagram-KYQIGQAA-rgfheTvQ.js +99 -0
- package/dist/web/assets/eventmodeling-K75KTNOO-r9vnCD2d.js +1 -0
- package/dist/web/assets/flowDiagram-IUGLLWBU-CiGVEt1a.js +1 -0
- package/dist/web/assets/ganttDiagram-R7GPNTJY-CJFYABWz.js +292 -0
- package/dist/web/assets/gitGraph-VSP46ZUC-ccOuonLa.js +1 -0
- package/dist/web/assets/gitGraphDiagram-PDYL7XHY-e5kzwjY2.js +106 -0
- package/dist/web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/assets/index-B4RJQRiD.js +142 -0
- package/dist/web/assets/index-DaMLk_sl.css +1 -0
- package/dist/web/assets/info-OHQRW6UA-C8aOXyva.js +1 -0
- package/dist/web/assets/infoDiagram-MVDRKAX5-ztgQX_ha.js +2 -0
- package/dist/web/assets/init-C-OQMol4.js +1 -0
- package/dist/web/assets/ishikawaDiagram-HPEHV2GE-BPCGAT_m.js +70 -0
- package/dist/web/assets/journeyDiagram-BOSHW7O7-BoiZL6al.js +139 -0
- package/dist/web/assets/kanban-definition-FNSA4HC5-BDcWGn8E.js +89 -0
- package/dist/web/assets/katex-B_JcIwqj.js +257 -0
- package/dist/web/assets/line-nGnhrXrD.js +1 -0
- package/dist/web/assets/linear-DiAwgAUj.js +1 -0
- package/dist/web/assets/mermaid-parser.core-DAzSIS8w.js +7 -0
- package/dist/web/assets/mermaid.core-CL_7HT-R.js +44 -0
- package/dist/web/assets/mindmap-definition-6OY57UG3-Bp7IBNG5.js +98 -0
- package/dist/web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/assets/packet-JDAUHWVQ-C-1SMzOZ.js +1 -0
- package/dist/web/assets/path-fybaL0A-.js +1 -0
- package/dist/web/assets/pegDiagram-ECIUJNBX-Be1uqoNt.js +1 -0
- package/dist/web/assets/pie-XZMESJXO-Dq5h06i3.js +1 -0
- package/dist/web/assets/pieDiagram-GNMPY74T-CN5ZGBXZ.js +39 -0
- package/dist/web/assets/quadrantDiagram-D57K4MC3-C7sLKW4U.js +7 -0
- package/dist/web/assets/radar-ABXABTNO-DVVIp0T9.js +1 -0
- package/dist/web/assets/railroad-I3PHUGI6-CxxBEQri.js +1 -0
- package/dist/web/assets/railroad-abnf-LNEFI6M7-CM7hMwVK.js +1 -0
- package/dist/web/assets/railroad-ebnf-DWYD2UWJ-KUafccMV.js +1 -0
- package/dist/web/assets/railroad-peg-JR7BVNR7-5BmypBHR.js +1 -0
- package/dist/web/assets/railroadDiagram-Y72NRBL7-DHAJk4_o.js +1 -0
- package/dist/web/assets/requirementDiagram-EQYSW5RA-y9zEf_QB.js +84 -0
- package/dist/web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/assets/sankeyDiagram-SY24JHO5-C6pWLy-I.js +40 -0
- package/dist/web/assets/sequenceDiagram-BLEHNHQU-Cj-Vitmg.js +169 -0
- package/dist/web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/web/assets/src-DbSGPN_8.js +1 -0
- package/dist/web/assets/stateDiagram-v2-A6IESKWZ-RbKYMXiF.js +291 -0
- package/dist/web/assets/swimlanes-B3ENRKFQ-7bBxQYlO.js +1 -0
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-CfAECQ56.js +8 -0
- package/dist/web/assets/timeline-definition-JXYKGLGB-5mrf5Irf.js +120 -0
- package/dist/web/assets/treeView-D4JQ5SDB-DP63r0Rt.js +1 -0
- package/dist/web/assets/treemap-SAJKECNS-ChWSB650.js +1 -0
- package/dist/web/assets/usecaseDiagram-WPOLBNNX-_OObMcZu.js +328 -0
- package/dist/web/assets/vennDiagram-Q3Y3IDCW-DO1Tmzxv.js +34 -0
- package/dist/web/assets/wardley-7MLQ67FV-DcDqvVeS.js +1 -0
- package/dist/web/assets/wardleyDiagram-IVAIDKWA-i-x65JPs.js +78 -0
- package/dist/web/assets/xychartDiagram-4URNHDU4-Dlk1JIjO.js +7 -0
- package/dist/web/index.html +2 -2
- package/package.json +6 -3
- package/dist/web/assets/index-Dr0Qkixk.css +0 -1
- package/dist/web/assets/index-z5RGzL8u.js +0 -138
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { accessSync, constants, mkdirSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { eq } from "drizzle-orm";
|
|
4
|
+
import { AppError } from "../shared/errors.js";
|
|
5
|
+
import { operations, sessionWorkspaces } from "./db/schema.js";
|
|
6
|
+
import { containsPath } from "./projects.js";
|
|
7
|
+
class WorkspaceRegistry {
|
|
8
|
+
constructor(database, projects, root) {
|
|
9
|
+
this.database = database;
|
|
10
|
+
this.projects = projects;
|
|
11
|
+
this.root = root;
|
|
12
|
+
}
|
|
13
|
+
database;
|
|
14
|
+
projects;
|
|
15
|
+
root;
|
|
16
|
+
unavailable(cause) {
|
|
17
|
+
return new AppError(
|
|
18
|
+
"WORKSPACE_UNAVAILABLE",
|
|
19
|
+
cause instanceof Error ? `\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u53EF\u7528\uFF1A${cause.message}` : "\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u53EF\u7528",
|
|
20
|
+
409
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
defaultsDirectory() {
|
|
24
|
+
if (!this.root) throw this.unavailable();
|
|
25
|
+
try {
|
|
26
|
+
mkdirSync(this.root, { recursive: true, mode: 448 });
|
|
27
|
+
const root = realpathSync(this.root);
|
|
28
|
+
accessSync(root, constants.R_OK | constants.W_OK | constants.X_OK);
|
|
29
|
+
return root;
|
|
30
|
+
} catch (error) {
|
|
31
|
+
throw this.unavailable(error);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
allocations() {
|
|
35
|
+
return this.database.select().from(sessionWorkspaces).all();
|
|
36
|
+
}
|
|
37
|
+
/** A dedicated directory lets us identify a creation whose RPC receipt was lost. */
|
|
38
|
+
recoverCreation(threadId, cwd) {
|
|
39
|
+
const canonical = realpathSync(cwd);
|
|
40
|
+
const row = this.allocations().find((entry) => entry.canonicalRoot === canonical);
|
|
41
|
+
if (!row || row.threadId !== null && row.threadId !== threadId) return;
|
|
42
|
+
const operation = this.database.select().from(operations).where(eq(operations.clientOperationId, row.operationId)).get();
|
|
43
|
+
if (operation?.state !== "unknown" || !["thread.create", "thread.fork"].includes(operation.kind))
|
|
44
|
+
return;
|
|
45
|
+
this.bind(row.operationId, threadId, cwd);
|
|
46
|
+
return row.operationId;
|
|
47
|
+
}
|
|
48
|
+
inspect(row) {
|
|
49
|
+
try {
|
|
50
|
+
if (realpathSync(row.rootPath) !== row.canonicalRoot || !statSync(row.canonicalRoot).isDirectory())
|
|
51
|
+
throw new Error("\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u771F\u5B9E\u8DEF\u5F84\u5DF2\u6539\u53D8");
|
|
52
|
+
accessSync(row.canonicalRoot, constants.R_OK | constants.X_OK);
|
|
53
|
+
return {
|
|
54
|
+
projectId: null,
|
|
55
|
+
cwd: row.canonicalRoot,
|
|
56
|
+
rootPath: row.rootPath,
|
|
57
|
+
canonicalRoot: row.canonicalRoot,
|
|
58
|
+
workspaceKey: row.canonicalRoot
|
|
59
|
+
};
|
|
60
|
+
} catch (error) {
|
|
61
|
+
throw this.unavailable(error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
allocate(operationId) {
|
|
65
|
+
const existing = this.database.select().from(sessionWorkspaces).where(eq(sessionWorkspaces.operationId, operationId)).get();
|
|
66
|
+
if (existing) return this.inspect(existing);
|
|
67
|
+
const root = this.defaultsDirectory();
|
|
68
|
+
const rootPath = join(root, operationId);
|
|
69
|
+
try {
|
|
70
|
+
mkdirSync(rootPath, { mode: 448 });
|
|
71
|
+
const row = {
|
|
72
|
+
operationId,
|
|
73
|
+
threadId: null,
|
|
74
|
+
rootPath,
|
|
75
|
+
canonicalRoot: realpathSync(rootPath),
|
|
76
|
+
createdAt: Date.now()
|
|
77
|
+
};
|
|
78
|
+
this.database.insert(sessionWorkspaces).values(row).run();
|
|
79
|
+
return this.inspect(row);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
throw this.unavailable(error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
bind(operationId, threadId, cwd) {
|
|
85
|
+
const row = this.database.select().from(sessionWorkspaces).where(eq(sessionWorkspaces.operationId, operationId)).get();
|
|
86
|
+
if (!row || row.threadId !== null && row.threadId !== threadId) throw this.unavailable();
|
|
87
|
+
const scope = this.inspect(row);
|
|
88
|
+
if (realpathSync(cwd) !== scope.cwd) throw this.unavailable();
|
|
89
|
+
this.database.update(sessionWorkspaces).set({ threadId }).where(eq(sessionWorkspaces.operationId, operationId)).run();
|
|
90
|
+
}
|
|
91
|
+
assertOwnership(projectId, cwd, threadId) {
|
|
92
|
+
if (projectId !== null) {
|
|
93
|
+
const ownership = this.projects.assertOwnership(projectId, cwd);
|
|
94
|
+
this.assertOutsideManaged(ownership.cwd);
|
|
95
|
+
return {
|
|
96
|
+
...ownership,
|
|
97
|
+
projectId,
|
|
98
|
+
rootPath: ownership.project.rootPath,
|
|
99
|
+
canonicalRoot: ownership.project.canonicalRoot
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const row = this.database.select().from(sessionWorkspaces).where(eq(sessionWorkspaces.threadId, threadId)).get();
|
|
103
|
+
if (!row) throw new AppError("PROJECT_OWNERSHIP", "\u4F1A\u8BDD\u6CA1\u6709\u5DF2\u5206\u914D\u7684\u5DE5\u4F5C\u76EE\u5F55", 403);
|
|
104
|
+
const scope = this.inspect(row);
|
|
105
|
+
if (realpathSync(cwd) !== scope.cwd)
|
|
106
|
+
throw new AppError("PROJECT_OWNERSHIP", "\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u4E0E\u5DF2\u4FDD\u5B58\u7684\u5173\u8054\u4E0D\u4E00\u81F4", 403);
|
|
107
|
+
return scope;
|
|
108
|
+
}
|
|
109
|
+
assertProjectDirectory(cwd) {
|
|
110
|
+
let canonical;
|
|
111
|
+
try {
|
|
112
|
+
canonical = realpathSync(cwd);
|
|
113
|
+
} catch {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.assertOutsideManaged(canonical);
|
|
117
|
+
}
|
|
118
|
+
assertOutsideManaged(cwd) {
|
|
119
|
+
let root = this.root;
|
|
120
|
+
try {
|
|
121
|
+
if (root) root = realpathSync(root);
|
|
122
|
+
} catch {
|
|
123
|
+
}
|
|
124
|
+
if (root && containsPath(root, cwd) || this.allocations().some((row) => containsPath(row.canonicalRoot, cwd)))
|
|
125
|
+
throw new AppError("PROJECT_OWNERSHIP", "\u5E94\u7528\u7BA1\u7406\u7684\u4F1A\u8BDD\u76EE\u5F55\u4E0D\u80FD\u5F52\u5165\u9879\u76EE", 403);
|
|
126
|
+
}
|
|
127
|
+
findOwner(cwd, threadId) {
|
|
128
|
+
const row = this.database.select().from(sessionWorkspaces).where(eq(sessionWorkspaces.threadId, threadId)).get();
|
|
129
|
+
if (row) return this.assertOwnership(null, cwd, threadId);
|
|
130
|
+
this.assertOutsideManaged(realpathSync(cwd));
|
|
131
|
+
const ownership = this.projects.findOwner(cwd);
|
|
132
|
+
return this.assertOwnership(ownership.project.id, cwd, threadId);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export {
|
|
136
|
+
WorkspaceRegistry
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/server/workspaces.ts"],
|
|
4
|
+
"sourcesContent": ["import { accessSync, constants, mkdirSync, realpathSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { eq } from 'drizzle-orm';\nimport { AppError } from '../shared/errors.js';\nimport type { AppDatabase } from './db/index.js';\nimport { operations, sessionWorkspaces } from './db/schema.js';\nimport { containsPath, ProjectRegistry } from './projects.js';\n\ntype Allocation = typeof sessionWorkspaces.$inferSelect;\nexport interface WorkspaceOwnership {\n projectId: string | null;\n cwd: string;\n rootPath: string;\n canonicalRoot: string;\n workspaceKey: string;\n}\n\n/** A project association and a server-owned session directory are separate identities. */\nexport class WorkspaceRegistry {\n constructor(\n private readonly database: AppDatabase,\n private readonly projects: ProjectRegistry,\n private readonly root?: string,\n ) {}\n\n private unavailable(cause?: unknown): AppError {\n return new AppError(\n 'WORKSPACE_UNAVAILABLE',\n cause instanceof Error ? `\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u53EF\u7528\uFF1A${cause.message}` : '\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u53EF\u7528',\n 409,\n );\n }\n\n defaultsDirectory(): string {\n if (!this.root) throw this.unavailable();\n try {\n mkdirSync(this.root, { recursive: true, mode: 0o700 });\n const root = realpathSync(this.root);\n accessSync(root, constants.R_OK | constants.W_OK | constants.X_OK);\n return root;\n } catch (error) {\n throw this.unavailable(error);\n }\n }\n\n allocations(): Allocation[] {\n return this.database.select().from(sessionWorkspaces).all();\n }\n\n /** A dedicated directory lets us identify a creation whose RPC receipt was lost. */\n recoverCreation(threadId: string, cwd: string): string | undefined {\n const canonical = realpathSync(cwd);\n const row = this.allocations().find((entry) => entry.canonicalRoot === canonical);\n if (!row || (row.threadId !== null && row.threadId !== threadId)) return;\n const operation = this.database\n .select()\n .from(operations)\n .where(eq(operations.clientOperationId, row.operationId))\n .get();\n if (\n operation?.state !== 'unknown' ||\n !['thread.create', 'thread.fork'].includes(operation.kind)\n )\n return;\n this.bind(row.operationId, threadId, cwd);\n return row.operationId;\n }\n\n private inspect(row: Allocation): WorkspaceOwnership {\n try {\n if (\n realpathSync(row.rootPath) !== row.canonicalRoot ||\n !statSync(row.canonicalRoot).isDirectory()\n )\n throw new Error('\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u771F\u5B9E\u8DEF\u5F84\u5DF2\u6539\u53D8');\n accessSync(row.canonicalRoot, constants.R_OK | constants.X_OK);\n return {\n projectId: null,\n cwd: row.canonicalRoot,\n rootPath: row.rootPath,\n canonicalRoot: row.canonicalRoot,\n workspaceKey: row.canonicalRoot,\n };\n } catch (error) {\n throw this.unavailable(error);\n }\n }\n\n allocate(operationId: string): WorkspaceOwnership {\n const existing = this.database\n .select()\n .from(sessionWorkspaces)\n .where(eq(sessionWorkspaces.operationId, operationId))\n .get();\n if (existing) return this.inspect(existing);\n const root = this.defaultsDirectory();\n const rootPath = join(root, operationId);\n try {\n // Never reuse an unrecorded directory, including one left by a crashed mkdir.\n mkdirSync(rootPath, { mode: 0o700 });\n const row = {\n operationId,\n threadId: null,\n rootPath,\n canonicalRoot: realpathSync(rootPath),\n createdAt: Date.now(),\n };\n this.database.insert(sessionWorkspaces).values(row).run();\n return this.inspect(row);\n } catch (error) {\n throw this.unavailable(error);\n }\n }\n\n bind(operationId: string, threadId: string, cwd: string): void {\n const row = this.database\n .select()\n .from(sessionWorkspaces)\n .where(eq(sessionWorkspaces.operationId, operationId))\n .get();\n if (!row || (row.threadId !== null && row.threadId !== threadId)) throw this.unavailable();\n const scope = this.inspect(row);\n if (realpathSync(cwd) !== scope.cwd) throw this.unavailable();\n this.database\n .update(sessionWorkspaces)\n .set({ threadId })\n .where(eq(sessionWorkspaces.operationId, operationId))\n .run();\n }\n\n assertOwnership(projectId: string | null, cwd: string, threadId: string): WorkspaceOwnership {\n if (projectId !== null) {\n const ownership = this.projects.assertOwnership(projectId, cwd);\n this.assertOutsideManaged(ownership.cwd);\n return {\n ...ownership,\n projectId,\n rootPath: ownership.project.rootPath,\n canonicalRoot: ownership.project.canonicalRoot,\n };\n }\n const row = this.database\n .select()\n .from(sessionWorkspaces)\n .where(eq(sessionWorkspaces.threadId, threadId))\n .get();\n if (!row) throw new AppError('PROJECT_OWNERSHIP', '\u4F1A\u8BDD\u6CA1\u6709\u5DF2\u5206\u914D\u7684\u5DE5\u4F5C\u76EE\u5F55', 403);\n const scope = this.inspect(row);\n if (realpathSync(cwd) !== scope.cwd)\n throw new AppError('PROJECT_OWNERSHIP', '\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55\u4E0E\u5DF2\u4FDD\u5B58\u7684\u5173\u8054\u4E0D\u4E00\u81F4', 403);\n return scope;\n }\n\n assertProjectDirectory(cwd: string): void {\n let canonical: string;\n try {\n canonical = realpathSync(cwd);\n } catch {\n return;\n }\n this.assertOutsideManaged(canonical);\n }\n\n private assertOutsideManaged(cwd: string): void {\n let root = this.root;\n try {\n if (root) root = realpathSync(root);\n } catch {\n /* A missing root has no files to adopt. */\n }\n if (\n (root && containsPath(root, cwd)) ||\n this.allocations().some((row) => containsPath(row.canonicalRoot, cwd))\n )\n throw new AppError('PROJECT_OWNERSHIP', '\u5E94\u7528\u7BA1\u7406\u7684\u4F1A\u8BDD\u76EE\u5F55\u4E0D\u80FD\u5F52\u5165\u9879\u76EE', 403);\n }\n\n findOwner(cwd: string, threadId: string): WorkspaceOwnership {\n const row = this.database\n .select()\n .from(sessionWorkspaces)\n .where(eq(sessionWorkspaces.threadId, threadId))\n .get();\n if (row) return this.assertOwnership(null, cwd, threadId);\n this.assertOutsideManaged(realpathSync(cwd));\n const ownership = this.projects.findOwner(cwd);\n return this.assertOwnership(ownership.project.id, cwd, threadId);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const UNASSIGNED_SCOPE = "@unassigned";
|
|
2
|
+
const scopeKey = (projectId) => projectId ?? UNASSIGNED_SCOPE;
|
|
3
|
+
const scopeApi = (scope) => scope === UNASSIGNED_SCOPE ? "/api/unassigned" : `/api/projects/${encodeURIComponent(scope)}`;
|
|
4
|
+
export {
|
|
5
|
+
UNASSIGNED_SCOPE,
|
|
6
|
+
scopeApi,
|
|
7
|
+
scopeKey
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=workspace-scope.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/shared/workspace-scope.ts"],
|
|
4
|
+
"sourcesContent": ["/** Navigation keys are distinct from persisted project identities. */\nexport const UNASSIGNED_SCOPE = '@unassigned';\nexport const scopeKey = (projectId: string | null): string => projectId ?? UNASSIGNED_SCOPE;\nexport const scopeApi = (scope: string): string =>\n scope === UNASSIGNED_SCOPE ? '/api/unassigned' : `/api/projects/${encodeURIComponent(scope)}`;\n"],
|
|
5
|
+
"mappings": "AACO,MAAM,mBAAmB;AACzB,MAAM,WAAW,CAAC,cAAqC,aAAa;AACpE,MAAM,WAAW,CAAC,UACvB,UAAU,mBAAmB,oBAAoB,iBAAiB,mBAAmB,KAAK,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|