@piecemaker-legal/piecemaker 2.0.7 → 2.0.9
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/assets/{abnfDiagram-VCTEODGH-D7dCOIXi.js → abnfDiagram-VCTEODGH-WrsSAHOe.js} +1 -1
- package/dist/assets/{arc-DhAWLNVu.js → arc-DAA6wH-C.js} +1 -1
- package/dist/assets/{architectureDiagram-5GKGNRK7-BzE_kJOM.js → architectureDiagram-5GKGNRK7-BGNHr7ef.js} +1 -1
- package/dist/assets/{blockDiagram-I7D4REHJ-CCvTgFRD.js → blockDiagram-I7D4REHJ-zGMnF7Ox.js} +1 -1
- package/dist/assets/{c4Diagram-7LVT6UL2-CdbOnorn.js → c4Diagram-7LVT6UL2-ClWw3bqt.js} +1 -1
- package/dist/assets/channel-BAQyfMll.js +1 -0
- package/dist/assets/{chunk-2Q5K7J3B-D8cmt0Sa.js → chunk-2Q5K7J3B-C-9ICPHv.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-CnDRnclp.js → chunk-5VM5RSS4-Bawy3teT.js} +1 -1
- package/dist/assets/{chunk-F27PBJKO-vgneLl23.js → chunk-F27PBJKO-DQ375RQO.js} +1 -1
- package/dist/assets/{chunk-IMKFNOWR-DMPUusko.js → chunk-IMKFNOWR-CflNF2f6.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-bRfTSGMj.js → chunk-JWPE2WC7-CIXQv0gc.js} +1 -1
- package/dist/assets/{chunk-POPQ4Y6H-C2tl1RjW.js → chunk-POPQ4Y6H-Cza5j6Qw.js} +1 -1
- package/dist/assets/{chunk-SVP7TREG-ClClzI9j.js → chunk-SVP7TREG-GQ_VvWZR.js} +1 -1
- package/dist/assets/{chunk-TICWLB2K-DIabeuUc.js → chunk-TICWLB2K-BEmU16W5.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-D9_LHetz.js → chunk-XXDRQBXY-C1KpkLYH.js} +1 -1
- package/dist/assets/classDiagram-ZZMXUADV-BNGCuvrR.js +1 -0
- package/dist/assets/classDiagram-v2-VYDZK3BY-BNGCuvrR.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-Bm_mspWw.js → cose-bilkent-JH36ORCC-CZE48TRG.js} +1 -1
- package/dist/assets/{cynefin-OW5HDTMX-CiByP-TO.js → cynefin-OW5HDTMX-L-tx1eC-.js} +1 -1
- package/dist/assets/{cynefinDiagram-5FMLGOSQ-BAsBRS4i.js → cynefinDiagram-5FMLGOSQ-Coa8oJwR.js} +1 -1
- package/dist/assets/{dagre-GXQ25YYZ-p85Sd22I.js → dagre-GXQ25YYZ-Bu_3Y75K.js} +1 -1
- package/dist/assets/{diagram-S7CK7UJ4-D17byk8T.js → diagram-S7CK7UJ4-CFiiV4es.js} +1 -1
- package/dist/assets/{diagram-UQ7AKVKN-CROIyAdR.js → diagram-UQ7AKVKN-CCXheGAA.js} +1 -1
- package/dist/assets/{diagram-VSXAHHWV-DZazZGn6.js → diagram-VSXAHHWV-B70m4lr_.js} +1 -1
- package/dist/assets/{diagram-VX7I27RA-Dnrg0GMg.js → diagram-VX7I27RA-CHkiMOVA.js} +1 -1
- package/dist/assets/{diagram-Z3DM3KII-DaVdLJt4.js → diagram-Z3DM3KII-_awpc4Bs.js} +1 -1
- package/dist/assets/{ebnfDiagram-PWID7BFC-DdA7pXO0.js → ebnfDiagram-PWID7BFC-CZzjH86H.js} +1 -1
- package/dist/assets/{erDiagram-RLTQ6QDP-X_hPKNl0.js → erDiagram-RLTQ6QDP-9DgiHZg9.js} +1 -1
- package/dist/assets/{flowDiagram-HODETNUW-C87EKwuJ.js → flowDiagram-HODETNUW-DHY_503b.js} +1 -1
- package/dist/assets/{ganttDiagram-EL5Y4UJY-DKGVh_bq.js → ganttDiagram-EL5Y4UJY-DPiiYZ_l.js} +1 -1
- package/dist/assets/{gitGraphDiagram-WWUBYQGX-DwSS0so-.js → gitGraphDiagram-WWUBYQGX-Ddd_evm7.js} +1 -1
- package/dist/assets/{index-DcfdIMj-.css → index-WwknP0l4.css} +1 -1
- package/dist/assets/{index-Dhev0IBD.js → index-tibHq7Qp.js} +82 -82
- package/dist/assets/{infoDiagram-27XIBGKW-9M2GYFX-.js → infoDiagram-27XIBGKW-BPRNhfwb.js} +1 -1
- package/dist/assets/{ishikawaDiagram-5VMMS53U-DcyPsfdd.js → ishikawaDiagram-5VMMS53U-BXx6aqkq.js} +1 -1
- package/dist/assets/{journeyDiagram-3NMN7TZE-uCFTtIkL.js → journeyDiagram-3NMN7TZE-BK8TZM29.js} +1 -1
- package/dist/assets/{kanban-definition-UXKFOSKX-fmP02Y_m.js → kanban-definition-UXKFOSKX-CHioRmxz.js} +1 -1
- package/dist/assets/{layout-CgzYIBR9.js → layout-DEnkyfTY.js} +1 -1
- package/dist/assets/{linear-R2LO12tF.js → linear-CTEhUcKG.js} +1 -1
- package/dist/assets/{mermaid.core-CcFr1kIk.js → mermaid.core-DYUb_UUB.js} +6 -6
- package/dist/assets/{mindmap-definition-YA3MSWOX-DIODLsip.js → mindmap-definition-YA3MSWOX-D7ODZ4oS.js} +1 -1
- package/dist/assets/{pegDiagram-XKGWAZYB-FUv_9PC6.js → pegDiagram-XKGWAZYB-8J-_2_kw.js} +1 -1
- package/dist/assets/{pieDiagram-E7YTZNPT-CAwW7jyM.js → pieDiagram-E7YTZNPT-ebg0yfMi.js} +1 -1
- package/dist/assets/{quadrantDiagram-AXDQQJYC-9h98Z_Df.js → quadrantDiagram-AXDQQJYC-BoWkDiFb.js} +1 -1
- package/dist/assets/{railroadDiagram-O6MQD6OU-DkH3Fnef.js → railroadDiagram-O6MQD6OU-BRJ77ldz.js} +1 -1
- package/dist/assets/{requirementDiagram-BXWQKSXE-BQs2338b.js → requirementDiagram-BXWQKSXE-Z0JJgktA.js} +1 -1
- package/dist/assets/{sankeyDiagram-P5KCCOFB-Cx6CaW2J.js → sankeyDiagram-P5KCCOFB-4PW5HTOP.js} +1 -1
- package/dist/assets/{sequenceDiagram-WJ2MYXX4-D9bqqWJX.js → sequenceDiagram-WJ2MYXX4-BPAjtXwp.js} +1 -1
- package/dist/assets/{sizeCapture-INFHLROL-BaqLD8lN.js → sizeCapture-INFHLROL-BGZPCzM4.js} +1 -1
- package/dist/assets/{stateDiagram-D77RDMKH-p7iECK7R.js → stateDiagram-D77RDMKH-o-vEcKwz.js} +1 -1
- package/dist/assets/{stateDiagram-v2-MP3YSRHH-B2OWsW7s.js → stateDiagram-v2-MP3YSRHH-BsuDaKkN.js} +1 -1
- package/dist/assets/{swimlanes-42K2YHIH-DnMxbe0k.js → swimlanes-42K2YHIH-DvuB15qF.js} +1 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-DcCAyKlT.js +8 -0
- package/dist/assets/{timeline-definition-24CTP7MA-Bbrf_JBy.js → timeline-definition-24CTP7MA-ZIziYCIF.js} +1 -1
- package/dist/assets/{vennDiagram-4TSXK5OY-DgBPpdsN.js → vennDiagram-4TSXK5OY-C5_B9gWa.js} +1 -1
- package/dist/assets/{wardleyDiagram-VM6X3IG4-BDQNH02n.js → wardleyDiagram-VM6X3IG4-DMlH9Afw.js} +1 -1
- package/dist/assets/{xychartDiagram-S5SC5T6Z-DvZhpZ3Y.js → xychartDiagram-S5SC5T6Z-BldhJt7i.js} +1 -1
- package/dist/index.html +2 -2
- package/dist/sw.js +1 -1
- package/dist-server/server/piecemaker/desktop-update/index.js +4 -3
- package/dist-server/server/piecemaker/desktop-update/index.js.map +1 -1
- package/dist-server/server/piecemaker/index.js +3 -2
- package/dist-server/server/piecemaker/index.js.map +1 -1
- package/dist-server/server/piecemaker/shell-environment.js +102 -0
- package/dist-server/server/piecemaker/shell-environment.js.map +1 -0
- package/package.json +1 -1
- package/server/piecemaker/anonymizer/client-config.cjs +4 -4
- package/server/piecemaker/anonymizer/providers.cjs +2 -2
- package/server/piecemaker/anonymizer/service.cjs +17 -4
- package/server/piecemaker/desktop-update/index.ts +4 -3
- package/server/piecemaker/index.ts +3 -2
- package/server/piecemaker/shell-environment.ts +111 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/scanner_worker.py +2 -0
- package/dist/assets/channel-CVQE_nrA.js +0 -1
- package/dist/assets/classDiagram-ZZMXUADV-BNp5yxXb.js +0 -1
- package/dist/assets/classDiagram-v2-VYDZK3BY-BNp5yxXb.js +0 -1
- package/dist/assets/swimlanesDiagram-VR7AAH4N-CzQACmEN.js +0 -8
- package/dist-server/server/piecemaker/claude-executable.js +0 -41
- package/dist-server/server/piecemaker/claude-executable.js.map +0 -1
- package/server/piecemaker/claude-executable.ts +0 -46
|
@@ -19,6 +19,7 @@ const { spawn } = require('node:child_process');
|
|
|
19
19
|
const fs = require('node:fs');
|
|
20
20
|
const os = require('node:os');
|
|
21
21
|
const path = require('node:path');
|
|
22
|
+
const tls = require('node:tls');
|
|
22
23
|
|
|
23
24
|
const { createSqliteDictionaryLoader } = require('./sqlite-dictionary.cjs');
|
|
24
25
|
const { startRewriterBridge } = require('./rewriter-bridge.cjs');
|
|
@@ -100,9 +101,18 @@ function certificatePaths() {
|
|
|
100
101
|
return {
|
|
101
102
|
cert: path.join(directory, 'piecemaker-ca.crt'),
|
|
102
103
|
key: path.join(directory, 'piecemaker-ca.key'),
|
|
104
|
+
trustBundle: path.join(directory, 'piecemaker-trust-bundle.pem'),
|
|
103
105
|
};
|
|
104
106
|
}
|
|
105
107
|
|
|
108
|
+
function writeTrustBundle(caFile, bundleFile) {
|
|
109
|
+
const content = [...tls.rootCertificates, fs.readFileSync(caFile, 'utf8').trim()].join('\n');
|
|
110
|
+
const temporary = `${bundleFile}.piecemaker-${process.pid}-${Date.now()}`;
|
|
111
|
+
fs.writeFileSync(temporary, `${content}\n`, { encoding: 'utf8', mode: 0o644 });
|
|
112
|
+
fs.renameSync(temporary, bundleFile);
|
|
113
|
+
return bundleFile;
|
|
114
|
+
}
|
|
115
|
+
|
|
106
116
|
function waitForOutput(child, needle, timeoutMs) {
|
|
107
117
|
return new Promise((resolve, reject) => {
|
|
108
118
|
let buffer = '';
|
|
@@ -129,7 +139,7 @@ function waitForOutput(child, needle, timeoutMs) {
|
|
|
129
139
|
});
|
|
130
140
|
}
|
|
131
141
|
|
|
132
|
-
function proxyEnvironment(proxyUrl, caFile) {
|
|
142
|
+
function proxyEnvironment(proxyUrl, caFile, trustBundle) {
|
|
133
143
|
return {
|
|
134
144
|
HTTPS_PROXY: proxyUrl,
|
|
135
145
|
HTTP_PROXY: proxyUrl,
|
|
@@ -137,9 +147,9 @@ function proxyEnvironment(proxyUrl, caFile) {
|
|
|
137
147
|
NO_PROXY: 'localhost,127.0.0.1,::1',
|
|
138
148
|
NODE_USE_ENV_PROXY: '1',
|
|
139
149
|
NODE_EXTRA_CA_CERTS: caFile,
|
|
140
|
-
SSL_CERT_FILE:
|
|
150
|
+
SSL_CERT_FILE: trustBundle,
|
|
141
151
|
CODEX_CA_CERTIFICATE: caFile,
|
|
142
|
-
REQUESTS_CA_BUNDLE:
|
|
152
|
+
REQUESTS_CA_BUNDLE: trustBundle,
|
|
143
153
|
};
|
|
144
154
|
}
|
|
145
155
|
|
|
@@ -251,12 +261,14 @@ function createAnonymizerService({ homeDir, userHome = os.homedir(), logger = co
|
|
|
251
261
|
PATH: process.env.PATH,
|
|
252
262
|
};
|
|
253
263
|
for (const key of PROXY_ENV_KEYS) previousEnv[key] = process.env[key];
|
|
254
|
-
|
|
264
|
+
const trustBundle = writeTrustBundle(certificates.cert, certificates.trustBundle);
|
|
265
|
+
Object.assign(process.env, proxyEnvironment(origin, certificates.cert, trustBundle));
|
|
255
266
|
process.env.PATH = `${binDir}${path.delimiter}${process.env.PATH || ''}`;
|
|
256
267
|
|
|
257
268
|
const report = await configureProviders({
|
|
258
269
|
origin,
|
|
259
270
|
caFile: certificates.cert,
|
|
271
|
+
trustBundle,
|
|
260
272
|
userHome,
|
|
261
273
|
binDir,
|
|
262
274
|
mappingFile: legacyMappingFile,
|
|
@@ -336,4 +348,5 @@ module.exports = {
|
|
|
336
348
|
isDisabled,
|
|
337
349
|
resolveUpstream,
|
|
338
350
|
summarizeCoverage,
|
|
351
|
+
writeTrustBundle,
|
|
339
352
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
+
import path from 'node:path';
|
|
2
3
|
|
|
3
4
|
import { loadProductConfig } from '../../../shared/product-config.mjs';
|
|
4
5
|
|
|
@@ -23,9 +24,9 @@ function runInstaller(command: string, environment: NodeJS.ProcessEnv) {
|
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
26
|
|
|
26
|
-
function productRepository(): string | null {
|
|
27
|
+
function productRepository(appRoot: string): string | null {
|
|
27
28
|
try {
|
|
28
|
-
return loadProductConfig().repository;
|
|
29
|
+
return loadProductConfig(process.env.CLOUDCLI_PRODUCT_CONFIG || path.join(appRoot, 'product.config.json')).repository;
|
|
29
30
|
} catch {
|
|
30
31
|
return null;
|
|
31
32
|
}
|
|
@@ -39,7 +40,7 @@ export function createPieceMakerDesktopUpdateRouter(appRoot: string) {
|
|
|
39
40
|
return createDesktopUpdateRouter(createDesktopUpdateService({
|
|
40
41
|
appRoot,
|
|
41
42
|
platform: process.platform,
|
|
42
|
-
repository: productRepository(),
|
|
43
|
+
repository: productRepository(appRoot),
|
|
43
44
|
applicationPid: process.ppid,
|
|
44
45
|
environment: process.env,
|
|
45
46
|
runInstaller,
|
|
@@ -8,7 +8,6 @@ import { findApplicationRoot, getModuleDirectory } from '@/shared/utils.js';
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
import { startRequiredAnonymizer } from './anonymizer/lifecycle.js';
|
|
11
|
-
import { useBundledClaudeWhenMissingFromPath } from './claude-executable.js';
|
|
12
11
|
import { createCitationStore } from './harness/citation-store.js';
|
|
13
12
|
import { installChatCitationHarness } from './harness/chat-harness.js';
|
|
14
13
|
import { createCitationsRouter } from './harness/citations.routes.js';
|
|
@@ -17,6 +16,7 @@ import { createKnowledgeBackend } from './knowledge/index.js';
|
|
|
17
16
|
import { createTimesheetBackend } from './timesheet/index.js';
|
|
18
17
|
import { createCompanySearchRouter } from './company-search.js';
|
|
19
18
|
import { createBodaccSearchRouter } from './bodacc-search.js';
|
|
19
|
+
import { createShellEnvironmentRouter, resolveDesktopShellEnvironment } from './shell-environment.js';
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Point d'entrée PieceMaker. Les modules de `server/piecemaker/vendor/` sont du
|
|
@@ -42,7 +42,7 @@ type PieceMakerVendorModule = {
|
|
|
42
42
|
stopOriginalsJobs(): Promise<void>;
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
const shellEnvironment = await resolveDesktopShellEnvironment();
|
|
46
46
|
const vendor = createRequire(import.meta.url)(routerPath) as PieceMakerVendorModule;
|
|
47
47
|
|
|
48
48
|
export const { piecemakerHome, stopOriginalsJobs } = vendor;
|
|
@@ -70,6 +70,7 @@ export function createPieceMakerRouter(options: { getRuntimeStatus?: () => Piece
|
|
|
70
70
|
router.use(knowledge.router);
|
|
71
71
|
router.use(createCompanySearchRouter());
|
|
72
72
|
router.use(createBodaccSearchRouter());
|
|
73
|
+
router.use(createShellEnvironmentRouter(shellEnvironment));
|
|
73
74
|
return router;
|
|
74
75
|
}
|
|
75
76
|
export type { PieceMakerRuntimeStatus };
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
|
|
6
|
+
import express from 'express';
|
|
7
|
+
|
|
8
|
+
export type ShellEnvironmentState =
|
|
9
|
+
| { status: 'inherited' }
|
|
10
|
+
| { status: 'resolved'; shell: string }
|
|
11
|
+
| { status: 'failed'; shell: string; reason: string };
|
|
12
|
+
|
|
13
|
+
const RESOLUTION_TIMEOUT_MS = 10_000;
|
|
14
|
+
|
|
15
|
+
const RESOLUTION_VARIABLES: Record<string, string> = {
|
|
16
|
+
ELECTRON_RUN_AS_NODE: '1',
|
|
17
|
+
ELECTRON_NO_ATTACH_CONSOLE: '1',
|
|
18
|
+
PIECEMAKER_RESOLVING_ENVIRONMENT: '1',
|
|
19
|
+
DISABLE_AUTO_UPDATE: 'true',
|
|
20
|
+
ZSH_TMUX_AUTOSTARTED: 'true',
|
|
21
|
+
ZSH_TMUX_AUTOSTART: 'false',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const SHELL_SESSION_VARIABLES = new Set(['_', 'PWD', 'OLDPWD', 'SHLVL', ...Object.keys(RESOLUTION_VARIABLES)]);
|
|
25
|
+
|
|
26
|
+
function quoteForShell(value: string): string {
|
|
27
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function userShell(environment: NodeJS.ProcessEnv): string {
|
|
31
|
+
return environment.SHELL || os.userInfo().shell || '/bin/zsh';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function extractMarkedEnvironment(output: string, mark: string): Record<string, string> | null {
|
|
35
|
+
const start = output.indexOf(mark);
|
|
36
|
+
const end = output.lastIndexOf(mark);
|
|
37
|
+
if (start === -1 || end <= start) return null;
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(output.slice(start + mark.length, end));
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function adoptShellEnvironment(target: NodeJS.ProcessEnv, shellEnvironment: Record<string, string>) {
|
|
46
|
+
for (const [key, value] of Object.entries(shellEnvironment)) {
|
|
47
|
+
if (key === 'PATH' || SHELL_SESSION_VARIABLES.has(key) || target[key] !== undefined) continue;
|
|
48
|
+
target[key] = value;
|
|
49
|
+
}
|
|
50
|
+
const entries = [...(shellEnvironment.PATH ?? '').split(path.delimiter), ...(target.PATH ?? '').split(path.delimiter)];
|
|
51
|
+
target.PATH = [...new Set(entries.filter(Boolean))].join(path.delimiter);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function readShellEnvironment(shell: string): Promise<Record<string, string>> {
|
|
55
|
+
const mark = randomUUID().replace(/-/g, '').slice(0, 12);
|
|
56
|
+
const printEnvironment = `${quoteForShell(process.execPath)} -p '"${mark}" + JSON.stringify(process.env) + "${mark}"'`;
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
const child = spawn(shell, ['-i', '-l', '-c', printEnvironment], {
|
|
59
|
+
detached: true,
|
|
60
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
61
|
+
env: { ...process.env, ...RESOLUTION_VARIABLES },
|
|
62
|
+
});
|
|
63
|
+
let output = '';
|
|
64
|
+
let errorOutput = '';
|
|
65
|
+
const timer = setTimeout(() => {
|
|
66
|
+
try {
|
|
67
|
+
process.kill(-child.pid!, 'SIGKILL');
|
|
68
|
+
} catch {
|
|
69
|
+
child.kill('SIGKILL');
|
|
70
|
+
}
|
|
71
|
+
reject(new Error(`le shell ${shell} n'a pas répondu en ${RESOLUTION_TIMEOUT_MS / 1000} s`));
|
|
72
|
+
}, RESOLUTION_TIMEOUT_MS);
|
|
73
|
+
child.stdout.on('data', (chunk: Buffer) => { output += chunk.toString(); });
|
|
74
|
+
child.stderr.on('data', (chunk: Buffer) => { errorOutput += chunk.toString(); });
|
|
75
|
+
child.once('error', (error) => {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
reject(new Error(`impossible de lancer ${shell} : ${error.message}`));
|
|
78
|
+
});
|
|
79
|
+
child.once('close', (code) => {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
const environment = extractMarkedEnvironment(output, mark);
|
|
82
|
+
if (environment) {
|
|
83
|
+
resolve(environment);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const detail = errorOutput.trim().split('\n').slice(-3).join(' ').slice(0, 300);
|
|
87
|
+
reject(new Error(`le shell ${shell} s'est arrêté (code ${code}) sans fournir son environnement${detail ? ` : ${detail}` : ''}`));
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export async function resolveDesktopShellEnvironment(): Promise<ShellEnvironmentState> {
|
|
93
|
+
if (process.platform === 'win32' || process.env.ELECTRON_RUN_AS_NODE !== '1') return { status: 'inherited' };
|
|
94
|
+
const shell = userShell(process.env);
|
|
95
|
+
try {
|
|
96
|
+
adoptShellEnvironment(process.env, await readShellEnvironment(shell));
|
|
97
|
+
return { status: 'resolved', shell };
|
|
98
|
+
} catch (error) {
|
|
99
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
100
|
+
console.warn(`[piecemaker] environnement du shell non résolu, PATH de base conservé : ${reason}`);
|
|
101
|
+
return { status: 'failed', shell, reason };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function createShellEnvironmentRouter(state: ShellEnvironmentState) {
|
|
106
|
+
const router = express.Router();
|
|
107
|
+
router.get('/shell-environment', (_request, response) => {
|
|
108
|
+
response.json(state);
|
|
109
|
+
});
|
|
110
|
+
return router;
|
|
111
|
+
}
|
|
@@ -26,6 +26,8 @@ from collections import defaultdict
|
|
|
26
26
|
from importlib.metadata import PackageNotFoundError, version as package_version
|
|
27
27
|
from typing import Dict, List, Optional
|
|
28
28
|
|
|
29
|
+
os.environ["HF_HUB_OFFLINE"] = "1"
|
|
30
|
+
|
|
29
31
|
# ---------------------------------------------------------------------------
|
|
30
32
|
# Heavy imports — these are the expensive ones (~30-60s)
|
|
31
33
|
# ---------------------------------------------------------------------------
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ah as o,ai as n}from"./mermaid.core-CcFr1kIk.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-TICWLB2K-DIabeuUc.js";import{_ as i}from"./mermaid.core-CcFr1kIk.js";import"./chunk-5VM5RSS4-CnDRnclp.js";import"./chunk-XXDRQBXY-D9_LHetz.js";import"./chunk-POPQ4Y6H-C2tl1RjW.js";import"./chunk-F27PBJKO-vgneLl23.js";import"./index-Dhev0IBD.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.js";import"./vendor-xterm-BWUgpGtR.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-TICWLB2K-DIabeuUc.js";import{_ as i}from"./mermaid.core-CcFr1kIk.js";import"./chunk-5VM5RSS4-CnDRnclp.js";import"./chunk-XXDRQBXY-D9_LHetz.js";import"./chunk-POPQ4Y6H-C2tl1RjW.js";import"./chunk-F27PBJKO-vgneLl23.js";import"./index-Dhev0IBD.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.js";import"./vendor-xterm-BWUgpGtR.js";var c={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{c as diagram};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{c as r,s as e}from"./flowDiagram-HODETNUW-C87EKwuJ.js";import{_ as a}from"./mermaid.core-CcFr1kIk.js";import"./chunk-5VM5RSS4-CnDRnclp.js";import"./chunk-XXDRQBXY-D9_LHetz.js";import"./chunk-POPQ4Y6H-C2tl1RjW.js";import"./chunk-F27PBJKO-vgneLl23.js";import"./index-Dhev0IBD.js";import"./vendor-codemirror-CjW0lHR5.js";import"./vendor-react-D809iwXR.js";import"./vendor-xterm-BWUgpGtR.js";import"./channel-CVQE_nrA.js";var o=a(t=>`${e(t)}
|
|
2
|
-
.swimlane.cluster rect {
|
|
3
|
-
stroke: ${t.clusterBorder} !important;
|
|
4
|
-
}
|
|
5
|
-
[data-look="neo"].cluster rect {
|
|
6
|
-
filter: none;
|
|
7
|
-
}
|
|
8
|
-
`,"getStyles"),m=o,g=r({defaultLayout:"swimlane",styles:m});export{g as diagram};
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import { createRequire } from 'node:module';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
function isExecutableFile(candidate) {
|
|
5
|
-
try {
|
|
6
|
-
fs.accessSync(candidate, fs.constants.X_OK);
|
|
7
|
-
return fs.statSync(candidate).isFile();
|
|
8
|
-
}
|
|
9
|
-
catch {
|
|
10
|
-
return false;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function bundledSdkExecutable() {
|
|
14
|
-
try {
|
|
15
|
-
const packageName = `@anthropic-ai/claude-agent-sdk-${process.platform}-${process.arch}`;
|
|
16
|
-
return createRequire(import.meta.url).resolve(`${packageName}/claude`);
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export function claudeExecutableFallback(context) {
|
|
23
|
-
if (context.platform === 'win32' || context.environment.CLAUDE_CLI_PATH)
|
|
24
|
-
return null;
|
|
25
|
-
const searchPath = (context.environment.PATH || '').split(path.delimiter).filter(Boolean);
|
|
26
|
-
if (searchPath.some((directory) => context.isExecutable(path.join(directory, 'claude'))))
|
|
27
|
-
return null;
|
|
28
|
-
const bundled = context.bundledExecutable();
|
|
29
|
-
return bundled && context.isExecutable(bundled) ? bundled : null;
|
|
30
|
-
}
|
|
31
|
-
export function useBundledClaudeWhenMissingFromPath() {
|
|
32
|
-
const fallback = claudeExecutableFallback({
|
|
33
|
-
environment: process.env,
|
|
34
|
-
platform: process.platform,
|
|
35
|
-
isExecutable: isExecutableFile,
|
|
36
|
-
bundledExecutable: bundledSdkExecutable,
|
|
37
|
-
});
|
|
38
|
-
if (fallback)
|
|
39
|
-
process.env.CLAUDE_CLI_PATH = fallback;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=claude-executable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-executable.js","sourceRoot":"","sources":["../../../server/piecemaker/claude-executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,SAAS,gBAAgB,CAAC,SAAiB;IACzC,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,kCAAkC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACzF,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,WAAW,SAAS,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAgC;IACvE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IACrF,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1F,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACtG,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAC5C,OAAO,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mCAAmC;IACjD,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QACxC,WAAW,EAAE,OAAO,CAAC,GAAG;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,gBAAgB;QAC9B,iBAAiB,EAAE,oBAAoB;KACxC,CAAC,CAAC;IACH,IAAI,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC;AACvD,CAAC"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import { createRequire } from 'node:module';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
|
|
5
|
-
type ClaudeExecutableContext = {
|
|
6
|
-
environment: NodeJS.ProcessEnv;
|
|
7
|
-
platform: NodeJS.Platform;
|
|
8
|
-
isExecutable(candidate: string): boolean;
|
|
9
|
-
bundledExecutable(): string | null;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
function isExecutableFile(candidate: string): boolean {
|
|
13
|
-
try {
|
|
14
|
-
fs.accessSync(candidate, fs.constants.X_OK);
|
|
15
|
-
return fs.statSync(candidate).isFile();
|
|
16
|
-
} catch {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function bundledSdkExecutable(): string | null {
|
|
22
|
-
try {
|
|
23
|
-
const packageName = `@anthropic-ai/claude-agent-sdk-${process.platform}-${process.arch}`;
|
|
24
|
-
return createRequire(import.meta.url).resolve(`${packageName}/claude`);
|
|
25
|
-
} catch {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function claudeExecutableFallback(context: ClaudeExecutableContext): string | null {
|
|
31
|
-
if (context.platform === 'win32' || context.environment.CLAUDE_CLI_PATH) return null;
|
|
32
|
-
const searchPath = (context.environment.PATH || '').split(path.delimiter).filter(Boolean);
|
|
33
|
-
if (searchPath.some((directory) => context.isExecutable(path.join(directory, 'claude')))) return null;
|
|
34
|
-
const bundled = context.bundledExecutable();
|
|
35
|
-
return bundled && context.isExecutable(bundled) ? bundled : null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function useBundledClaudeWhenMissingFromPath() {
|
|
39
|
-
const fallback = claudeExecutableFallback({
|
|
40
|
-
environment: process.env,
|
|
41
|
-
platform: process.platform,
|
|
42
|
-
isExecutable: isExecutableFile,
|
|
43
|
-
bundledExecutable: bundledSdkExecutable,
|
|
44
|
-
});
|
|
45
|
-
if (fallback) process.env.CLAUDE_CLI_PATH = fallback;
|
|
46
|
-
}
|