@temporalabs/treasury 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.
Files changed (75) hide show
  1. package/NOTICE +4 -2
  2. package/README.md +108 -111
  3. package/THIRD_PARTY_NOTICES.connect-page.md +7420 -0
  4. package/THIRD_PARTY_NOTICES.md +4 -196
  5. package/dist/cli.d.ts +6 -0
  6. package/dist/cli.js +220 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/client.d.ts +224 -239
  9. package/dist/client.js +147 -25
  10. package/dist/client.js.map +1 -1
  11. package/dist/config/earn.d.ts +33 -12
  12. package/dist/config/earn.js +33 -12
  13. package/dist/config/earn.js.map +1 -1
  14. package/dist/connect/ack.d.ts +59 -0
  15. package/dist/connect/ack.js +111 -0
  16. package/dist/connect/ack.js.map +1 -0
  17. package/dist/connect/commands.d.ts +78 -0
  18. package/dist/connect/commands.js +411 -0
  19. package/dist/connect/commands.js.map +1 -0
  20. package/dist/connect/config.d.ts +22 -0
  21. package/dist/connect/config.js +33 -0
  22. package/dist/connect/config.js.map +1 -0
  23. package/dist/connect/gate.d.ts +37 -0
  24. package/dist/connect/gate.js +115 -0
  25. package/dist/connect/gate.js.map +1 -0
  26. package/dist/connect/http.d.ts +54 -0
  27. package/dist/connect/http.js +205 -0
  28. package/dist/connect/http.js.map +1 -0
  29. package/dist/connect/open.d.ts +2 -0
  30. package/dist/connect/open.js +35 -0
  31. package/dist/connect/open.js.map +1 -0
  32. package/dist/connect/page.d.ts +5 -0
  33. package/dist/connect/page.js +69 -0
  34. package/dist/connect/page.js.map +1 -0
  35. package/dist/connect/session.d.ts +16 -0
  36. package/dist/connect/session.js +73 -0
  37. package/dist/connect/session.js.map +1 -0
  38. package/dist/connect/verify.d.ts +37 -0
  39. package/dist/connect/verify.js +89 -0
  40. package/dist/connect/verify.js.map +1 -0
  41. package/dist/connect-page.js +5141 -0
  42. package/dist/disclosures.d.ts +21 -6
  43. package/dist/disclosures.js +32 -7
  44. package/dist/disclosures.js.map +1 -1
  45. package/dist/earn/commands.d.ts +46 -0
  46. package/dist/earn/commands.js +483 -0
  47. package/dist/earn/commands.js.map +1 -0
  48. package/dist/links.d.ts +2 -0
  49. package/dist/links.js +38 -14
  50. package/dist/links.js.map +1 -1
  51. package/dist/position.d.ts +7 -5
  52. package/dist/position.js +35 -18
  53. package/dist/position.js.map +1 -1
  54. package/dist/preflight.d.ts +9 -0
  55. package/dist/preflight.js +14 -3
  56. package/dist/preflight.js.map +1 -1
  57. package/dist/quote.js +24 -7
  58. package/dist/quote.js.map +1 -1
  59. package/dist/redact.d.ts +3 -3
  60. package/dist/redact.js +3 -3
  61. package/dist/redact.js.map +1 -1
  62. package/dist/registry-schema.d.ts +5 -5
  63. package/dist/registry-schema.js +30 -16
  64. package/dist/registry-schema.js.map +1 -1
  65. package/dist/registry.d.ts +29 -6
  66. package/dist/registry.js +80 -16
  67. package/dist/registry.js.map +1 -1
  68. package/dist/{mcp-server.mjs → treasury.mjs} +29289 -44702
  69. package/dist/version.js +6 -3
  70. package/dist/version.js.map +1 -1
  71. package/package.json +9 -7
  72. package/registry/vaults.json +105 -4
  73. package/dist/mcp/server.d.ts +0 -33
  74. package/dist/mcp/server.js +0 -346
  75. package/dist/mcp/server.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { type Registry, type VaultEntry } from "./registry-schema.js";
2
+ import { type ChainKey, type SupportedChainId } from "./client.js";
2
3
  /** Parses and validates the shipped registry. Throws on any schema violation — a registry that does not parse is not a registry. */
3
4
  export declare function loadRegistry(): Registry;
4
5
  /**
@@ -11,14 +12,36 @@ export declare function loadRegistry(): Registry;
11
12
  export declare function __setRegistryForTests(r: Registry | undefined): void;
12
13
  export declare function listVaults(): VaultEntry[];
13
14
  export declare function getVault(symbol: string): VaultEntry;
15
+ /** The chain used when a caller names neither a chain nor a vault: `EARN.defaultChain`. */
16
+ export declare function defaultChainId(): SupportedChainId;
14
17
  /**
15
- * The vault the tools use when the caller names none: `EARN.defaultVault` (config/earn.ts — the
16
- * toggle), which the registry must also mark `isDefault` (the measurement; the schema guarantees exactly
17
- * one and that it is open). A disagreement between the two is refused, never resolved silently.
18
+ * The chains a caller can name: every supported chain with at least one vault in the registry, the
19
+ * default chain first. A chain this client supports and the registry has no vault on is not
20
+ * offered — there is nothing to do there.
18
21
  */
19
- export declare function defaultVault(): VaultEntry;
20
- /** Resolves an optional ticker to a vault: the named one, or the default. */
21
- export declare function resolveVault(symbol?: string): VaultEntry;
22
+ export declare function offeredChains(): {
23
+ key: ChainKey;
24
+ chainId: SupportedChainId;
25
+ name: string;
26
+ }[];
27
+ /**
28
+ * The vault the tools use on a chain when the caller names none: `EARN.defaultVaultByChain`
29
+ * (config/earn.ts — the toggle), which the registry must also mark `isDefault` (the measurement; the
30
+ * schema guarantees exactly one per chain and that it is open or whitelist-gated). A disagreement
31
+ * between the two is refused, never resolved silently. With no argument: the default chain's.
32
+ */
33
+ export declare function defaultVault(chainId?: SupportedChainId): VaultEntry;
34
+ /**
35
+ * Resolves an optional ticker and an optional chain to ONE vault:
36
+ *
37
+ * neither the default chain's default vault
38
+ * chain only that chain's default vault
39
+ * vault only that vault, on whatever chain it is on
40
+ * both that vault, and it must be on that chain — a disagreement is REFUSED, never
41
+ * resolved by picking one, because the two answers are different contracts on
42
+ * different chains and the caller meant exactly one of them.
43
+ */
44
+ export declare function resolveVault(symbol?: string, chain?: string): VaultEntry;
22
45
  /**
23
46
  * The vaults this client can put money into: ACTIVE, on an ERC-4626 chassis, and MEASURED open.
24
47
  * This is the rule, not a list — the count moves as vaults are provisioned, gated, or retired.
package/dist/registry.js CHANGED
@@ -1,15 +1,25 @@
1
- import { readFileSync } from "node:fs";
2
- import { fileURLToPath } from "node:url";
1
+ import { readFileSync, realpathSync } from "node:fs";
2
+ import { fileURLToPath, pathToFileURL } from "node:url";
3
3
  import { registrySchema, erc4626Chassis } from "./registry-schema.js";
4
4
  import { EARN } from "./config/earn.js";
5
- const REGISTRY_URL = new URL("../registry/vaults.json", import.meta.url);
5
+ import { CHAIN_INFO, chainIdForKey, supportedChainIds } from "./client.js";
6
+ // From this file's real path, not a symlink's: see PACKAGE_JSON_URL in version.ts.
7
+ const REGISTRY_URL = new URL("../registry/vaults.json", pathToFileURL(realpathSync(fileURLToPath(import.meta.url))));
6
8
  let cached;
7
9
  /** Parses and validates the shipped registry. Throws on any schema violation — a registry that does not parse is not a registry. */
8
10
  export function loadRegistry() {
9
11
  if (cached)
10
12
  return cached;
11
13
  const raw = JSON.parse(readFileSync(fileURLToPath(REGISTRY_URL), "utf8"));
12
- cached = registrySchema.parse(raw);
14
+ const parsed = registrySchema.parse(raw);
15
+ // The schema holds one default per chain THAT HAS A VAULT, so it cannot see a registry with no
16
+ // vault on the default chain at all — and then the discovery call itself is what fails, with an
17
+ // error about a chain nobody asked for. Refuse the file here, where the cause can be named.
18
+ const chainId = defaultChainId();
19
+ if (!parsed.vaults.some((v) => v.chainId === chainId)) {
20
+ throw new Error(`the registry has no vault on ${CHAIN_INFO[chainId].name}, which config/earn.ts names as the default chain; add one or change defaultChain`);
21
+ }
22
+ cached = parsed;
13
23
  return cached;
14
24
  }
15
25
  /**
@@ -35,22 +45,76 @@ export function getVault(symbol) {
35
45
  }
36
46
  return v;
37
47
  }
48
+ /** The chain used when a caller names neither a chain nor a vault: `EARN.defaultChain`. */
49
+ export function defaultChainId() {
50
+ const id = chainIdForKey(EARN.defaultChain);
51
+ if (id === undefined)
52
+ throw new Error(`config/earn.ts names "${EARN.defaultChain}" as the default chain, which this client does not support`);
53
+ return id;
54
+ }
38
55
  /**
39
- * The vault the tools use when the caller names none: `EARN.defaultVault` (config/earn.ts — the
40
- * toggle), which the registry must also mark `isDefault` (the measurement; the schema guarantees exactly
41
- * one and that it is open). A disagreement between the two is refused, never resolved silently.
56
+ * The chains a caller can name: every supported chain with at least one vault in the registry, the
57
+ * default chain first. A chain this client supports and the registry has no vault on is not
58
+ * offered — there is nothing to do there.
42
59
  */
43
- export function defaultVault() {
44
- const v = getVault(EARN.defaultVault);
45
- if (!v.isDefault) {
46
- const marked = loadRegistry().vaults.find((x) => x.isDefault)?.symbol ?? "(none)";
47
- throw new Error(`config/earn.ts names "${EARN.defaultVault}" as the default but the registry marks "${marked}"; change both or neither`);
60
+ export function offeredChains() {
61
+ const present = new Set(loadRegistry().vaults.map((v) => v.chainId));
62
+ const first = defaultChainId();
63
+ return supportedChainIds
64
+ .filter((id) => present.has(id))
65
+ .sort((a, b) => (a === first ? -1 : b === first ? 1 : 0)) // stable: the rest keep `supportedChainIds` order
66
+ .map((id) => ({ key: CHAIN_INFO[id].key, chainId: id, name: CHAIN_INFO[id].name }));
67
+ }
68
+ /**
69
+ * The vault the tools use on a chain when the caller names none: `EARN.defaultVaultByChain`
70
+ * (config/earn.ts — the toggle), which the registry must also mark `isDefault` (the measurement; the
71
+ * schema guarantees exactly one per chain and that it is open or whitelist-gated). A disagreement
72
+ * between the two is refused, never resolved silently. With no argument: the default chain's.
73
+ */
74
+ export function defaultVault(chainId = defaultChainId()) {
75
+ const key = CHAIN_INFO[chainId].key;
76
+ const named = EARN.defaultVaultByChain[key];
77
+ const marked = loadRegistry().vaults.find((x) => x.chainId === chainId && x.isDefault);
78
+ if (marked === undefined) {
79
+ throw new Error(`no vault is offered on ${CHAIN_INFO[chainId].name}; chains with a vault: ${offeredChains().map((c) => c.key).join(", ")}`);
48
80
  }
49
- return v;
81
+ if (marked.symbol !== named) {
82
+ throw new Error(`config/earn.ts names "${named}" as the default on ${key} but the registry marks "${marked.symbol}"; change both or neither`);
83
+ }
84
+ return marked;
50
85
  }
51
- /** Resolves an optional ticker to a vault: the named one, or the default. */
52
- export function resolveVault(symbol) {
53
- return symbol ? getVault(symbol) : defaultVault();
86
+ /**
87
+ * Resolves an optional ticker and an optional chain to ONE vault:
88
+ *
89
+ * neither the default chain's default vault
90
+ * chain only that chain's default vault
91
+ * vault only that vault, on whatever chain it is on
92
+ * both that vault, and it must be on that chain — a disagreement is REFUSED, never
93
+ * resolved by picking one, because the two answers are different contracts on
94
+ * different chains and the caller meant exactly one of them.
95
+ */
96
+ export function resolveVault(symbol, chain) {
97
+ let chainId;
98
+ // An EMPTY string is an omitted argument, for `chain` exactly as for `vault` (`!symbol` below):
99
+ // a host that sends "" for every optional it did not fill must get the default, not a refusal.
100
+ if (chain) {
101
+ chainId = chainIdForKey(chain);
102
+ const offered = offeredChains();
103
+ if (chainId === undefined || !offered.some((c) => c.chainId === chainId)) {
104
+ throw new Error(`unknown chain "${chain}"; chains with a vault: ${offered.map((c) => c.key).join(", ")}`);
105
+ }
106
+ }
107
+ if (!symbol)
108
+ return defaultVault(chainId);
109
+ const v = getVault(symbol);
110
+ if (chainId !== undefined && v.chainId !== chainId) {
111
+ const on = loadRegistry()
112
+ .vaults.filter((x) => x.chainId === chainId)
113
+ .map((x) => x.symbol)
114
+ .join(", ");
115
+ throw new Error(`vault "${symbol}" is on ${CHAIN_INFO[v.chainId].key}, not ${chain}. Name one or the other: drop \`chain\` to use ${symbol} on ${CHAIN_INFO[v.chainId].key}, or pick a vault on ${chain} (${on}).`);
116
+ }
117
+ return v;
54
118
  }
55
119
  /**
56
120
  * The vaults this client can put money into: ACTIVE, on an ERC-4626 chassis, and MEASURED open.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAkC,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,yBAAyB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEzE,IAAI,MAA4B,CAAC;AAEjC,oIAAoI;AACpI,MAAM,UAAU,YAAY;IAC1B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC;IACrF,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,CAAuB;IAC3D,MAAM,GAAG,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACjE,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,YAAY,EAAE;aACzB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,aAAa,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC;QAClF,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,YAAY,4CAA4C,MAAM,2BAA2B,CAAC,CAAC;IAC3I,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAC3D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}