pilotswarm 0.0.1 → 0.4.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.
Files changed (149) hide show
  1. package/README.md +37 -1
  2. package/mcp/README.md +484 -0
  3. package/mcp/dist/bin/pilotswarm-mcp.d.ts +3 -0
  4. package/mcp/dist/bin/pilotswarm-mcp.d.ts.map +1 -0
  5. package/mcp/dist/bin/pilotswarm-mcp.js +367 -0
  6. package/mcp/dist/bin/pilotswarm-mcp.js.map +1 -0
  7. package/mcp/dist/src/auth.d.ts +7 -0
  8. package/mcp/dist/src/auth.d.ts.map +1 -0
  9. package/mcp/dist/src/auth.js +99 -0
  10. package/mcp/dist/src/auth.js.map +1 -0
  11. package/mcp/dist/src/context.d.ts +48 -0
  12. package/mcp/dist/src/context.d.ts.map +1 -0
  13. package/mcp/dist/src/context.js +83 -0
  14. package/mcp/dist/src/context.js.map +1 -0
  15. package/mcp/dist/src/index.d.ts +4 -0
  16. package/mcp/dist/src/index.d.ts.map +1 -0
  17. package/mcp/dist/src/index.js +3 -0
  18. package/mcp/dist/src/index.js.map +1 -0
  19. package/mcp/dist/src/prompts/skills.d.ts +4 -0
  20. package/mcp/dist/src/prompts/skills.d.ts.map +1 -0
  21. package/mcp/dist/src/prompts/skills.js +11 -0
  22. package/mcp/dist/src/prompts/skills.js.map +1 -0
  23. package/mcp/dist/src/resources/agents.d.ts +4 -0
  24. package/mcp/dist/src/resources/agents.d.ts.map +1 -0
  25. package/mcp/dist/src/resources/agents.js +64 -0
  26. package/mcp/dist/src/resources/agents.js.map +1 -0
  27. package/mcp/dist/src/resources/facts.d.ts +4 -0
  28. package/mcp/dist/src/resources/facts.d.ts.map +1 -0
  29. package/mcp/dist/src/resources/facts.js +125 -0
  30. package/mcp/dist/src/resources/facts.js.map +1 -0
  31. package/mcp/dist/src/resources/models.d.ts +4 -0
  32. package/mcp/dist/src/resources/models.d.ts.map +1 -0
  33. package/mcp/dist/src/resources/models.js +43 -0
  34. package/mcp/dist/src/resources/models.js.map +1 -0
  35. package/mcp/dist/src/resources/sessions.d.ts +4 -0
  36. package/mcp/dist/src/resources/sessions.d.ts.map +1 -0
  37. package/mcp/dist/src/resources/sessions.js +190 -0
  38. package/mcp/dist/src/resources/sessions.js.map +1 -0
  39. package/mcp/dist/src/resources/subscriptions.d.ts +9 -0
  40. package/mcp/dist/src/resources/subscriptions.d.ts.map +1 -0
  41. package/mcp/dist/src/resources/subscriptions.js +157 -0
  42. package/mcp/dist/src/resources/subscriptions.js.map +1 -0
  43. package/mcp/dist/src/server.d.ts +4 -0
  44. package/mcp/dist/src/server.d.ts.map +1 -0
  45. package/mcp/dist/src/server.js +59 -0
  46. package/mcp/dist/src/server.js.map +1 -0
  47. package/mcp/dist/src/tools/agents.d.ts +4 -0
  48. package/mcp/dist/src/tools/agents.d.ts.map +1 -0
  49. package/mcp/dist/src/tools/agents.js +317 -0
  50. package/mcp/dist/src/tools/agents.js.map +1 -0
  51. package/mcp/dist/src/tools/facts.d.ts +4 -0
  52. package/mcp/dist/src/tools/facts.d.ts.map +1 -0
  53. package/mcp/dist/src/tools/facts.js +151 -0
  54. package/mcp/dist/src/tools/facts.js.map +1 -0
  55. package/mcp/dist/src/tools/models.d.ts +4 -0
  56. package/mcp/dist/src/tools/models.d.ts.map +1 -0
  57. package/mcp/dist/src/tools/models.js +256 -0
  58. package/mcp/dist/src/tools/models.js.map +1 -0
  59. package/mcp/dist/src/tools/sessions.d.ts +4 -0
  60. package/mcp/dist/src/tools/sessions.d.ts.map +1 -0
  61. package/mcp/dist/src/tools/sessions.js +606 -0
  62. package/mcp/dist/src/tools/sessions.js.map +1 -0
  63. package/mcp/dist/src/util/command.d.ts +52 -0
  64. package/mcp/dist/src/util/command.d.ts.map +1 -0
  65. package/mcp/dist/src/util/command.js +78 -0
  66. package/mcp/dist/src/util/command.js.map +1 -0
  67. package/package.json +81 -6
  68. package/tui/README.md +35 -0
  69. package/tui/bin/tui.js +30 -0
  70. package/tui/plugins/.mcp.json +7 -0
  71. package/tui/plugins/plugin.json +13 -0
  72. package/tui/plugins/session-policy.json +8 -0
  73. package/tui/src/app.js +850 -0
  74. package/tui/src/auth/cli.js +111 -0
  75. package/tui/src/auth/entra-auth.js +218 -0
  76. package/tui/src/bootstrap-env.js +176 -0
  77. package/tui/src/embedded-workers.js +79 -0
  78. package/tui/src/http-transport-host.js +106 -0
  79. package/tui/src/index.js +340 -0
  80. package/tui/src/node-sdk-transport.js +1793 -0
  81. package/tui/src/platform.js +984 -0
  82. package/tui/src/plugin-config.js +239 -0
  83. package/tui/src/portal.js +7 -0
  84. package/tui/src/version.js +7 -0
  85. package/tui/tui-splash.txt +11 -0
  86. package/ui/core/README.md +6 -0
  87. package/ui/core/src/commands.js +93 -0
  88. package/ui/core/src/context-usage.js +212 -0
  89. package/ui/core/src/controller.js +6104 -0
  90. package/ui/core/src/formatting.js +1036 -0
  91. package/ui/core/src/history.js +932 -0
  92. package/ui/core/src/index.js +13 -0
  93. package/ui/core/src/layout.js +332 -0
  94. package/ui/core/src/reducer.js +1935 -0
  95. package/ui/core/src/selectors.js +5409 -0
  96. package/ui/core/src/session-errors.js +14 -0
  97. package/ui/core/src/session-tree.js +151 -0
  98. package/ui/core/src/state.js +248 -0
  99. package/ui/core/src/store.js +23 -0
  100. package/ui/core/src/system-titles.js +24 -0
  101. package/ui/core/src/themes/catppuccin-mocha.js +56 -0
  102. package/ui/core/src/themes/cobalt2.js +56 -0
  103. package/ui/core/src/themes/dark-high-contrast.js +56 -0
  104. package/ui/core/src/themes/daylight.js +62 -0
  105. package/ui/core/src/themes/dracula.js +56 -0
  106. package/ui/core/src/themes/github-dark.js +56 -0
  107. package/ui/core/src/themes/github-light.js +59 -0
  108. package/ui/core/src/themes/gruvbox-dark.js +56 -0
  109. package/ui/core/src/themes/hacker-x-matrix.js +56 -0
  110. package/ui/core/src/themes/hacker-x-orion-prime.js +56 -0
  111. package/ui/core/src/themes/helpers.js +79 -0
  112. package/ui/core/src/themes/high-contrast-mono.js +59 -0
  113. package/ui/core/src/themes/index.js +52 -0
  114. package/ui/core/src/themes/light-high-contrast.js +62 -0
  115. package/ui/core/src/themes/noctis-obscuro.js +56 -0
  116. package/ui/core/src/themes/noctis.js +56 -0
  117. package/ui/core/src/themes/paper-ink.js +62 -0
  118. package/ui/core/src/themes/solarized-ops.js +59 -0
  119. package/ui/core/src/themes/terminal-green.js +59 -0
  120. package/ui/core/src/themes/tokyo-night.js +56 -0
  121. package/ui/react/README.md +5 -0
  122. package/ui/react/src/chat-status.js +39 -0
  123. package/ui/react/src/components.js +1989 -0
  124. package/ui/react/src/index.js +4 -0
  125. package/ui/react/src/platform.js +15 -0
  126. package/ui/react/src/use-controller-state.js +38 -0
  127. package/ui/react/src/web-app.js +4390 -0
  128. package/web/README.md +198 -0
  129. package/web/api/router.js +196 -0
  130. package/web/api/ws.js +152 -0
  131. package/web/auth/authz/engine.js +204 -0
  132. package/web/auth/config.js +115 -0
  133. package/web/auth/index.js +175 -0
  134. package/web/auth/normalize/entra.js +22 -0
  135. package/web/auth/providers/entra.js +76 -0
  136. package/web/auth/providers/none.js +24 -0
  137. package/web/auth.js +10 -0
  138. package/web/bin/serve.js +53 -0
  139. package/web/config.js +20 -0
  140. package/web/dist/app.js +469 -0
  141. package/web/dist/assets/index-CBgQQk-j.css +1 -0
  142. package/web/dist/assets/index-DMefB7Wb.js +24 -0
  143. package/web/dist/assets/msal-CytV9RFv.js +7 -0
  144. package/web/dist/assets/pilotswarm-DyBlqVTY.js +87 -0
  145. package/web/dist/assets/react-BZwsW8pe.js +1 -0
  146. package/web/dist/index.html +16 -0
  147. package/web/runtime.js +454 -0
  148. package/web/server.js +276 -0
  149. package/index.js +0 -1
@@ -0,0 +1,157 @@
1
+ import { SubscribeRequestSchema, UnsubscribeRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
2
+ const FACTS_PREFIXES = ["skills/%", "asks/%"];
3
+ /**
4
+ * Starts a background poller that detects session/resource changes and emits
5
+ * MCP `notifications/resources/updated` notifications. The poller activates
6
+ * when the first subscription arrives and stops when all subscriptions clear.
7
+ */
8
+ export function enableResourceSubscriptions(server, ctx, pollIntervalMs = 5_000) {
9
+ const subscriptions = new Set();
10
+ let pollTimer = null;
11
+ let lastSnapshot = new Map();
12
+ let lastFactsSnapshot = new Map();
13
+ // Access the lower-level Server for sendResourceUpdated
14
+ const lowLevel = server.server;
15
+ if (!lowLevel?.sendResourceUpdated)
16
+ return;
17
+ function startPoller() {
18
+ if (pollTimer)
19
+ return;
20
+ pollTimer = setInterval(async () => {
21
+ try {
22
+ await pollForChanges();
23
+ await pollFactsChanges();
24
+ }
25
+ catch {
26
+ // Swallow — poller is best-effort
27
+ }
28
+ }, pollIntervalMs);
29
+ }
30
+ function stopPoller() {
31
+ if (pollTimer) {
32
+ clearInterval(pollTimer);
33
+ pollTimer = null;
34
+ }
35
+ }
36
+ async function pollForChanges() {
37
+ if (subscriptions.size === 0)
38
+ return;
39
+ const sessions = await ctx.mgmt.listSessions();
40
+ const currentSnapshot = new Map();
41
+ for (const s of sessions) {
42
+ currentSnapshot.set(s.sessionId, {
43
+ sessionId: s.sessionId,
44
+ updatedAt: s.updatedAt ?? null,
45
+ status: s.status,
46
+ });
47
+ const prev = lastSnapshot.get(s.sessionId);
48
+ const changed = !prev
49
+ || prev.updatedAt !== (s.updatedAt ?? null)
50
+ || prev.status !== s.status;
51
+ if (changed) {
52
+ // Session-specific resource
53
+ const sessionUri = `pilotswarm://sessions/${s.sessionId}`;
54
+ if (subscriptions.has(sessionUri)) {
55
+ try {
56
+ await lowLevel.sendResourceUpdated({ uri: sessionUri });
57
+ }
58
+ catch { /* ignore */ }
59
+ }
60
+ // System agent alias resources — set populated dynamically in
61
+ // ServerContext from mgmt.listSessions(). If we observe a new
62
+ // system agent here that wasn't in the startup snapshot, fold
63
+ // it into the live set so subsequent change notifications fire
64
+ // for it too.
65
+ if (s.isSystem && s.agentId) {
66
+ if (!ctx.systemAgentIds.has(s.agentId)) {
67
+ ctx.systemAgentIds.add(s.agentId);
68
+ }
69
+ const agentUri = `pilotswarm://agents/${s.agentId}`;
70
+ if (subscriptions.has(agentUri)) {
71
+ try {
72
+ await lowLevel.sendResourceUpdated({ uri: agentUri });
73
+ }
74
+ catch { /* ignore */ }
75
+ }
76
+ }
77
+ }
78
+ }
79
+ // Sessions list changed if any session added/removed/modified
80
+ if (subscriptions.has("pilotswarm://sessions")) {
81
+ const anyChange = currentSnapshot.size !== lastSnapshot.size
82
+ || [...currentSnapshot.entries()].some(([id, snap]) => {
83
+ const prev = lastSnapshot.get(id);
84
+ return !prev || prev.updatedAt !== snap.updatedAt || prev.status !== snap.status;
85
+ });
86
+ if (anyChange) {
87
+ try {
88
+ await lowLevel.sendResourceUpdated({ uri: "pilotswarm://sessions" });
89
+ }
90
+ catch { /* ignore */ }
91
+ }
92
+ }
93
+ lastSnapshot = currentSnapshot;
94
+ }
95
+ async function pollFactsChanges() {
96
+ const factsUris = [
97
+ "pilotswarm://facts/skills",
98
+ "pilotswarm://facts/asks",
99
+ ];
100
+ const subscribedFacts = factsUris.filter(u => subscriptions.has(u));
101
+ if (subscribedFacts.length === 0)
102
+ return;
103
+ const currentFactsSnapshot = new Map();
104
+ for (const uri of subscribedFacts) {
105
+ const prefix = uri === "pilotswarm://facts/skills" ? "skills/%" : "asks/%";
106
+ try {
107
+ const result = await ctx.facts.readFacts({ keyPattern: prefix, limit: 1000 });
108
+ const facts = result.facts ?? [];
109
+ const latestUpdatedAt = facts.reduce((latest, f) => {
110
+ const u = f.updatedAt ?? f.updated_at ?? null;
111
+ if (!u)
112
+ return latest;
113
+ return !latest || u > latest ? u : latest;
114
+ }, null);
115
+ currentFactsSnapshot.set(uri, {
116
+ count: result.count ?? facts.length,
117
+ latestUpdatedAt,
118
+ });
119
+ const prev = lastFactsSnapshot.get(uri);
120
+ const changed = !prev
121
+ || prev.count !== (result.count ?? facts.length)
122
+ || prev.latestUpdatedAt !== latestUpdatedAt;
123
+ if (changed) {
124
+ try {
125
+ await lowLevel.sendResourceUpdated({ uri });
126
+ }
127
+ catch { /* ignore */ }
128
+ }
129
+ }
130
+ catch {
131
+ // Facts store may not be available
132
+ }
133
+ }
134
+ lastFactsSnapshot = currentFactsSnapshot;
135
+ }
136
+ // Hook into MCP subscribe/unsubscribe via the low-level server.
137
+ // setRequestHandler requires the SDK's typed Zod schemas — passing a plain
138
+ // `{ method }` object causes the SDK to throw "Schema is missing a method
139
+ // literal" and silently drop the handler.
140
+ lowLevel.setRequestHandler(SubscribeRequestSchema, async (request) => {
141
+ const uri = request?.params?.uri;
142
+ if (uri) {
143
+ subscriptions.add(uri);
144
+ startPoller();
145
+ }
146
+ return {};
147
+ });
148
+ lowLevel.setRequestHandler(UnsubscribeRequestSchema, async (request) => {
149
+ const uri = request?.params?.uri;
150
+ if (uri)
151
+ subscriptions.delete(uri);
152
+ if (subscriptions.size === 0)
153
+ stopPoller();
154
+ return {};
155
+ });
156
+ }
157
+ //# sourceMappingURL=subscriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../../../src/resources/subscriptions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "./context.js";
3
+ export declare function createMcpServer(ctx: ServerContext): McpServer;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAYlD,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,CAsD7D"}
@@ -0,0 +1,59 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { ListPromptsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
3
+ import { registerSessionTools } from "./tools/sessions.js";
4
+ import { registerAgentTools } from "./tools/agents.js";
5
+ import { registerFactsTools } from "./tools/facts.js";
6
+ import { registerModelTools } from "./tools/models.js";
7
+ import { registerSessionResources } from "./resources/sessions.js";
8
+ import { registerAgentResources } from "./resources/agents.js";
9
+ import { registerFactsResources } from "./resources/facts.js";
10
+ import { registerModelsResources } from "./resources/models.js";
11
+ import { registerSkillPrompts } from "./prompts/skills.js";
12
+ import { enableResourceSubscriptions } from "./resources/subscriptions.js";
13
+ export function createMcpServer(ctx) {
14
+ const server = new McpServer({
15
+ name: "pilotswarm",
16
+ version: "0.1.0",
17
+ }, {
18
+ capabilities: {
19
+ tools: { listChanged: true },
20
+ resources: { subscribe: true, listChanged: true },
21
+ prompts: { listChanged: true },
22
+ },
23
+ });
24
+ // Tools
25
+ registerSessionTools(server, ctx);
26
+ registerAgentTools(server, ctx);
27
+ registerFactsTools(server, ctx);
28
+ registerModelTools(server, ctx);
29
+ // Resources
30
+ registerSessionResources(server, ctx);
31
+ registerAgentResources(server, ctx);
32
+ registerFactsResources(server, ctx);
33
+ registerModelsResources(server, ctx);
34
+ // Prompts
35
+ registerSkillPrompts(server, ctx);
36
+ // We advertise the `prompts` capability unconditionally (see constructor
37
+ // above), so honor `prompts/list` even when zero prompts are registered.
38
+ // The high-level McpServer only installs its own ListPrompts handler the
39
+ // first time `.prompt()` runs; without that, advertising the capability
40
+ // but 404'ing the method violates the contract. Install a low-level
41
+ // fallback that returns an empty list. If `.prompt()` later runs, the
42
+ // SDK's `assertCanSetRequestHandler` would conflict — but that's only
43
+ // invoked from `setPromptRequestHandlers()`, which is gated by the
44
+ // `_promptHandlersInitialized` flag the SDK manages itself; since we're
45
+ // claiming the handler first, register a low-level handler and let the
46
+ // SDK skip its own setup. To keep both paths working, we only install
47
+ // the fallback when no prompts were registered above.
48
+ const lowLevel = server.server;
49
+ const sdkPromptsInitialized = server._promptHandlersInitialized === true;
50
+ if (lowLevel?.setRequestHandler && !sdkPromptsInitialized) {
51
+ lowLevel.setRequestHandler(ListPromptsRequestSchema, async () => ({
52
+ prompts: [],
53
+ }));
54
+ }
55
+ // Resource subscriptions (best-effort push notifications)
56
+ enableResourceSubscriptions(server, ctx);
57
+ return server;
58
+ }
59
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E,MAAM,UAAU,eAAe,CAAC,GAAkB;IAC9C,MAAM,MAAM,GAAG,IAAI,SAAS,CACxB;QACI,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,OAAO;KACnB,EACD;QACI,YAAY,EAAE;YACV,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;YAC5B,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;YACjD,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE;SACjC;KACJ,CACJ,CAAC;IAEF,QAAQ;IACR,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEhC,YAAY;IACZ,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC,UAAU;IACV,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAElC,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,oEAAoE;IACpE,sEAAsE;IACtE,sEAAsE;IACtE,mEAAmE;IACnE,wEAAwE;IACxE,uEAAuE;IACvE,sEAAsE;IACtE,sDAAsD;IACtD,MAAM,QAAQ,GAAS,MAAc,CAAC,MAAM,CAAC;IAC7C,MAAM,qBAAqB,GAAI,MAAc,CAAC,0BAA0B,KAAK,IAAI,CAAC;IAClF,IAAI,QAAQ,EAAE,iBAAiB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,QAAQ,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YAC9D,OAAO,EAAE,EAAE;SACd,CAAC,CAAC,CAAC;IACR,CAAC;IAED,0DAA0D;IAC1D,2BAA2B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../context.js";
3
+ export declare function registerAgentTools(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/tools/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,QAwWvE"}
@@ -0,0 +1,317 @@
1
+ import { z } from "zod";
2
+ export function registerAgentTools(server, ctx) {
3
+ // list_agents — List all sub-agents across sessions (read-only inspection).
4
+ //
5
+ // The external MCP surface deliberately does NOT expose action tools for
6
+ // sub-agents — spawn_agent / message_agent / cancel_agent are reachable
7
+ // only from inside the parent session's reasoning loop, via the
8
+ // in-loop `spawn_agent` tool and related orchestration commands. See
9
+ // `packages/app/mcp/README.md` section "External MCP boundary" for
10
+ // the full rule.
11
+ server.registerTool("list_agents", {
12
+ title: "List Sub-Agents",
13
+ description: "List all sub-agents (child sessions) across PilotSwarm. Shows agent name, status, model, parent session, and task context. " +
14
+ "Optionally filter by parent session or status.",
15
+ inputSchema: {
16
+ parent_session_id: z
17
+ .string()
18
+ .optional()
19
+ .describe("Filter agents belonging to a specific parent session"),
20
+ status_filter: z
21
+ .string()
22
+ .optional()
23
+ .describe("Filter by status (running, idle, waiting, completed, failed)"),
24
+ },
25
+ }, async ({ parent_session_id, status_filter }) => {
26
+ try {
27
+ const sessions = await ctx.mgmt.listSessions();
28
+ // Agents are sessions with a parentSessionId
29
+ let agents = sessions.filter((s) => s.parentSessionId);
30
+ if (parent_session_id) {
31
+ agents = agents.filter((s) => s.parentSessionId === parent_session_id);
32
+ }
33
+ if (status_filter) {
34
+ const f = status_filter.toLowerCase();
35
+ agents = agents.filter((s) => s.status?.toLowerCase() === f);
36
+ }
37
+ const data = agents.map((s) => ({
38
+ agent_session_id: s.sessionId,
39
+ agent_id: s.agentId ?? null,
40
+ title: s.title ?? null,
41
+ status: s.status,
42
+ orchestration_status: s.orchestrationStatus ?? null,
43
+ model: s.model ?? "default",
44
+ parent_session_id: s.parentSessionId,
45
+ is_system: s.isSystem ?? false,
46
+ iterations: s.iterations ?? 0,
47
+ wait_reason: s.waitReason ?? null,
48
+ error: s.error ?? null,
49
+ created_at: s.createdAt,
50
+ updated_at: s.updatedAt ?? null,
51
+ }));
52
+ return {
53
+ content: [
54
+ {
55
+ type: "text",
56
+ text: JSON.stringify({ count: data.length, agents: data }, null, 2),
57
+ },
58
+ ],
59
+ };
60
+ }
61
+ catch (err) {
62
+ const message = err instanceof Error ? err.message : String(err);
63
+ return {
64
+ content: [{ type: "text", text: `Error: ${message}` }],
65
+ isError: true,
66
+ };
67
+ }
68
+ });
69
+ // list_registered_agents — Read PilotSwarm's catalog of agent definitions.
70
+ //
71
+ // Returns agent definitions visible to this MCP server (loaded from
72
+ // configured plugin dirs). Pure read; no creation affordance — external
73
+ // MCP clients cannot spawn from this. Workers in different processes
74
+ // may have a different catalog because plugin dirs are configured
75
+ // per-process; this tool reports only what this MCP server sees.
76
+ server.registerTool("list_registered_agents", {
77
+ title: "List Registered Agents",
78
+ description: "Read PilotSwarm's catalog of registered agent definitions visible to this MCP server. " +
79
+ "Returns name, description, system flag, and parent constraint per definition. " +
80
+ "Pure inspection — does not create or spawn anything. Workers in different processes " +
81
+ "may have a different catalog (configured per-process via --plugin).",
82
+ inputSchema: {
83
+ include_system: z
84
+ .boolean()
85
+ .optional()
86
+ .describe("Include system agent definitions like sweeper, resourcemgr (default false)"),
87
+ },
88
+ }, async ({ include_system }) => {
89
+ try {
90
+ let agents = ctx.registeredAgents;
91
+ if (!include_system) {
92
+ agents = agents.filter((a) => !a.system);
93
+ }
94
+ const data = agents.map((a) => ({
95
+ name: a.name,
96
+ title: a.title ?? null,
97
+ description: a.description ?? null,
98
+ system: Boolean(a.system),
99
+ parent: a.parent ?? null,
100
+ }));
101
+ return {
102
+ content: [
103
+ {
104
+ type: "text",
105
+ text: JSON.stringify({ count: data.length, agents: data }, null, 2),
106
+ },
107
+ ],
108
+ };
109
+ }
110
+ catch (err) {
111
+ const message = err instanceof Error ? err.message : String(err);
112
+ return {
113
+ content: [{ type: "text", text: `Error: ${message}` }],
114
+ isError: true,
115
+ };
116
+ }
117
+ });
118
+ // get_agent_tree — Recursive subtree of a root session.
119
+ //
120
+ // One mgmt.listSessions() call, then in-memory depth-first walk over
121
+ // the parent_session_id graph. Cycle-defensive via visited Set, bounded
122
+ // by max_depth.
123
+ server.registerTool("get_agent_tree", {
124
+ title: "Get Agent Tree",
125
+ description: "Recursive sub-agent tree rooted at the given session. " +
126
+ "Returns nested children with status, agent_id, depth. " +
127
+ "Bounded by max_depth (default 5). " +
128
+ "include_system filters system descendants; the root session is always returned regardless.",
129
+ inputSchema: {
130
+ root_session_id: z
131
+ .string()
132
+ .min(1)
133
+ .describe("Root session id to walk from (top-level or any sub-agent). " +
134
+ "Accepts any non-empty string; PilotSwarm system-agent UUIDs are not strictly RFC-4122 compliant."),
135
+ max_depth: z
136
+ .number()
137
+ .int()
138
+ .min(0)
139
+ .max(20)
140
+ .optional()
141
+ .describe("Maximum recursion depth (default 5)"),
142
+ include_system: z
143
+ .boolean()
144
+ .optional()
145
+ .describe("Include system sub-agents in the tree (default true)"),
146
+ },
147
+ }, async ({ root_session_id, max_depth, include_system }) => {
148
+ try {
149
+ const limit = max_depth ?? 5;
150
+ const includeSystem = include_system ?? true;
151
+ const sessions = await ctx.mgmt.listSessions();
152
+ // Index children by parentSessionId
153
+ const childrenByParent = new Map();
154
+ const sessionById = new Map();
155
+ for (const s of sessions) {
156
+ sessionById.set(s.sessionId, s);
157
+ if (s.parentSessionId) {
158
+ const arr = childrenByParent.get(s.parentSessionId) ?? [];
159
+ arr.push(s);
160
+ childrenByParent.set(s.parentSessionId, arr);
161
+ }
162
+ }
163
+ const root = sessionById.get(root_session_id);
164
+ if (!root) {
165
+ return {
166
+ content: [
167
+ {
168
+ type: "text",
169
+ text: JSON.stringify({
170
+ error: "session not found",
171
+ root_session_id,
172
+ }),
173
+ },
174
+ ],
175
+ isError: true,
176
+ };
177
+ }
178
+ const visited = new Set();
179
+ let totalNodes = 0;
180
+ let depthReached = 0;
181
+ const buildNode = (s, depth) => {
182
+ if (visited.has(s.sessionId)) {
183
+ return { session_id: s.sessionId, agent_id: s.agentId ?? null, status: s.status, depth, children: [], cycle_detected: true };
184
+ }
185
+ visited.add(s.sessionId);
186
+ totalNodes++;
187
+ if (depth > depthReached)
188
+ depthReached = depth;
189
+ let childNodes = [];
190
+ if (depth < limit) {
191
+ const kids = childrenByParent.get(s.sessionId) ?? [];
192
+ childNodes = kids
193
+ .filter((c) => includeSystem || !c.isSystem)
194
+ .map((c) => buildNode(c, depth + 1));
195
+ }
196
+ return {
197
+ session_id: s.sessionId,
198
+ agent_id: s.agentId ?? null,
199
+ title: s.title ?? null,
200
+ status: s.status,
201
+ is_system: Boolean(s.isSystem),
202
+ depth,
203
+ children: childNodes,
204
+ };
205
+ };
206
+ const tree = buildNode(root, 0);
207
+ return {
208
+ content: [
209
+ {
210
+ type: "text",
211
+ text: JSON.stringify({ root_session_id, depth_reached: depthReached, total_nodes: totalNodes, tree }, null, 2),
212
+ },
213
+ ],
214
+ };
215
+ }
216
+ catch (err) {
217
+ const message = err instanceof Error ? err.message : String(err);
218
+ return {
219
+ content: [{ type: "text", text: `Error: ${message}` }],
220
+ isError: true,
221
+ };
222
+ }
223
+ });
224
+ // get_session_tree_stats — Aggregated metrics over a session subtree.
225
+ // Wraps mgmt.getSessionTreeStats() and snake_cases the field names.
226
+ server.registerTool("get_session_tree_stats", {
227
+ title: "Get Session Tree Stats",
228
+ description: "Aggregated metrics for a session and all its descendants: token totals, " +
229
+ "session count, dehydration / hydration counts, per-model breakdown, cache hit ratio. " +
230
+ "Pure inspection.",
231
+ inputSchema: {
232
+ session_id: z
233
+ .string()
234
+ .min(1)
235
+ .describe("Root session id of the subtree. Accepts any non-empty string; " +
236
+ "PilotSwarm system-agent UUIDs are not strictly RFC-4122 compliant."),
237
+ },
238
+ }, async ({ session_id }) => {
239
+ try {
240
+ const stats = await ctx.mgmt.getSessionTreeStats(session_id);
241
+ if (!stats) {
242
+ return {
243
+ content: [
244
+ {
245
+ type: "text",
246
+ text: JSON.stringify({ error: "session not found", session_id }),
247
+ },
248
+ ],
249
+ isError: true,
250
+ };
251
+ }
252
+ const out = {
253
+ root_session_id: stats.rootSessionId,
254
+ self: {
255
+ session_id: stats.self.sessionId,
256
+ agent_id: stats.self.agentId ?? null,
257
+ model: stats.self.model ?? null,
258
+ reasoning_effort: stats.self.reasoningEffort ?? null,
259
+ parent_session_id: stats.self.parentSessionId ?? null,
260
+ snapshot_size_bytes: stats.self.snapshotSizeBytes,
261
+ dehydration_count: stats.self.dehydrationCount,
262
+ hydration_count: stats.self.hydrationCount,
263
+ lossy_handoff_count: stats.self.lossyHandoffCount,
264
+ last_dehydrated_at: stats.self.lastDehydratedAt ?? null,
265
+ last_hydrated_at: stats.self.lastHydratedAt ?? null,
266
+ last_checkpoint_at: stats.self.lastCheckpointAt ?? null,
267
+ tokens_input: stats.self.tokensInput,
268
+ tokens_output: stats.self.tokensOutput,
269
+ tokens_cache_read: stats.self.tokensCacheRead,
270
+ tokens_cache_write: stats.self.tokensCacheWrite,
271
+ cache_hit_ratio: stats.self.cacheHitRatio,
272
+ deleted_at: stats.self.deletedAt ?? null,
273
+ created_at: stats.self.createdAt,
274
+ updated_at: stats.self.updatedAt,
275
+ },
276
+ tree: {
277
+ session_count: stats.tree.sessionCount,
278
+ total_tokens_input: stats.tree.totalTokensInput,
279
+ total_tokens_output: stats.tree.totalTokensOutput,
280
+ total_tokens_cache_read: stats.tree.totalTokensCacheRead,
281
+ total_tokens_cache_write: stats.tree.totalTokensCacheWrite,
282
+ cache_hit_ratio: stats.tree.cacheHitRatio,
283
+ total_dehydration_count: stats.tree.totalDehydrationCount,
284
+ total_hydration_count: stats.tree.totalHydrationCount,
285
+ total_lossy_handoff_count: stats.tree.totalLossyHandoffCount,
286
+ total_snapshot_size_bytes: stats.tree.totalSnapshotSizeBytes,
287
+ },
288
+ by_model: stats.byModel.map((m) => ({
289
+ model: m.model,
290
+ session_count: m.sessionCount,
291
+ total_tokens_input: m.totalTokensInput,
292
+ total_tokens_output: m.totalTokensOutput,
293
+ total_tokens_cache_read: m.totalTokensCacheRead,
294
+ total_tokens_cache_write: m.totalTokensCacheWrite,
295
+ total_snapshot_size_bytes: m.totalSnapshotSizeBytes,
296
+ cache_hit_ratio: m.cacheHitRatio,
297
+ })),
298
+ };
299
+ return {
300
+ content: [
301
+ {
302
+ type: "text",
303
+ text: JSON.stringify(out, null, 2),
304
+ },
305
+ ],
306
+ };
307
+ }
308
+ catch (err) {
309
+ const message = err instanceof Error ? err.message : String(err);
310
+ return {
311
+ content: [{ type: "text", text: `Error: ${message}` }],
312
+ isError: true,
313
+ };
314
+ }
315
+ });
316
+ }
317
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/tools/agents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,GAAkB;IACpE,4EAA4E;IAC5E,EAAE;IACF,yEAAyE;IACzE,wEAAwE;IACxE,gEAAgE;IAChE,qEAAqE;IACrE,mEAAmE;IACnE,iBAAiB;IACjB,MAAM,CAAC,YAAY,CACf,aAAa,EACb;QACI,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACP,6HAA6H;YAC7H,gDAAgD;QACpD,WAAW,EAAE;YACT,iBAAiB,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;YACrE,aAAa,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,8DAA8D,CAAC;SAChF;KACJ,EACD,KAAK,EAAE,EAAE,iBAAiB,EAAE,aAAa,EAAE,EAAE,EAAE;QAC3C,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAE/C,6CAA6C;YAC7C,IAAI,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YAE5D,IAAI,iBAAiB,EAAE,CAAC;gBACpB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,iBAAiB,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;gBACtC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACjC,gBAAgB,EAAE,CAAC,CAAC,SAAS;gBAC7B,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;gBAC3B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,oBAAoB,EAAE,CAAC,CAAC,mBAAmB,IAAI,IAAI;gBACnD,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;gBAC3B,iBAAiB,EAAE,CAAC,CAAC,eAAe;gBACpC,SAAS,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;gBAC9B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC;gBAC7B,WAAW,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;gBACjC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,UAAU,EAAE,CAAC,CAAC,SAAS;gBACvB,UAAU,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;aAClC,CAAC,CAAC,CAAC;YAEJ,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAChB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EACpC,IAAI,EACJ,CAAC,CACJ;qBACJ;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,2EAA2E;IAC3E,EAAE;IACF,oEAAoE;IACpE,wEAAwE;IACxE,qEAAqE;IACrE,kEAAkE;IAClE,iEAAiE;IACjE,MAAM,CAAC,YAAY,CACf,wBAAwB,EACxB;QACI,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACP,wFAAwF;YACxF,gFAAgF;YAChF,sFAAsF;YACtF,qEAAqE;QACzE,WAAW,EAAE;YACT,cAAc,EAAE,CAAC;iBACZ,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,4EAA4E,CAAC;SAC9F;KACJ,EACD,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACD,IAAI,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC;YAClC,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;gBAClC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBACzB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;aAC3B,CAAC,CAAC,CAAC;YAEJ,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;qBACtE;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,wDAAwD;IACxD,EAAE;IACF,qEAAqE;IACrE,wEAAwE;IACxE,gBAAgB;IAChB,MAAM,CAAC,YAAY,CACf,gBAAgB,EAChB;QACI,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACP,wDAAwD;YACxD,wDAAwD;YACxD,oCAAoC;YACpC,4FAA4F;QAChG,WAAW,EAAE;YACT,eAAe,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACL,6DAA6D;gBAC7D,kGAAkG,CACrG;YACL,SAAS,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,EAAE,CAAC;iBACP,QAAQ,EAAE;iBACV,QAAQ,CAAC,qCAAqC,CAAC;YACpD,cAAc,EAAE,CAAC;iBACZ,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;SACxE;KACJ,EACD,KAAK,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE;QACrD,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,CAAC;YAC7B,MAAM,aAAa,GAAG,cAAc,IAAI,IAAI,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAE/C,oCAAoC;YACpC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAiB,CAAC;YAClD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAe,CAAC;YAC3C,KAAK,MAAM,CAAC,IAAI,QAAiB,EAAE,CAAC;gBAChC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAChC,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;oBACpB,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;oBAC1D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACZ,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;gBACjD,CAAC;YACL,CAAC;YAED,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC9C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gCACjB,KAAK,EAAE,mBAAmB;gCAC1B,eAAe;6BAClB,CAAC;yBACL;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,YAAY,GAAG,CAAC,CAAC;YAErB,MAAM,SAAS,GAAG,CAAC,CAAM,EAAE,KAAa,EAAO,EAAE;gBAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3B,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;gBACjI,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACzB,UAAU,EAAE,CAAC;gBACb,IAAI,KAAK,GAAG,YAAY;oBAAE,YAAY,GAAG,KAAK,CAAC;gBAE/C,IAAI,UAAU,GAAU,EAAE,CAAC;gBAC3B,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;oBAChB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrD,UAAU,GAAG,IAAI;yBACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;yBAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC;gBAED,OAAO;oBACH,UAAU,EAAE,CAAC,CAAC,SAAS;oBACvB,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;oBAC3B,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;oBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC9B,KAAK;oBACL,QAAQ,EAAE,UAAU;iBACvB,CAAC;YACN,CAAC,CAAC;YAEF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAEhC,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAChB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,EAC/E,IAAI,EACJ,CAAC,CACJ;qBACJ;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,sEAAsE;IACtE,oEAAoE;IACpE,MAAM,CAAC,YAAY,CACf,wBAAwB,EACxB;QACI,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACP,0EAA0E;YAC1E,uFAAuF;YACvF,kBAAkB;QACtB,WAAW,EAAE;YACT,UAAU,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACL,gEAAgE;gBAChE,oEAAoE,CACvE;SACR;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;yBACnE;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,MAAM,GAAG,GAAG;gBACR,eAAe,EAAE,KAAK,CAAC,aAAa;gBACpC,IAAI,EAAE;oBACF,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS;oBAChC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI;oBACpC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;oBAC/B,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI;oBACpD,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI;oBACrD,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB;oBACjD,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB;oBAC9C,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc;oBAC1C,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB;oBACjD,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI;oBACvD,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI;oBACnD,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI;oBACvD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW;oBACpC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY;oBACtC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,eAAe;oBAC7C,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB;oBAC/C,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa;oBACzC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI;oBACxC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS;oBAChC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS;iBACnC;gBACD,IAAI,EAAE;oBACF,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY;oBACtC,kBAAkB,EAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB;oBAC/C,mBAAmB,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB;oBACjD,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,oBAAoB;oBACxD,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB;oBAC1D,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa;oBACzC,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB;oBACzD,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB;oBACrD,yBAAyB,EAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB;oBAC5D,yBAAyB,EAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB;iBAC/D;gBACD,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,aAAa,EAAE,CAAC,CAAC,YAAY;oBAC7B,kBAAkB,EAAE,CAAC,CAAC,gBAAgB;oBACtC,mBAAmB,EAAE,CAAC,CAAC,iBAAiB;oBACxC,uBAAuB,EAAE,CAAC,CAAC,oBAAoB;oBAC/C,wBAAwB,EAAE,CAAC,CAAC,qBAAqB;oBACjD,yBAAyB,EAAE,CAAC,CAAC,sBAAsB;oBACnD,eAAe,EAAE,CAAC,CAAC,aAAa;iBACnC,CAAC,CAAC;aACN,CAAC;YAEF,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;qBACrC;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ServerContext } from "../context.js";
3
+ export declare function registerFactsTools(server: McpServer, ctx: ServerContext): void;
4
+ //# sourceMappingURL=facts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facts.d.ts","sourceRoot":"","sources":["../../../src/tools/facts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,QAuKvE"}