@tokenrip/cli 1.0.1

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 (88) hide show
  1. package/AGENTS.md +127 -0
  2. package/LICENSE +21 -0
  3. package/README.md +195 -0
  4. package/dist/auth-client.d.ts +8 -0
  5. package/dist/auth-client.js +14 -0
  6. package/dist/auth-client.js.map +1 -0
  7. package/dist/cjs/auth-client.js +17 -0
  8. package/dist/cjs/auth-client.js.map +1 -0
  9. package/dist/cjs/client.js +34 -0
  10. package/dist/cjs/client.js.map +1 -0
  11. package/dist/cjs/commands/auth.js +44 -0
  12. package/dist/cjs/commands/auth.js.map +1 -0
  13. package/dist/cjs/commands/config.js +20 -0
  14. package/dist/cjs/commands/config.js.map +1 -0
  15. package/dist/cjs/commands/delete-version.js +16 -0
  16. package/dist/cjs/commands/delete-version.js.map +1 -0
  17. package/dist/cjs/commands/delete.js +16 -0
  18. package/dist/cjs/commands/delete.js.map +1 -0
  19. package/dist/cjs/commands/publish.js +50 -0
  20. package/dist/cjs/commands/publish.js.map +1 -0
  21. package/dist/cjs/commands/stats.js +12 -0
  22. package/dist/cjs/commands/stats.js.map +1 -0
  23. package/dist/cjs/commands/status.js +19 -0
  24. package/dist/cjs/commands/status.js.map +1 -0
  25. package/dist/cjs/commands/update.js +55 -0
  26. package/dist/cjs/commands/update.js.map +1 -0
  27. package/dist/cjs/commands/upload.js +53 -0
  28. package/dist/cjs/commands/upload.js.map +1 -0
  29. package/dist/cjs/config.js +38 -0
  30. package/dist/cjs/config.js.map +1 -0
  31. package/dist/cjs/errors.js +20 -0
  32. package/dist/cjs/errors.js.map +1 -0
  33. package/dist/cjs/formatters.js +94 -0
  34. package/dist/cjs/formatters.js.map +1 -0
  35. package/dist/cjs/index.js +21 -0
  36. package/dist/cjs/index.js.map +1 -0
  37. package/dist/cjs/output.js +64 -0
  38. package/dist/cjs/output.js.map +1 -0
  39. package/dist/cjs/package.json +1 -0
  40. package/dist/cli.d.ts +2 -0
  41. package/dist/cli.js +211 -0
  42. package/dist/cli.js.map +1 -0
  43. package/dist/client.d.ts +7 -0
  44. package/dist/client.js +28 -0
  45. package/dist/client.js.map +1 -0
  46. package/dist/commands/auth.d.ts +4 -0
  47. package/dist/commands/auth.js +41 -0
  48. package/dist/commands/auth.js.map +1 -0
  49. package/dist/commands/config.d.ts +2 -0
  50. package/dist/commands/config.js +16 -0
  51. package/dist/commands/config.js.map +1 -0
  52. package/dist/commands/delete-version.d.ts +3 -0
  53. package/dist/commands/delete-version.js +13 -0
  54. package/dist/commands/delete-version.js.map +1 -0
  55. package/dist/commands/delete.d.ts +3 -0
  56. package/dist/commands/delete.js +13 -0
  57. package/dist/commands/delete.js.map +1 -0
  58. package/dist/commands/publish.d.ts +8 -0
  59. package/dist/commands/publish.js +44 -0
  60. package/dist/commands/publish.js.map +1 -0
  61. package/dist/commands/stats.d.ts +1 -0
  62. package/dist/commands/stats.js +9 -0
  63. package/dist/commands/stats.js.map +1 -0
  64. package/dist/commands/status.d.ts +5 -0
  65. package/dist/commands/status.js +16 -0
  66. package/dist/commands/status.js.map +1 -0
  67. package/dist/commands/update.d.ts +6 -0
  68. package/dist/commands/update.js +49 -0
  69. package/dist/commands/update.js.map +1 -0
  70. package/dist/commands/upload.d.ts +7 -0
  71. package/dist/commands/upload.js +47 -0
  72. package/dist/commands/upload.js.map +1 -0
  73. package/dist/config.d.ts +10 -0
  74. package/dist/config.js +28 -0
  75. package/dist/config.js.map +1 -0
  76. package/dist/errors.d.ts +5 -0
  77. package/dist/errors.js +15 -0
  78. package/dist/errors.js.map +1 -0
  79. package/dist/formatters.d.ts +9 -0
  80. package/dist/formatters.js +83 -0
  81. package/dist/formatters.js.map +1 -0
  82. package/dist/index.d.ts +8 -0
  83. package/dist/index.js +6 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/output.d.ts +6 -0
  86. package/dist/output.js +58 -0
  87. package/dist/output.js.map +1 -0
  88. package/package.json +43 -0
package/AGENTS.md ADDED
@@ -0,0 +1,127 @@
1
+ # @tokenrip/cli — Agent Guide
2
+
3
+ Tokenrip CLI creates shareable asset links (PDFs, markdown, HTML, charts, images) for AI agents.
4
+
5
+ ## Setup
6
+
7
+ ```bash
8
+ npm install -g @tokenrip/cli
9
+ tokenrip auth create-key
10
+ ```
11
+
12
+ Or use environment variables:
13
+
14
+ ```bash
15
+ export TOKENRIP_API_KEY=tr_...
16
+ export TOKENRIP_API_URL=https://api.tokenrip.com # optional, this is the default
17
+ ```
18
+
19
+ ## Output Format
20
+
21
+ All commands output JSON when piped or when `--json` is passed:
22
+
23
+ ```json
24
+ { "ok": true, "data": { ... } }
25
+ { "ok": false, "error": "ERROR_CODE", "message": "description" }
26
+ ```
27
+
28
+ Exit code 0 = success, 1 = error.
29
+
30
+ In a TTY without `--json`, output is human-readable. Force JSON with `--json` or `TOKENRIP_OUTPUT=json`.
31
+
32
+ ## Commands
33
+
34
+ ### `tokenrip asset publish <file> --type <type>`
35
+
36
+ Publish structured content. Types: `markdown`, `html`, `chart`, `code`, `text`, `json`.
37
+
38
+ ```bash
39
+ tokenrip asset publish report.md --type markdown --title "Analysis"
40
+ tokenrip asset publish data.json --type json --context "My Agent"
41
+ tokenrip asset publish report.md --type markdown --dry-run # validate only
42
+ ```
43
+
44
+ ### `tokenrip asset upload <file>`
45
+
46
+ Upload a binary file (PDF, image, etc.).
47
+
48
+ ```bash
49
+ tokenrip asset upload screenshot.png --title "Screenshot"
50
+ tokenrip asset upload document.pdf --dry-run # validate only
51
+ ```
52
+
53
+ ### `tokenrip asset list`
54
+
55
+ List your assets.
56
+
57
+ ```bash
58
+ tokenrip asset list
59
+ tokenrip asset list --since 2026-03-30T00:00:00Z
60
+ tokenrip asset list --type markdown --limit 5
61
+ ```
62
+
63
+ ### `tokenrip asset delete <uuid>`
64
+
65
+ Delete an asset permanently.
66
+
67
+ ```bash
68
+ tokenrip asset delete 550e8400-e29b-41d4-a716-446655440000
69
+ tokenrip asset delete 550e8400-... --dry-run # preview without deleting
70
+ ```
71
+
72
+ ### `tokenrip asset stats`
73
+
74
+ Show storage usage statistics.
75
+
76
+ ```bash
77
+ tokenrip asset stats
78
+ ```
79
+
80
+ ### `tokenrip auth create-key`
81
+
82
+ Create and auto-save a new API key.
83
+
84
+ ```bash
85
+ tokenrip auth create-key
86
+ tokenrip auth create-key --name "My Agent" --no-save
87
+ ```
88
+
89
+ ### `tokenrip config set-key <key>` / `tokenrip config set-url <url>`
90
+
91
+ Manually configure API key or server URL.
92
+
93
+ ## Provenance Tracking
94
+
95
+ All asset commands support lineage metadata:
96
+
97
+ - `--parent <uuid>` — Parent asset ID
98
+ - `--context <text>` — Creator context (agent name, task description)
99
+ - `--refs <urls>` — Comma-separated input reference URLs
100
+
101
+ ## Error Codes
102
+
103
+ | Code | Meaning | Fix |
104
+ |---|---|---|
105
+ | `NO_API_KEY` | No API key configured | `tokenrip auth create-key` or set `TOKENRIP_API_KEY` |
106
+ | `UNAUTHORIZED` | Key invalid or expired | Create a new key |
107
+ | `FILE_NOT_FOUND` | File path doesn't exist | Check the path |
108
+ | `INVALID_TYPE` | Bad content type | Use: markdown, html, chart, code, text, json |
109
+ | `NETWORK_ERROR` | Can't reach server | Check `TOKENRIP_API_URL` |
110
+ | `TIMEOUT` | Server didn't respond | Retry or check server status |
111
+
112
+ ## Agent Workflow Example
113
+
114
+ ```bash
115
+ # 1. Setup (once)
116
+ tokenrip auth create-key --name "analysis-agent"
117
+
118
+ # 2. Publish results
119
+ tokenrip asset publish --json report.md --type markdown --title "Daily Report" \
120
+ --context "analysis-agent" --refs "https://source.example.com"
121
+
122
+ # 3. Parse the response
123
+ # { "ok": true, "data": { "id": "...", "url": "https://..." } }
124
+
125
+ # 4. Check storage
126
+ tokenrip --json asset stats
127
+ ```
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Tokenrip
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,195 @@
1
+ # @tokenrip/cli
2
+
3
+ Asset sharing for AI agents. Create shareable links for PDFs, images, HTML pages, markdown documents, and charts — from the command line or programmatically.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @tokenrip/cli
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```bash
14
+ # 1. Create an API key (auto-saved)
15
+ tokenrip auth create-key
16
+
17
+ # 2. Upload a file
18
+ tokenrip asset upload report.pdf --title "Q1 Report"
19
+
20
+ # 3. Publish structured content
21
+ tokenrip asset publish dashboard.html --type html --title "Dashboard"
22
+
23
+ # 4. Check your assets
24
+ tokenrip asset list
25
+ ```
26
+
27
+ Every command outputs machine-readable JSON:
28
+
29
+ ```json
30
+ { "ok": true, "data": { "id": "abc-123", "url": "https://...", "title": "Q1 Report", "type": "file" } }
31
+ ```
32
+
33
+ ## CLI Commands
34
+
35
+ ### `tokenrip asset upload <file> [--title <title>]`
36
+
37
+ Upload a binary file (PDF, image, etc.) and get a shareable link. MIME type is auto-detected.
38
+
39
+ ```bash
40
+ tokenrip asset upload chart.png
41
+ tokenrip asset upload slides.pdf --title "Team Slides"
42
+ ```
43
+
44
+ ### `tokenrip asset publish <file> --type <type> [--title <title>]`
45
+
46
+ Publish structured content for rich rendering in the browser.
47
+
48
+ Supported types: `markdown`, `html`, `chart`, `code`, `text`, `json`
49
+
50
+ ```bash
51
+ tokenrip asset publish notes.md --type markdown
52
+ tokenrip asset publish page.html --type html --title "Landing Page"
53
+ tokenrip asset publish data.json --type chart --title "Revenue Chart"
54
+ ```
55
+
56
+ ### `tokenrip asset list`
57
+
58
+ List your published assets and their metadata.
59
+
60
+ ```bash
61
+ tokenrip asset list
62
+ tokenrip asset list --since 2026-03-30T00:00:00Z --type markdown --limit 5
63
+ ```
64
+
65
+ ### `tokenrip asset update <uuid> <file> [--type <type>]`
66
+
67
+ Publish a new version of an existing asset.
68
+
69
+ ```bash
70
+ tokenrip asset update 550e8400-... report-v2.md --type markdown
71
+ tokenrip asset update 550e8400-... chart.png --label "with axes fixed"
72
+ ```
73
+
74
+ ### `tokenrip asset delete <uuid>`
75
+
76
+ Permanently delete an asset and its shareable link.
77
+
78
+ ```bash
79
+ tokenrip asset delete 550e8400-e29b-41d4-a716-446655440000
80
+ ```
81
+
82
+ ### `tokenrip asset stats`
83
+
84
+ Show storage usage statistics.
85
+
86
+ ### `tokenrip auth create-key`
87
+
88
+ Create a new API key (auto-saved to config).
89
+
90
+ ```bash
91
+ tokenrip auth create-key
92
+ tokenrip auth create-key --name "My Agent" --no-save
93
+ ```
94
+
95
+ ### `tokenrip config set-key <key>`
96
+
97
+ Save your API key to `~/.config/tokenrip/config.json`.
98
+
99
+ ### `tokenrip config set-url <url>`
100
+
101
+ Set a custom API server URL (default: `https://api.tokenrip.com`).
102
+
103
+ ## Provenance Tracking
104
+
105
+ All asset commands support lineage metadata:
106
+
107
+ - `--parent <uuid>` — Parent asset ID
108
+ - `--context <text>` — Creator context (agent name, task description)
109
+ - `--refs <urls>` — Comma-separated input reference URLs
110
+
111
+ ## Library Usage
112
+
113
+ `@tokenrip/cli` also works as a Node.js library for programmatic asset creation.
114
+
115
+ ```typescript
116
+ import { loadConfig, getApiUrl, getApiKey, createHttpClient } from '@tokenrip/cli';
117
+
118
+ const config = loadConfig();
119
+ const client = createHttpClient({
120
+ baseUrl: getApiUrl(config),
121
+ apiKey: getApiKey(config),
122
+ });
123
+
124
+ // Publish markdown content
125
+ const { data } = await client.post('/v0/assets', {
126
+ type: 'markdown',
127
+ content: '# Hello\n\nGenerated by my agent.',
128
+ title: 'Agent Output',
129
+ });
130
+
131
+ console.log(data.data.id); // asset UUID
132
+ ```
133
+
134
+ ### Exports
135
+
136
+ | Export | Description |
137
+ |--------|-------------|
138
+ | `loadConfig()` | Load config from `~/.config/tokenrip/config.json` |
139
+ | `saveConfig(config)` | Persist config to disk |
140
+ | `getApiUrl(config)` | Resolve API URL (config > env > default) |
141
+ | `getApiKey(config)` | Resolve API key (config > env) |
142
+ | `createHttpClient(config?)` | Axios instance with auth and error handling |
143
+ | `CliError` | Typed error class with error codes |
144
+ | `toCliError(err)` | Normalize any error to `CliError` |
145
+ | `outputSuccess(data)` | Print `{ ok: true, data }` JSON |
146
+ | `outputError(err)` | Print `{ ok: false, error, message }` and exit |
147
+ | `wrapCommand(fn)` | Wrap async handler with error catching |
148
+
149
+ ## Configuration
150
+
151
+ Configuration is read from `~/.config/tokenrip/config.json`:
152
+
153
+ ```json
154
+ {
155
+ "apiKey": "tr_...",
156
+ "apiUrl": "https://api.tokenrip.com",
157
+ "preferences": {}
158
+ }
159
+ ```
160
+
161
+ Environment variables take precedence over the config file:
162
+
163
+ | Variable | Overrides |
164
+ |----------|-----------|
165
+ | `TOKENRIP_API_KEY` | `apiKey` |
166
+ | `TOKENRIP_API_URL` | `apiUrl` |
167
+
168
+ ## Output Format
169
+
170
+ All commands output JSON to stdout. In a TTY, output is human-readable by default — use `--json` or pipe to get JSON. Errors exit with code 1.
171
+
172
+ **Success:**
173
+ ```json
174
+ { "ok": true, "data": { ... } }
175
+ ```
176
+
177
+ **Error:**
178
+ ```json
179
+ { "ok": false, "error": "NO_API_KEY", "message": "No API key configured. Run `tokenrip config set-key <key>`" }
180
+ ```
181
+
182
+ ### Error Codes
183
+
184
+ | Code | Meaning |
185
+ |------|---------|
186
+ | `NO_API_KEY` | No API key configured |
187
+ | `FILE_NOT_FOUND` | Input file does not exist |
188
+ | `INVALID_TYPE` | Publish type not one of: markdown, html, chart, code, text, json |
189
+ | `UNAUTHORIZED` | API key is invalid or expired |
190
+ | `TIMEOUT` | Request timed out (30s) |
191
+ | `NETWORK_ERROR` | Cannot reach the API server |
192
+
193
+ ## License
194
+
195
+ MIT
@@ -0,0 +1,8 @@
1
+ import { AxiosInstance } from 'axios';
2
+ import { TokenripConfig } from './config.js';
3
+ export interface AuthContext {
4
+ client: AxiosInstance;
5
+ config: TokenripConfig;
6
+ apiUrl: string;
7
+ }
8
+ export declare function requireAuthClient(): AuthContext;
@@ -0,0 +1,14 @@
1
+ import { loadConfig, getApiUrl, getApiKey } from './config.js';
2
+ import { createHttpClient } from './client.js';
3
+ import { CliError } from './errors.js';
4
+ export function requireAuthClient() {
5
+ const config = loadConfig();
6
+ const apiKey = getApiKey(config);
7
+ if (!apiKey) {
8
+ throw new CliError('NO_API_KEY', 'No API key configured. Run `tokenrip auth create-key` or set TOKENRIP_API_KEY.');
9
+ }
10
+ const apiUrl = getApiUrl(config);
11
+ const client = createHttpClient({ baseUrl: apiUrl, apiKey });
12
+ return { client, config, apiUrl };
13
+ }
14
+ //# sourceMappingURL=auth-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../src/auth-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAQvC,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,YAAY,EACZ,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireAuthClient = requireAuthClient;
4
+ const config_js_1 = require("./config.js");
5
+ const client_js_1 = require("./client.js");
6
+ const errors_js_1 = require("./errors.js");
7
+ function requireAuthClient() {
8
+ const config = (0, config_js_1.loadConfig)();
9
+ const apiKey = (0, config_js_1.getApiKey)(config);
10
+ if (!apiKey) {
11
+ throw new errors_js_1.CliError('NO_API_KEY', 'No API key configured. Run `tokenrip auth create-key` or set TOKENRIP_API_KEY.');
12
+ }
13
+ const apiUrl = (0, config_js_1.getApiUrl)(config);
14
+ const client = (0, client_js_1.createHttpClient)({ baseUrl: apiUrl, apiKey });
15
+ return { client, config, apiUrl };
16
+ }
17
+ //# sourceMappingURL=auth-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../src/auth-client.ts"],"names":[],"mappings":";;AAWA,8CAYC;AAtBD,2CAA+E;AAC/E,2CAA+C;AAC/C,2CAAuC;AAQvC,SAAgB,iBAAiB;IAC/B,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAQ,CAChB,YAAY,EACZ,gFAAgF,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,MAAM,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createHttpClient = createHttpClient;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const errors_js_1 = require("./errors.js");
9
+ const DEFAULT_TIMEOUT = 30000;
10
+ function createHttpClient(config = {}) {
11
+ const headers = {};
12
+ if (config.apiKey) {
13
+ headers['Authorization'] = `Bearer ${config.apiKey}`;
14
+ }
15
+ const client = axios_1.default.create({
16
+ baseURL: config.baseUrl || 'https://api.tokenrip.com',
17
+ timeout: config.timeout || DEFAULT_TIMEOUT,
18
+ headers,
19
+ });
20
+ client.interceptors.response.use((response) => response, (error) => {
21
+ if (error.response?.status === 401) {
22
+ throw new errors_js_1.CliError('UNAUTHORIZED', 'API key required or invalid. Run `tokenrip auth create-key` or set TOKENRIP_API_KEY.');
23
+ }
24
+ if (error.response?.data?.error) {
25
+ throw new errors_js_1.CliError(error.response.data.error, error.response.data.message || 'Unknown API error');
26
+ }
27
+ if (error.code === 'ECONNABORTED') {
28
+ throw new errors_js_1.CliError('TIMEOUT', 'Request timeout — is the Tokenrip server running?');
29
+ }
30
+ throw new errors_js_1.CliError('NETWORK_ERROR', 'Network error — is the Tokenrip server running?');
31
+ });
32
+ return client;
33
+ }
34
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":";;;;;AAWA,4CAgCC;AA3CD,kDAAyD;AACzD,2CAAuC;AAEvC,MAAM,eAAe,GAAG,KAAK,CAAC;AAQ9B,SAAgB,gBAAgB,CAAC,SAAuB,EAAE;IACxD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,MAAM,GAAG,eAAK,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,0BAA0B;QACrD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,eAAe;QAC1C,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAoE,EAAE,EAAE;QACvE,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,IAAI,oBAAQ,CAChB,cAAc,EACd,sFAAsF,CACvF,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAChC,MAAM,IAAI,oBAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAQ,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,IAAI,oBAAQ,CAAC,eAAe,EAAE,iDAAiD,CAAC,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authCreateKey = authCreateKey;
4
+ const node_os_1 = require("node:os");
5
+ const config_js_1 = require("../config.js");
6
+ const client_js_1 = require("../client.js");
7
+ const errors_js_1 = require("../errors.js");
8
+ const output_js_1 = require("../output.js");
9
+ const formatters_js_1 = require("../formatters.js");
10
+ async function authCreateKey(options) {
11
+ const config = (0, config_js_1.loadConfig)();
12
+ const apiUrl = (0, config_js_1.getApiUrl)(config);
13
+ const keyName = options.name || `tokenrip-${(0, node_os_1.hostname)()}`;
14
+ const client = (0, client_js_1.createHttpClient)({ baseUrl: apiUrl });
15
+ try {
16
+ const { data } = await client.post('/v0/auth/keys', { name: keyName });
17
+ const apiKey = data.data.apiKey;
18
+ // Auto-save the key if requested or not explicitly disabled
19
+ if (options.save !== false) {
20
+ config.apiKey = apiKey;
21
+ (0, config_js_1.saveConfig)(config);
22
+ (0, output_js_1.outputSuccess)({
23
+ keyName,
24
+ apiKey,
25
+ message: 'API key created and saved',
26
+ note: 'Keep this key safe — treat it like a password',
27
+ }, formatters_js_1.formatAuthKey);
28
+ }
29
+ else {
30
+ (0, output_js_1.outputSuccess)({
31
+ keyName,
32
+ apiKey,
33
+ message: 'API key created',
34
+ note: 'To save it, run: tokenrip config set-key <key>',
35
+ }, formatters_js_1.formatAuthKey);
36
+ }
37
+ }
38
+ catch (error) {
39
+ if (error instanceof errors_js_1.CliError)
40
+ throw error;
41
+ throw new errors_js_1.CliError('AUTH_FAILED', 'Failed to create API key. Is the server running?');
42
+ }
43
+ }
44
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":";;AAOA,sCAiCC;AAxCD,qCAAmC;AACnC,4CAAiE;AACjE,4CAAgD;AAChD,4CAAwC;AACxC,4CAA6C;AAC7C,oDAAiD;AAE1C,KAAK,UAAU,aAAa,CAAC,OAA0C;IAC5E,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,MAAM,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,IAAA,kBAAQ,GAAE,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,IAAA,4BAAgB,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAEhC,4DAA4D;QAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,IAAA,sBAAU,EAAC,MAAM,CAAC,CAAC;YACnB,IAAA,yBAAa,EAAC;gBACZ,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,2BAA2B;gBACpC,IAAI,EAAE,+CAA+C;aACtD,EAAE,6BAAa,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAA,yBAAa,EAAC;gBACZ,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,iBAAiB;gBAC1B,IAAI,EAAE,gDAAgD;aACvD,EAAE,6BAAa,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,oBAAQ;YAAE,MAAM,KAAK,CAAC;QAC3C,MAAM,IAAI,oBAAQ,CAAC,aAAa,EAAE,kDAAkD,CAAC,CAAC;IACxF,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configSetKey = configSetKey;
4
+ exports.configSetUrl = configSetUrl;
5
+ const config_js_1 = require("../config.js");
6
+ const output_js_1 = require("../output.js");
7
+ const formatters_js_1 = require("../formatters.js");
8
+ async function configSetKey(key) {
9
+ const config = (0, config_js_1.loadConfig)();
10
+ config.apiKey = key;
11
+ (0, config_js_1.saveConfig)(config);
12
+ (0, output_js_1.outputSuccess)({ message: 'API key saved' }, formatters_js_1.formatConfigSaved);
13
+ }
14
+ async function configSetUrl(url) {
15
+ const config = (0, config_js_1.loadConfig)();
16
+ config.apiUrl = url;
17
+ (0, config_js_1.saveConfig)(config);
18
+ (0, output_js_1.outputSuccess)({ message: 'API URL saved', apiUrl: url }, formatters_js_1.formatConfigSaved);
19
+ }
20
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/commands/config.ts"],"names":[],"mappings":";;AAIA,oCAKC;AAED,oCAKC;AAhBD,4CAAsD;AACtD,4CAA6C;AAC7C,oDAAqD;AAE9C,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;IACpB,IAAA,sBAAU,EAAC,MAAM,CAAC,CAAC;IACnB,IAAA,yBAAa,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,iCAAiB,CAAC,CAAC;AACjE,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,IAAA,sBAAU,GAAE,CAAC;IAC5B,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;IACpB,IAAA,sBAAU,EAAC,MAAM,CAAC,CAAC;IACnB,IAAA,yBAAa,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,iCAAiB,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteVersion = deleteVersion;
4
+ const auth_client_js_1 = require("../auth-client.js");
5
+ const output_js_1 = require("../output.js");
6
+ const formatters_js_1 = require("../formatters.js");
7
+ async function deleteVersion(uuid, versionId, options = {}) {
8
+ if (options.dryRun) {
9
+ (0, output_js_1.outputSuccess)({ dryRun: true, action: 'would delete version', assetId: uuid, versionId }, formatters_js_1.formatVersionDeleted);
10
+ return;
11
+ }
12
+ const { client } = (0, auth_client_js_1.requireAuthClient)();
13
+ await client.delete(`/v0/assets/${uuid}/versions/${versionId}`);
14
+ (0, output_js_1.outputSuccess)({ assetId: uuid, versionId, deleted: true }, formatters_js_1.formatVersionDeleted);
15
+ }
16
+ //# sourceMappingURL=delete-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-version.js","sourceRoot":"","sources":["../../../src/commands/delete-version.ts"],"names":[],"mappings":";;AAIA,sCAcC;AAlBD,sDAAsD;AACtD,4CAA6C;AAC7C,oDAAwD;AAEjD,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,SAAiB,EACjB,UAAgC,EAAE;IAElC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAA,yBAAa,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,oCAAoB,CAAC,CAAC;QAChH,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kCAAiB,GAAE,CAAC;IACvC,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,aAAa,SAAS,EAAE,CAAC,CAAC;IAEhE,IAAA,yBAAa,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,oCAAoB,CAAC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deleteAsset = deleteAsset;
4
+ const auth_client_js_1 = require("../auth-client.js");
5
+ const output_js_1 = require("../output.js");
6
+ const formatters_js_1 = require("../formatters.js");
7
+ async function deleteAsset(uuid, options = {}) {
8
+ if (options.dryRun) {
9
+ (0, output_js_1.outputSuccess)({ dryRun: true, action: 'would delete', id: uuid }, formatters_js_1.formatAssetDeleted);
10
+ return;
11
+ }
12
+ const { client } = (0, auth_client_js_1.requireAuthClient)();
13
+ await client.delete(`/v0/assets/${uuid}`);
14
+ (0, output_js_1.outputSuccess)({ id: uuid, deleted: true }, formatters_js_1.formatAssetDeleted);
15
+ }
16
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/delete.ts"],"names":[],"mappings":";;AAIA,kCAUC;AAdD,sDAAsD;AACtD,4CAA6C;AAC7C,oDAAsD;AAE/C,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,UAAgC,EAAE;IAChF,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAA,yBAAa,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,kCAAkB,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kCAAiB,GAAE,CAAC;IACvC,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IAE1C,IAAA,yBAAa,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,kCAAkB,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.publish = publish;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const auth_client_js_1 = require("../auth-client.js");
10
+ const errors_js_1 = require("../errors.js");
11
+ const output_js_1 = require("../output.js");
12
+ const formatters_js_1 = require("../formatters.js");
13
+ const VALID_TYPES = ['markdown', 'html', 'chart', 'code', 'text', 'json'];
14
+ async function publish(filePath, options) {
15
+ if (!VALID_TYPES.includes(options.type)) {
16
+ throw new errors_js_1.CliError('INVALID_TYPE', `Type must be one of: ${VALID_TYPES.join(', ')}`);
17
+ }
18
+ const absPath = node_path_1.default.resolve(filePath);
19
+ if (!node_fs_1.default.existsSync(absPath)) {
20
+ throw new errors_js_1.CliError('FILE_NOT_FOUND', `File not found: ${absPath}`);
21
+ }
22
+ const title = options.title || node_path_1.default.basename(absPath);
23
+ const size = node_fs_1.default.statSync(absPath).size;
24
+ if (options.dryRun) {
25
+ (0, output_js_1.outputSuccess)({ dryRun: true, action: 'would publish', file: absPath, title, type: options.type, size }, formatters_js_1.formatAssetCreated);
26
+ return;
27
+ }
28
+ const { client } = (0, auth_client_js_1.requireAuthClient)();
29
+ const content = node_fs_1.default.readFileSync(absPath, 'utf-8');
30
+ const body = {
31
+ type: options.type,
32
+ content,
33
+ title,
34
+ };
35
+ if (options.parent)
36
+ body.parentAssetId = options.parent;
37
+ if (options.context)
38
+ body.creatorContext = options.context;
39
+ if (options.refs)
40
+ body.inputReferences = options.refs.split(',').map((r) => r.trim());
41
+ const { data } = await client.post('/v0/assets', body);
42
+ const url = data.data.url || `https://tokenrip.com/s/${data.data.id}`;
43
+ (0, output_js_1.outputSuccess)({
44
+ id: data.data.id,
45
+ url,
46
+ title: data.data.title,
47
+ type: data.data.type,
48
+ }, formatters_js_1.formatAssetCreated);
49
+ }
50
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/publish.ts"],"names":[],"mappings":";;;;;AAUA,0BA0CC;AApDD,sDAAyB;AACzB,0DAA6B;AAC7B,sDAAsD;AACtD,4CAAwC;AACxC,4CAA6C;AAC7C,oDAAsD;AAEtD,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAG5E,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,OAA6G;IAE7G,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAmB,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,oBAAQ,CAAC,cAAc,EAAE,wBAAwB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,OAAO,GAAG,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,oBAAQ,CAAC,gBAAgB,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,mBAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,iBAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAEvC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAA,yBAAa,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,kCAAkB,CAAC,CAAC;QAC7H,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kCAAiB,GAAE,CAAC;IACvC,MAAM,OAAO,GAAG,iBAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO;QACP,KAAK;KACN,CAAC;IACF,IAAI,OAAO,CAAC,MAAM;QAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IACxD,IAAI,OAAO,CAAC,OAAO;QAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,CAAC,IAAI;QAAE,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,0BAA0B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IACtE,IAAA,yBAAa,EAAC;QACZ,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;QAChB,GAAG;QACH,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;KACrB,EAAE,kCAAkB,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stats = stats;
4
+ const auth_client_js_1 = require("../auth-client.js");
5
+ const output_js_1 = require("../output.js");
6
+ const formatters_js_1 = require("../formatters.js");
7
+ async function stats() {
8
+ const { client } = (0, auth_client_js_1.requireAuthClient)();
9
+ const { data } = await client.get('/v0/assets/stats');
10
+ (0, output_js_1.outputSuccess)(data.data, formatters_js_1.formatStats);
11
+ }
12
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/commands/stats.ts"],"names":[],"mappings":";;AAIA,sBAKC;AATD,sDAAsD;AACtD,4CAA6C;AAC7C,oDAA+C;AAExC,KAAK,UAAU,KAAK;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kCAAiB,GAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAEtD,IAAA,yBAAa,EAAC,IAAI,CAAC,IAAI,EAAE,2BAAW,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.status = status;
4
+ const auth_client_js_1 = require("../auth-client.js");
5
+ const output_js_1 = require("../output.js");
6
+ const formatters_js_1 = require("../formatters.js");
7
+ async function status(options) {
8
+ const { client } = (0, auth_client_js_1.requireAuthClient)();
9
+ const params = {};
10
+ if (options.since)
11
+ params.since = options.since;
12
+ if (options.limit)
13
+ params.limit = options.limit;
14
+ if (options.type)
15
+ params.type = options.type;
16
+ const { data } = await client.get('/v0/assets/status', { params });
17
+ (0, output_js_1.outputSuccess)(data.data, formatters_js_1.formatAssetList);
18
+ }
19
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/status.ts"],"names":[],"mappings":";;AAIA,wBAWC;AAfD,sDAAsD;AACtD,4CAA6C;AAC7C,oDAAmD;AAE5C,KAAK,UAAU,MAAM,CAAC,OAA0D;IACrF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kCAAiB,GAAE,CAAC;IAEvC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAE7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,IAAA,yBAAa,EAAC,IAAI,CAAC,IAAI,EAAE,+BAAe,CAAC,CAAC;AAC5C,CAAC"}