@onedotmint/siftpath 0.0.0-stage → 2.0.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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -2
  3. package/THIRD_PARTY_NOTICES.md +26 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +116 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/client.d.ts +144 -0
  8. package/dist/client.js +130 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/config.d.ts +107 -0
  11. package/dist/config.js +127 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/defaults.d.ts +38 -0
  14. package/dist/defaults.js +31 -0
  15. package/dist/defaults.js.map +1 -0
  16. package/dist/diagnostics.d.ts +158 -0
  17. package/dist/diagnostics.js +202 -0
  18. package/dist/diagnostics.js.map +1 -0
  19. package/dist/errors.d.ts +15 -0
  20. package/dist/errors.js +16 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/index.d.ts +8 -0
  23. package/dist/index.js +5 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/inputs.d.ts +25 -0
  26. package/dist/inputs.js +27 -0
  27. package/dist/inputs.js.map +1 -0
  28. package/dist/mcp/stdio.d.ts +2 -0
  29. package/dist/mcp/stdio.js +43 -0
  30. package/dist/mcp/stdio.js.map +1 -0
  31. package/dist/output.d.ts +23 -0
  32. package/dist/output.js +118 -0
  33. package/dist/output.js.map +1 -0
  34. package/dist/router.d.ts +20 -0
  35. package/dist/router.js +85 -0
  36. package/dist/router.js.map +1 -0
  37. package/dist/setup-ui.d.ts +8 -0
  38. package/dist/setup-ui.js +3032 -0
  39. package/dist/setup-ui.js.map +1 -0
  40. package/dist/setup.d.ts +2 -0
  41. package/dist/setup.js +50 -0
  42. package/dist/setup.js.map +1 -0
  43. package/dist/tools.d.ts +35 -0
  44. package/dist/tools.js +17 -0
  45. package/dist/tools.js.map +1 -0
  46. package/dist/version.d.ts +1 -0
  47. package/dist/version.js +4 -0
  48. package/dist/version.js.map +1 -0
  49. package/docs/ARCHITECTURE.md +33 -0
  50. package/docs/CONFIGURATION.md +127 -0
  51. package/docs/DIAGNOSTICS.md +109 -0
  52. package/docs/MIGRATION.md +13 -0
  53. package/docs/PROVIDERS.md +43 -0
  54. package/docs/SECURITY.md +15 -0
  55. package/docs/TESTING.md +138 -0
  56. package/examples/anonymous.json +36 -0
  57. package/extensions/siftpath.mjs +32 -0
  58. package/package.json +60 -4
package/dist/router.js ADDED
@@ -0,0 +1,85 @@
1
+ import { McpClients } from './client.js';
2
+ import { parseConfiguration, providerStatus } from './config.js';
3
+ import { SiftpathError } from './errors.js';
4
+ import { parseInput, publicUrl, readSchema, searchSchema } from './inputs.js';
5
+ import { normalize } from './output.js';
6
+ /** $field references tool input; missing optional fields are omitted, not sent as null. */
7
+ export function mapArguments(template, input) {
8
+ const map = (value) => {
9
+ if (typeof value === 'string' && /^\$(query|intent|maxResults|url|focus)$/.test(value))
10
+ return input[value.slice(1)];
11
+ if (Array.isArray(value))
12
+ return value.map(map).filter(item => item !== undefined);
13
+ if (value && typeof value === 'object')
14
+ return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, map(child)]).filter(([, child]) => child !== undefined));
15
+ return value;
16
+ };
17
+ return map(template);
18
+ }
19
+ export class Siftpath {
20
+ env;
21
+ configuration;
22
+ clients;
23
+ shutdown = new AbortController();
24
+ constructor(config = {}, env = process.env) {
25
+ this.env = env;
26
+ this.configuration = parseConfiguration(config);
27
+ this.clients = new McpClients(this.configuration, env);
28
+ }
29
+ search(input, options = {}) {
30
+ const args = parseInput(searchSchema, input);
31
+ const intent = args.intent ?? this.configuration.routes.defaultIntent;
32
+ return this.route('search', { ...args, intent, maxResults: args.maxResults ?? 5 }, options.signal);
33
+ }
34
+ read(input, options = {}) {
35
+ const args = parseInput(readSchema, input);
36
+ publicUrl(args.url);
37
+ return this.route('read', args, options.signal);
38
+ }
39
+ async close() { this.shutdown.abort(); await this.clients.close(); }
40
+ async route(kind, input, caller) {
41
+ const c = this.configuration, routes = c.routes, deadline = AbortSignal.timeout(c.timeoutMs);
42
+ const signal = AbortSignal.any([deadline, this.shutdown.signal, ...(caller ? [caller] : [])]);
43
+ const primary = kind === 'search' ? routes.intents[input.intent] ?? routes.search : routes.read;
44
+ const order = [...new Set([primary, ...routes[kind === 'search' ? 'searchFallback' : 'readFallback']])];
45
+ const diagnostics = [];
46
+ const cancelled = () => {
47
+ if (this.shutdown.signal.aborted)
48
+ throw new SiftpathError('CLOSED', 'Siftpath has been closed.');
49
+ if (caller?.aborted)
50
+ throw new SiftpathError('ABORTED', 'Operation cancelled.');
51
+ if (deadline.aborted)
52
+ throw new SiftpathError('TIMEOUT', 'Operation deadline exceeded.', diagnostics);
53
+ };
54
+ for (const id of order) {
55
+ cancelled();
56
+ const status = providerStatus(id, c, this.env), provider = c.providers[id], binding = provider?.[kind];
57
+ if (status.code !== 'READY') {
58
+ diagnostics.push(status);
59
+ continue;
60
+ }
61
+ if (!binding) {
62
+ diagnostics.push({ provider: id, code: 'UNSUPPORTED_OPERATION' });
63
+ continue;
64
+ }
65
+ const attempt = AbortSignal.timeout(provider.timeoutMs ?? c.providerTimeoutMs);
66
+ try {
67
+ const raw = await this.clients.call(id, binding.name, mapArguments(binding.arguments, input), AbortSignal.any([signal, attempt]));
68
+ cancelled();
69
+ const warnings = [];
70
+ if (kind === 'read' && input.focus && !JSON.stringify(binding.arguments).includes('"$focus"'))
71
+ warnings.push({ provider: id, code: 'FOCUS_UNSUPPORTED' });
72
+ warnings.push(...diagnostics.map(({ provider, code }) => ({ provider, code })));
73
+ return normalize(raw, id, binding.name, c.maxOutputChars, kind === 'read' ? String(input.url) : undefined, warnings);
74
+ }
75
+ catch (error) {
76
+ cancelled();
77
+ const code = attempt.aborted ? 'PROVIDER_TIMEOUT' : error instanceof SiftpathError ? error.code : 'UPSTREAM_ERROR';
78
+ diagnostics.push({ provider: id, code });
79
+ }
80
+ }
81
+ cancelled();
82
+ throw new SiftpathError('NO_PROVIDER_SUCCEEDED', 'No official MCP succeeded. Run siftpath doctor and check credentials, tool names and connectivity.', diagnostics);
83
+ }
84
+ }
85
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { type Configuration } from './config.js';
3
+ type Prompts = Pick<typeof clack, 'intro' | 'outro' | 'cancel' | 'log' | 'select' | 'multiselect' | 'password' | 'confirm' | 'isCancel'>;
4
+ export declare function runSetupWizard(saved: Configuration, env?: NodeJS.ProcessEnv, prompts?: Prompts): Promise<{
5
+ configuration: Configuration;
6
+ test: boolean;
7
+ } | null>;
8
+ export {};