@uipath/project-packager 1.199.0-preview.99 → 1.200.0-preview.109
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/browser.js +52 -22
- package/dist/index.js +55 -25
- package/dist/node.js +132 -36
- package/package.json +5 -5
package/dist/browser.js
CHANGED
|
@@ -22652,7 +22652,7 @@ var COMMAND_ATTRIBUTION = commandAttribution([
|
|
|
22652
22652
|
["agents", "build", ["uip.codedagent", "uip.agent"]],
|
|
22653
22653
|
["agenthub", "build", ["uip.agenthub"]],
|
|
22654
22654
|
["coded-apps", "build", ["uip.codedapp"]],
|
|
22655
|
-
["functions", "build", ["uip.functions"]],
|
|
22655
|
+
["functions", "build", ["uip.function", "uip.functions"]],
|
|
22656
22656
|
["solution", "build", ["uip.solution"]],
|
|
22657
22657
|
["maestro", "build", ["uip.maestro", "uip.case", "uip.flow"]],
|
|
22658
22658
|
["llm-observability", "troubleshoot", ["uip.traces"]],
|
|
@@ -22769,8 +22769,18 @@ function getInboundTraceContext() {
|
|
|
22769
22769
|
return parseInboundTraceparent(getProcessEnv()?.[TELEMETRY_TRACEPARENT_ENV]);
|
|
22770
22770
|
}
|
|
22771
22771
|
var TELEMETRY_SESSION_ID_ENV = "UIPATH_SESSION_ID";
|
|
22772
|
-
var
|
|
22773
|
-
var
|
|
22772
|
+
var SESSION_ID_MAX_LENGTH = 64;
|
|
22773
|
+
var RANDOM_SESSION_ID_LENGTH = 32;
|
|
22774
|
+
var TELEMETRY_SESSION_SOURCE_PROPERTY = "session_id_source";
|
|
22775
|
+
var CONTROL_CHARACTERS = /\p{Cc}/gu;
|
|
22776
|
+
var INHERITED_SESSION_SOURCES = [
|
|
22777
|
+
{ envVar: "CLAUDE_CODE_SESSION_ID", source: "claude-code" },
|
|
22778
|
+
{ envVar: "CODEX_THREAD_ID", source: "codex" },
|
|
22779
|
+
{ envVar: "ANTIGRAVITY_TRAJECTORY_ID", source: "antigravity" },
|
|
22780
|
+
{ envVar: "TERM_SESSION_ID", source: "terminal" },
|
|
22781
|
+
{ envVar: "WT_SESSION", source: "terminal" }
|
|
22782
|
+
];
|
|
22783
|
+
var telemetrySessionSlot = singleton("TelemetrySession");
|
|
22774
22784
|
var telemetryOperationIdSlot = singleton("TelemetryOperationId");
|
|
22775
22785
|
function getProcessEnv2() {
|
|
22776
22786
|
return globalThis.process?.env;
|
|
@@ -22779,14 +22789,42 @@ function normalizeSessionId(value) {
|
|
|
22779
22789
|
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
22780
22790
|
return;
|
|
22781
22791
|
}
|
|
22782
|
-
const
|
|
22783
|
-
return
|
|
22792
|
+
const cleaned = String(value).replace(CONTROL_CHARACTERS, "").trim().slice(0, SESSION_ID_MAX_LENGTH);
|
|
22793
|
+
return cleaned || undefined;
|
|
22784
22794
|
}
|
|
22785
22795
|
function getConfiguredTelemetrySessionId() {
|
|
22786
22796
|
return normalizeSessionId(getProcessEnv2()?.[TELEMETRY_SESSION_ID_ENV]);
|
|
22787
22797
|
}
|
|
22788
|
-
function
|
|
22789
|
-
|
|
22798
|
+
function getInheritedSession(env2) {
|
|
22799
|
+
for (const candidate of INHERITED_SESSION_SOURCES) {
|
|
22800
|
+
const handle = normalizeSessionId(env2[candidate.envVar]);
|
|
22801
|
+
if (handle) {
|
|
22802
|
+
return { id: handle, source: candidate.source };
|
|
22803
|
+
}
|
|
22804
|
+
}
|
|
22805
|
+
return;
|
|
22806
|
+
}
|
|
22807
|
+
function generateRandomSession() {
|
|
22808
|
+
const bytes = new Uint8Array(RANDOM_SESSION_ID_LENGTH / 2);
|
|
22809
|
+
crypto.getRandomValues(bytes);
|
|
22810
|
+
let hex = "";
|
|
22811
|
+
for (const byte of bytes) {
|
|
22812
|
+
hex += byte.toString(16).padStart(2, "0");
|
|
22813
|
+
}
|
|
22814
|
+
return { id: hex, source: "random" };
|
|
22815
|
+
}
|
|
22816
|
+
function resolveTelemetrySession() {
|
|
22817
|
+
const existing = telemetrySessionSlot.get();
|
|
22818
|
+
if (existing) {
|
|
22819
|
+
return existing;
|
|
22820
|
+
}
|
|
22821
|
+
const declaredHandle = getConfiguredTelemetrySessionId();
|
|
22822
|
+
const resolved = declaredHandle ? { id: declaredHandle, source: "declared" } : getInheritedSession(getProcessEnv2() ?? {}) ?? generateRandomSession();
|
|
22823
|
+
telemetrySessionSlot.set(resolved);
|
|
22824
|
+
return resolved;
|
|
22825
|
+
}
|
|
22826
|
+
function getTelemetrySessionSource() {
|
|
22827
|
+
return resolveTelemetrySession().source;
|
|
22790
22828
|
}
|
|
22791
22829
|
function getTelemetryOperationId() {
|
|
22792
22830
|
const existing = telemetryOperationIdSlot.get();
|
|
@@ -23152,14 +23190,11 @@ class TelemetryService {
|
|
|
23152
23190
|
}
|
|
23153
23191
|
async trackDependencyOperation(name, type, fn, properties) {
|
|
23154
23192
|
const parentContext = this.getCurrentContext();
|
|
23155
|
-
|
|
23156
|
-
throw new Error("trackDependencyOperation must be called within a trackRequest block.");
|
|
23157
|
-
}
|
|
23158
|
-
const childContext = {
|
|
23193
|
+
const childContext = parentContext !== undefined ? {
|
|
23159
23194
|
operationId: parentContext.operationId,
|
|
23160
23195
|
parentId: parentContext.id,
|
|
23161
23196
|
id: this.generateId()
|
|
23162
|
-
};
|
|
23197
|
+
} : this.createRequestContext();
|
|
23163
23198
|
const startTime = performance.now();
|
|
23164
23199
|
try {
|
|
23165
23200
|
const result = await this.contextStorage.run(childContext, fn);
|
|
@@ -23180,24 +23215,18 @@ class TelemetryService {
|
|
|
23180
23215
|
}
|
|
23181
23216
|
enrichPropertiesWithContext(properties, context) {
|
|
23182
23217
|
const globalProperties = getGlobalTelemetryProperties();
|
|
23183
|
-
const existingSessionId = properties?.[TELEMETRY_SESSION_ID_PROPERTY] ?? this.defaultProperties?.[TELEMETRY_SESSION_ID_PROPERTY] ?? globalProperties?.[TELEMETRY_SESSION_ID_PROPERTY];
|
|
23184
|
-
const sessionId = resolveTelemetrySessionId(existingSessionId);
|
|
23185
23218
|
const enriched = {
|
|
23186
23219
|
...getExecutionContextTelemetryProperties(),
|
|
23187
23220
|
...globalProperties,
|
|
23188
23221
|
...this.defaultProperties,
|
|
23189
23222
|
...redactProperties(properties ?? {}),
|
|
23223
|
+
[TELEMETRY_SESSION_SOURCE_PROPERTY]: getTelemetrySessionSource(),
|
|
23190
23224
|
...context ? {
|
|
23191
23225
|
[TELEMETRY_OPERATION_ID_PROPERTY]: context.operationId,
|
|
23192
23226
|
...context.parentId !== undefined ? { [TELEMETRY_PARENT_ID_PROPERTY]: context.parentId } : {},
|
|
23193
23227
|
[TELEMETRY_SPAN_ID_PROPERTY]: context.id
|
|
23194
23228
|
} : {}
|
|
23195
23229
|
};
|
|
23196
|
-
if (sessionId === undefined) {
|
|
23197
|
-
delete enriched[TELEMETRY_SESSION_ID_PROPERTY];
|
|
23198
|
-
} else {
|
|
23199
|
-
enriched[TELEMETRY_SESSION_ID_PROPERTY] = sessionId;
|
|
23200
|
-
}
|
|
23201
23230
|
return enriched;
|
|
23202
23231
|
}
|
|
23203
23232
|
generateId() {
|
|
@@ -23214,6 +23243,7 @@ class TelemetryService {
|
|
|
23214
23243
|
}
|
|
23215
23244
|
}
|
|
23216
23245
|
var factorySlot = singleton("PackagerFactoryProvider");
|
|
23246
|
+
var moduleSlot = singleton("ToolModuleProvider");
|
|
23217
23247
|
|
|
23218
23248
|
// src/base-browser-packager-factory.ts
|
|
23219
23249
|
import { BrowserFileSystem } from "@uipath/filesystem/browser";
|
|
@@ -24050,7 +24080,7 @@ class ProjectPackager {
|
|
|
24050
24080
|
}, cancellationToken);
|
|
24051
24081
|
}
|
|
24052
24082
|
async packProjectAsync(options, cancellationToken) {
|
|
24053
|
-
return await this.telemetryService.
|
|
24083
|
+
return await this.telemetryService.trackDependencyOperation("ProjectPackager.Pack" /* ProjectPackagerPack */, "pack", async () => {
|
|
24054
24084
|
try {
|
|
24055
24085
|
await this.governancePolicyService.resolveGovernancePolicyAsync(options.validateOptions, options.connection, cancellationToken);
|
|
24056
24086
|
let result = await this.packOptionsValidator.validateAsync(options, cancellationToken);
|
|
@@ -24135,7 +24165,7 @@ class ProjectPackager {
|
|
|
24135
24165
|
return packageStreams;
|
|
24136
24166
|
}
|
|
24137
24167
|
async executeProjectOperationAsync(options, operationName, telemetryName, operation, _cancellationToken) {
|
|
24138
|
-
return await this.telemetryService.
|
|
24168
|
+
return await this.telemetryService.trackDependencyOperation(telemetryName, operationName.toLowerCase(), async () => {
|
|
24139
24169
|
try {
|
|
24140
24170
|
const loadedProject = await this.projectLoader.loadProject(options.inputPath);
|
|
24141
24171
|
const uiPathProject = {
|
|
@@ -24230,4 +24260,4 @@ export {
|
|
|
24230
24260
|
BaseBrowserPackagerFactory
|
|
24231
24261
|
};
|
|
24232
24262
|
|
|
24233
|
-
//# debugId=
|
|
24263
|
+
//# debugId=F73F22FB7739EA3164756E2164756E21
|
package/dist/index.js
CHANGED
|
@@ -22652,7 +22652,7 @@ var COMMAND_ATTRIBUTION = commandAttribution([
|
|
|
22652
22652
|
["agents", "build", ["uip.codedagent", "uip.agent"]],
|
|
22653
22653
|
["agenthub", "build", ["uip.agenthub"]],
|
|
22654
22654
|
["coded-apps", "build", ["uip.codedapp"]],
|
|
22655
|
-
["functions", "build", ["uip.functions"]],
|
|
22655
|
+
["functions", "build", ["uip.function", "uip.functions"]],
|
|
22656
22656
|
["solution", "build", ["uip.solution"]],
|
|
22657
22657
|
["maestro", "build", ["uip.maestro", "uip.case", "uip.flow"]],
|
|
22658
22658
|
["llm-observability", "troubleshoot", ["uip.traces"]],
|
|
@@ -22769,8 +22769,18 @@ function getInboundTraceContext() {
|
|
|
22769
22769
|
return parseInboundTraceparent(getProcessEnv()?.[TELEMETRY_TRACEPARENT_ENV]);
|
|
22770
22770
|
}
|
|
22771
22771
|
var TELEMETRY_SESSION_ID_ENV = "UIPATH_SESSION_ID";
|
|
22772
|
-
var
|
|
22773
|
-
var
|
|
22772
|
+
var SESSION_ID_MAX_LENGTH = 64;
|
|
22773
|
+
var RANDOM_SESSION_ID_LENGTH = 32;
|
|
22774
|
+
var TELEMETRY_SESSION_SOURCE_PROPERTY = "session_id_source";
|
|
22775
|
+
var CONTROL_CHARACTERS = /\p{Cc}/gu;
|
|
22776
|
+
var INHERITED_SESSION_SOURCES = [
|
|
22777
|
+
{ envVar: "CLAUDE_CODE_SESSION_ID", source: "claude-code" },
|
|
22778
|
+
{ envVar: "CODEX_THREAD_ID", source: "codex" },
|
|
22779
|
+
{ envVar: "ANTIGRAVITY_TRAJECTORY_ID", source: "antigravity" },
|
|
22780
|
+
{ envVar: "TERM_SESSION_ID", source: "terminal" },
|
|
22781
|
+
{ envVar: "WT_SESSION", source: "terminal" }
|
|
22782
|
+
];
|
|
22783
|
+
var telemetrySessionSlot = singleton("TelemetrySession");
|
|
22774
22784
|
var telemetryOperationIdSlot = singleton("TelemetryOperationId");
|
|
22775
22785
|
function getProcessEnv2() {
|
|
22776
22786
|
return globalThis.process?.env;
|
|
@@ -22779,14 +22789,42 @@ function normalizeSessionId(value) {
|
|
|
22779
22789
|
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
22780
22790
|
return;
|
|
22781
22791
|
}
|
|
22782
|
-
const
|
|
22783
|
-
return
|
|
22792
|
+
const cleaned = String(value).replace(CONTROL_CHARACTERS, "").trim().slice(0, SESSION_ID_MAX_LENGTH);
|
|
22793
|
+
return cleaned || undefined;
|
|
22784
22794
|
}
|
|
22785
22795
|
function getConfiguredTelemetrySessionId() {
|
|
22786
22796
|
return normalizeSessionId(getProcessEnv2()?.[TELEMETRY_SESSION_ID_ENV]);
|
|
22787
22797
|
}
|
|
22788
|
-
function
|
|
22789
|
-
|
|
22798
|
+
function getInheritedSession(env2) {
|
|
22799
|
+
for (const candidate of INHERITED_SESSION_SOURCES) {
|
|
22800
|
+
const handle = normalizeSessionId(env2[candidate.envVar]);
|
|
22801
|
+
if (handle) {
|
|
22802
|
+
return { id: handle, source: candidate.source };
|
|
22803
|
+
}
|
|
22804
|
+
}
|
|
22805
|
+
return;
|
|
22806
|
+
}
|
|
22807
|
+
function generateRandomSession() {
|
|
22808
|
+
const bytes = new Uint8Array(RANDOM_SESSION_ID_LENGTH / 2);
|
|
22809
|
+
crypto.getRandomValues(bytes);
|
|
22810
|
+
let hex = "";
|
|
22811
|
+
for (const byte of bytes) {
|
|
22812
|
+
hex += byte.toString(16).padStart(2, "0");
|
|
22813
|
+
}
|
|
22814
|
+
return { id: hex, source: "random" };
|
|
22815
|
+
}
|
|
22816
|
+
function resolveTelemetrySession() {
|
|
22817
|
+
const existing = telemetrySessionSlot.get();
|
|
22818
|
+
if (existing) {
|
|
22819
|
+
return existing;
|
|
22820
|
+
}
|
|
22821
|
+
const declaredHandle = getConfiguredTelemetrySessionId();
|
|
22822
|
+
const resolved = declaredHandle ? { id: declaredHandle, source: "declared" } : getInheritedSession(getProcessEnv2() ?? {}) ?? generateRandomSession();
|
|
22823
|
+
telemetrySessionSlot.set(resolved);
|
|
22824
|
+
return resolved;
|
|
22825
|
+
}
|
|
22826
|
+
function getTelemetrySessionSource() {
|
|
22827
|
+
return resolveTelemetrySession().source;
|
|
22790
22828
|
}
|
|
22791
22829
|
function getTelemetryOperationId() {
|
|
22792
22830
|
const existing = telemetryOperationIdSlot.get();
|
|
@@ -23152,14 +23190,11 @@ class TelemetryService {
|
|
|
23152
23190
|
}
|
|
23153
23191
|
async trackDependencyOperation(name, type, fn, properties) {
|
|
23154
23192
|
const parentContext = this.getCurrentContext();
|
|
23155
|
-
|
|
23156
|
-
throw new Error("trackDependencyOperation must be called within a trackRequest block.");
|
|
23157
|
-
}
|
|
23158
|
-
const childContext = {
|
|
23193
|
+
const childContext = parentContext !== undefined ? {
|
|
23159
23194
|
operationId: parentContext.operationId,
|
|
23160
23195
|
parentId: parentContext.id,
|
|
23161
23196
|
id: this.generateId()
|
|
23162
|
-
};
|
|
23197
|
+
} : this.createRequestContext();
|
|
23163
23198
|
const startTime = performance.now();
|
|
23164
23199
|
try {
|
|
23165
23200
|
const result = await this.contextStorage.run(childContext, fn);
|
|
@@ -23180,24 +23215,18 @@ class TelemetryService {
|
|
|
23180
23215
|
}
|
|
23181
23216
|
enrichPropertiesWithContext(properties, context) {
|
|
23182
23217
|
const globalProperties = getGlobalTelemetryProperties();
|
|
23183
|
-
const existingSessionId = properties?.[TELEMETRY_SESSION_ID_PROPERTY] ?? this.defaultProperties?.[TELEMETRY_SESSION_ID_PROPERTY] ?? globalProperties?.[TELEMETRY_SESSION_ID_PROPERTY];
|
|
23184
|
-
const sessionId = resolveTelemetrySessionId(existingSessionId);
|
|
23185
23218
|
const enriched = {
|
|
23186
23219
|
...getExecutionContextTelemetryProperties(),
|
|
23187
23220
|
...globalProperties,
|
|
23188
23221
|
...this.defaultProperties,
|
|
23189
23222
|
...redactProperties(properties ?? {}),
|
|
23223
|
+
[TELEMETRY_SESSION_SOURCE_PROPERTY]: getTelemetrySessionSource(),
|
|
23190
23224
|
...context ? {
|
|
23191
23225
|
[TELEMETRY_OPERATION_ID_PROPERTY]: context.operationId,
|
|
23192
23226
|
...context.parentId !== undefined ? { [TELEMETRY_PARENT_ID_PROPERTY]: context.parentId } : {},
|
|
23193
23227
|
[TELEMETRY_SPAN_ID_PROPERTY]: context.id
|
|
23194
23228
|
} : {}
|
|
23195
23229
|
};
|
|
23196
|
-
if (sessionId === undefined) {
|
|
23197
|
-
delete enriched[TELEMETRY_SESSION_ID_PROPERTY];
|
|
23198
|
-
} else {
|
|
23199
|
-
enriched[TELEMETRY_SESSION_ID_PROPERTY] = sessionId;
|
|
23200
|
-
}
|
|
23201
23230
|
return enriched;
|
|
23202
23231
|
}
|
|
23203
23232
|
generateId() {
|
|
@@ -23214,6 +23243,7 @@ class TelemetryService {
|
|
|
23214
23243
|
}
|
|
23215
23244
|
}
|
|
23216
23245
|
var factorySlot = singleton("PackagerFactoryProvider");
|
|
23246
|
+
var moduleSlot = singleton("ToolModuleProvider");
|
|
23217
23247
|
// src/models/packager-parameters.ts
|
|
23218
23248
|
import {
|
|
23219
23249
|
LogLevel as LogLevel2
|
|
@@ -23613,7 +23643,7 @@ import { translate as translate3 } from "@uipath/solutionpackager-tool-core";
|
|
|
23613
23643
|
var package_default = {
|
|
23614
23644
|
name: "@uipath/project-packager",
|
|
23615
23645
|
license: "MIT",
|
|
23616
|
-
version: "1.
|
|
23646
|
+
version: "1.200.0-preview.109",
|
|
23617
23647
|
description: "UiPath Project Packager - core library for packing individual UiPath projects",
|
|
23618
23648
|
type: "module",
|
|
23619
23649
|
main: "./dist/index.js",
|
|
@@ -23676,8 +23706,8 @@ var package_default = {
|
|
|
23676
23706
|
"@uipath/packager-tool-webapp": "workspace:*",
|
|
23677
23707
|
"@uipath/packager-tool-workflowcompiler": "workspace:*",
|
|
23678
23708
|
"@vitest/coverage-v8": "^4.1.6",
|
|
23679
|
-
jsdom: "^
|
|
23680
|
-
typescript: "^
|
|
23709
|
+
jsdom: "^30.0.1",
|
|
23710
|
+
typescript: "^7.0.2",
|
|
23681
23711
|
"vite-tsconfig-paths": "^6.1.1",
|
|
23682
23712
|
vitest: "^4.1.6"
|
|
23683
23713
|
}
|
|
@@ -24702,7 +24732,7 @@ class ProjectPackager {
|
|
|
24702
24732
|
}, cancellationToken);
|
|
24703
24733
|
}
|
|
24704
24734
|
async packProjectAsync(options, cancellationToken) {
|
|
24705
|
-
return await this.telemetryService.
|
|
24735
|
+
return await this.telemetryService.trackDependencyOperation("ProjectPackager.Pack" /* ProjectPackagerPack */, "pack", async () => {
|
|
24706
24736
|
try {
|
|
24707
24737
|
await this.governancePolicyService.resolveGovernancePolicyAsync(options.validateOptions, options.connection, cancellationToken);
|
|
24708
24738
|
let result = await this.packOptionsValidator.validateAsync(options, cancellationToken);
|
|
@@ -24787,7 +24817,7 @@ class ProjectPackager {
|
|
|
24787
24817
|
return packageStreams;
|
|
24788
24818
|
}
|
|
24789
24819
|
async executeProjectOperationAsync(options, operationName, telemetryName, operation, _cancellationToken) {
|
|
24790
|
-
return await this.telemetryService.
|
|
24820
|
+
return await this.telemetryService.trackDependencyOperation(telemetryName, operationName.toLowerCase(), async () => {
|
|
24791
24821
|
try {
|
|
24792
24822
|
const loadedProject = await this.projectLoader.loadProject(options.inputPath);
|
|
24793
24823
|
const uiPathProject = {
|
|
@@ -24888,4 +24918,4 @@ export {
|
|
|
24888
24918
|
BrowserContextStorage
|
|
24889
24919
|
};
|
|
24890
24920
|
|
|
24891
|
-
//# debugId=
|
|
24921
|
+
//# debugId=0B334606CC8785AC64756E2164756E21
|
package/dist/node.js
CHANGED
|
@@ -7179,7 +7179,7 @@ function requireOmap() {
|
|
|
7179
7179
|
function resolveYamlOmap(data) {
|
|
7180
7180
|
if (data === null)
|
|
7181
7181
|
return true;
|
|
7182
|
-
const objectKeys =
|
|
7182
|
+
const objectKeys = {};
|
|
7183
7183
|
const object = data;
|
|
7184
7184
|
for (let index = 0, length = object.length;index < length; index += 1) {
|
|
7185
7185
|
const pair = object[index];
|
|
@@ -7197,10 +7197,9 @@ function requireOmap() {
|
|
|
7197
7197
|
}
|
|
7198
7198
|
if (!pairHasKey)
|
|
7199
7199
|
return false;
|
|
7200
|
-
if (
|
|
7201
|
-
objectKeys.push(pairKey);
|
|
7202
|
-
else
|
|
7200
|
+
if (_hasOwnProperty.call(objectKeys, pairKey))
|
|
7203
7201
|
return false;
|
|
7202
|
+
Object.defineProperty(objectKeys, pairKey, { value: true });
|
|
7204
7203
|
}
|
|
7205
7204
|
return true;
|
|
7206
7205
|
}
|
|
@@ -9824,7 +9823,7 @@ function buildCommandTerminalTelemetryProperties(input) {
|
|
|
9824
9823
|
}
|
|
9825
9824
|
var CommonTelemetryEvents = {
|
|
9826
9825
|
Error: "uip.error",
|
|
9827
|
-
ShipSucceeded: "
|
|
9826
|
+
ShipSucceeded: "uip.ship.succeeded"
|
|
9828
9827
|
};
|
|
9829
9828
|
function readRegistryValue(keyPath, valueName) {
|
|
9830
9829
|
if (process.platform !== "win32") {
|
|
@@ -10062,8 +10061,18 @@ function getInboundTraceContext() {
|
|
|
10062
10061
|
return parseInboundTraceparent(getProcessEnv()?.[TELEMETRY_TRACEPARENT_ENV]);
|
|
10063
10062
|
}
|
|
10064
10063
|
var TELEMETRY_SESSION_ID_ENV = "UIPATH_SESSION_ID";
|
|
10065
|
-
var
|
|
10066
|
-
var
|
|
10064
|
+
var SESSION_ID_MAX_LENGTH = 64;
|
|
10065
|
+
var RANDOM_SESSION_ID_LENGTH = 32;
|
|
10066
|
+
var TELEMETRY_SESSION_SOURCE_PROPERTY = "session_id_source";
|
|
10067
|
+
var CONTROL_CHARACTERS = /\p{Cc}/gu;
|
|
10068
|
+
var INHERITED_SESSION_SOURCES = [
|
|
10069
|
+
{ envVar: "CLAUDE_CODE_SESSION_ID", source: "claude-code" },
|
|
10070
|
+
{ envVar: "CODEX_THREAD_ID", source: "codex" },
|
|
10071
|
+
{ envVar: "ANTIGRAVITY_TRAJECTORY_ID", source: "antigravity" },
|
|
10072
|
+
{ envVar: "TERM_SESSION_ID", source: "terminal" },
|
|
10073
|
+
{ envVar: "WT_SESSION", source: "terminal" }
|
|
10074
|
+
];
|
|
10075
|
+
var telemetrySessionSlot = singleton("TelemetrySession");
|
|
10067
10076
|
var telemetryOperationIdSlot = singleton("TelemetryOperationId");
|
|
10068
10077
|
function getProcessEnv2() {
|
|
10069
10078
|
return globalThis.process?.env;
|
|
@@ -10072,14 +10081,42 @@ function normalizeSessionId(value) {
|
|
|
10072
10081
|
if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean") {
|
|
10073
10082
|
return;
|
|
10074
10083
|
}
|
|
10075
|
-
const
|
|
10076
|
-
return
|
|
10084
|
+
const cleaned = String(value).replace(CONTROL_CHARACTERS, "").trim().slice(0, SESSION_ID_MAX_LENGTH);
|
|
10085
|
+
return cleaned || undefined;
|
|
10077
10086
|
}
|
|
10078
10087
|
function getConfiguredTelemetrySessionId() {
|
|
10079
10088
|
return normalizeSessionId(getProcessEnv2()?.[TELEMETRY_SESSION_ID_ENV]);
|
|
10080
10089
|
}
|
|
10081
|
-
function
|
|
10082
|
-
|
|
10090
|
+
function getInheritedSession(env) {
|
|
10091
|
+
for (const candidate of INHERITED_SESSION_SOURCES) {
|
|
10092
|
+
const handle = normalizeSessionId(env[candidate.envVar]);
|
|
10093
|
+
if (handle) {
|
|
10094
|
+
return { id: handle, source: candidate.source };
|
|
10095
|
+
}
|
|
10096
|
+
}
|
|
10097
|
+
return;
|
|
10098
|
+
}
|
|
10099
|
+
function generateRandomSession() {
|
|
10100
|
+
const bytes = new Uint8Array(RANDOM_SESSION_ID_LENGTH / 2);
|
|
10101
|
+
crypto.getRandomValues(bytes);
|
|
10102
|
+
let hex = "";
|
|
10103
|
+
for (const byte of bytes) {
|
|
10104
|
+
hex += byte.toString(16).padStart(2, "0");
|
|
10105
|
+
}
|
|
10106
|
+
return { id: hex, source: "random" };
|
|
10107
|
+
}
|
|
10108
|
+
function resolveTelemetrySession() {
|
|
10109
|
+
const existing = telemetrySessionSlot.get();
|
|
10110
|
+
if (existing) {
|
|
10111
|
+
return existing;
|
|
10112
|
+
}
|
|
10113
|
+
const declaredHandle = getConfiguredTelemetrySessionId();
|
|
10114
|
+
const resolved = declaredHandle ? { id: declaredHandle, source: "declared" } : getInheritedSession(getProcessEnv2() ?? {}) ?? generateRandomSession();
|
|
10115
|
+
telemetrySessionSlot.set(resolved);
|
|
10116
|
+
return resolved;
|
|
10117
|
+
}
|
|
10118
|
+
function getTelemetrySessionSource() {
|
|
10119
|
+
return resolveTelemetrySession().source;
|
|
10083
10120
|
}
|
|
10084
10121
|
function getTelemetryOperationId() {
|
|
10085
10122
|
const existing = telemetryOperationIdSlot.get();
|
|
@@ -10323,14 +10360,11 @@ class TelemetryService {
|
|
|
10323
10360
|
}
|
|
10324
10361
|
async trackDependencyOperation(name, type2, fn, properties) {
|
|
10325
10362
|
const parentContext = this.getCurrentContext();
|
|
10326
|
-
|
|
10327
|
-
throw new Error("trackDependencyOperation must be called within a trackRequest block.");
|
|
10328
|
-
}
|
|
10329
|
-
const childContext = {
|
|
10363
|
+
const childContext = parentContext !== undefined ? {
|
|
10330
10364
|
operationId: parentContext.operationId,
|
|
10331
10365
|
parentId: parentContext.id,
|
|
10332
10366
|
id: this.generateId()
|
|
10333
|
-
};
|
|
10367
|
+
} : this.createRequestContext();
|
|
10334
10368
|
const startTime = performance.now();
|
|
10335
10369
|
try {
|
|
10336
10370
|
const result = await this.contextStorage.run(childContext, fn);
|
|
@@ -10351,24 +10385,18 @@ class TelemetryService {
|
|
|
10351
10385
|
}
|
|
10352
10386
|
enrichPropertiesWithContext(properties, context) {
|
|
10353
10387
|
const globalProperties = getGlobalTelemetryProperties();
|
|
10354
|
-
const existingSessionId = properties?.[TELEMETRY_SESSION_ID_PROPERTY] ?? this.defaultProperties?.[TELEMETRY_SESSION_ID_PROPERTY] ?? globalProperties?.[TELEMETRY_SESSION_ID_PROPERTY];
|
|
10355
|
-
const sessionId = resolveTelemetrySessionId(existingSessionId);
|
|
10356
10388
|
const enriched = {
|
|
10357
10389
|
...getExecutionContextTelemetryProperties(),
|
|
10358
10390
|
...globalProperties,
|
|
10359
10391
|
...this.defaultProperties,
|
|
10360
10392
|
...redactProperties(properties ?? {}),
|
|
10393
|
+
[TELEMETRY_SESSION_SOURCE_PROPERTY]: getTelemetrySessionSource(),
|
|
10361
10394
|
...context ? {
|
|
10362
10395
|
[TELEMETRY_OPERATION_ID_PROPERTY]: context.operationId,
|
|
10363
10396
|
...context.parentId !== undefined ? { [TELEMETRY_PARENT_ID_PROPERTY]: context.parentId } : {},
|
|
10364
10397
|
[TELEMETRY_SPAN_ID_PROPERTY]: context.id
|
|
10365
10398
|
} : {}
|
|
10366
10399
|
};
|
|
10367
|
-
if (sessionId === undefined) {
|
|
10368
|
-
delete enriched[TELEMETRY_SESSION_ID_PROPERTY];
|
|
10369
|
-
} else {
|
|
10370
|
-
enriched[TELEMETRY_SESSION_ID_PROPERTY] = sessionId;
|
|
10371
|
-
}
|
|
10372
10400
|
return enriched;
|
|
10373
10401
|
}
|
|
10374
10402
|
generateId() {
|
|
@@ -10385,6 +10413,8 @@ class TelemetryService {
|
|
|
10385
10413
|
}
|
|
10386
10414
|
}
|
|
10387
10415
|
var providerSlot = singleton("TelemetryProvider");
|
|
10416
|
+
var sidecarEntrySlot = singleton("TelemetrySidecarEntry");
|
|
10417
|
+
var MAX_SPOOL_AGE_MS = 72 * 60 * 60 * 1000;
|
|
10388
10418
|
var telemetryInstanceSlot = singleton("TelemetryService");
|
|
10389
10419
|
var DEFAULT_AI_CONNECTION_STRING = atob("SW5zdHJ1bWVudGF0aW9uS2V5PTliZDM3NDgyLTgxMGUtNDQyYS1hYWE2LWQzOGVmNjVjNjY3NDtJbmdlc3Rpb25FbmRwb2ludD1odHRwczovL3dlc3RldXJvcGUtNS5pbi5hcHBsaWNhdGlvbmluc2lnaHRzLmF6dXJlLmNvbS87TGl2ZUVuZHBvaW50PWh0dHBzOi8vd2VzdGV1cm9wZS5saXZlZGlhZ25vc3RpY3MubW9uaXRvci5henVyZS5jb20vO0FwcGxpY2F0aW9uSWQ9MzU2OTdlZjEtOGJkMC00ZjE5LWEyN2MtZDg3Y2NhYzY2ZDJj");
|
|
10390
10420
|
function getGlobalTelemetryInstance() {
|
|
@@ -10630,21 +10660,43 @@ function printTable(data, logFn, externalLogValue) {
|
|
|
10630
10660
|
logFn(`Log: ${externalLogValue}`);
|
|
10631
10661
|
}
|
|
10632
10662
|
}
|
|
10663
|
+
function isPlainObjectArray(value) {
|
|
10664
|
+
return Array.isArray(value) && value.length > 0 && value.every(isPlainRecord);
|
|
10665
|
+
}
|
|
10666
|
+
function isNonEmptyPlainObject(value) {
|
|
10667
|
+
return isPlainRecord(value) && Object.keys(value).length > 0;
|
|
10668
|
+
}
|
|
10669
|
+
var NESTED_INDENT = " ";
|
|
10633
10670
|
function printVerticalTable(data, logFn = console.log, externalLogValue) {
|
|
10634
10671
|
const keys = Object.keys(data).filter((key) => !["code", "log"].includes(key.toLowerCase()));
|
|
10635
10672
|
if (keys.length === 0)
|
|
10636
10673
|
return;
|
|
10637
|
-
const
|
|
10674
|
+
const isBlockValue = (value) => isPlainObjectArray(value) || isNonEmptyPlainObject(value);
|
|
10675
|
+
const scalarKeys = keys.filter((key) => !isBlockValue(data[key]));
|
|
10676
|
+
const maxKeyWidth = scalarKeys.length > 0 ? Math.max(...scalarKeys.map((key) => key.length)) : 0;
|
|
10677
|
+
const termWidth = process.stdout.columns || 120;
|
|
10678
|
+
const nestedWidth = Math.max(termWidth - NESTED_INDENT.length, 1);
|
|
10638
10679
|
keys.forEach((key) => {
|
|
10680
|
+
const value = data[key];
|
|
10681
|
+
if (isPlainObjectArray(value)) {
|
|
10682
|
+
logFn(`${key}:`);
|
|
10683
|
+
printResizableTable(value, (line) => logFn(`${NESTED_INDENT}${line}`), undefined, nestedWidth);
|
|
10684
|
+
return;
|
|
10685
|
+
}
|
|
10686
|
+
if (isNonEmptyPlainObject(value)) {
|
|
10687
|
+
logFn(`${key}:`);
|
|
10688
|
+
printVerticalTable(value, (line) => logFn(`${NESTED_INDENT}${line}`));
|
|
10689
|
+
return;
|
|
10690
|
+
}
|
|
10639
10691
|
const keyCol = key.padEnd(maxKeyWidth);
|
|
10640
|
-
logFn(`${keyCol} | ${cellToString(
|
|
10692
|
+
logFn(`${keyCol} | ${cellToString(value)}`);
|
|
10641
10693
|
});
|
|
10642
10694
|
if (externalLogValue) {
|
|
10643
10695
|
logFn("");
|
|
10644
10696
|
logFn(`Log: ${externalLogValue}`);
|
|
10645
10697
|
}
|
|
10646
10698
|
}
|
|
10647
|
-
function printResizableTable(data, logFn = console.log, externalLogValue) {
|
|
10699
|
+
function printResizableTable(data, logFn = console.log, externalLogValue, availableWidth) {
|
|
10648
10700
|
if (data.length === 0)
|
|
10649
10701
|
return;
|
|
10650
10702
|
const keys = Object.keys(data[0]).filter((key) => !["code", "log"].includes(key.toLowerCase()));
|
|
@@ -10657,7 +10709,7 @@ function printResizableTable(data, logFn = console.log, externalLogValue) {
|
|
|
10657
10709
|
const naturalWidths = keys.map((key) => Math.max(key.length, ...data.map((item) => cellToString(item[key]).length)));
|
|
10658
10710
|
const separatorTotal = (keys.length - 1) * 3;
|
|
10659
10711
|
const totalWidth = naturalWidths.reduce((a, b) => a + b, 0) + separatorTotal;
|
|
10660
|
-
const termWidth = process.stdout.columns || 120;
|
|
10712
|
+
const termWidth = availableWidth ?? (process.stdout.columns || 120);
|
|
10661
10713
|
if (totalWidth <= termWidth) {
|
|
10662
10714
|
printTable(data, logFn, externalLogValue);
|
|
10663
10715
|
return;
|
|
@@ -10738,6 +10790,19 @@ class FilterEvaluationError extends Error {
|
|
|
10738
10790
|
this.instructions = `The --output-filter expression '${filter}' failed at evaluation time. ` + "Note that --output-filter operates on the 'Data' field of the envelope, not the full object. " + "For example, on a list result use 'length(@)' instead of 'Data | length(@)'.";
|
|
10739
10791
|
}
|
|
10740
10792
|
}
|
|
10793
|
+
|
|
10794
|
+
class FilterImplicitLimitError extends Error {
|
|
10795
|
+
__brand = "FilterImplicitLimitError";
|
|
10796
|
+
errorCode = "invalid_argument";
|
|
10797
|
+
instructions;
|
|
10798
|
+
retry = "RetryWillNotFix";
|
|
10799
|
+
result = RESULTS.ValidationError;
|
|
10800
|
+
constructor(defaultLimit) {
|
|
10801
|
+
super(`--output-filter requires an explicit --limit: this command defaults to --limit ${defaultLimit}, ` + `so the filter would silently apply to only the first ${defaultLimit} records.`);
|
|
10802
|
+
this.name = "FilterImplicitLimitError";
|
|
10803
|
+
this.instructions = "Pass --limit <n> to choose how many records the filter applies to. " + "To filter over all records, pass the command's maximum accepted --limit (see the option's description in --help).";
|
|
10804
|
+
}
|
|
10805
|
+
}
|
|
10741
10806
|
function applyFilter(data, filter) {
|
|
10742
10807
|
let result;
|
|
10743
10808
|
try {
|
|
@@ -10989,7 +11054,7 @@ var COMMAND_ATTRIBUTION = commandAttribution([
|
|
|
10989
11054
|
["agents", "build", ["uip.codedagent", "uip.agent"]],
|
|
10990
11055
|
["agenthub", "build", ["uip.agenthub"]],
|
|
10991
11056
|
["coded-apps", "build", ["uip.codedapp"]],
|
|
10992
|
-
["functions", "build", ["uip.functions"]],
|
|
11057
|
+
["functions", "build", ["uip.function", "uip.functions"]],
|
|
10993
11058
|
["solution", "build", ["uip.solution"]],
|
|
10994
11059
|
["maestro", "build", ["uip.maestro", "uip.case", "uip.flow"]],
|
|
10995
11060
|
["llm-observability", "troubleshoot", ["uip.traces"]],
|
|
@@ -11128,6 +11193,16 @@ function commandHelpHint(commandPath) {
|
|
|
11128
11193
|
function isPromptCancellation(error) {
|
|
11129
11194
|
return error instanceof Error && error.name === "ExitPromptError";
|
|
11130
11195
|
}
|
|
11196
|
+
function implicitLimitViolation(cmd) {
|
|
11197
|
+
if (getOutputFilter() === undefined) {
|
|
11198
|
+
return;
|
|
11199
|
+
}
|
|
11200
|
+
const hasLimit = cmd.options.some((o) => o.attributeName() === "limit");
|
|
11201
|
+
if (!hasLimit || cmd.getOptionValueSource("limit") !== "default") {
|
|
11202
|
+
return;
|
|
11203
|
+
}
|
|
11204
|
+
return new FilterImplicitLimitError(String(cmd.opts().limit));
|
|
11205
|
+
}
|
|
11131
11206
|
function exitCodeFromProcess(fallback) {
|
|
11132
11207
|
return typeof process.exitCode === "number" ? process.exitCode : fallback;
|
|
11133
11208
|
}
|
|
@@ -11141,7 +11216,13 @@ Command.prototype.trackedAction = function(context, fn, properties) {
|
|
|
11141
11216
|
let errorMessage;
|
|
11142
11217
|
let fallbackExitCode = EXIT_CODES.Success;
|
|
11143
11218
|
clearRecordedCommandFailureTelemetry();
|
|
11144
|
-
const [error] = await catchError(telemetry.runWithContext(requestContext, () =>
|
|
11219
|
+
const [error] = await catchError(telemetry.runWithContext(requestContext, () => {
|
|
11220
|
+
const violation = implicitLimitViolation(command);
|
|
11221
|
+
if (violation) {
|
|
11222
|
+
return Promise.reject(violation);
|
|
11223
|
+
}
|
|
11224
|
+
return fn(...args);
|
|
11225
|
+
}));
|
|
11145
11226
|
if (error) {
|
|
11146
11227
|
errorMessage = error instanceof Error ? error.message : String(error);
|
|
11147
11228
|
logger.debug(`[trackedAction] ${telemetryName} failed: ${errorMessage}`);
|
|
@@ -11197,6 +11278,20 @@ Command.prototype.trackedAction = function(context, fn, properties) {
|
|
|
11197
11278
|
var guardInstalledSlot = singleton("ConsoleGuardInstalled");
|
|
11198
11279
|
var savedOriginalsSlot = singleton("ConsoleGuardOriginals");
|
|
11199
11280
|
var DEFAULT_AUTH_TIMEOUT_MS = 5 * 60 * 1000;
|
|
11281
|
+
var HOST_GLOBAL_OPTIONS_WITH_VALUE = [
|
|
11282
|
+
"--output",
|
|
11283
|
+
"--output-filter",
|
|
11284
|
+
"--log-level",
|
|
11285
|
+
"--log-file",
|
|
11286
|
+
"--profile"
|
|
11287
|
+
];
|
|
11288
|
+
var HOST_GLOBAL_FLAGS = [
|
|
11289
|
+
"--json",
|
|
11290
|
+
"--interactive",
|
|
11291
|
+
"--no-interactive"
|
|
11292
|
+
];
|
|
11293
|
+
var VALUE_OPTIONS = new Set(HOST_GLOBAL_OPTIONS_WITH_VALUE);
|
|
11294
|
+
var BOOLEAN_FLAGS = new Set(HOST_GLOBAL_FLAGS);
|
|
11200
11295
|
var modeSlot = singleton("InteractivityMode");
|
|
11201
11296
|
var interactiveFlagSlot = singleton("InteractiveFlag");
|
|
11202
11297
|
var PollOutcome = {
|
|
@@ -11248,6 +11343,8 @@ var ScreenLogger;
|
|
|
11248
11343
|
ScreenLogger2.progress = progress;
|
|
11249
11344
|
})(ScreenLogger ||= {});
|
|
11250
11345
|
var sdkUserAgentHostToken = singleton("SdkUserAgentHostToken");
|
|
11346
|
+
var factorySlot = singleton("PackagerFactoryProvider");
|
|
11347
|
+
var moduleSlot = singleton("ToolModuleProvider");
|
|
11251
11348
|
class ConsoleTelemetryProvider {
|
|
11252
11349
|
async trackEvent(eventName, _properties) {
|
|
11253
11350
|
console.debug(`[Telemetry] Event: ${eventName}`);
|
|
@@ -11263,7 +11360,6 @@ class ConsoleTelemetryProvider {
|
|
|
11263
11360
|
}
|
|
11264
11361
|
}
|
|
11265
11362
|
var shippedKeysSlot = singleton("ShipSucceededDedupeKeys");
|
|
11266
|
-
var factorySlot = singleton("PackagerFactoryProvider");
|
|
11267
11363
|
// src/base-node-packager-factory.ts
|
|
11268
11364
|
import { NodeFileSystem as NodeFileSystem2 } from "@uipath/filesystem";
|
|
11269
11365
|
import { translate } from "@uipath/solutionpackager-tool-core";
|
|
@@ -12234,7 +12330,7 @@ class ProjectPackager {
|
|
|
12234
12330
|
}, cancellationToken);
|
|
12235
12331
|
}
|
|
12236
12332
|
async packProjectAsync(options, cancellationToken) {
|
|
12237
|
-
return await this.telemetryService.
|
|
12333
|
+
return await this.telemetryService.trackDependencyOperation("ProjectPackager.Pack" /* ProjectPackagerPack */, "pack", async () => {
|
|
12238
12334
|
try {
|
|
12239
12335
|
await this.governancePolicyService.resolveGovernancePolicyAsync(options.validateOptions, options.connection, cancellationToken);
|
|
12240
12336
|
let result = await this.packOptionsValidator.validateAsync(options, cancellationToken);
|
|
@@ -12319,7 +12415,7 @@ class ProjectPackager {
|
|
|
12319
12415
|
return packageStreams;
|
|
12320
12416
|
}
|
|
12321
12417
|
async executeProjectOperationAsync(options, operationName, telemetryName, operation, _cancellationToken) {
|
|
12322
|
-
return await this.telemetryService.
|
|
12418
|
+
return await this.telemetryService.trackDependencyOperation(telemetryName, operationName.toLowerCase(), async () => {
|
|
12323
12419
|
try {
|
|
12324
12420
|
const loadedProject = await this.projectLoader.loadProject(options.inputPath);
|
|
12325
12421
|
const uiPathProject = {
|
|
@@ -12671,7 +12767,7 @@ import { translate as translate9 } from "@uipath/solutionpackager-tool-core";
|
|
|
12671
12767
|
var package_default = {
|
|
12672
12768
|
name: "@uipath/project-packager",
|
|
12673
12769
|
license: "MIT",
|
|
12674
|
-
version: "1.
|
|
12770
|
+
version: "1.200.0-preview.109",
|
|
12675
12771
|
description: "UiPath Project Packager - core library for packing individual UiPath projects",
|
|
12676
12772
|
type: "module",
|
|
12677
12773
|
main: "./dist/index.js",
|
|
@@ -12734,8 +12830,8 @@ var package_default = {
|
|
|
12734
12830
|
"@uipath/packager-tool-webapp": "workspace:*",
|
|
12735
12831
|
"@uipath/packager-tool-workflowcompiler": "workspace:*",
|
|
12736
12832
|
"@vitest/coverage-v8": "^4.1.6",
|
|
12737
|
-
jsdom: "^
|
|
12738
|
-
typescript: "^
|
|
12833
|
+
jsdom: "^30.0.1",
|
|
12834
|
+
typescript: "^7.0.2",
|
|
12739
12835
|
"vite-tsconfig-paths": "^6.1.1",
|
|
12740
12836
|
vitest: "^4.1.6"
|
|
12741
12837
|
}
|
|
@@ -13128,4 +13224,4 @@ export {
|
|
|
13128
13224
|
BaseNodePackagerFactory
|
|
13129
13225
|
};
|
|
13130
13226
|
|
|
13131
|
-
//# debugId=
|
|
13227
|
+
//# debugId=5C5DAF16F22D60FD64756E2164756E21
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uipath/project-packager",
|
|
3
3
|
"license": "MIT",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.200.0-preview.109",
|
|
5
5
|
"description": "UiPath Project Packager - core library for packing individual UiPath projects",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
"dist"
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@uipath/filesystem": "1.
|
|
36
|
-
"@uipath/solutionpackager-tool-core": "1.
|
|
37
|
-
"@uipath/common": "1.
|
|
35
|
+
"@uipath/filesystem": "1.200.0",
|
|
36
|
+
"@uipath/solutionpackager-tool-core": "1.200.0",
|
|
37
|
+
"@uipath/common": "1.200.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"fflate": "^0.8.2"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "fcc01cdae81bbd0c25d3d4fc287537a9d19d99f4"
|
|
43
43
|
}
|