@iloveagents/foundry-agent 0.1.0 → 0.1.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.
@@ -0,0 +1,53 @@
1
+ import { createStore } from "zustand/vanilla";
2
+
3
+ export interface LinkHandler {
4
+ canHandle: (href: string) => boolean;
5
+ normalizeHref?: (href: string) => string | null;
6
+ openLink: (href: string) => void;
7
+ }
8
+
9
+ export interface ResolvedLinkHandler {
10
+ handler: LinkHandler;
11
+ href: string;
12
+ }
13
+
14
+ interface LinkState {
15
+ /**
16
+ * Latest registered handler kept for backwards-compatible consumers.
17
+ * New code should use `handlers` or `resolveLinkHandler`.
18
+ */
19
+ handler: LinkHandler | null;
20
+ handlers: LinkHandler[];
21
+ setHandler: (handler: LinkHandler) => void;
22
+ clear: () => void;
23
+ }
24
+
25
+ /**
26
+ * Generic markdown-link extension point.
27
+ *
28
+ * Feature modules register a handler for their own deep-link namespace
29
+ * (for example Spaces handles `/spaces/...`). The chat renderer stays
30
+ * module-agnostic while still letting app-local links navigate in-place.
31
+ */
32
+ export const linkStore = createStore<LinkState>((set) => ({
33
+ handler: null,
34
+ handlers: [],
35
+ setHandler: (handler) =>
36
+ set((state) => ({
37
+ handler,
38
+ handlers: [...state.handlers.filter((item) => item !== handler), handler],
39
+ })),
40
+ clear: () => set({ handler: null, handlers: [] }),
41
+ }));
42
+
43
+ export function resolveLinkHandler(rawHref: string): ResolvedLinkHandler | null {
44
+ const handlers = linkStore.getState().handlers;
45
+ for (let i = handlers.length - 1; i >= 0; i -= 1) {
46
+ const handler = handlers[i];
47
+ const href = handler.normalizeHref ? handler.normalizeHref(rawHref) : rawHref;
48
+ if (href && handler.canHandle(href)) {
49
+ return { handler, href };
50
+ }
51
+ }
52
+ return null;
53
+ }