@truefoundry/trueforge-ui 0.3.0-rc.0 → 0.3.0-rc.2
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/CHANGELOG.md +68 -0
- package/README.md +21 -6
- package/dist/AgentCodeSnippets-637HQUXD.js +74 -0
- package/dist/AgentCodeSnippets-637HQUXD.js.map +1 -0
- package/dist/AgentMetricChart-4FYECRIN.js +15 -0
- package/dist/AgentOverview-3FJ5EE6N.js +167 -0
- package/dist/AgentOverview-3FJ5EE6N.js.map +1 -0
- package/dist/AgentSessionEventTimeline-VELWUYPR.js +88 -0
- package/dist/AgentSessionEventTimeline-VELWUYPR.js.map +1 -0
- package/dist/AgentSessionEventTimelineChart-CUKETHWM.js +591 -0
- package/dist/AgentSessionEventTimelineChart-CUKETHWM.js.map +1 -0
- package/dist/AgentSessions-T7MOGOTZ.js +275 -0
- package/dist/AgentSessions-T7MOGOTZ.js.map +1 -0
- package/dist/{ConnectorSettings-FXQ5B7TN.js → ConnectorSettings-ESZ2RSRG.js} +19 -21
- package/dist/ConnectorSettings-ESZ2RSRG.js.map +1 -0
- package/dist/{DockLayout-LBNQJZNF.js → DockLayout-NLFNU6F2.js} +11 -10
- package/dist/{DockLayout-LBNQJZNF.js.map → DockLayout-NLFNU6F2.js.map} +1 -1
- package/dist/DrawerLayout-PR3SMKA6.js +184 -0
- package/dist/DrawerLayout-PR3SMKA6.js.map +1 -0
- package/dist/{ModelSettings-4L4LOQJA.js → ModelSettings-LYW64IRR.js} +20 -24
- package/dist/ModelSettings-LYW64IRR.js.map +1 -0
- package/dist/OpenUiFenceBlock-JEPNPJ7U.js +9 -0
- package/dist/OpenUiFenceBlock-JEPNPJ7U.js.map +1 -0
- package/dist/{SandboxSettings-Z4ZG6ZX4.js → SandboxSettings-DF64LHYI.js} +16 -18
- package/dist/SandboxSettings-DF64LHYI.js.map +1 -0
- package/dist/SchedulesPage-WQU4H25F.js +15 -0
- package/dist/SchedulesPage-WQU4H25F.js.map +1 -0
- package/dist/{SettingsBuilder-WF7ZWKQW.js → SettingsBuilder-LSXK2VN4.js} +26 -22
- package/dist/SettingsBuilder-LSXK2VN4.js.map +1 -0
- package/dist/ShellRouteSync-B22IAV2W.js +255 -0
- package/dist/ShellRouteSync-B22IAV2W.js.map +1 -0
- package/dist/SidebarLayout-XW6LXB7R.js +309 -0
- package/dist/SidebarLayout-XW6LXB7R.js.map +1 -0
- package/dist/{SkillSettings-3EPPC3IT.js → SkillSettings-64VXUO6J.js} +14 -15
- package/dist/SkillSettings-64VXUO6J.js.map +1 -0
- package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js → TrueForgeUIWithRouter-3TSLV22Q.js} +14 -10
- package/dist/{TrueForgeUIWithRouter-NZ4FGPE4.js.map → TrueForgeUIWithRouter-3TSLV22Q.js.map} +1 -1
- package/dist/{WidgetLayout-3QZ357FL.js → WidgetLayout-Q5P7PYSJ.js} +17 -13
- package/dist/WidgetLayout-Q5P7PYSJ.js.map +1 -0
- package/dist/chunk-5I2COQNL.js +119 -0
- package/dist/chunk-5I2COQNL.js.map +1 -0
- package/dist/chunk-BWHOZFIV.js +587 -0
- package/dist/chunk-BWHOZFIV.js.map +1 -0
- package/dist/chunk-DJUFS2BW.js +27 -0
- package/dist/chunk-DJUFS2BW.js.map +1 -0
- package/dist/chunk-FQK2XVVE.js +880 -0
- package/dist/chunk-FQK2XVVE.js.map +1 -0
- package/dist/chunk-G2TUAD65.js +555 -0
- package/dist/chunk-G2TUAD65.js.map +1 -0
- package/dist/chunk-GXYAOAK5.js +1357 -0
- package/dist/chunk-GXYAOAK5.js.map +1 -0
- package/dist/{chunk-FJ5RSSMA.js → chunk-H6WTY5PM.js} +196 -32
- package/dist/chunk-H6WTY5PM.js.map +1 -0
- package/dist/chunk-I3AL54MA.js +180 -0
- package/dist/chunk-I3AL54MA.js.map +1 -0
- package/dist/{chunk-WREC7D54.js → chunk-LGRHHFHN.js} +120 -32
- package/dist/chunk-LGRHHFHN.js.map +1 -0
- package/dist/chunk-NHHSZB5N.js +74 -0
- package/dist/chunk-NHHSZB5N.js.map +1 -0
- package/dist/{chunk-CFLVPV5M.js → chunk-QC42MLAK.js} +7 -2
- package/dist/chunk-QC42MLAK.js.map +1 -0
- package/dist/chunk-RDXBMTP5.js +32 -0
- package/dist/chunk-RDXBMTP5.js.map +1 -0
- package/dist/chunk-SFZNIO6U.js +18 -0
- package/dist/chunk-SFZNIO6U.js.map +1 -0
- package/dist/chunk-SQGT43Z3.js +200 -0
- package/dist/chunk-SQGT43Z3.js.map +1 -0
- package/dist/{chunk-B52K63AW.js → chunk-VJ7BZGAF.js} +2 -2
- package/dist/chunk-VUMGMGKZ.js +252 -0
- package/dist/chunk-VUMGMGKZ.js.map +1 -0
- package/dist/chunk-Y6S4OVVQ.js +16 -0
- package/dist/chunk-Y6S4OVVQ.js.map +1 -0
- package/dist/chunk-YQO2NMJ3.js +13341 -0
- package/dist/chunk-YQO2NMJ3.js.map +1 -0
- package/dist/{createTrueFoundryServer-B72bU-J7.d.ts → createTrueFoundryServer-CmZnBh_l.d.ts} +15 -4
- package/dist/index.d.ts +1024 -24
- package/dist/index.js +691 -67
- package/dist/index.js.map +1 -1
- package/dist/plugins/trueforge-agent-server-adapter/index.d.ts +552 -8
- package/dist/plugins/trueforge-agent-server-adapter/index.js +504 -188
- package/dist/plugins/trueforge-agent-server-adapter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +9 -8
- package/dist/ConnectorSettings-FXQ5B7TN.js.map +0 -1
- package/dist/DrawerLayout-Q6UK4VMI.js +0 -159
- package/dist/DrawerLayout-Q6UK4VMI.js.map +0 -1
- package/dist/ModelSettings-4L4LOQJA.js.map +0 -1
- package/dist/OpenUiFenceBlock-6UIIAVBX.js +0 -9
- package/dist/SandboxSettings-Z4ZG6ZX4.js.map +0 -1
- package/dist/SettingsBuilder-WF7ZWKQW.js.map +0 -1
- package/dist/ShellRouteSync-T4WLY57Q.js +0 -172
- package/dist/ShellRouteSync-T4WLY57Q.js.map +0 -1
- package/dist/SidebarLayout-3WZ3CVON.js +0 -256
- package/dist/SidebarLayout-3WZ3CVON.js.map +0 -1
- package/dist/SkillSettings-3EPPC3IT.js.map +0 -1
- package/dist/WidgetLayout-3QZ357FL.js.map +0 -1
- package/dist/chunk-36KOSC2J.js +0 -567
- package/dist/chunk-36KOSC2J.js.map +0 -1
- package/dist/chunk-3S6KHO7H.js +0 -2121
- package/dist/chunk-3S6KHO7H.js.map +0 -1
- package/dist/chunk-7L63OK3O.js +0 -91
- package/dist/chunk-7L63OK3O.js.map +0 -1
- package/dist/chunk-CFLVPV5M.js.map +0 -1
- package/dist/chunk-FJ5RSSMA.js.map +0 -1
- package/dist/chunk-OSV3HI5M.js +0 -6891
- package/dist/chunk-OSV3HI5M.js.map +0 -1
- package/dist/chunk-WQULF5AT.js +0 -460
- package/dist/chunk-WQULF5AT.js.map +0 -1
- package/dist/chunk-WREC7D54.js.map +0 -1
- package/dist/chunk-YIWUG6MC.js +0 -101
- package/dist/chunk-YIWUG6MC.js.map +0 -1
- package/dist/chunk-ZXOADNF3.js +0 -75
- package/dist/chunk-ZXOADNF3.js.map +0 -1
- /package/dist/{OpenUiFenceBlock-6UIIAVBX.js.map → AgentMetricChart-4FYECRIN.js.map} +0 -0
- /package/dist/{chunk-B52K63AW.js.map → chunk-VJ7BZGAF.js.map} +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import {
|
|
2
|
+
writeSessionShareSearch
|
|
3
|
+
} from "./chunk-FQK2XVVE.js";
|
|
4
|
+
|
|
5
|
+
// src/utils/scheduleShareUrl.ts
|
|
6
|
+
var SCHEDULE_AGENT_QUERY = "agent";
|
|
7
|
+
var SCHEDULE_STATUS_QUERY = "status";
|
|
8
|
+
var SCHEDULE_NAME_QUERY = "q";
|
|
9
|
+
var SCHEDULE_IS_NEW_QUERY = "isNew";
|
|
10
|
+
var SCHEDULE_SHARE_CHANGE_EVENT = "trueforge-schedule-share";
|
|
11
|
+
function nonEmpty(value) {
|
|
12
|
+
return value != null && value.length > 0 ? value : null;
|
|
13
|
+
}
|
|
14
|
+
function parseStatus(value) {
|
|
15
|
+
if (value === "active" || value === "paused") return value;
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function readScheduleShareSearch(search) {
|
|
19
|
+
const params = new URLSearchParams(search.startsWith("?") ? search.slice(1) : search);
|
|
20
|
+
return {
|
|
21
|
+
agent: nonEmpty(params.get(SCHEDULE_AGENT_QUERY)),
|
|
22
|
+
status: parseStatus(params.get(SCHEDULE_STATUS_QUERY)),
|
|
23
|
+
q: nonEmpty(params.get(SCHEDULE_NAME_QUERY)),
|
|
24
|
+
isNew: params.get(SCHEDULE_IS_NEW_QUERY) === "true"
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function writeScheduleShareSearch(params, next) {
|
|
28
|
+
if (next.agent === null) params.delete(SCHEDULE_AGENT_QUERY);
|
|
29
|
+
else if (next.agent != null) params.set(SCHEDULE_AGENT_QUERY, next.agent);
|
|
30
|
+
if (next.status === null) params.delete(SCHEDULE_STATUS_QUERY);
|
|
31
|
+
else if (next.status != null) params.set(SCHEDULE_STATUS_QUERY, next.status);
|
|
32
|
+
if (next.q === null) params.delete(SCHEDULE_NAME_QUERY);
|
|
33
|
+
else if (next.q != null) params.set(SCHEDULE_NAME_QUERY, next.q);
|
|
34
|
+
if (next.isNew === null || next.isNew === false) params.delete(SCHEDULE_IS_NEW_QUERY);
|
|
35
|
+
else if (next.isNew === true) params.set(SCHEDULE_IS_NEW_QUERY, "true");
|
|
36
|
+
}
|
|
37
|
+
function clearScheduleShareSearch(params) {
|
|
38
|
+
params.delete(SCHEDULE_AGENT_QUERY);
|
|
39
|
+
params.delete(SCHEDULE_STATUS_QUERY);
|
|
40
|
+
params.delete(SCHEDULE_NAME_QUERY);
|
|
41
|
+
params.delete(SCHEDULE_IS_NEW_QUERY);
|
|
42
|
+
}
|
|
43
|
+
function replaceScheduleShareSearch(next) {
|
|
44
|
+
const url = new URL(window.location.href);
|
|
45
|
+
writeScheduleShareSearch(url.searchParams, next);
|
|
46
|
+
window.history.replaceState(window.history.state, "", url);
|
|
47
|
+
window.dispatchEvent(new Event(SCHEDULE_SHARE_CHANGE_EVENT));
|
|
48
|
+
return url.search;
|
|
49
|
+
}
|
|
50
|
+
function writeOpenSchedulesForAgentSearch({ agentId, isNew }) {
|
|
51
|
+
const url = new URL(window.location.href);
|
|
52
|
+
writeSessionShareSearch(url.searchParams, {
|
|
53
|
+
sessionId: null,
|
|
54
|
+
agentId: null,
|
|
55
|
+
tab: null,
|
|
56
|
+
view: null,
|
|
57
|
+
timeRange: null
|
|
58
|
+
});
|
|
59
|
+
writeScheduleShareSearch(url.searchParams, {
|
|
60
|
+
agent: agentId,
|
|
61
|
+
status: null,
|
|
62
|
+
q: null,
|
|
63
|
+
isNew: isNew === true ? true : null
|
|
64
|
+
});
|
|
65
|
+
window.history.replaceState(window.history.state, "", url);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export {
|
|
69
|
+
readScheduleShareSearch,
|
|
70
|
+
clearScheduleShareSearch,
|
|
71
|
+
replaceScheduleShareSearch,
|
|
72
|
+
writeOpenSchedulesForAgentSearch
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=chunk-NHHSZB5N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/scheduleShareUrl.ts"],"sourcesContent":["import type { ScheduleStatus } from '../server/types.js';\nimport { writeSessionShareSearch } from './sessionShareUrl.js';\n\nexport const SCHEDULE_AGENT_QUERY = 'agent';\nexport const SCHEDULE_STATUS_QUERY = 'status';\nexport const SCHEDULE_NAME_QUERY = 'q';\nexport const SCHEDULE_IS_NEW_QUERY = 'isNew';\n\nexport const SCHEDULE_SHARE_CHANGE_EVENT = 'trueforge-schedule-share';\n\nexport type ScheduleShareSearch = {\n /** Agent id filter; `null` means all agents. */\n agent: string | null;\n /** Status filter; `null` means all statuses. */\n status: ScheduleStatus | null;\n /** Name search; `null` when empty. */\n q: string | null;\n /** One-shot flag to open the create schedule drawer. */\n isNew: boolean;\n};\n\nexport type ScheduleShareWrite = {\n agent?: string | null;\n status?: ScheduleStatus | null;\n q?: string | null;\n isNew?: boolean | null;\n};\n\nfunction nonEmpty(value: string | null): string | null {\n return value != null && value.length > 0 ? value : null;\n}\n\nfunction parseStatus(value: string | null): ScheduleStatus | null {\n if (value === 'active' || value === 'paused') return value;\n return null;\n}\n\nexport function readScheduleShareSearch(search: string): ScheduleShareSearch {\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n return {\n agent: nonEmpty(params.get(SCHEDULE_AGENT_QUERY)),\n status: parseStatus(params.get(SCHEDULE_STATUS_QUERY)),\n q: nonEmpty(params.get(SCHEDULE_NAME_QUERY)),\n isNew: params.get(SCHEDULE_IS_NEW_QUERY) === 'true',\n };\n}\n\nexport function writeScheduleShareSearch(params: URLSearchParams, next: ScheduleShareWrite): void {\n if (next.agent === null) params.delete(SCHEDULE_AGENT_QUERY);\n else if (next.agent != null) params.set(SCHEDULE_AGENT_QUERY, next.agent);\n if (next.status === null) params.delete(SCHEDULE_STATUS_QUERY);\n else if (next.status != null) params.set(SCHEDULE_STATUS_QUERY, next.status);\n if (next.q === null) params.delete(SCHEDULE_NAME_QUERY);\n else if (next.q != null) params.set(SCHEDULE_NAME_QUERY, next.q);\n if (next.isNew === null || next.isNew === false) params.delete(SCHEDULE_IS_NEW_QUERY);\n else if (next.isNew === true) params.set(SCHEDULE_IS_NEW_QUERY, 'true');\n}\n\n/** Drop all schedules-owned query keys (used when leaving the schedules place). */\nexport function clearScheduleShareSearch(params: URLSearchParams): void {\n params.delete(SCHEDULE_AGENT_QUERY);\n params.delete(SCHEDULE_STATUS_QUERY);\n params.delete(SCHEDULE_NAME_QUERY);\n params.delete(SCHEDULE_IS_NEW_QUERY);\n}\n\nexport function replaceScheduleShareSearch(next: ScheduleShareWrite): string {\n const url = new URL(window.location.href);\n writeScheduleShareSearch(url.searchParams, next);\n window.history.replaceState(window.history.state, '', url);\n window.dispatchEvent(new Event(SCHEDULE_SHARE_CHANGE_EVENT));\n return url.search;\n}\n\n/**\n * Point the address bar at schedules filtered to `agentId` (clears library agent\n * share keys). Caller still opens the schedules place via shell.\n */\nexport function writeOpenSchedulesForAgentSearch({ agentId, isNew }: { agentId: string; isNew?: boolean }): void {\n const url = new URL(window.location.href);\n writeSessionShareSearch(url.searchParams, {\n sessionId: null,\n agentId: null,\n tab: null,\n view: null,\n timeRange: null,\n });\n writeScheduleShareSearch(url.searchParams, {\n agent: agentId,\n status: null,\n q: null,\n isNew: isNew === true ? true : null,\n });\n window.history.replaceState(window.history.state, '', url);\n}\n"],"mappings":";;;;;AAGO,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAE9B,IAAM,8BAA8B;AAoB3C,SAAS,SAAS,OAAqC;AACrD,SAAO,SAAS,QAAQ,MAAM,SAAS,IAAI,QAAQ;AACrD;AAEA,SAAS,YAAY,OAA6C;AAChE,MAAI,UAAU,YAAY,UAAU,SAAU,QAAO;AACrD,SAAO;AACT;AAEO,SAAS,wBAAwB,QAAqC;AAC3E,QAAM,SAAS,IAAI,gBAAgB,OAAO,WAAW,GAAG,IAAI,OAAO,MAAM,CAAC,IAAI,MAAM;AACpF,SAAO;AAAA,IACL,OAAO,SAAS,OAAO,IAAI,oBAAoB,CAAC;AAAA,IAChD,QAAQ,YAAY,OAAO,IAAI,qBAAqB,CAAC;AAAA,IACrD,GAAG,SAAS,OAAO,IAAI,mBAAmB,CAAC;AAAA,IAC3C,OAAO,OAAO,IAAI,qBAAqB,MAAM;AAAA,EAC/C;AACF;AAEO,SAAS,yBAAyB,QAAyB,MAAgC;AAChG,MAAI,KAAK,UAAU,KAAM,QAAO,OAAO,oBAAoB;AAAA,WAClD,KAAK,SAAS,KAAM,QAAO,IAAI,sBAAsB,KAAK,KAAK;AACxE,MAAI,KAAK,WAAW,KAAM,QAAO,OAAO,qBAAqB;AAAA,WACpD,KAAK,UAAU,KAAM,QAAO,IAAI,uBAAuB,KAAK,MAAM;AAC3E,MAAI,KAAK,MAAM,KAAM,QAAO,OAAO,mBAAmB;AAAA,WAC7C,KAAK,KAAK,KAAM,QAAO,IAAI,qBAAqB,KAAK,CAAC;AAC/D,MAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,MAAO,QAAO,OAAO,qBAAqB;AAAA,WAC3E,KAAK,UAAU,KAAM,QAAO,IAAI,uBAAuB,MAAM;AACxE;AAGO,SAAS,yBAAyB,QAA+B;AACtE,SAAO,OAAO,oBAAoB;AAClC,SAAO,OAAO,qBAAqB;AACnC,SAAO,OAAO,mBAAmB;AACjC,SAAO,OAAO,qBAAqB;AACrC;AAEO,SAAS,2BAA2B,MAAkC;AAC3E,QAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,2BAAyB,IAAI,cAAc,IAAI;AAC/C,SAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,GAAG;AACzD,SAAO,cAAc,IAAI,MAAM,2BAA2B,CAAC;AAC3D,SAAO,IAAI;AACb;AAMO,SAAS,iCAAiC,EAAE,SAAS,MAAM,GAA+C;AAC/G,QAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,0BAAwB,IAAI,cAAc;AAAA,IACxC,WAAW;AAAA,IACX,SAAS;AAAA,IACT,KAAK;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,EACb,CAAC;AACD,2BAAyB,IAAI,cAAc;AAAA,IACzC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,GAAG;AAAA,IACH,OAAO,UAAU,OAAO,OAAO;AAAA,EACjC,CAAC;AACD,SAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,GAAG;AAC3D;","names":[]}
|
|
@@ -5,6 +5,8 @@ function createTrueFoundryServer(opts) {
|
|
|
5
5
|
getModels: opts.getModels,
|
|
6
6
|
getSkills: opts.getSkills,
|
|
7
7
|
getMcp: opts.getMcp,
|
|
8
|
+
...opts.listMcp === void 0 ? {} : { listMcp: opts.listMcp },
|
|
9
|
+
...opts.getMcpTools === void 0 ? {} : { getMcpTools: opts.getMcpTools },
|
|
8
10
|
searchAgents: opts.searchAgents,
|
|
9
11
|
saveAgent: opts.saveAgent,
|
|
10
12
|
deleteAgent: async (req) => {
|
|
@@ -18,7 +20,10 @@ function createTrueFoundryServer(opts) {
|
|
|
18
20
|
const server = {
|
|
19
21
|
...opts.chatServer,
|
|
20
22
|
...builder,
|
|
21
|
-
...opts.catalog != null ? { catalog: opts.catalog } : {}
|
|
23
|
+
...opts.catalog != null ? { catalog: opts.catalog } : {},
|
|
24
|
+
...opts.sessions != null ? { sessions: opts.sessions } : {},
|
|
25
|
+
...opts.metrics != null ? { metrics: opts.metrics } : {},
|
|
26
|
+
...opts.schedules != null ? { schedules: opts.schedules } : {}
|
|
22
27
|
};
|
|
23
28
|
return server;
|
|
24
29
|
}
|
|
@@ -26,4 +31,4 @@ function createTrueFoundryServer(opts) {
|
|
|
26
31
|
export {
|
|
27
32
|
createTrueFoundryServer
|
|
28
33
|
};
|
|
29
|
-
//# sourceMappingURL=chunk-
|
|
34
|
+
//# sourceMappingURL=chunk-QC42MLAK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/createTrueFoundryServer.ts"],"sourcesContent":["import type {\n AgentBuilderCapabilitiesResponse,\n AgentBuilderServer,\n AgentChatServer,\n AgentLibraryEntry,\n AgentMetricsServer,\n AgentSessionsServer,\n AgentSkill,\n AgentSpec,\n CatalogServer,\n ConnectorState,\n ListResult,\n ModelSelection,\n PageParams,\n SaveAgentRequest,\n SaveAgentResult,\n ScheduleServer,\n SearchAgentsParams,\n} from './types.js';\n\nexport type CreateTrueFoundryServerOptions<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>,\n TMetrics extends AgentMetricsServer = AgentMetricsServer,\n TSchedules extends ScheduleServer = ScheduleServer,\n> = {\n /** Chat port — e.g. from `@truefoundry/agent-server-adapter`. */\n chatServer: AgentChatServer<TSpec>;\n getCapabilities: () => Promise<TCapabilities>;\n getModels: () => Promise<TModel[]>;\n getSkills: () => Promise<TSkill[]>;\n getMcp: () => Promise<TMcp[]>;\n listMcp?: (req?: PageParams) => Promise<ListResult<TMcp>>;\n getMcpTools?: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities>['getMcpTools'];\n searchAgents: (req?: SearchAgentsParams) => Promise<TAgent[]>;\n saveAgent: (req: SaveAgentRequest<TSpec>) => Promise<TSave>;\n deleteAgent?: (req: { agentName: string }) => Promise<void>;\n /** Settings catalog (models + connectors). Optional. */\n catalog?: TCatalog;\n /** Optional agent-detail port (Overview + Use In Code). */\n sessions?: TSessions;\n /** Optional aggregate metrics + chart port. */\n metrics?: TMetrics;\n /** Schedules listing + CRUD. Optional. */\n schedules?: TSchedules;\n};\n\nexport type TrueFoundryServer<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>,\n TMetrics extends AgentMetricsServer = AgentMetricsServer,\n TSchedules extends ScheduleServer = ScheduleServer,\n> = AgentChatServer<TSpec> &\n AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> & {\n catalog?: TCatalog;\n sessions?: TSessions;\n metrics?: TMetrics;\n schedules?: TSchedules;\n };\n\n/**\n * Composes an `AgentChatServer` with host-provided builder catalog callbacks\n * and an optional settings `catalog`.\n * Gateway wiring lives in the host (or `@truefoundry/agent-server-adapter`).\n */\nexport function createTrueFoundryServer<\n TSpec extends AgentSpec = AgentSpec,\n TModel extends ModelSelection = ModelSelection,\n TSkill extends AgentSkill = AgentSkill,\n TMcp extends ConnectorState = ConnectorState,\n TAgent extends AgentLibraryEntry = AgentLibraryEntry,\n TSave extends SaveAgentResult = SaveAgentResult,\n TCatalog extends CatalogServer = CatalogServer,\n TCapabilities extends AgentBuilderCapabilitiesResponse = AgentBuilderCapabilitiesResponse,\n TSessions extends AgentSessionsServer<TSpec> = AgentSessionsServer<TSpec>,\n TMetrics extends AgentMetricsServer = AgentMetricsServer,\n TSchedules extends ScheduleServer = ScheduleServer,\n>(\n opts: CreateTrueFoundryServerOptions<\n TSpec,\n TModel,\n TSkill,\n TMcp,\n TAgent,\n TSave,\n TCatalog,\n TCapabilities,\n TSessions,\n TMetrics,\n TSchedules\n >,\n): TrueFoundryServer<\n TSpec,\n TModel,\n TSkill,\n TMcp,\n TAgent,\n TSave,\n TCatalog,\n TCapabilities,\n TSessions,\n TMetrics,\n TSchedules\n> {\n const builder: AgentBuilderServer<TSpec, TModel, TSkill, TMcp, TAgent, TSave, TCapabilities> = {\n getCapabilities: opts.getCapabilities,\n getModels: opts.getModels,\n getSkills: opts.getSkills,\n getMcp: opts.getMcp,\n ...(opts.listMcp === undefined ? {} : { listMcp: opts.listMcp }),\n ...(opts.getMcpTools === undefined ? {} : { getMcpTools: opts.getMcpTools }),\n searchAgents: opts.searchAgents,\n saveAgent: opts.saveAgent,\n deleteAgent: async req => {\n if (opts.deleteAgent) {\n await opts.deleteAgent(req);\n return;\n }\n throw new Error('deleteAgent is host-owned. Pass deleteAgent to createTrueFoundryServer.');\n },\n };\n\n const server: TrueFoundryServer<\n TSpec,\n TModel,\n TSkill,\n TMcp,\n TAgent,\n TSave,\n TCatalog,\n TCapabilities,\n TSessions,\n TMetrics,\n TSchedules\n > = {\n ...opts.chatServer,\n ...builder,\n ...(opts.catalog != null ? { catalog: opts.catalog } : {}),\n ...(opts.sessions != null ? { sessions: opts.sessions } : {}),\n ...(opts.metrics != null ? { metrics: opts.metrics } : {}),\n ...(opts.schedules != null ? { schedules: opts.schedules } : {}),\n };\n return server;\n}\n"],"mappings":";AA+EO,SAAS,wBAad,MAyBA;AACA,QAAM,UAAyF;AAAA,IAC7F,iBAAiB,KAAK;AAAA,IACtB,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ;AAAA,IAC9D,GAAI,KAAK,gBAAgB,SAAY,CAAC,IAAI,EAAE,aAAa,KAAK,YAAY;AAAA,IAC1E,cAAc,KAAK;AAAA,IACnB,WAAW,KAAK;AAAA,IAChB,aAAa,OAAM,QAAO;AACxB,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,YAAY,GAAG;AAC1B;AAAA,MACF;AACA,YAAM,IAAI,MAAM,yEAAyE;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,SAYF;AAAA,IACF,GAAG,KAAK;AAAA,IACR,GAAG;AAAA,IACH,GAAI,KAAK,WAAW,OAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,YAAY,OAAO,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IAC3D,GAAI,KAAK,WAAW,OAAO,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,aAAa,OAAO,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,EAChE;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// src/atoms/lib/sessionCreateAgent.ts
|
|
2
|
+
var IS_CREATE_AGENT_METADATA_KEY = "is_create_agent";
|
|
3
|
+
function isCreateAgentMetadataValue(isCreateAgent) {
|
|
4
|
+
return isCreateAgent ? "true" : "false";
|
|
5
|
+
}
|
|
6
|
+
function readSessionIsCreateAgent(metadata) {
|
|
7
|
+
if (metadata == null) return false;
|
|
8
|
+
return Reflect.get(metadata, IS_CREATE_AGENT_METADATA_KEY) === "true";
|
|
9
|
+
}
|
|
10
|
+
function sessionIsCreateAgent(session) {
|
|
11
|
+
if ("isCreateAgent" in session && Reflect.get(session, "isCreateAgent") === true) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
if (!("metadata" in session)) return false;
|
|
15
|
+
const metadata = Reflect.get(session, "metadata");
|
|
16
|
+
if (typeof metadata !== "object" || metadata === null) return false;
|
|
17
|
+
const record = {};
|
|
18
|
+
for (const key of Object.keys(metadata)) {
|
|
19
|
+
const value = Reflect.get(metadata, key);
|
|
20
|
+
if (typeof value !== "string") continue;
|
|
21
|
+
record[key] = value;
|
|
22
|
+
}
|
|
23
|
+
return readSessionIsCreateAgent(record);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export {
|
|
27
|
+
IS_CREATE_AGENT_METADATA_KEY,
|
|
28
|
+
isCreateAgentMetadataValue,
|
|
29
|
+
readSessionIsCreateAgent,
|
|
30
|
+
sessionIsCreateAgent
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=chunk-RDXBMTP5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/atoms/lib/sessionCreateAgent.ts"],"sourcesContent":["/** Session metadata key for New Chat vs New Agent builder intent (wire/jsonb snake_case). */\nexport const IS_CREATE_AGENT_METADATA_KEY = 'is_create_agent';\n\n/** Wire metadata values are strings (`SessionMetadataSchema`). */\nexport function isCreateAgentMetadataValue(isCreateAgent: boolean): 'true' | 'false' {\n return isCreateAgent ? 'true' : 'false';\n}\n\n/**\n * Read create-agent intent from session metadata.\n * Missing / undefined / anything other than `\"true\"` → false (legacy = Chat).\n */\nexport function readSessionIsCreateAgent(metadata: Record<string, string> | null | undefined): boolean {\n if (metadata == null) return false;\n return Reflect.get(metadata, IS_CREATE_AGENT_METADATA_KEY) === 'true';\n}\n\n/** True when a UI session was stamped as agent-builder (own prop or metadata). */\nexport function sessionIsCreateAgent(session: object): boolean {\n if ('isCreateAgent' in session && Reflect.get(session, 'isCreateAgent') === true) {\n return true;\n }\n if (!('metadata' in session)) return false;\n const metadata = Reflect.get(session, 'metadata');\n if (typeof metadata !== 'object' || metadata === null) return false;\n const record: Record<string, string> = {};\n for (const key of Object.keys(metadata)) {\n const value = Reflect.get(metadata, key);\n if (typeof value !== 'string') continue;\n record[key] = value;\n }\n return readSessionIsCreateAgent(record);\n}\n"],"mappings":";AACO,IAAM,+BAA+B;AAGrC,SAAS,2BAA2B,eAA0C;AACnF,SAAO,gBAAgB,SAAS;AAClC;AAMO,SAAS,yBAAyB,UAA8D;AACrG,MAAI,YAAY,KAAM,QAAO;AAC7B,SAAO,QAAQ,IAAI,UAAU,4BAA4B,MAAM;AACjE;AAGO,SAAS,qBAAqB,SAA0B;AAC7D,MAAI,mBAAmB,WAAW,QAAQ,IAAI,SAAS,eAAe,MAAM,MAAM;AAChF,WAAO;AAAA,EACT;AACA,MAAI,EAAE,cAAc,SAAU,QAAO;AACrC,QAAM,WAAW,QAAQ,IAAI,SAAS,UAAU;AAChD,MAAI,OAAO,aAAa,YAAY,aAAa,KAAM,QAAO;AAC9D,QAAM,SAAiC,CAAC;AACxC,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,UAAM,QAAQ,QAAQ,IAAI,UAAU,GAAG;AACvC,QAAI,OAAO,UAAU,SAAU;AAC/B,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO,yBAAyB,MAAM;AACxC;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/utils/drainListPages.ts
|
|
2
|
+
async function drainListPages({
|
|
3
|
+
fetchPage
|
|
4
|
+
}) {
|
|
5
|
+
const items = [];
|
|
6
|
+
let pageToken;
|
|
7
|
+
do {
|
|
8
|
+
const page = await fetchPage(pageToken);
|
|
9
|
+
items.push(...page.data);
|
|
10
|
+
pageToken = page.nextPageToken;
|
|
11
|
+
} while (pageToken != null && pageToken.length > 0);
|
|
12
|
+
return items;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
drainListPages
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=chunk-SFZNIO6U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/drainListPages.ts"],"sourcesContent":["import type { ListResult } from '../server/types.js';\n\n/** Drain token-paginated list endpoints until `nextPageToken` is exhausted. */\nexport async function drainListPages<T>({\n fetchPage,\n}: {\n fetchPage: (pageToken?: string) => Promise<ListResult<T>>;\n}): Promise<T[]> {\n const items: T[] = [];\n let pageToken: string | undefined;\n do {\n const page = await fetchPage(pageToken);\n items.push(...page.data);\n pageToken = page.nextPageToken;\n } while (pageToken != null && pageToken.length > 0);\n return items;\n}\n"],"mappings":";AAGA,eAAsB,eAAkB;AAAA,EACtC;AACF,GAEiB;AACf,QAAM,QAAa,CAAC;AACpB,MAAI;AACJ,KAAG;AACD,UAAM,OAAO,MAAM,UAAU,SAAS;AACtC,UAAM,KAAK,GAAG,KAAK,IAAI;AACvB,gBAAY,KAAK;AAAA,EACnB,SAAS,aAAa,QAAQ,UAAU,SAAS;AACjD,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clearScheduleShareSearch
|
|
3
|
+
} from "./chunk-NHHSZB5N.js";
|
|
4
|
+
import {
|
|
5
|
+
readSessionShareSearch,
|
|
6
|
+
writeSessionShareSearch
|
|
7
|
+
} from "./chunk-FQK2XVVE.js";
|
|
8
|
+
|
|
9
|
+
// src/routing/paths.ts
|
|
10
|
+
var DEFAULTS = {
|
|
11
|
+
root: "/",
|
|
12
|
+
settings: "/settings",
|
|
13
|
+
library: "/library",
|
|
14
|
+
libraryAgent: "/library/:agentId",
|
|
15
|
+
schedules: "/schedules",
|
|
16
|
+
agent: "/agents/:agentName",
|
|
17
|
+
session: "/sessions/:sessionId",
|
|
18
|
+
sessionsBrowser: "/sessions"
|
|
19
|
+
};
|
|
20
|
+
function normalizePath(path) {
|
|
21
|
+
const trimmed = path.trim();
|
|
22
|
+
const withLead = trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
|
|
23
|
+
return withLead.length > 1 && withLead.endsWith("/") ? withLead.slice(0, -1) : withLead;
|
|
24
|
+
}
|
|
25
|
+
function resolveOptional(value, fallback) {
|
|
26
|
+
if (value === false) return null;
|
|
27
|
+
return normalizePath(value ?? fallback);
|
|
28
|
+
}
|
|
29
|
+
function resolveRoutesConfig(routes) {
|
|
30
|
+
const paths = routes?.paths;
|
|
31
|
+
return {
|
|
32
|
+
basename: routes?.basename ?? "",
|
|
33
|
+
root: normalizePath(paths?.root ?? DEFAULTS.root),
|
|
34
|
+
settings: resolveOptional(paths?.settings, DEFAULTS.settings),
|
|
35
|
+
library: resolveOptional(paths?.library, DEFAULTS.library),
|
|
36
|
+
libraryAgent: resolveOptional(paths?.libraryAgent, DEFAULTS.libraryAgent),
|
|
37
|
+
schedules: resolveOptional(paths?.schedules, DEFAULTS.schedules),
|
|
38
|
+
agent: resolveOptional(paths?.agent, DEFAULTS.agent),
|
|
39
|
+
session: resolveOptional(paths?.session, DEFAULTS.session),
|
|
40
|
+
sessionsBrowser: resolveOptional(paths?.sessionsBrowser, DEFAULTS.sessionsBrowser)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function splitSegments(path) {
|
|
44
|
+
return path.split("/").filter((segment) => segment.length > 0);
|
|
45
|
+
}
|
|
46
|
+
function fillTemplate(template, value) {
|
|
47
|
+
return "/" + splitSegments(template).map((segment) => segment.startsWith(":") ? encodeURIComponent(value) : segment).join("/");
|
|
48
|
+
}
|
|
49
|
+
function buildPath(place, routes) {
|
|
50
|
+
switch (place.type) {
|
|
51
|
+
case "root":
|
|
52
|
+
return routes.root;
|
|
53
|
+
case "settings":
|
|
54
|
+
return routes.settings;
|
|
55
|
+
case "library":
|
|
56
|
+
return routes.library;
|
|
57
|
+
case "libraryAgent":
|
|
58
|
+
return routes.libraryAgent == null ? null : fillTemplate(routes.libraryAgent, place.agentId);
|
|
59
|
+
case "schedules":
|
|
60
|
+
return routes.schedules;
|
|
61
|
+
case "agent":
|
|
62
|
+
return routes.agent == null ? null : fillTemplate(routes.agent, place.agentName);
|
|
63
|
+
case "session":
|
|
64
|
+
return routes.session == null ? null : fillTemplate(routes.session, place.sessionId);
|
|
65
|
+
case "sessionsBrowser":
|
|
66
|
+
return routes.sessionsBrowser;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function buildSessionResumeHref({
|
|
70
|
+
sessionId,
|
|
71
|
+
routes,
|
|
72
|
+
href = typeof window === "undefined" ? "http://localhost/" : window.location.href
|
|
73
|
+
}) {
|
|
74
|
+
const sessionPath = buildPath({ type: "session", sessionId }, routes);
|
|
75
|
+
if (sessionPath == null) return null;
|
|
76
|
+
const url = new URL(href);
|
|
77
|
+
const basename = routes.basename.endsWith("/") ? routes.basename.slice(0, -1) : routes.basename;
|
|
78
|
+
url.pathname = `${basename}${sessionPath}` || "/";
|
|
79
|
+
url.search = sanitizeSearchForPlace({ type: "session", sessionId }, url.search);
|
|
80
|
+
url.hash = "";
|
|
81
|
+
return url.toString();
|
|
82
|
+
}
|
|
83
|
+
function sanitizeSearchForPlace(place, search) {
|
|
84
|
+
if (place.type === "settings") return search;
|
|
85
|
+
const params = new URLSearchParams(search.startsWith("?") ? search.slice(1) : search);
|
|
86
|
+
if (place.type === "sessionsBrowser") {
|
|
87
|
+
writeSessionShareSearch(params, { tab: null });
|
|
88
|
+
clearScheduleShareSearch(params);
|
|
89
|
+
} else if (place.type === "libraryAgent") {
|
|
90
|
+
const share = readSessionShareSearch(search);
|
|
91
|
+
writeSessionShareSearch(params, {
|
|
92
|
+
view: null,
|
|
93
|
+
timeRange: null,
|
|
94
|
+
...share.sessionId != null && share.agentId !== place.agentId ? { sessionId: null, agentId: null } : {}
|
|
95
|
+
});
|
|
96
|
+
clearScheduleShareSearch(params);
|
|
97
|
+
} else if (place.type === "schedules") {
|
|
98
|
+
writeSessionShareSearch(params, {
|
|
99
|
+
sessionId: null,
|
|
100
|
+
agentId: null,
|
|
101
|
+
tab: null,
|
|
102
|
+
view: null,
|
|
103
|
+
timeRange: null
|
|
104
|
+
});
|
|
105
|
+
} else {
|
|
106
|
+
writeSessionShareSearch(params, {
|
|
107
|
+
sessionId: null,
|
|
108
|
+
agentId: null,
|
|
109
|
+
tab: null,
|
|
110
|
+
view: null,
|
|
111
|
+
timeRange: null
|
|
112
|
+
});
|
|
113
|
+
clearScheduleShareSearch(params);
|
|
114
|
+
}
|
|
115
|
+
const next = params.toString();
|
|
116
|
+
return next.length > 0 ? `?${next}` : "";
|
|
117
|
+
}
|
|
118
|
+
function decodeSegment(segment) {
|
|
119
|
+
try {
|
|
120
|
+
return decodeURIComponent(segment);
|
|
121
|
+
} catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function matchTemplate(template, segments) {
|
|
126
|
+
const templateSegments = splitSegments(template);
|
|
127
|
+
if (templateSegments.length !== segments.length) return null;
|
|
128
|
+
let param = null;
|
|
129
|
+
for (const [i, tpl] of templateSegments.entries()) {
|
|
130
|
+
const seg = segments[i];
|
|
131
|
+
if (seg === void 0) return null;
|
|
132
|
+
if (tpl.startsWith(":")) {
|
|
133
|
+
const decoded = decodeSegment(seg);
|
|
134
|
+
if (decoded == null) return null;
|
|
135
|
+
param = decoded;
|
|
136
|
+
} else if (tpl !== seg) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return param;
|
|
141
|
+
}
|
|
142
|
+
function matchPath(pathname, routes) {
|
|
143
|
+
const normalized = normalizePath(pathname);
|
|
144
|
+
const segments = splitSegments(normalized);
|
|
145
|
+
if (routes.settings != null && normalized === routes.settings) {
|
|
146
|
+
return { type: "settings" };
|
|
147
|
+
}
|
|
148
|
+
if (routes.library != null && normalized === routes.library) {
|
|
149
|
+
return { type: "library" };
|
|
150
|
+
}
|
|
151
|
+
if (routes.sessionsBrowser != null && normalized === routes.sessionsBrowser) {
|
|
152
|
+
return { type: "sessionsBrowser" };
|
|
153
|
+
}
|
|
154
|
+
if (routes.libraryAgent != null) {
|
|
155
|
+
const agentId = matchTemplate(routes.libraryAgent, segments);
|
|
156
|
+
if (agentId != null) return { type: "libraryAgent", agentId };
|
|
157
|
+
}
|
|
158
|
+
if (routes.schedules != null && normalized === routes.schedules) {
|
|
159
|
+
return { type: "schedules" };
|
|
160
|
+
}
|
|
161
|
+
if (routes.agent != null) {
|
|
162
|
+
const agentName = matchTemplate(routes.agent, segments);
|
|
163
|
+
if (agentName != null) return { type: "agent", agentName };
|
|
164
|
+
}
|
|
165
|
+
if (routes.session != null) {
|
|
166
|
+
const sessionId = matchTemplate(routes.session, segments);
|
|
167
|
+
if (sessionId != null) return { type: "session", sessionId };
|
|
168
|
+
}
|
|
169
|
+
if (normalized === routes.root) {
|
|
170
|
+
return { type: "root" };
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
function matchLocation({
|
|
175
|
+
pathname,
|
|
176
|
+
search,
|
|
177
|
+
routes
|
|
178
|
+
}) {
|
|
179
|
+
const matched = matchPath(pathname, routes);
|
|
180
|
+
if (matched == null || matched.type !== "root") return matched;
|
|
181
|
+
const { agentId } = readSessionShareSearch(search);
|
|
182
|
+
return agentId != null ? { type: "libraryAgent", agentId } : matched;
|
|
183
|
+
}
|
|
184
|
+
function placesEqual(a, b) {
|
|
185
|
+
if (a.type !== b.type) return false;
|
|
186
|
+
if (a.type === "agent" && b.type === "agent") return a.agentName === b.agentName;
|
|
187
|
+
if (a.type === "libraryAgent" && b.type === "libraryAgent") return a.agentId === b.agentId;
|
|
188
|
+
if (a.type === "session" && b.type === "session") return a.sessionId === b.sessionId;
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export {
|
|
193
|
+
resolveRoutesConfig,
|
|
194
|
+
buildPath,
|
|
195
|
+
buildSessionResumeHref,
|
|
196
|
+
sanitizeSearchForPlace,
|
|
197
|
+
matchLocation,
|
|
198
|
+
placesEqual
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=chunk-SQGT43Z3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/routing/paths.ts"],"sourcesContent":["import { clearScheduleShareSearch } from '../utils/scheduleShareUrl.js';\nimport { readSessionShareSearch, writeSessionShareSearch } from '../utils/sessionShareUrl.js';\nimport type { ResolvedRoutes, RoutePlace, RoutesConfig } from './types.js';\n\nconst DEFAULTS = {\n root: '/',\n settings: '/settings',\n library: '/library',\n libraryAgent: '/library/:agentId',\n schedules: '/schedules',\n agent: '/agents/:agentName',\n session: '/sessions/:sessionId',\n sessionsBrowser: '/sessions',\n} as const;\n\nfunction normalizePath(path: string): string {\n const trimmed = path.trim();\n const withLead = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n // Drop a trailing slash except for the root itself.\n return withLead.length > 1 && withLead.endsWith('/') ? withLead.slice(0, -1) : withLead;\n}\n\nfunction resolveOptional(value: string | false | undefined, fallback: string): string | null {\n if (value === false) return null;\n return normalizePath(value ?? fallback);\n}\n\nexport function resolveRoutesConfig(routes?: RoutesConfig): ResolvedRoutes {\n const paths = routes?.paths;\n return {\n basename: routes?.basename ?? '',\n root: normalizePath(paths?.root ?? DEFAULTS.root),\n settings: resolveOptional(paths?.settings, DEFAULTS.settings),\n library: resolveOptional(paths?.library, DEFAULTS.library),\n libraryAgent: resolveOptional(paths?.libraryAgent, DEFAULTS.libraryAgent),\n schedules: resolveOptional(paths?.schedules, DEFAULTS.schedules),\n agent: resolveOptional(paths?.agent, DEFAULTS.agent),\n session: resolveOptional(paths?.session, DEFAULTS.session),\n sessionsBrowser: resolveOptional(paths?.sessionsBrowser, DEFAULTS.sessionsBrowser),\n };\n}\n\nfunction splitSegments(path: string): string[] {\n return path.split('/').filter(segment => segment.length > 0);\n}\n\n/** Fill a single-param template (`/agents/:agentName`) with an encoded value. */\nfunction fillTemplate(template: string, value: string): string {\n return (\n '/' +\n splitSegments(template)\n .map(segment => (segment.startsWith(':') ? encodeURIComponent(value) : segment))\n .join('/')\n );\n}\n\n/** Build the URL path for a place, or `null` when that place has no configured route. */\nexport function buildPath(place: RoutePlace, routes: ResolvedRoutes): string | null {\n switch (place.type) {\n case 'root':\n return routes.root;\n case 'settings':\n return routes.settings;\n case 'library':\n return routes.library;\n case 'libraryAgent':\n return routes.libraryAgent == null ? null : fillTemplate(routes.libraryAgent, place.agentId);\n case 'schedules':\n return routes.schedules;\n case 'agent':\n return routes.agent == null ? null : fillTemplate(routes.agent, place.agentName);\n case 'session':\n return routes.session == null ? null : fillTemplate(routes.session, place.sessionId);\n case 'sessionsBrowser':\n return routes.sessionsBrowser;\n }\n}\n\n/**\n * Absolute href that boots the shell on a history session (`/sessions/:id`).\n * Includes `routes.basename` and clears place-owned share query keys.\n */\nexport function buildSessionResumeHref({\n sessionId,\n routes,\n href = typeof window === 'undefined' ? 'http://localhost/' : window.location.href,\n}: {\n sessionId: string;\n routes: ResolvedRoutes;\n href?: string;\n}): string | null {\n const sessionPath = buildPath({ type: 'session', sessionId }, routes);\n if (sessionPath == null) return null;\n const url = new URL(href);\n const basename = routes.basename.endsWith('/') ? routes.basename.slice(0, -1) : routes.basename;\n url.pathname = `${basename}${sessionPath}` || '/';\n url.search = sanitizeSearchForPlace({ type: 'session', sessionId }, url.search);\n url.hash = '';\n return url.toString();\n}\n\n/**\n * Remove query state owned by a different shell place while preserving host\n * parameters. Settings is an overlay, so it retains the underlying place state.\n */\nexport function sanitizeSearchForPlace(place: RoutePlace, search: string): string {\n if (place.type === 'settings') return search;\n\n const params = new URLSearchParams(search.startsWith('?') ? search.slice(1) : search);\n if (place.type === 'sessionsBrowser') {\n writeSessionShareSearch(params, { tab: null });\n clearScheduleShareSearch(params);\n } else if (place.type === 'libraryAgent') {\n const share = readSessionShareSearch(search);\n writeSessionShareSearch(params, {\n view: null,\n timeRange: null,\n ...(share.sessionId != null && share.agentId !== place.agentId ? { sessionId: null, agentId: null } : {}),\n });\n clearScheduleShareSearch(params);\n } else if (place.type === 'schedules') {\n writeSessionShareSearch(params, {\n sessionId: null,\n agentId: null,\n tab: null,\n view: null,\n timeRange: null,\n });\n // Keep `agent` / `status` / `q` — owned by the schedules place.\n } else {\n writeSessionShareSearch(params, {\n sessionId: null,\n agentId: null,\n tab: null,\n view: null,\n timeRange: null,\n });\n clearScheduleShareSearch(params);\n }\n const next = params.toString();\n return next.length > 0 ? `?${next}` : '';\n}\n\n/** Percent-decode a segment; `null` when the URL carries a malformed escape. */\nfunction decodeSegment(segment: string): string | null {\n try {\n return decodeURIComponent(segment);\n } catch {\n return null;\n }\n}\n\n/** Match a single-param template against concrete segments; returns the decoded param or null. */\nfunction matchTemplate(template: string, segments: string[]): string | null {\n const templateSegments = splitSegments(template);\n if (templateSegments.length !== segments.length) return null;\n let param: string | null = null;\n for (const [i, tpl] of templateSegments.entries()) {\n const seg = segments[i];\n if (seg === undefined) return null;\n if (tpl.startsWith(':')) {\n // A malformed escape is an unusable id, so the path simply does not match.\n const decoded = decodeSegment(seg);\n if (decoded == null) return null;\n param = decoded;\n } else if (tpl !== seg) {\n return null;\n }\n }\n return param;\n}\n\n/** Parse a (basename-relative) pathname into a place, or `null` when unrecognized. */\nexport function matchPath(pathname: string, routes: ResolvedRoutes): RoutePlace | null {\n const normalized = normalizePath(pathname);\n const segments = splitSegments(normalized);\n\n if (routes.settings != null && normalized === routes.settings) {\n return { type: 'settings' };\n }\n if (routes.library != null && normalized === routes.library) {\n return { type: 'library' };\n }\n if (routes.sessionsBrowser != null && normalized === routes.sessionsBrowser) {\n return { type: 'sessionsBrowser' };\n }\n if (routes.libraryAgent != null) {\n const agentId = matchTemplate(routes.libraryAgent, segments);\n if (agentId != null) return { type: 'libraryAgent', agentId };\n }\n if (routes.schedules != null && normalized === routes.schedules) {\n return { type: 'schedules' };\n }\n if (routes.agent != null) {\n const agentName = matchTemplate(routes.agent, segments);\n if (agentName != null) return { type: 'agent', agentName };\n }\n if (routes.session != null) {\n const sessionId = matchTemplate(routes.session, segments);\n if (sessionId != null) return { type: 'session', sessionId };\n }\n if (normalized === routes.root) {\n return { type: 'root' };\n }\n return null;\n}\n\n/** Pathname place, or library agent from `?agentId=` when the path is root. */\nexport function matchLocation({\n pathname,\n search,\n routes,\n}: {\n pathname: string;\n search: string;\n routes: ResolvedRoutes;\n}): RoutePlace | null {\n const matched = matchPath(pathname, routes);\n if (matched == null || matched.type !== 'root') return matched;\n const { agentId } = readSessionShareSearch(search);\n return agentId != null ? { type: 'libraryAgent', agentId } : matched;\n}\n\nexport function placesEqual(a: RoutePlace, b: RoutePlace): boolean {\n if (a.type !== b.type) return false;\n if (a.type === 'agent' && b.type === 'agent') return a.agentName === b.agentName;\n if (a.type === 'libraryAgent' && b.type === 'libraryAgent') return a.agentId === b.agentId;\n if (a.type === 'session' && b.type === 'session') return a.sessionId === b.sessionId;\n return true;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
cn,
|
|
3
3
|
useOptionalContentClassNames
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BWHOZFIV.js";
|
|
5
5
|
|
|
6
6
|
// src/atoms/OpenUiFenceBlock.tsx
|
|
7
7
|
import { Renderer } from "@openuidev/react-lang";
|
|
@@ -21,4 +21,4 @@ function OpenUiFenceBlock({ content, isStreaming, darkTheme }) {
|
|
|
21
21
|
export {
|
|
22
22
|
OpenUiFenceBlock
|
|
23
23
|
};
|
|
24
|
-
//# sourceMappingURL=chunk-
|
|
24
|
+
//# sourceMappingURL=chunk-VJ7BZGAF.js.map
|