@datatechsolutions/ui 3.2.0 → 3.3.0
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/astrlabe/contracts.d.mts +31 -3
- package/dist/astrlabe/contracts.d.ts +31 -3
- package/dist/astrlabe/index.js +115 -115
- package/dist/astrlabe/index.mjs +4 -4
- package/dist/astrlabe/utils.js +9 -9
- package/dist/astrlabe/utils.mjs +2 -2
- package/dist/astrlabe/workflow-canvas.js +3 -3
- package/dist/astrlabe/workflow-canvas.mjs +2 -2
- package/dist/{chunk-QYA53LUF.mjs → chunk-2WXRRQM3.mjs} +21 -4
- package/dist/chunk-2WXRRQM3.mjs.map +1 -0
- package/dist/{chunk-C3H4FM4A.js → chunk-72SWXOD5.js} +15 -2
- package/dist/chunk-72SWXOD5.js.map +1 -0
- package/dist/{chunk-H2D2CRTD.mjs → chunk-BR2GAZKG.mjs} +5 -5
- package/dist/{chunk-H2D2CRTD.mjs.map → chunk-BR2GAZKG.mjs.map} +1 -1
- package/dist/{chunk-NJS2YC3J.js → chunk-DJDZIRM6.js} +12 -2
- package/dist/chunk-DJDZIRM6.js.map +1 -0
- package/dist/{chunk-5W7L7BT7.mjs → chunk-G7JQ4OCE.mjs} +15 -2
- package/dist/chunk-G7JQ4OCE.mjs.map +1 -0
- package/dist/{chunk-YIB2YAM5.mjs → chunk-GIQXB3BG.mjs} +3 -3
- package/dist/{chunk-YIB2YAM5.mjs.map → chunk-GIQXB3BG.mjs.map} +1 -1
- package/dist/{chunk-RL35XATZ.js → chunk-IJAKZHXX.js} +82 -65
- package/dist/chunk-IJAKZHXX.js.map +1 -0
- package/dist/{chunk-U7XM3N7F.mjs → chunk-LEXBTVGM.mjs} +12 -2
- package/dist/chunk-LEXBTVGM.mjs.map +1 -0
- package/dist/{chunk-SU3YPWFW.js → chunk-MWPTSBAI.js} +4 -4
- package/dist/{chunk-SU3YPWFW.js.map → chunk-MWPTSBAI.js.map} +1 -1
- package/dist/{chunk-EFOXN3LC.js → chunk-NJFRJ6YD.js} +279 -19
- package/dist/chunk-NJFRJ6YD.js.map +1 -0
- package/dist/{chunk-YV72JM4B.mjs → chunk-O6M3KDGT.mjs} +3 -3
- package/dist/{chunk-YV72JM4B.mjs.map → chunk-O6M3KDGT.mjs.map} +1 -1
- package/dist/{chunk-RGI74SQH.js → chunk-OCELRSLO.js} +4 -4
- package/dist/{chunk-RGI74SQH.js.map → chunk-OCELRSLO.js.map} +1 -1
- package/dist/{chunk-IRT4T3CU.mjs → chunk-PCYL4MII.mjs} +274 -14
- package/dist/chunk-PCYL4MII.mjs.map +1 -0
- package/dist/{chunk-Y6AEE56Q.js → chunk-ZL6C2ZAF.js} +29 -29
- package/dist/{chunk-Y6AEE56Q.js.map → chunk-ZL6C2ZAF.js.map} +1 -1
- package/dist/platform/agents-workspace.js +6 -6
- package/dist/platform/agents-workspace.mjs +5 -5
- package/dist/platform/index.js +17 -17
- package/dist/platform/index.mjs +8 -8
- package/dist/platform/pages/index.js +12 -12
- package/dist/platform/pages/index.mjs +6 -6
- package/dist/platform/telemetry/index.js +9 -0
- package/dist/platform/telemetry/index.js.map +1 -1
- package/dist/platform/telemetry/index.mjs +9 -0
- package/dist/platform/telemetry/index.mjs.map +1 -1
- package/dist/platform/workflow-canvas-shell.js +4 -4
- package/dist/platform/workflow-canvas-shell.mjs +3 -3
- package/package.json +1 -1
- package/dist/chunk-5W7L7BT7.mjs.map +0 -1
- package/dist/chunk-C3H4FM4A.js.map +0 -1
- package/dist/chunk-EFOXN3LC.js.map +0 -1
- package/dist/chunk-IRT4T3CU.mjs.map +0 -1
- package/dist/chunk-NJS2YC3J.js.map +0 -1
- package/dist/chunk-QYA53LUF.mjs.map +0 -1
- package/dist/chunk-RL35XATZ.js.map +0 -1
- package/dist/chunk-U7XM3N7F.mjs.map +0 -1
package/dist/platform/index.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkOCELRSLO_js = require('../chunk-OCELRSLO.js');
|
|
5
5
|
var chunkKR2X2WHJ_js = require('../chunk-KR2X2WHJ.js');
|
|
6
6
|
var chunkTVMLV675_js = require('../chunk-TVMLV675.js');
|
|
7
7
|
var chunkP4RVGMZL_js = require('../chunk-P4RVGMZL.js');
|
|
8
8
|
var chunkZM5MVWIT_js = require('../chunk-ZM5MVWIT.js');
|
|
9
|
-
var
|
|
9
|
+
var chunkMWPTSBAI_js = require('../chunk-MWPTSBAI.js');
|
|
10
10
|
var chunkW5OEBO6E_js = require('../chunk-W5OEBO6E.js');
|
|
11
11
|
var chunkRXZNACMI_js = require('../chunk-RXZNACMI.js');
|
|
12
12
|
var chunkAOUUZ52N_js = require('../chunk-AOUUZ52N.js');
|
|
13
13
|
var chunkJSNRCYSO_js = require('../chunk-JSNRCYSO.js');
|
|
14
14
|
var chunkHDCUWUNH_js = require('../chunk-HDCUWUNH.js');
|
|
15
|
-
var
|
|
15
|
+
var chunkZL6C2ZAF_js = require('../chunk-ZL6C2ZAF.js');
|
|
16
16
|
require('../chunk-TIJJHW2Z.js');
|
|
17
17
|
var chunk3JJWPOK6_js = require('../chunk-3JJWPOK6.js');
|
|
18
18
|
var chunkHZ4LOVHM_js = require('../chunk-HZ4LOVHM.js');
|
|
19
19
|
var chunk6PBTB5ZX_js = require('../chunk-6PBTB5ZX.js');
|
|
20
|
-
require('../chunk-
|
|
20
|
+
require('../chunk-IJAKZHXX.js');
|
|
21
21
|
require('../chunk-55H6WZQP.js');
|
|
22
|
-
require('../chunk-
|
|
23
|
-
require('../chunk-
|
|
22
|
+
require('../chunk-DJDZIRM6.js');
|
|
23
|
+
require('../chunk-NJFRJ6YD.js');
|
|
24
24
|
var chunkI2NZGVBG_js = require('../chunk-I2NZGVBG.js');
|
|
25
25
|
require('../chunk-UZ3CMNUJ.js');
|
|
26
26
|
var chunkYXN2K77G_js = require('../chunk-YXN2K77G.js');
|
|
@@ -28,7 +28,7 @@ var chunkS7KHTUHA_js = require('../chunk-S7KHTUHA.js');
|
|
|
28
28
|
var chunkF54Q2YJY_js = require('../chunk-F54Q2YJY.js');
|
|
29
29
|
require('../chunk-FAGDZEKM.js');
|
|
30
30
|
require('../chunk-P4YYEM4B.js');
|
|
31
|
-
require('../chunk-
|
|
31
|
+
require('../chunk-72SWXOD5.js');
|
|
32
32
|
var jsxRuntime = require('react/jsx-runtime');
|
|
33
33
|
var react = require('react');
|
|
34
34
|
var client = require('@datatechsolutions/windsock/client');
|
|
@@ -229,7 +229,7 @@ function UsersSettingsSection({ normalizeRole }) {
|
|
|
229
229
|
void reload();
|
|
230
230
|
}, [currentOrganizationId]);
|
|
231
231
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
232
|
-
|
|
232
|
+
chunkMWPTSBAI_js.UsersPageView,
|
|
233
233
|
{
|
|
234
234
|
labels: {
|
|
235
235
|
title: t("title"),
|
|
@@ -272,7 +272,7 @@ function RolesSettingsSection({ roleDefinitions, roleOptions, normalizeRole }) {
|
|
|
272
272
|
chunk6PBTB5ZX_js.listUsers({ organizationId: currentOrganizationId }).then((result) => setUsers(result.items.map((row) => mapAdminUser(row, normalizeRole)))).catch((error) => notifyError(error.message));
|
|
273
273
|
}, [currentOrganizationId, notifyError, normalizeRole]);
|
|
274
274
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
275
|
-
|
|
275
|
+
chunkMWPTSBAI_js.RolesPageView,
|
|
276
276
|
{
|
|
277
277
|
roleDefinitions,
|
|
278
278
|
roleOptions,
|
|
@@ -5263,7 +5263,7 @@ function KoriAssistantDemo({ locale, hideHeader } = {}) {
|
|
|
5263
5263
|
|
|
5264
5264
|
Object.defineProperty(exports, "WorkflowCanvasShell", {
|
|
5265
5265
|
enumerable: true,
|
|
5266
|
-
get: function () { return
|
|
5266
|
+
get: function () { return chunkOCELRSLO_js.WorkflowCanvasShell; }
|
|
5267
5267
|
});
|
|
5268
5268
|
Object.defineProperty(exports, "AdminOrganizationForm", {
|
|
5269
5269
|
enumerable: true,
|
|
@@ -5339,7 +5339,7 @@ Object.defineProperty(exports, "ImpersonationBanner", {
|
|
|
5339
5339
|
});
|
|
5340
5340
|
Object.defineProperty(exports, "WorkflowWorkspace", {
|
|
5341
5341
|
enumerable: true,
|
|
5342
|
-
get: function () { return
|
|
5342
|
+
get: function () { return chunkMWPTSBAI_js.WorkflowWorkspace; }
|
|
5343
5343
|
});
|
|
5344
5344
|
Object.defineProperty(exports, "PlatformSettings", {
|
|
5345
5345
|
enumerable: true,
|
|
@@ -5403,27 +5403,27 @@ Object.defineProperty(exports, "BillingPanel", {
|
|
|
5403
5403
|
});
|
|
5404
5404
|
Object.defineProperty(exports, "AgentsWorkspace", {
|
|
5405
5405
|
enumerable: true,
|
|
5406
|
-
get: function () { return
|
|
5406
|
+
get: function () { return chunkZL6C2ZAF_js.AgentsWorkspace; }
|
|
5407
5407
|
});
|
|
5408
5408
|
Object.defineProperty(exports, "applyWorkflowExecutionEventToStore", {
|
|
5409
5409
|
enumerable: true,
|
|
5410
|
-
get: function () { return
|
|
5410
|
+
get: function () { return chunkZL6C2ZAF_js.applyWorkflowExecutionEventToStore; }
|
|
5411
5411
|
});
|
|
5412
5412
|
Object.defineProperty(exports, "resetWorkflowRunPresentation", {
|
|
5413
5413
|
enumerable: true,
|
|
5414
|
-
get: function () { return
|
|
5414
|
+
get: function () { return chunkZL6C2ZAF_js.resetWorkflowRunPresentation; }
|
|
5415
5415
|
});
|
|
5416
5416
|
Object.defineProperty(exports, "useRunEvents", {
|
|
5417
5417
|
enumerable: true,
|
|
5418
|
-
get: function () { return
|
|
5418
|
+
get: function () { return chunkZL6C2ZAF_js.useRunEvents; }
|
|
5419
5419
|
});
|
|
5420
5420
|
Object.defineProperty(exports, "useWorkflowExecution", {
|
|
5421
5421
|
enumerable: true,
|
|
5422
|
-
get: function () { return
|
|
5422
|
+
get: function () { return chunkZL6C2ZAF_js.useWorkflowExecution; }
|
|
5423
5423
|
});
|
|
5424
5424
|
Object.defineProperty(exports, "useWorkflowRunPresentation", {
|
|
5425
5425
|
enumerable: true,
|
|
5426
|
-
get: function () { return
|
|
5426
|
+
get: function () { return chunkZL6C2ZAF_js.useWorkflowRunPresentation; }
|
|
5427
5427
|
});
|
|
5428
5428
|
Object.defineProperty(exports, "PlatformAppShell", {
|
|
5429
5429
|
enumerable: true,
|
package/dist/platform/index.mjs
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { WorkflowCanvasShell } from '../chunk-
|
|
2
|
+
export { WorkflowCanvasShell } from '../chunk-GIQXB3BG.mjs';
|
|
3
3
|
export { AdminOrganizationForm, AdminOrganizationList, AdminPermissionList, AdminUserForm, AdminUserList } from '../chunk-B67DP7MI.mjs';
|
|
4
4
|
export { ConsentScreen, ForgotPassword, MfaChallenge, PasswordlessSignIn, ResetPassword, SignIn, SignUp, SsoConnectorList, SsoEmailForm, UserButton, VerifyEmail } from '../chunk-MVBIAXVN.mjs';
|
|
5
5
|
export { UpgradePrompt } from '../chunk-DJ33CSGJ.mjs';
|
|
6
6
|
export { ImpersonationBanner } from '../chunk-OL73LBX5.mjs';
|
|
7
|
-
import { UsersPageView, RolesPageView } from '../chunk-
|
|
8
|
-
export { WorkflowWorkspace } from '../chunk-
|
|
7
|
+
import { UsersPageView, RolesPageView } from '../chunk-O6M3KDGT.mjs';
|
|
8
|
+
export { WorkflowWorkspace } from '../chunk-O6M3KDGT.mjs';
|
|
9
9
|
export { PlatformSettings } from '../chunk-UDDZTTLO.mjs';
|
|
10
10
|
export { AdminOrganizationDetail } from '../chunk-IRPS5UCS.mjs';
|
|
11
11
|
export { LinkedAccountsTabContent, MfaManage, MfaSetup, ProfileTabContent, SecurityTabContent, SessionsTabContent, UserProfile } from '../chunk-LEKZUS6N.mjs';
|
|
12
12
|
export { AuthLayout, BackupCodeGrid, OtpInput, PasswordStrengthMeter, SocialLoginButtons } from '../chunk-5GDKCFM5.mjs';
|
|
13
13
|
export { BillingPanel } from '../chunk-R4TQWXNG.mjs';
|
|
14
|
-
export { AgentsWorkspace, applyWorkflowExecutionEventToStore, resetWorkflowRunPresentation, useRunEvents, useWorkflowExecution, useWorkflowRunPresentation } from '../chunk-
|
|
14
|
+
export { AgentsWorkspace, applyWorkflowExecutionEventToStore, resetWorkflowRunPresentation, useRunEvents, useWorkflowExecution, useWorkflowRunPresentation } from '../chunk-BR2GAZKG.mjs';
|
|
15
15
|
import '../chunk-5RM6NGZ6.mjs';
|
|
16
16
|
import { usePlatformState } from '../chunk-3ZUMJTDT.mjs';
|
|
17
17
|
export { PlatformAppShell, PlatformStateProvider, usePlatformState } from '../chunk-3ZUMJTDT.mjs';
|
|
18
18
|
export { createPlatformRbac } from '../chunk-ZJPNP2YW.mjs';
|
|
19
19
|
import { createUser, listUsers, addOrganizationMember } from '../chunk-UHHPBREK.mjs';
|
|
20
20
|
export { addOrganizationDomain, addOrganizationMember, createOrganization, createOrganizationInvitation, createPermission, createSecret, createUser, deleteOrganization, deletePermission, deleteUser, disableSecret, getSecret, getUserPermissions, listOrganizationDomains, listOrganizationInvitations, listOrganizationMembers, listOrganizations, listPermissions, listSecrets, listUsers, removeOrganizationMember, resetUserPassword, rotateSecret, setUserPermissions, setWindsockAdminClient, updateOrganization, updatePermission, updateUser, verifyOrganizationDomain } from '../chunk-UHHPBREK.mjs';
|
|
21
|
-
import '../chunk-
|
|
21
|
+
import '../chunk-2WXRRQM3.mjs';
|
|
22
22
|
import '../chunk-JB6RNAD2.mjs';
|
|
23
|
-
import '../chunk-
|
|
24
|
-
import '../chunk-
|
|
23
|
+
import '../chunk-LEXBTVGM.mjs';
|
|
24
|
+
import '../chunk-PCYL4MII.mjs';
|
|
25
25
|
import { Select, Button, filterByPermission, AppNavigation, GlassModal, IconButton, useNotifications, Textarea, DepartmentAssistantDemo, koriAssistantTheme, logisticsWorkflow, marketingWorkflow, manufacturingWorkflow, supportWorkflow, lgpdWorkflow, payrollWorkflow, inventoryWorkflow, financialWorkflow, salesWorkflow, customerAnalyticsWorkflow } from '../chunk-JN6IL6OH.mjs';
|
|
26
26
|
import '../chunk-D2JF6C3E.mjs';
|
|
27
27
|
import { useTranslations, useLocale } from '../chunk-7VJ7CMMT.mjs';
|
|
@@ -29,7 +29,7 @@ import { usePathname, useRouter } from '../chunk-QWG2FMUN.mjs';
|
|
|
29
29
|
import { listModelProviderConnections, listWorkflowTemplates, createWorkflowFromTemplate, aiGenerateWorkflow, createWorkflow, saveWorkflowDraft } from '../chunk-ZV5EZXXO.mjs';
|
|
30
30
|
import '../chunk-SYNVNTLJ.mjs';
|
|
31
31
|
import '../chunk-OZNTQROP.mjs';
|
|
32
|
-
import '../chunk-
|
|
32
|
+
import '../chunk-G7JQ4OCE.mjs';
|
|
33
33
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
34
34
|
import { useState, useMemo, useCallback, useEffect } from 'react';
|
|
35
35
|
import { useAuth, usePlatformPreferences } from '@datatechsolutions/windsock/client';
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
var chunk3T2WGL47_js = require('../../chunk-3T2WGL47.js');
|
|
5
|
-
var
|
|
5
|
+
var chunkMWPTSBAI_js = require('../../chunk-MWPTSBAI.js');
|
|
6
6
|
var chunkTIJJHW2Z_js = require('../../chunk-TIJJHW2Z.js');
|
|
7
|
-
var
|
|
7
|
+
var chunkIJAKZHXX_js = require('../../chunk-IJAKZHXX.js');
|
|
8
8
|
require('../../chunk-55H6WZQP.js');
|
|
9
|
-
require('../../chunk-
|
|
10
|
-
require('../../chunk-
|
|
9
|
+
require('../../chunk-DJDZIRM6.js');
|
|
10
|
+
require('../../chunk-NJFRJ6YD.js');
|
|
11
11
|
var chunkI2NZGVBG_js = require('../../chunk-I2NZGVBG.js');
|
|
12
12
|
require('../../chunk-UZ3CMNUJ.js');
|
|
13
13
|
require('../../chunk-YXN2K77G.js');
|
|
@@ -15,7 +15,7 @@ var chunkS7KHTUHA_js = require('../../chunk-S7KHTUHA.js');
|
|
|
15
15
|
require('../../chunk-F54Q2YJY.js');
|
|
16
16
|
require('../../chunk-FAGDZEKM.js');
|
|
17
17
|
require('../../chunk-P4YYEM4B.js');
|
|
18
|
-
require('../../chunk-
|
|
18
|
+
require('../../chunk-72SWXOD5.js');
|
|
19
19
|
var outline = require('@heroicons/react/24/outline');
|
|
20
20
|
var jsxRuntime = require('react/jsx-runtime');
|
|
21
21
|
var react = require('react');
|
|
@@ -933,7 +933,7 @@ function RulesPageView({ labels, rules, loading, onCreate, onUpdate, onDelete })
|
|
|
933
933
|
{
|
|
934
934
|
title: labels.createTitle,
|
|
935
935
|
saveLabel: labels.save,
|
|
936
|
-
initial:
|
|
936
|
+
initial: chunkIJAKZHXX_js.defaultRuleForm(),
|
|
937
937
|
onClose: () => setCreateOpen(false),
|
|
938
938
|
onSubmit: (value) => {
|
|
939
939
|
onCreate(value);
|
|
@@ -977,12 +977,12 @@ function RuleEditor({
|
|
|
977
977
|
event.preventDefault();
|
|
978
978
|
onSubmit(value);
|
|
979
979
|
},
|
|
980
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
980
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkIJAKZHXX_js.RuleForm, { value, onChange: setValue })
|
|
981
981
|
}
|
|
982
982
|
);
|
|
983
983
|
}
|
|
984
984
|
function ruleToFormValue(rule) {
|
|
985
|
-
const base =
|
|
985
|
+
const base = chunkIJAKZHXX_js.defaultRuleForm();
|
|
986
986
|
const rawCondition = rule.condition ?? rule.conditions;
|
|
987
987
|
const rawAction = pickAction(rule);
|
|
988
988
|
return {
|
|
@@ -1386,7 +1386,7 @@ function WorkflowsPageView({ labels, workflows, onCreate, onUpdateMeta, onPublis
|
|
|
1386
1386
|
] }),
|
|
1387
1387
|
/* @__PURE__ */ jsxRuntime.jsxs("section", { className: "liquid-surface rounded-2xl p-4 space-y-3", children: [
|
|
1388
1388
|
/* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Text, { className: "font-semibold text-slate-900 dark:text-slate-100", children: labels.workspace }),
|
|
1389
|
-
selectedWorkflow ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-[680px] rounded-2xl border border-white/65 dark:border-white/12 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1389
|
+
selectedWorkflow ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-[680px] rounded-2xl border border-white/65 dark:border-white/12 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(chunkMWPTSBAI_js.WorkflowWorkspace, { graph: chunk3T2WGL47_js.adaptWorkflowGraphToUi(selectedWorkflow.graph) }) }) : /* @__PURE__ */ jsxRuntime.jsx(chunkI2NZGVBG_js.Text, { children: labels.empty })
|
|
1390
1390
|
] })
|
|
1391
1391
|
] });
|
|
1392
1392
|
}
|
|
@@ -1500,7 +1500,7 @@ function RunTimelinePageView({ labels, entries, loading, runId }) {
|
|
|
1500
1500
|
{
|
|
1501
1501
|
hero,
|
|
1502
1502
|
content: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1503
|
-
|
|
1503
|
+
chunkIJAKZHXX_js.ExecutionTimelinePanel,
|
|
1504
1504
|
{
|
|
1505
1505
|
entries,
|
|
1506
1506
|
labels
|
|
@@ -2026,11 +2026,11 @@ function CredentialsPageView({ labels, credentials, loading, onCreate, onRotate,
|
|
|
2026
2026
|
|
|
2027
2027
|
Object.defineProperty(exports, "RolesPageView", {
|
|
2028
2028
|
enumerable: true,
|
|
2029
|
-
get: function () { return
|
|
2029
|
+
get: function () { return chunkMWPTSBAI_js.RolesPageView; }
|
|
2030
2030
|
});
|
|
2031
2031
|
Object.defineProperty(exports, "UsersPageView", {
|
|
2032
2032
|
enumerable: true,
|
|
2033
|
-
get: function () { return
|
|
2033
|
+
get: function () { return chunkMWPTSBAI_js.UsersPageView; }
|
|
2034
2034
|
});
|
|
2035
2035
|
Object.defineProperty(exports, "DIALECT_CATEGORIES", {
|
|
2036
2036
|
enumerable: true,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { adaptWorkflowGraphToUi, formatDurationMs } from '../../chunk-UQXVCVAN.mjs';
|
|
3
|
-
import { WorkflowWorkspace } from '../../chunk-
|
|
4
|
-
export { RolesPageView, UsersPageView } from '../../chunk-
|
|
3
|
+
import { WorkflowWorkspace } from '../../chunk-O6M3KDGT.mjs';
|
|
4
|
+
export { RolesPageView, UsersPageView } from '../../chunk-O6M3KDGT.mjs';
|
|
5
5
|
import { DatasourceModal, findCategory, DIALECT_CATEGORIES } from '../../chunk-5RM6NGZ6.mjs';
|
|
6
6
|
export { DIALECT_CATEGORIES, DatasourceFormModal, DatasourceModal, findCategory, findDialect } from '../../chunk-5RM6NGZ6.mjs';
|
|
7
|
-
import { defaultRuleForm, RuleForm, ExecutionTimelinePanel } from '../../chunk-
|
|
7
|
+
import { defaultRuleForm, RuleForm, ExecutionTimelinePanel } from '../../chunk-2WXRRQM3.mjs';
|
|
8
8
|
import '../../chunk-JB6RNAD2.mjs';
|
|
9
|
-
import '../../chunk-
|
|
10
|
-
import '../../chunk-
|
|
9
|
+
import '../../chunk-LEXBTVGM.mjs';
|
|
10
|
+
import '../../chunk-PCYL4MII.mjs';
|
|
11
11
|
import { HeroSection, PageLoadingState, PageEmptyState, EntityCard, Badge, ManagementPageLayout, CreateActionButton, Button, GlassModal, FormGrid, FormSelect, FormInput, FormTextarea, SectionHeader, Text, Form, FormActionsRow, Table, TableHead, TableRow, TableHeader, TableBody, TableCell, InlineForm, CopyableId } from '../../chunk-JN6IL6OH.mjs';
|
|
12
12
|
import '../../chunk-D2JF6C3E.mjs';
|
|
13
13
|
import '../../chunk-7VJ7CMMT.mjs';
|
|
@@ -15,7 +15,7 @@ import { useLink } from '../../chunk-QWG2FMUN.mjs';
|
|
|
15
15
|
import '../../chunk-ZV5EZXXO.mjs';
|
|
16
16
|
import '../../chunk-SYNVNTLJ.mjs';
|
|
17
17
|
import '../../chunk-OZNTQROP.mjs';
|
|
18
|
-
import '../../chunk-
|
|
18
|
+
import '../../chunk-G7JQ4OCE.mjs';
|
|
19
19
|
import { CubeTransparentIcon, CpuChipIcon, ChatBubbleLeftEllipsisIcon, WrenchScrewdriverIcon, AdjustmentsHorizontalIcon, CircleStackIcon, RectangleStackIcon, ClockIcon, LinkIcon, KeyIcon, ArrowPathIcon, TrashIcon } from '@heroicons/react/24/outline';
|
|
20
20
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
21
21
|
import { useState, useMemo, useEffect } from 'react';
|
|
@@ -63,6 +63,15 @@ function TelemetryProvider({
|
|
|
63
63
|
capture_pageview: "history_change",
|
|
64
64
|
capture_pageleave: true,
|
|
65
65
|
autocapture: true,
|
|
66
|
+
// PostHog's default UA filter silently drops events from headless
|
|
67
|
+
// browsers (incl. Playwright) — the SDK logs
|
|
68
|
+
// "[WebExperiments] Refusing to render … likely bot" and never
|
|
69
|
+
// POSTs to /e/. We want e2e test sessions visible in PostHog so
|
|
70
|
+
// session replay can reproduce SPA bugs caught by Playwright. Real
|
|
71
|
+
// crawler spam is already filtered at the CloudFront edge by WAF
|
|
72
|
+
// rules; opting out here doesn't widen the spam surface in
|
|
73
|
+
// practice for our deployed nonprod / prod hosts.
|
|
74
|
+
opt_out_useragent_filter: true,
|
|
66
75
|
// Always tag every event with the SPA slug so we can filter.
|
|
67
76
|
loaded: (instance) => {
|
|
68
77
|
instance.register({ app });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/platform/telemetry/posthog-provider.tsx"],"names":["useMemo","useEffect","posthog","jsx","Fragment","PostHogProvider","usePostHog"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * PostHog telemetry provider.\n *\n * Mounted once at the root of every Datatech SPA (astrlabe, sextant,\n * data-br, kori-erp, windsock-ui). Reads the PostHog project key + host\n * from `window.__APP_CONFIG__.posthog` — populated by `runtime-config.js`\n * which the deployed SPA's index.html loads BEFORE main.tsx. The CDK\n * FrontendStack uploads `runtime-config.js` to the bucket from SSM\n * (`/datatech/{env}/posthog/{project-key,api-host}`).\n *\n * For local dev, `import.meta.env.VITE_POSTHOG_KEY` is the fallback —\n * empty in most local sessions, so telemetry stays off without ceremony.\n *\n * Explicit prop overrides (`projectKey` / `apiHost`) win over both —\n * useful for tests and one-off sub-app embeds.\n *\n * Why a shared provider instead of per-app posthog.init():\n * - Single bundle dep (peer-installed in each SPA, but the wiring\n * code lives here so identification + opt-out logic stays consistent).\n * - Auto-tags every event with `app` (SPA name) and `organization_id`\n * (windsock JWT claim) so analytics across the platform can pivot\n * by tenant without per-team plumbing.\n *\n * Opt-out:\n * - Tracking disabled if no project key is resolvable from any source.\n * - Tracking disabled if `localStorage.posthog_opt_out === 'true'`.\n * - Replay can be disabled separately via `recordSessions={false}`.\n */\nimport posthog from 'posthog-js'\nimport { PostHogProvider, usePostHog } from 'posthog-js/react'\nimport { type ReactNode, useEffect, useMemo } from 'react'\n\nexport type TelemetryUser = {\n /** Stable user id — typically the windsock JWT `sub`. */\n id: string\n email?: string\n name?: string\n role?: string\n /** Tenant id — from `https://datatechsolutions.com.br/organization_id` claim. */\n organizationId?: string\n}\n\nexport type TelemetryProviderProps = {\n /** App slug — e.g. `astrlabe`, `sextant`, `data-br`. Tags every event. */\n app: string\n /**\n * PostHog project token (write-only key, safe in browser bundles).\n * If unset, the provider falls back to `window.__APP_CONFIG__.posthog.key`\n * (set by the CDK-managed `runtime-config.js`) and then to\n * `import.meta.env.VITE_POSTHOG_KEY`. Pass explicitly only for tests\n * or sub-app embeds.\n */\n projectKey?: string\n /**\n * PostHog ingestion host. Falls back through the same chain as\n * `projectKey`; defaults to US Cloud if nothing else resolves.\n */\n apiHost?: string\n /** Whether to record session replays. Defaults to true. */\n recordSessions?: boolean\n /** Current authenticated user, if any. The provider re-identifies on change. */\n user?: TelemetryUser | null\n children: ReactNode\n}\n\nconst DEFAULT_API_HOST = 'https://us.i.posthog.com'\n\n/**\n * Resolve the PostHog config from the first source that has a value:\n * 1. Explicit prop (test override)\n * 2. `window.__APP_CONFIG__.posthog.{key,host}` (deployed runtime-config.js)\n * 3. `import.meta.env.VITE_POSTHOG_*` (local dev)\n */\nfunction resolveConfig(propKey?: string, propHost?: string): { key: string; host: string } {\n let key = propKey ?? ''\n let host = propHost ?? ''\n\n if (typeof window !== 'undefined') {\n const runtime = (window as unknown as { __APP_CONFIG__?: { posthog?: { key?: string; host?: string } } })\n .__APP_CONFIG__?.posthog\n if (!key && runtime?.key) key = runtime.key\n if (!host && runtime?.host) host = runtime.host\n }\n\n // Vite injects `import.meta.env.*` at build time; reading is safe in\n // both dev and prod bundles. Empty string when not defined.\n try {\n const env = (import.meta as unknown as { env?: Record<string, string | undefined> }).env ?? {}\n if (!key) key = env.VITE_POSTHOG_KEY ?? ''\n if (!host) host = env.VITE_POSTHOG_HOST ?? ''\n } catch {\n /* import.meta unavailable (CJS test env) — treat as no env */\n }\n\n if (!host) host = DEFAULT_API_HOST\n return { key, host }\n}\n\n/**\n * Wrap every SPA in this provider. Pass the windsock-resolved user so\n * PostHog associates events with the right tenant; pass `null` after\n * sign-out so the next session is anonymous.\n */\nexport function TelemetryProvider({\n app,\n projectKey: propProjectKey,\n apiHost: propApiHost,\n recordSessions = true,\n user,\n children,\n}: TelemetryProviderProps) {\n const { key: projectKey, host: apiHost } = useMemo(\n () => resolveConfig(propProjectKey, propApiHost),\n [propProjectKey, propApiHost],\n )\n\n const enabled = useMemo(() => {\n if (!projectKey) return false\n if (typeof window === 'undefined') return false\n if (window.localStorage?.getItem('posthog_opt_out') === 'true') return false\n return true\n }, [projectKey])\n\n useEffect(() => {\n if (!enabled || !projectKey) return\n // Idempotent — posthog.init no-ops on second call with same key.\n posthog.init(projectKey, {\n api_host: apiHost,\n defaults: '2026-01-30',\n // Session replay: capture DOM + console + network (excluding\n // request/response bodies — PII risk). The masking config blanks\n // input fields by default; sensitive forms (login, MFA) should\n // mark themselves with `data-ph-no-capture` to be extra-safe.\n session_recording: recordSessions\n ? {\n maskAllInputs: true,\n recordCrossOriginIframes: false,\n }\n : undefined,\n capture_pageview: 'history_change',\n capture_pageleave: true,\n autocapture: true,\n // Always tag every event with the SPA slug so we can filter.\n loaded: (instance) => {\n instance.register({ app })\n },\n })\n }, [enabled, projectKey, apiHost, recordSessions, app])\n\n useEffect(() => {\n if (!enabled) return\n if (user?.id) {\n posthog.identify(user.id, {\n email: user.email,\n name: user.name,\n role: user.role,\n organization_id: user.organizationId,\n })\n if (user.organizationId) {\n posthog.group('organization', user.organizationId)\n }\n } else {\n // No user (sign-out, never authenticated) → reset PostHog identity\n // so the next sign-in starts a fresh session.\n posthog.reset()\n }\n }, [enabled, user?.id, user?.email, user?.name, user?.role, user?.organizationId])\n\n if (!enabled) return <>{children}</>\n\n return <PostHogProvider client={posthog}>{children}</PostHogProvider>\n}\n\n/**\n * Re-export the posthog-js/react hook so consumer SPAs can capture\n * custom events without importing posthog-js directly:\n *\n * const ph = useTelemetry()\n * ph?.capture('workflow_run_started', { workflowId })\n */\nexport const useTelemetry = usePostHog\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/platform/telemetry/posthog-provider.tsx"],"names":["useMemo","useEffect","posthog","jsx","Fragment","PostHogProvider","usePostHog"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * PostHog telemetry provider.\n *\n * Mounted once at the root of every Datatech SPA (astrlabe, sextant,\n * data-br, kori-erp, windsock-ui). Reads the PostHog project key + host\n * from `window.__APP_CONFIG__.posthog` — populated by `runtime-config.js`\n * which the deployed SPA's index.html loads BEFORE main.tsx. The CDK\n * FrontendStack uploads `runtime-config.js` to the bucket from SSM\n * (`/datatech/{env}/posthog/{project-key,api-host}`).\n *\n * For local dev, `import.meta.env.VITE_POSTHOG_KEY` is the fallback —\n * empty in most local sessions, so telemetry stays off without ceremony.\n *\n * Explicit prop overrides (`projectKey` / `apiHost`) win over both —\n * useful for tests and one-off sub-app embeds.\n *\n * Why a shared provider instead of per-app posthog.init():\n * - Single bundle dep (peer-installed in each SPA, but the wiring\n * code lives here so identification + opt-out logic stays consistent).\n * - Auto-tags every event with `app` (SPA name) and `organization_id`\n * (windsock JWT claim) so analytics across the platform can pivot\n * by tenant without per-team plumbing.\n *\n * Opt-out:\n * - Tracking disabled if no project key is resolvable from any source.\n * - Tracking disabled if `localStorage.posthog_opt_out === 'true'`.\n * - Replay can be disabled separately via `recordSessions={false}`.\n */\nimport posthog from 'posthog-js'\nimport { PostHogProvider, usePostHog } from 'posthog-js/react'\nimport { type ReactNode, useEffect, useMemo } from 'react'\n\nexport type TelemetryUser = {\n /** Stable user id — typically the windsock JWT `sub`. */\n id: string\n email?: string\n name?: string\n role?: string\n /** Tenant id — from `https://datatechsolutions.com.br/organization_id` claim. */\n organizationId?: string\n}\n\nexport type TelemetryProviderProps = {\n /** App slug — e.g. `astrlabe`, `sextant`, `data-br`. Tags every event. */\n app: string\n /**\n * PostHog project token (write-only key, safe in browser bundles).\n * If unset, the provider falls back to `window.__APP_CONFIG__.posthog.key`\n * (set by the CDK-managed `runtime-config.js`) and then to\n * `import.meta.env.VITE_POSTHOG_KEY`. Pass explicitly only for tests\n * or sub-app embeds.\n */\n projectKey?: string\n /**\n * PostHog ingestion host. Falls back through the same chain as\n * `projectKey`; defaults to US Cloud if nothing else resolves.\n */\n apiHost?: string\n /** Whether to record session replays. Defaults to true. */\n recordSessions?: boolean\n /** Current authenticated user, if any. The provider re-identifies on change. */\n user?: TelemetryUser | null\n children: ReactNode\n}\n\nconst DEFAULT_API_HOST = 'https://us.i.posthog.com'\n\n/**\n * Resolve the PostHog config from the first source that has a value:\n * 1. Explicit prop (test override)\n * 2. `window.__APP_CONFIG__.posthog.{key,host}` (deployed runtime-config.js)\n * 3. `import.meta.env.VITE_POSTHOG_*` (local dev)\n */\nfunction resolveConfig(propKey?: string, propHost?: string): { key: string; host: string } {\n let key = propKey ?? ''\n let host = propHost ?? ''\n\n if (typeof window !== 'undefined') {\n const runtime = (window as unknown as { __APP_CONFIG__?: { posthog?: { key?: string; host?: string } } })\n .__APP_CONFIG__?.posthog\n if (!key && runtime?.key) key = runtime.key\n if (!host && runtime?.host) host = runtime.host\n }\n\n // Vite injects `import.meta.env.*` at build time; reading is safe in\n // both dev and prod bundles. Empty string when not defined.\n try {\n const env = (import.meta as unknown as { env?: Record<string, string | undefined> }).env ?? {}\n if (!key) key = env.VITE_POSTHOG_KEY ?? ''\n if (!host) host = env.VITE_POSTHOG_HOST ?? ''\n } catch {\n /* import.meta unavailable (CJS test env) — treat as no env */\n }\n\n if (!host) host = DEFAULT_API_HOST\n return { key, host }\n}\n\n/**\n * Wrap every SPA in this provider. Pass the windsock-resolved user so\n * PostHog associates events with the right tenant; pass `null` after\n * sign-out so the next session is anonymous.\n */\nexport function TelemetryProvider({\n app,\n projectKey: propProjectKey,\n apiHost: propApiHost,\n recordSessions = true,\n user,\n children,\n}: TelemetryProviderProps) {\n const { key: projectKey, host: apiHost } = useMemo(\n () => resolveConfig(propProjectKey, propApiHost),\n [propProjectKey, propApiHost],\n )\n\n const enabled = useMemo(() => {\n if (!projectKey) return false\n if (typeof window === 'undefined') return false\n if (window.localStorage?.getItem('posthog_opt_out') === 'true') return false\n return true\n }, [projectKey])\n\n useEffect(() => {\n if (!enabled || !projectKey) return\n // Idempotent — posthog.init no-ops on second call with same key.\n posthog.init(projectKey, {\n api_host: apiHost,\n defaults: '2026-01-30',\n // Session replay: capture DOM + console + network (excluding\n // request/response bodies — PII risk). The masking config blanks\n // input fields by default; sensitive forms (login, MFA) should\n // mark themselves with `data-ph-no-capture` to be extra-safe.\n session_recording: recordSessions\n ? {\n maskAllInputs: true,\n recordCrossOriginIframes: false,\n }\n : undefined,\n capture_pageview: 'history_change',\n capture_pageleave: true,\n autocapture: true,\n // PostHog's default UA filter silently drops events from headless\n // browsers (incl. Playwright) — the SDK logs\n // \"[WebExperiments] Refusing to render … likely bot\" and never\n // POSTs to /e/. We want e2e test sessions visible in PostHog so\n // session replay can reproduce SPA bugs caught by Playwright. Real\n // crawler spam is already filtered at the CloudFront edge by WAF\n // rules; opting out here doesn't widen the spam surface in\n // practice for our deployed nonprod / prod hosts.\n opt_out_useragent_filter: true,\n // Always tag every event with the SPA slug so we can filter.\n loaded: (instance) => {\n instance.register({ app })\n },\n })\n }, [enabled, projectKey, apiHost, recordSessions, app])\n\n useEffect(() => {\n if (!enabled) return\n if (user?.id) {\n posthog.identify(user.id, {\n email: user.email,\n name: user.name,\n role: user.role,\n organization_id: user.organizationId,\n })\n if (user.organizationId) {\n posthog.group('organization', user.organizationId)\n }\n } else {\n // No user (sign-out, never authenticated) → reset PostHog identity\n // so the next sign-in starts a fresh session.\n posthog.reset()\n }\n }, [enabled, user?.id, user?.email, user?.name, user?.role, user?.organizationId])\n\n if (!enabled) return <>{children}</>\n\n return <PostHogProvider client={posthog}>{children}</PostHogProvider>\n}\n\n/**\n * Re-export the posthog-js/react hook so consumer SPAs can capture\n * custom events without importing posthog-js directly:\n *\n * const ph = useTelemetry()\n * ph?.capture('workflow_run_started', { workflowId })\n */\nexport const useTelemetry = usePostHog\n"]}
|
|
@@ -57,6 +57,15 @@ function TelemetryProvider({
|
|
|
57
57
|
capture_pageview: "history_change",
|
|
58
58
|
capture_pageleave: true,
|
|
59
59
|
autocapture: true,
|
|
60
|
+
// PostHog's default UA filter silently drops events from headless
|
|
61
|
+
// browsers (incl. Playwright) — the SDK logs
|
|
62
|
+
// "[WebExperiments] Refusing to render … likely bot" and never
|
|
63
|
+
// POSTs to /e/. We want e2e test sessions visible in PostHog so
|
|
64
|
+
// session replay can reproduce SPA bugs caught by Playwright. Real
|
|
65
|
+
// crawler spam is already filtered at the CloudFront edge by WAF
|
|
66
|
+
// rules; opting out here doesn't widen the spam surface in
|
|
67
|
+
// practice for our deployed nonprod / prod hosts.
|
|
68
|
+
opt_out_useragent_filter: true,
|
|
60
69
|
// Always tag every event with the SPA slug so we can filter.
|
|
61
70
|
loaded: (instance) => {
|
|
62
71
|
instance.register({ app });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/platform/telemetry/posthog-provider.tsx"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * PostHog telemetry provider.\n *\n * Mounted once at the root of every Datatech SPA (astrlabe, sextant,\n * data-br, kori-erp, windsock-ui). Reads the PostHog project key + host\n * from `window.__APP_CONFIG__.posthog` — populated by `runtime-config.js`\n * which the deployed SPA's index.html loads BEFORE main.tsx. The CDK\n * FrontendStack uploads `runtime-config.js` to the bucket from SSM\n * (`/datatech/{env}/posthog/{project-key,api-host}`).\n *\n * For local dev, `import.meta.env.VITE_POSTHOG_KEY` is the fallback —\n * empty in most local sessions, so telemetry stays off without ceremony.\n *\n * Explicit prop overrides (`projectKey` / `apiHost`) win over both —\n * useful for tests and one-off sub-app embeds.\n *\n * Why a shared provider instead of per-app posthog.init():\n * - Single bundle dep (peer-installed in each SPA, but the wiring\n * code lives here so identification + opt-out logic stays consistent).\n * - Auto-tags every event with `app` (SPA name) and `organization_id`\n * (windsock JWT claim) so analytics across the platform can pivot\n * by tenant without per-team plumbing.\n *\n * Opt-out:\n * - Tracking disabled if no project key is resolvable from any source.\n * - Tracking disabled if `localStorage.posthog_opt_out === 'true'`.\n * - Replay can be disabled separately via `recordSessions={false}`.\n */\nimport posthog from 'posthog-js'\nimport { PostHogProvider, usePostHog } from 'posthog-js/react'\nimport { type ReactNode, useEffect, useMemo } from 'react'\n\nexport type TelemetryUser = {\n /** Stable user id — typically the windsock JWT `sub`. */\n id: string\n email?: string\n name?: string\n role?: string\n /** Tenant id — from `https://datatechsolutions.com.br/organization_id` claim. */\n organizationId?: string\n}\n\nexport type TelemetryProviderProps = {\n /** App slug — e.g. `astrlabe`, `sextant`, `data-br`. Tags every event. */\n app: string\n /**\n * PostHog project token (write-only key, safe in browser bundles).\n * If unset, the provider falls back to `window.__APP_CONFIG__.posthog.key`\n * (set by the CDK-managed `runtime-config.js`) and then to\n * `import.meta.env.VITE_POSTHOG_KEY`. Pass explicitly only for tests\n * or sub-app embeds.\n */\n projectKey?: string\n /**\n * PostHog ingestion host. Falls back through the same chain as\n * `projectKey`; defaults to US Cloud if nothing else resolves.\n */\n apiHost?: string\n /** Whether to record session replays. Defaults to true. */\n recordSessions?: boolean\n /** Current authenticated user, if any. The provider re-identifies on change. */\n user?: TelemetryUser | null\n children: ReactNode\n}\n\nconst DEFAULT_API_HOST = 'https://us.i.posthog.com'\n\n/**\n * Resolve the PostHog config from the first source that has a value:\n * 1. Explicit prop (test override)\n * 2. `window.__APP_CONFIG__.posthog.{key,host}` (deployed runtime-config.js)\n * 3. `import.meta.env.VITE_POSTHOG_*` (local dev)\n */\nfunction resolveConfig(propKey?: string, propHost?: string): { key: string; host: string } {\n let key = propKey ?? ''\n let host = propHost ?? ''\n\n if (typeof window !== 'undefined') {\n const runtime = (window as unknown as { __APP_CONFIG__?: { posthog?: { key?: string; host?: string } } })\n .__APP_CONFIG__?.posthog\n if (!key && runtime?.key) key = runtime.key\n if (!host && runtime?.host) host = runtime.host\n }\n\n // Vite injects `import.meta.env.*` at build time; reading is safe in\n // both dev and prod bundles. Empty string when not defined.\n try {\n const env = (import.meta as unknown as { env?: Record<string, string | undefined> }).env ?? {}\n if (!key) key = env.VITE_POSTHOG_KEY ?? ''\n if (!host) host = env.VITE_POSTHOG_HOST ?? ''\n } catch {\n /* import.meta unavailable (CJS test env) — treat as no env */\n }\n\n if (!host) host = DEFAULT_API_HOST\n return { key, host }\n}\n\n/**\n * Wrap every SPA in this provider. Pass the windsock-resolved user so\n * PostHog associates events with the right tenant; pass `null` after\n * sign-out so the next session is anonymous.\n */\nexport function TelemetryProvider({\n app,\n projectKey: propProjectKey,\n apiHost: propApiHost,\n recordSessions = true,\n user,\n children,\n}: TelemetryProviderProps) {\n const { key: projectKey, host: apiHost } = useMemo(\n () => resolveConfig(propProjectKey, propApiHost),\n [propProjectKey, propApiHost],\n )\n\n const enabled = useMemo(() => {\n if (!projectKey) return false\n if (typeof window === 'undefined') return false\n if (window.localStorage?.getItem('posthog_opt_out') === 'true') return false\n return true\n }, [projectKey])\n\n useEffect(() => {\n if (!enabled || !projectKey) return\n // Idempotent — posthog.init no-ops on second call with same key.\n posthog.init(projectKey, {\n api_host: apiHost,\n defaults: '2026-01-30',\n // Session replay: capture DOM + console + network (excluding\n // request/response bodies — PII risk). The masking config blanks\n // input fields by default; sensitive forms (login, MFA) should\n // mark themselves with `data-ph-no-capture` to be extra-safe.\n session_recording: recordSessions\n ? {\n maskAllInputs: true,\n recordCrossOriginIframes: false,\n }\n : undefined,\n capture_pageview: 'history_change',\n capture_pageleave: true,\n autocapture: true,\n // Always tag every event with the SPA slug so we can filter.\n loaded: (instance) => {\n instance.register({ app })\n },\n })\n }, [enabled, projectKey, apiHost, recordSessions, app])\n\n useEffect(() => {\n if (!enabled) return\n if (user?.id) {\n posthog.identify(user.id, {\n email: user.email,\n name: user.name,\n role: user.role,\n organization_id: user.organizationId,\n })\n if (user.organizationId) {\n posthog.group('organization', user.organizationId)\n }\n } else {\n // No user (sign-out, never authenticated) → reset PostHog identity\n // so the next sign-in starts a fresh session.\n posthog.reset()\n }\n }, [enabled, user?.id, user?.email, user?.name, user?.role, user?.organizationId])\n\n if (!enabled) return <>{children}</>\n\n return <PostHogProvider client={posthog}>{children}</PostHogProvider>\n}\n\n/**\n * Re-export the posthog-js/react hook so consumer SPAs can capture\n * custom events without importing posthog-js directly:\n *\n * const ph = useTelemetry()\n * ph?.capture('workflow_run_started', { workflowId })\n */\nexport const useTelemetry = usePostHog\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/platform/telemetry/posthog-provider.tsx"],"names":[],"mappings":";;;;;;AAiEA,IAAM,gBAAA,GAAmB,0BAAA;AAQzB,SAAS,aAAA,CAAc,SAAkB,QAAA,EAAkD;AACzF,EAAA,IAAI,MAAM,OAAA,IAAW,EAAA;AACrB,EAAA,IAAI,OAAO,QAAA,IAAY,EAAA;AAEvB,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,OAAA,GAAW,OACd,cAAA,EAAgB,OAAA;AACnB,IAAA,IAAI,CAAC,GAAA,IAAO,OAAA,EAAS,GAAA,QAAW,OAAA,CAAQ,GAAA;AACxC,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAA,EAAS,IAAA,SAAa,OAAA,CAAQ,IAAA;AAAA,EAC7C;AAIA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAO,MAAA,CAAA,IAAA,CAAwE,GAAA,IAAO,EAAC;AAC7F,IAAA,IAAI,CAAC,GAAA,EAAK,GAAA,GAAM,GAAA,CAAI,gBAAA,IAAoB,EAAA;AACxC,IAAA,IAAI,CAAC,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,iBAAA,IAAqB,EAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,IAAI,CAAC,MAAM,IAAA,GAAO,gBAAA;AAClB,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACrB;AAOO,SAAS,iBAAA,CAAkB;AAAA,EAChC,GAAA;AAAA,EACA,UAAA,EAAY,cAAA;AAAA,EACZ,OAAA,EAAS,WAAA;AAAA,EACT,cAAA,GAAiB,IAAA;AAAA,EACjB,IAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,EAAE,GAAA,EAAK,UAAA,EAAY,IAAA,EAAM,SAAQ,GAAI,OAAA;AAAA,IACzC,MAAM,aAAA,CAAc,cAAA,EAAgB,WAAW,CAAA;AAAA,IAC/C,CAAC,gBAAgB,WAAW;AAAA,GAC9B;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAM;AAC5B,IAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,IAAA,IAAI,OAAO,YAAA,EAAc,OAAA,CAAQ,iBAAiB,CAAA,KAAM,QAAQ,OAAO,KAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAA,EAAY;AAE7B,IAAA,OAAA,CAAQ,KAAK,UAAA,EAAY;AAAA,MACvB,QAAA,EAAU,OAAA;AAAA,MACV,QAAA,EAAU,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKV,mBAAmB,cAAA,GACf;AAAA,QACE,aAAA,EAAe,IAAA;AAAA,QACf,wBAAA,EAA0B;AAAA,OAC5B,GACA,MAAA;AAAA,MACJ,gBAAA,EAAkB,gBAAA;AAAA,MAClB,iBAAA,EAAmB,IAAA;AAAA,MACnB,WAAA,EAAa,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASb,wBAAA,EAA0B,IAAA;AAAA;AAAA,MAE1B,MAAA,EAAQ,CAAC,QAAA,KAAa;AACpB,QAAA,QAAA,CAAS,QAAA,CAAS,EAAE,GAAA,EAAK,CAAA;AAAA,MAC3B;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,OAAA,EAAS,YAAY,OAAA,EAAS,cAAA,EAAgB,GAAG,CAAC,CAAA;AAEtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,OAAA,CAAQ,QAAA,CAAS,KAAK,EAAA,EAAI;AAAA,QACxB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,iBAAiB,IAAA,CAAK;AAAA,OACvB,CAAA;AACD,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,OAAA,CAAQ,KAAA,CAAM,cAAA,EAAgB,IAAA,CAAK,cAAc,CAAA;AAAA,MACnD;AAAA,IACF,CAAA,MAAO;AAGL,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,cAAc,CAAC,CAAA;AAEjF,EAAA,IAAI,CAAC,OAAA,EAAS,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAEjC,EAAA,uBAAO,GAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAQ,OAAA,EAAU,QAAA,EAAS,CAAA;AACrD;AASO,IAAM,YAAA,GAAe","file":"index.mjs","sourcesContent":["/**\n * PostHog telemetry provider.\n *\n * Mounted once at the root of every Datatech SPA (astrlabe, sextant,\n * data-br, kori-erp, windsock-ui). Reads the PostHog project key + host\n * from `window.__APP_CONFIG__.posthog` — populated by `runtime-config.js`\n * which the deployed SPA's index.html loads BEFORE main.tsx. The CDK\n * FrontendStack uploads `runtime-config.js` to the bucket from SSM\n * (`/datatech/{env}/posthog/{project-key,api-host}`).\n *\n * For local dev, `import.meta.env.VITE_POSTHOG_KEY` is the fallback —\n * empty in most local sessions, so telemetry stays off without ceremony.\n *\n * Explicit prop overrides (`projectKey` / `apiHost`) win over both —\n * useful for tests and one-off sub-app embeds.\n *\n * Why a shared provider instead of per-app posthog.init():\n * - Single bundle dep (peer-installed in each SPA, but the wiring\n * code lives here so identification + opt-out logic stays consistent).\n * - Auto-tags every event with `app` (SPA name) and `organization_id`\n * (windsock JWT claim) so analytics across the platform can pivot\n * by tenant without per-team plumbing.\n *\n * Opt-out:\n * - Tracking disabled if no project key is resolvable from any source.\n * - Tracking disabled if `localStorage.posthog_opt_out === 'true'`.\n * - Replay can be disabled separately via `recordSessions={false}`.\n */\nimport posthog from 'posthog-js'\nimport { PostHogProvider, usePostHog } from 'posthog-js/react'\nimport { type ReactNode, useEffect, useMemo } from 'react'\n\nexport type TelemetryUser = {\n /** Stable user id — typically the windsock JWT `sub`. */\n id: string\n email?: string\n name?: string\n role?: string\n /** Tenant id — from `https://datatechsolutions.com.br/organization_id` claim. */\n organizationId?: string\n}\n\nexport type TelemetryProviderProps = {\n /** App slug — e.g. `astrlabe`, `sextant`, `data-br`. Tags every event. */\n app: string\n /**\n * PostHog project token (write-only key, safe in browser bundles).\n * If unset, the provider falls back to `window.__APP_CONFIG__.posthog.key`\n * (set by the CDK-managed `runtime-config.js`) and then to\n * `import.meta.env.VITE_POSTHOG_KEY`. Pass explicitly only for tests\n * or sub-app embeds.\n */\n projectKey?: string\n /**\n * PostHog ingestion host. Falls back through the same chain as\n * `projectKey`; defaults to US Cloud if nothing else resolves.\n */\n apiHost?: string\n /** Whether to record session replays. Defaults to true. */\n recordSessions?: boolean\n /** Current authenticated user, if any. The provider re-identifies on change. */\n user?: TelemetryUser | null\n children: ReactNode\n}\n\nconst DEFAULT_API_HOST = 'https://us.i.posthog.com'\n\n/**\n * Resolve the PostHog config from the first source that has a value:\n * 1. Explicit prop (test override)\n * 2. `window.__APP_CONFIG__.posthog.{key,host}` (deployed runtime-config.js)\n * 3. `import.meta.env.VITE_POSTHOG_*` (local dev)\n */\nfunction resolveConfig(propKey?: string, propHost?: string): { key: string; host: string } {\n let key = propKey ?? ''\n let host = propHost ?? ''\n\n if (typeof window !== 'undefined') {\n const runtime = (window as unknown as { __APP_CONFIG__?: { posthog?: { key?: string; host?: string } } })\n .__APP_CONFIG__?.posthog\n if (!key && runtime?.key) key = runtime.key\n if (!host && runtime?.host) host = runtime.host\n }\n\n // Vite injects `import.meta.env.*` at build time; reading is safe in\n // both dev and prod bundles. Empty string when not defined.\n try {\n const env = (import.meta as unknown as { env?: Record<string, string | undefined> }).env ?? {}\n if (!key) key = env.VITE_POSTHOG_KEY ?? ''\n if (!host) host = env.VITE_POSTHOG_HOST ?? ''\n } catch {\n /* import.meta unavailable (CJS test env) — treat as no env */\n }\n\n if (!host) host = DEFAULT_API_HOST\n return { key, host }\n}\n\n/**\n * Wrap every SPA in this provider. Pass the windsock-resolved user so\n * PostHog associates events with the right tenant; pass `null` after\n * sign-out so the next session is anonymous.\n */\nexport function TelemetryProvider({\n app,\n projectKey: propProjectKey,\n apiHost: propApiHost,\n recordSessions = true,\n user,\n children,\n}: TelemetryProviderProps) {\n const { key: projectKey, host: apiHost } = useMemo(\n () => resolveConfig(propProjectKey, propApiHost),\n [propProjectKey, propApiHost],\n )\n\n const enabled = useMemo(() => {\n if (!projectKey) return false\n if (typeof window === 'undefined') return false\n if (window.localStorage?.getItem('posthog_opt_out') === 'true') return false\n return true\n }, [projectKey])\n\n useEffect(() => {\n if (!enabled || !projectKey) return\n // Idempotent — posthog.init no-ops on second call with same key.\n posthog.init(projectKey, {\n api_host: apiHost,\n defaults: '2026-01-30',\n // Session replay: capture DOM + console + network (excluding\n // request/response bodies — PII risk). The masking config blanks\n // input fields by default; sensitive forms (login, MFA) should\n // mark themselves with `data-ph-no-capture` to be extra-safe.\n session_recording: recordSessions\n ? {\n maskAllInputs: true,\n recordCrossOriginIframes: false,\n }\n : undefined,\n capture_pageview: 'history_change',\n capture_pageleave: true,\n autocapture: true,\n // PostHog's default UA filter silently drops events from headless\n // browsers (incl. Playwright) — the SDK logs\n // \"[WebExperiments] Refusing to render … likely bot\" and never\n // POSTs to /e/. We want e2e test sessions visible in PostHog so\n // session replay can reproduce SPA bugs caught by Playwright. Real\n // crawler spam is already filtered at the CloudFront edge by WAF\n // rules; opting out here doesn't widen the spam surface in\n // practice for our deployed nonprod / prod hosts.\n opt_out_useragent_filter: true,\n // Always tag every event with the SPA slug so we can filter.\n loaded: (instance) => {\n instance.register({ app })\n },\n })\n }, [enabled, projectKey, apiHost, recordSessions, app])\n\n useEffect(() => {\n if (!enabled) return\n if (user?.id) {\n posthog.identify(user.id, {\n email: user.email,\n name: user.name,\n role: user.role,\n organization_id: user.organizationId,\n })\n if (user.organizationId) {\n posthog.group('organization', user.organizationId)\n }\n } else {\n // No user (sign-out, never authenticated) → reset PostHog identity\n // so the next sign-in starts a fresh session.\n posthog.reset()\n }\n }, [enabled, user?.id, user?.email, user?.name, user?.role, user?.organizationId])\n\n if (!enabled) return <>{children}</>\n\n return <PostHogProvider client={posthog}>{children}</PostHogProvider>\n}\n\n/**\n * Re-export the posthog-js/react hook so consumer SPAs can capture\n * custom events without importing posthog-js directly:\n *\n * const ph = useTelemetry()\n * ph?.capture('workflow_run_started', { workflowId })\n */\nexport const useTelemetry = usePostHog\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('../chunk-
|
|
4
|
+
var chunkOCELRSLO_js = require('../chunk-OCELRSLO.js');
|
|
5
|
+
require('../chunk-NJFRJ6YD.js');
|
|
6
6
|
require('../chunk-I2NZGVBG.js');
|
|
7
7
|
require('../chunk-UZ3CMNUJ.js');
|
|
8
8
|
require('../chunk-YXN2K77G.js');
|
|
@@ -10,13 +10,13 @@ require('../chunk-S7KHTUHA.js');
|
|
|
10
10
|
require('../chunk-F54Q2YJY.js');
|
|
11
11
|
require('../chunk-FAGDZEKM.js');
|
|
12
12
|
require('../chunk-P4YYEM4B.js');
|
|
13
|
-
require('../chunk-
|
|
13
|
+
require('../chunk-72SWXOD5.js');
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
Object.defineProperty(exports, "WorkflowCanvasShell", {
|
|
18
18
|
enumerable: true,
|
|
19
|
-
get: function () { return
|
|
19
|
+
get: function () { return chunkOCELRSLO_js.WorkflowCanvasShell; }
|
|
20
20
|
});
|
|
21
21
|
//# sourceMappingURL=workflow-canvas-shell.js.map
|
|
22
22
|
//# sourceMappingURL=workflow-canvas-shell.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
export { WorkflowCanvasShell } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
2
|
+
export { WorkflowCanvasShell } from '../chunk-GIQXB3BG.mjs';
|
|
3
|
+
import '../chunk-PCYL4MII.mjs';
|
|
4
4
|
import '../chunk-JN6IL6OH.mjs';
|
|
5
5
|
import '../chunk-D2JF6C3E.mjs';
|
|
6
6
|
import '../chunk-7VJ7CMMT.mjs';
|
|
@@ -8,6 +8,6 @@ import '../chunk-QWG2FMUN.mjs';
|
|
|
8
8
|
import '../chunk-ZV5EZXXO.mjs';
|
|
9
9
|
import '../chunk-SYNVNTLJ.mjs';
|
|
10
10
|
import '../chunk-OZNTQROP.mjs';
|
|
11
|
-
import '../chunk-
|
|
11
|
+
import '../chunk-G7JQ4OCE.mjs';
|
|
12
12
|
//# sourceMappingURL=workflow-canvas-shell.mjs.map
|
|
13
13
|
//# sourceMappingURL=workflow-canvas-shell.mjs.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/astrlabe/utils/logic-node-defaults.ts","../src/astrlabe/utils/layout-engine.ts","../src/astrlabe/utils/agent-tier.ts"],"names":[],"mappings":"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","file":"chunk-5W7L7BT7.mjs","sourcesContent":["/**\n * Logic Node Default Configs\n * ==========================\n * Factory function to create default configs for each logic node type.\n */\n\nimport type { WorkflowNodeType, LogicNodeConfig } from '../contracts'\n\nexport function createDefaultLogicNodeConfig(nodeType: WorkflowNodeType): LogicNodeConfig | null {\n switch (nodeType) {\n case 'start':\n return { type: 'start', inputVariables: [] }\n case 'end':\n return { type: 'end', outputVariables: [] }\n case 'if_else':\n return {\n type: 'if_else',\n conditions: [{ variable: '', operator: 'equals', value: '' }],\n logicalOperator: 'and',\n }\n case 'code':\n return { type: 'code', language: 'javascript', code: '' }\n case 'http_request':\n return {\n type: 'http_request',\n method: 'GET',\n url: '',\n headers: {},\n body: '',\n timeoutMs: 10000,\n }\n case 's3_write':\n return {\n type: 's3_write',\n bucket: '',\n key: '',\n sourceUrl: '',\n body: '',\n contentType: '',\n timeoutMs: 300000,\n connectionId: '',\n }\n case 'template_transform':\n return { type: 'template_transform', template: '', outputVariable: '' }\n case 'iteration':\n return { type: 'iteration', iteratorVariable: '', maxIterations: 100 }\n case 'knowledge_base':\n return { type: 'knowledge_base', sourceId: '', topK: 5, similarityThreshold: 0.7 }\n case 'answer':\n return { type: 'answer', outputTemplate: '', outputVariables: [] }\n case 'question_classifier':\n return {\n type: 'question_classifier',\n modelId: '',\n instructions: '',\n categories: [\n { id: crypto.randomUUID(), name: '', description: '' },\n { id: crypto.randomUUID(), name: '', description: '' },\n ],\n }\n case 'parameter_extractor':\n return {\n type: 'parameter_extractor',\n modelId: '',\n parameters: [{ name: '', type: 'string', description: '', required: true }],\n }\n case 'variable_assigner':\n return {\n type: 'variable_assigner',\n assignments: [{ target: '', source: '' }],\n }\n case 'variable_aggregator':\n return {\n type: 'variable_aggregator',\n inputVariables: [],\n outputVariable: '',\n aggregationMode: 'array',\n }\n case 'document_extractor':\n return {\n type: 'document_extractor',\n extractionMode: 'text',\n outputVariable: '',\n }\n case 'list_operator':\n return {\n type: 'list_operator',\n operation: 'filter',\n inputVariable: '',\n outputVariable: '',\n condition: '',\n }\n case 'iteration_start':\n return {\n type: 'iteration_start',\n iteratorVariable: '',\n itemVariable: 'item',\n indexVariable: 'index',\n }\n case 'note':\n return {\n type: 'note',\n text: '',\n color: 'yellow',\n width: 200,\n height: 150,\n }\n case 'group':\n return {\n type: 'group',\n label: 'Group',\n color: 'slate',\n isExpanded: true,\n width: 400,\n height: 300,\n collapsedWidth: 260,\n collapsedHeight: 60,\n }\n case 'datasource':\n return {\n type: 'datasource',\n datasourceId: '',\n dialect: '',\n table: '',\n selectedColumns: [],\n filterVariables: {},\n outputVariable: 'datasourceResult',\n limit: 100,\n }\n case 'dashboard_output':\n return {\n type: 'dashboard_output',\n dashboardFrom: '',\n }\n default:\n return null\n }\n}\n","/**\n * Layout Engine\n * =============\n * Auto-layout for workflow graphs using @dagrejs/dagre.\n * Pure utility — no React dependencies.\n */\n\nimport Dagre from '@dagrejs/dagre'\nimport type { Node, Edge } from '@xyflow/react'\n\n/** Layout direction: free means no auto-layout is applied. */\nexport type LayoutDirection = 'free' | 'LR' | 'TB'\n\nconst DEFAULT_NODE_WIDTH = 260\nconst DEFAULT_NODE_HEIGHT = 70\n\nfunction getNodeSize(node: Node): { width: number; height: number } {\n const measured = node.measured as { width?: number; height?: number } | undefined\n return {\n width: measured?.width ?? DEFAULT_NODE_WIDTH,\n height: measured?.height ?? DEFAULT_NODE_HEIGHT,\n }\n}\n\n/**\n * Apply dagre layout to the given nodes and edges.\n * Returns a new array of nodes with updated positions.\n * Group child nodes (parentId set) and note nodes are excluded from layout.\n */\nexport function applyDagreLayout(\n nodes: Node[],\n edges: Edge[],\n direction: Exclude<LayoutDirection, 'free'>,\n): Node[] {\n const nodeSpacingHorizontal = 80\n const nodeSpacingVertical = 50\n\n // Separate layoutable nodes from excluded ones\n const layoutNodes = nodes.filter(\n (node) => !node.parentId && node.type !== 'note',\n )\n\n // Build dagre graph\n const dagreGraph = new Dagre.graphlib.Graph({ directed: true })\n dagreGraph.setDefaultEdgeLabel(() => ({}))\n\n const isHorizontal = direction === 'LR'\n dagreGraph.setGraph({\n rankdir: direction,\n nodesep: isHorizontal ? nodeSpacingVertical : nodeSpacingHorizontal,\n ranksep: isHorizontal ? nodeSpacingHorizontal : nodeSpacingVertical,\n marginx: 40,\n marginy: 40,\n })\n\n const layoutNodeIds = new Set(layoutNodes.map((node) => node.id))\n\n for (const node of layoutNodes) {\n const { width, height } = getNodeSize(node)\n dagreGraph.setNode(node.id, { width, height })\n }\n\n for (const edge of edges) {\n if (layoutNodeIds.has(edge.source) && layoutNodeIds.has(edge.target)) {\n dagreGraph.setEdge(edge.source, edge.target)\n }\n }\n\n Dagre.layout(dagreGraph)\n\n // Build position map — dagre returns center coords, React Flow uses top-left\n const positionMap = new Map<string, { x: number; y: number }>()\n for (const node of layoutNodes) {\n const dagreNode = dagreGraph.node(node.id)\n if (!dagreNode) continue\n const { width, height } = getNodeSize(node)\n positionMap.set(node.id, {\n x: dagreNode.x - width / 2,\n y: dagreNode.y - height / 2,\n })\n }\n\n // Return all nodes with updated positions for layout-participating nodes\n return nodes.map((node) => {\n const newPosition = positionMap.get(node.id)\n if (!newPosition) return node\n return { ...node, position: newPosition }\n })\n}\n","/**\n * Agent ELO Tier\n * ==============\n * Derives difficulty tier from agent ELO rating.\n * Used in node palette, agent flow node, and agent modal.\n */\n\nexport type AgentTier = {\n key: 'beginner' | 'intermediate' | 'advanced' | 'expert'\n pillColor: string\n}\n\nconst TIERS: Array<{ maxElo: number; tier: AgentTier }> = [\n { maxElo: 1200, tier: { key: 'beginner', pillColor: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400' } },\n { maxElo: 1600, tier: { key: 'intermediate', pillColor: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400' } },\n { maxElo: 2000, tier: { key: 'advanced', pillColor: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400' } },\n { maxElo: Infinity, tier: { key: 'expert', pillColor: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400' } },\n]\n\nexport function getAgentTier(elo: number | undefined): AgentTier {\n const eloValue = elo ?? 0\n for (const { maxElo, tier } of TIERS) {\n if (eloValue < maxElo) return tier\n }\n return TIERS[TIERS.length - 1].tier\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/astrlabe/utils/logic-node-defaults.ts","../src/astrlabe/utils/layout-engine.ts","../src/astrlabe/utils/agent-tier.ts"],"names":["Dagre"],"mappings":"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","file":"chunk-C3H4FM4A.js","sourcesContent":["/**\n * Logic Node Default Configs\n * ==========================\n * Factory function to create default configs for each logic node type.\n */\n\nimport type { WorkflowNodeType, LogicNodeConfig } from '../contracts'\n\nexport function createDefaultLogicNodeConfig(nodeType: WorkflowNodeType): LogicNodeConfig | null {\n switch (nodeType) {\n case 'start':\n return { type: 'start', inputVariables: [] }\n case 'end':\n return { type: 'end', outputVariables: [] }\n case 'if_else':\n return {\n type: 'if_else',\n conditions: [{ variable: '', operator: 'equals', value: '' }],\n logicalOperator: 'and',\n }\n case 'code':\n return { type: 'code', language: 'javascript', code: '' }\n case 'http_request':\n return {\n type: 'http_request',\n method: 'GET',\n url: '',\n headers: {},\n body: '',\n timeoutMs: 10000,\n }\n case 's3_write':\n return {\n type: 's3_write',\n bucket: '',\n key: '',\n sourceUrl: '',\n body: '',\n contentType: '',\n timeoutMs: 300000,\n connectionId: '',\n }\n case 'template_transform':\n return { type: 'template_transform', template: '', outputVariable: '' }\n case 'iteration':\n return { type: 'iteration', iteratorVariable: '', maxIterations: 100 }\n case 'knowledge_base':\n return { type: 'knowledge_base', sourceId: '', topK: 5, similarityThreshold: 0.7 }\n case 'answer':\n return { type: 'answer', outputTemplate: '', outputVariables: [] }\n case 'question_classifier':\n return {\n type: 'question_classifier',\n modelId: '',\n instructions: '',\n categories: [\n { id: crypto.randomUUID(), name: '', description: '' },\n { id: crypto.randomUUID(), name: '', description: '' },\n ],\n }\n case 'parameter_extractor':\n return {\n type: 'parameter_extractor',\n modelId: '',\n parameters: [{ name: '', type: 'string', description: '', required: true }],\n }\n case 'variable_assigner':\n return {\n type: 'variable_assigner',\n assignments: [{ target: '', source: '' }],\n }\n case 'variable_aggregator':\n return {\n type: 'variable_aggregator',\n inputVariables: [],\n outputVariable: '',\n aggregationMode: 'array',\n }\n case 'document_extractor':\n return {\n type: 'document_extractor',\n extractionMode: 'text',\n outputVariable: '',\n }\n case 'list_operator':\n return {\n type: 'list_operator',\n operation: 'filter',\n inputVariable: '',\n outputVariable: '',\n condition: '',\n }\n case 'iteration_start':\n return {\n type: 'iteration_start',\n iteratorVariable: '',\n itemVariable: 'item',\n indexVariable: 'index',\n }\n case 'note':\n return {\n type: 'note',\n text: '',\n color: 'yellow',\n width: 200,\n height: 150,\n }\n case 'group':\n return {\n type: 'group',\n label: 'Group',\n color: 'slate',\n isExpanded: true,\n width: 400,\n height: 300,\n collapsedWidth: 260,\n collapsedHeight: 60,\n }\n case 'datasource':\n return {\n type: 'datasource',\n datasourceId: '',\n dialect: '',\n table: '',\n selectedColumns: [],\n filterVariables: {},\n outputVariable: 'datasourceResult',\n limit: 100,\n }\n case 'dashboard_output':\n return {\n type: 'dashboard_output',\n dashboardFrom: '',\n }\n default:\n return null\n }\n}\n","/**\n * Layout Engine\n * =============\n * Auto-layout for workflow graphs using @dagrejs/dagre.\n * Pure utility — no React dependencies.\n */\n\nimport Dagre from '@dagrejs/dagre'\nimport type { Node, Edge } from '@xyflow/react'\n\n/** Layout direction: free means no auto-layout is applied. */\nexport type LayoutDirection = 'free' | 'LR' | 'TB'\n\nconst DEFAULT_NODE_WIDTH = 260\nconst DEFAULT_NODE_HEIGHT = 70\n\nfunction getNodeSize(node: Node): { width: number; height: number } {\n const measured = node.measured as { width?: number; height?: number } | undefined\n return {\n width: measured?.width ?? DEFAULT_NODE_WIDTH,\n height: measured?.height ?? DEFAULT_NODE_HEIGHT,\n }\n}\n\n/**\n * Apply dagre layout to the given nodes and edges.\n * Returns a new array of nodes with updated positions.\n * Group child nodes (parentId set) and note nodes are excluded from layout.\n */\nexport function applyDagreLayout(\n nodes: Node[],\n edges: Edge[],\n direction: Exclude<LayoutDirection, 'free'>,\n): Node[] {\n const nodeSpacingHorizontal = 80\n const nodeSpacingVertical = 50\n\n // Separate layoutable nodes from excluded ones\n const layoutNodes = nodes.filter(\n (node) => !node.parentId && node.type !== 'note',\n )\n\n // Build dagre graph\n const dagreGraph = new Dagre.graphlib.Graph({ directed: true })\n dagreGraph.setDefaultEdgeLabel(() => ({}))\n\n const isHorizontal = direction === 'LR'\n dagreGraph.setGraph({\n rankdir: direction,\n nodesep: isHorizontal ? nodeSpacingVertical : nodeSpacingHorizontal,\n ranksep: isHorizontal ? nodeSpacingHorizontal : nodeSpacingVertical,\n marginx: 40,\n marginy: 40,\n })\n\n const layoutNodeIds = new Set(layoutNodes.map((node) => node.id))\n\n for (const node of layoutNodes) {\n const { width, height } = getNodeSize(node)\n dagreGraph.setNode(node.id, { width, height })\n }\n\n for (const edge of edges) {\n if (layoutNodeIds.has(edge.source) && layoutNodeIds.has(edge.target)) {\n dagreGraph.setEdge(edge.source, edge.target)\n }\n }\n\n Dagre.layout(dagreGraph)\n\n // Build position map — dagre returns center coords, React Flow uses top-left\n const positionMap = new Map<string, { x: number; y: number }>()\n for (const node of layoutNodes) {\n const dagreNode = dagreGraph.node(node.id)\n if (!dagreNode) continue\n const { width, height } = getNodeSize(node)\n positionMap.set(node.id, {\n x: dagreNode.x - width / 2,\n y: dagreNode.y - height / 2,\n })\n }\n\n // Return all nodes with updated positions for layout-participating nodes\n return nodes.map((node) => {\n const newPosition = positionMap.get(node.id)\n if (!newPosition) return node\n return { ...node, position: newPosition }\n })\n}\n","/**\n * Agent ELO Tier\n * ==============\n * Derives difficulty tier from agent ELO rating.\n * Used in node palette, agent flow node, and agent modal.\n */\n\nexport type AgentTier = {\n key: 'beginner' | 'intermediate' | 'advanced' | 'expert'\n pillColor: string\n}\n\nconst TIERS: Array<{ maxElo: number; tier: AgentTier }> = [\n { maxElo: 1200, tier: { key: 'beginner', pillColor: 'bg-cyan-100 text-cyan-700 dark:bg-cyan-900/30 dark:text-cyan-400' } },\n { maxElo: 1600, tier: { key: 'intermediate', pillColor: 'bg-pink-100 text-pink-700 dark:bg-pink-900/30 dark:text-pink-400' } },\n { maxElo: 2000, tier: { key: 'advanced', pillColor: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400' } },\n { maxElo: Infinity, tier: { key: 'expert', pillColor: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400' } },\n]\n\nexport function getAgentTier(elo: number | undefined): AgentTier {\n const eloValue = elo ?? 0\n for (const { maxElo, tier } of TIERS) {\n if (eloValue < maxElo) return tier\n }\n return TIERS[TIERS.length - 1].tier\n}\n"]}
|