@lordierclaw/bluenote-term 0.4.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.
@@ -0,0 +1,201 @@
1
+ import {
2
+ __require
3
+ } from "./command-0v6na3yp.js";
4
+ // packages/term/package.json
5
+ var package_default = {
6
+ name: "@lordierclaw/bluenote-term",
7
+ version: "0.4.1",
8
+ license: "Apache-2.0",
9
+ type: "module",
10
+ files: [
11
+ "bin",
12
+ "dist",
13
+ "src/command.d.ts"
14
+ ],
15
+ exports: {
16
+ ".": {
17
+ types: "./src/command.d.ts",
18
+ import: "./dist/command.js"
19
+ },
20
+ "./command": {
21
+ types: "./src/command.d.ts",
22
+ import: "./dist/command.js"
23
+ },
24
+ "./package.json": "./package.json"
25
+ },
26
+ bin: {
27
+ "bluenote-term": "./bin/bluenote-term.js"
28
+ },
29
+ scripts: {
30
+ "build:package-runtime": "bun ../../scripts/build-package-runtime.ts",
31
+ prepack: "bun run build:package-runtime"
32
+ },
33
+ engines: {
34
+ bun: ">=1.3.0",
35
+ node: ">=20.0.0"
36
+ },
37
+ dependencies: {
38
+ "@lordierclaw/bluenote-core": "0.4.1",
39
+ "@opentui/core": "0.2.14",
40
+ clipboardy: "5.3.1"
41
+ }
42
+ };
43
+
44
+ // packages/term/src/command.ts
45
+ function formatTuiHelp() {
46
+ return [
47
+ "Usage: bluenote tui [options]",
48
+ "",
49
+ "Launch the BlueNote terminal UI workspace.",
50
+ "",
51
+ "Options:",
52
+ " --daemon-url <url> BlueNote daemon URL (default: BLUENOTE_DAEMON_URL)",
53
+ " --daemon-token <token> BlueNote daemon token (default: BLUENOTE_DAEMON_TOKEN)",
54
+ " --check-daemon Check daemon health/capabilities without launching the TUI",
55
+ " --help, -h Show this help",
56
+ " --version, -v Show the version"
57
+ ].join(`
58
+ `) + `
59
+ `;
60
+ }
61
+ function bunRequiredResult(surface) {
62
+ return {
63
+ exitCode: 1,
64
+ stdout: "",
65
+ stderr: `The default bluenote-term ${surface} runner requires Bun. Pass ${surface === "CLI" ? "cliRunner" : "tuiRunner"} when using run${surface === "CLI" ? "Command" : "TuiCommand"} from Node.
66
+ `
67
+ };
68
+ }
69
+ async function runDefaultCli(args, version) {
70
+ if (!("Bun" in globalThis)) {
71
+ return bunRequiredResult("CLI");
72
+ }
73
+ const module = await import("./entry-9xj9qt6a.js");
74
+ return module.runCliAsync(args, version);
75
+ }
76
+ async function runDefaultTui() {
77
+ if (!("Bun" in globalThis)) {
78
+ return bunRequiredResult("TUI");
79
+ }
80
+ const module = await import("./app-t3b9bp7k.js");
81
+ return module.runTuiCliInteractive();
82
+ }
83
+ function writeCliResult(result, io) {
84
+ if (result.stdout) {
85
+ io.stdout.write(result.stdout);
86
+ }
87
+ if (result.stderr) {
88
+ io.stderr.write(result.stderr);
89
+ }
90
+ }
91
+ async function runAndWrite(resultPromise, io) {
92
+ const result = await resultPromise;
93
+ writeCliResult(result, io);
94
+ return result.exitCode;
95
+ }
96
+ function readDaemonCommandOptions(args, env) {
97
+ let checkDaemon = false;
98
+ let daemonUrl = env.BLUENOTE_DAEMON_URL;
99
+ let daemonToken = env.BLUENOTE_DAEMON_TOKEN;
100
+ for (let index = 0;index < args.length; index += 1) {
101
+ const arg = args[index];
102
+ if (arg === "--check-daemon") {
103
+ checkDaemon = true;
104
+ continue;
105
+ }
106
+ if (arg === "--daemon-url") {
107
+ daemonUrl = args[index + 1] ?? daemonUrl;
108
+ index += 1;
109
+ continue;
110
+ }
111
+ if (arg.startsWith("--daemon-url=")) {
112
+ daemonUrl = arg.slice("--daemon-url=".length);
113
+ continue;
114
+ }
115
+ if (arg === "--daemon-token") {
116
+ daemonToken = args[index + 1] ?? daemonToken;
117
+ index += 1;
118
+ continue;
119
+ }
120
+ if (arg.startsWith("--daemon-token=")) {
121
+ daemonToken = arg.slice("--daemon-token=".length);
122
+ }
123
+ }
124
+ return { checkDaemon, daemonUrl, daemonToken };
125
+ }
126
+ function daemonEndpoint(baseUrl, pathname) {
127
+ const url = new URL(baseUrl);
128
+ url.pathname = pathname;
129
+ url.search = "";
130
+ url.hash = "";
131
+ return url.toString();
132
+ }
133
+ async function fetchDaemonEndpoint(baseUrl, pathname, token) {
134
+ const response = await fetch(daemonEndpoint(baseUrl, pathname), {
135
+ headers: token ? { authorization: `Bearer ${token}` } : undefined
136
+ });
137
+ if (!response.ok) {
138
+ throw new Error(`${pathname} returned HTTP ${response.status}`);
139
+ }
140
+ await response.arrayBuffer();
141
+ }
142
+ async function performDaemonCheck(options) {
143
+ if (!options.daemonUrl) {
144
+ return { ok: false, error: "missing daemon URL. Pass --daemon-url or set BLUENOTE_DAEMON_URL." };
145
+ }
146
+ try {
147
+ await fetchDaemonEndpoint(options.daemonUrl, "/health", options.daemonToken);
148
+ await fetchDaemonEndpoint(options.daemonUrl, "/capabilities", options.daemonToken);
149
+ return { ok: true };
150
+ } catch (error) {
151
+ const message = error instanceof Error ? error.message : "unknown error";
152
+ return { ok: false, error: message };
153
+ }
154
+ }
155
+ function formatDaemonCheckResult(result) {
156
+ if (result.ok) {
157
+ return {
158
+ exitCode: 0,
159
+ stdout: `BlueNote daemon check passed.
160
+ `,
161
+ stderr: ""
162
+ };
163
+ }
164
+ return {
165
+ exitCode: 1,
166
+ stdout: "",
167
+ stderr: `BlueNote daemon check failed: ${result.error ?? "unknown error"}
168
+ `
169
+ };
170
+ }
171
+ async function runTuiCommand(args = [], options = {}) {
172
+ const io = options.io ?? process;
173
+ if (args.includes("--help") || args.includes("-h")) {
174
+ io.stdout.write(formatTuiHelp());
175
+ return 0;
176
+ }
177
+ if (args.includes("--version") || args.includes("-v")) {
178
+ io.stdout.write(`${options.version ?? package_default.version}
179
+ `);
180
+ return 0;
181
+ }
182
+ const daemonOptions = readDaemonCommandOptions(args, options.env ?? process.env);
183
+ if (daemonOptions.checkDaemon || daemonOptions.daemonUrl) {
184
+ const daemonCheckResult = await performDaemonCheck(daemonOptions);
185
+ if (daemonOptions.checkDaemon || !daemonCheckResult.ok) {
186
+ writeCliResult(formatDaemonCheckResult(daemonCheckResult), io);
187
+ return daemonCheckResult.ok ? 0 : 1;
188
+ }
189
+ }
190
+ return runAndWrite((options.tuiRunner ?? runDefaultTui)(), io);
191
+ }
192
+ async function runCommand(args, options = {}) {
193
+ const io = options.io ?? process;
194
+ const version = options.version ?? package_default.version;
195
+ const result = args[0] === "tui" ? (options.tuiRunner ?? runDefaultTui)() : (options.cliRunner ?? runDefaultCli)(args, version);
196
+ return runAndWrite(result, io);
197
+ }
198
+ export {
199
+ runTuiCommand,
200
+ runCommand
201
+ };