@meridiona/meridian-darwin-arm64 1.51.0 → 1.52.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.
package/.env.example CHANGED
@@ -188,8 +188,9 @@
188
188
  # structured log ingestion into a local OpenObserve instance)
189
189
  # ---------------------------------------------------------------------------
190
190
 
191
- # base64(email:password) for your local OpenObserve instance.
192
- # When unset, OTLP export is silently skipped logs still go to .jsonl files.
191
+ # DEPRECATED the Rust daemon ignores this; set OpenObserve credentials in
192
+ # the dashboard Settings instead (stored in settings.json). Still read by the
193
+ # Python services' exporter and as an installer fallback for old setups.
193
194
  # Generate: echo -n "you@your-org.com:yourpassword" | base64
194
195
  # MERIDIAN_OO_AUTH=base64encodedcredentials
195
196
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 1.51.0
1
+ 1.52.1
package/bin/meridian CHANGED
Binary file
package/bin/meridian-tray CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridiona/meridian-darwin-arm64",
3
- "version": "1.51.0",
3
+ "version": "1.52.1",
4
4
  "description": "Prebuilt Meridian app for macOS arm64 (daemon binary + dashboard + Python services). Installed via @meridiona/meridian.",
5
5
  "homepage": "https://github.com/Meridiona/meridian",
6
6
  "repository": {
@@ -43,14 +43,14 @@
43
43
  <string>{{HOME}}/.meridian/meridian.db</string>
44
44
  <key>POLL_INTERVAL_SECS</key>
45
45
  <string>60</string>
46
- <key>RUST_LOG</key>
47
- <string>meridian=info</string>
48
- <!-- OTLP auth for OpenObserve must be set here (not just .env)
49
- because the Rust binary reads env vars before dotenv is loaded.
50
- The install script reads MERIDIAN_OO_AUTH from the repo-root .env and
51
- substitutes the {{MERIDIAN_OO_AUTH}} placeholder below. -->
52
- <key>MERIDIAN_OO_AUTH</key>
53
- <string>{{MERIDIAN_OO_AUTH}}</string>
46
+ <!-- RUST_LOG is intentionally NOT set here. The daemon derives its log
47
+ filter from settings.log_level (dashboard Settings → Log Level) and
48
+ hot-reloads it on the next poll tick; pinning RUST_LOG would make
49
+ reload_log_level() a no-op and silently defeat the UI control. A
50
+ power user can still export RUST_LOG to override. -->
51
+ <!-- MERIDIAN_OO_AUTH is deprecated and ignored by the daemon OpenObserve
52
+ credentials come from settings.json (dashboard Settings). The key is
53
+ left out of this plist on purpose. -->
54
54
  <key>MERIDIAN_OTLP_ENDPOINT</key>
55
55
  <string>{{MERIDIAN_OTLP_ENDPOINT}}</string>
56
56
  </dict>
@@ -0,0 +1,69 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ com.meridiona.openobserve — runs OpenObserve as a local OTLP backend for
4
+ traces + logs from the Meridian stack. Serves on http://localhost:5080.
5
+
6
+ Install via scripts/install-openobserve-daemon.sh which copies this file
7
+ into ~/Library/LaunchAgents/ with absolute paths and credentials
8
+ substituted, then bootstraps it under launchd. The plist below uses
9
+ {{HOME}}, {{OO_BIN}}, {{OO_EMAIL}}, and {{OO_PASSWORD}} placeholders that
10
+ the install script decodes from MERIDIAN_OO_AUTH and substitutes.
11
+
12
+ Uninstall:
13
+ scripts/uninstall-openobserve-daemon.sh
14
+ Or manually:
15
+ launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.meridiona.openobserve.plist
16
+ rm ~/Library/LaunchAgents/com.meridiona.openobserve.plist
17
+ -->
18
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
19
+ <plist version="1.0">
20
+ <dict>
21
+ <key>Label</key>
22
+ <string>com.meridiona.openobserve</string>
23
+
24
+ <!-- run.sh reads ~/.openobserve/.log_level for RUST_LOG (default: warn)
25
+ and sets memory caps before exec-ing the binary. -->
26
+ <key>ProgramArguments</key>
27
+ <array>
28
+ <string>/bin/bash</string>
29
+ <string>{{HOME}}/.openobserve/run.sh</string>
30
+ </array>
31
+
32
+ <key>EnvironmentVariables</key>
33
+ <dict>
34
+ <key>HOME</key>
35
+ <string>{{HOME}}</string>
36
+ <!-- Admin credentials used by OO to bootstrap its first-run account.
37
+ Decoded from MERIDIAN_OO_AUTH = base64(email:password) by the
38
+ install script. -->
39
+ <key>ZO_ROOT_USER_EMAIL</key>
40
+ <string>{{OO_EMAIL}}</string>
41
+ <key>ZO_ROOT_USER_PASSWORD</key>
42
+ <string>{{OO_PASSWORD}}</string>
43
+ <key>ZO_DATA_DIR</key>
44
+ <string>{{HOME}}/.openobserve/data</string>
45
+ <key>ZO_HTTP_PORT</key>
46
+ <string>5080</string>
47
+ <key>ZO_GRPC_PORT</key>
48
+ <string>5081</string>
49
+ <key>ZO_TELEMETRY</key>
50
+ <string>false</string>
51
+ </dict>
52
+
53
+ <key>StandardOutPath</key>
54
+ <string>{{HOME}}/.meridian/logs/openobserve.log</string>
55
+ <key>StandardErrorPath</key>
56
+ <string>{{HOME}}/.meridian/logs/openobserve-error.log</string>
57
+
58
+ <!-- RunAtLoad true: OO must be up before the Rust daemon and Python agents
59
+ send traces, so it starts immediately on login. -->
60
+ <key>RunAtLoad</key>
61
+ <true/>
62
+ <key>KeepAlive</key>
63
+ <true/>
64
+ <key>ThrottleInterval</key>
65
+ <integer>30</integer>
66
+ <key>ProcessType</key>
67
+ <string>Background</string>
68
+ </dict>
69
+ </plist>
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env bash
2
+ # ambient dev tool that watches what you do and updates your PM tickets automatically, boosting developer productivity
3
+ # Install OpenObserve as a launchd LaunchAgent under the current user.
4
+ # Serves on http://localhost:5080 and auto-starts on login.
5
+ #
6
+ # ./scripts/install-openobserve-daemon.sh
7
+ #
8
+ # Re-running is safe — it bootouts the existing agent first, rewrites the
9
+ # plist with current credentials, and reloads it.
10
+ #
11
+ # Credentials come from settings.json (oo_email/oo_password, set in the
12
+ # dashboard Settings). MERIDIAN_OO_AUTH in <repo>/.env is DEPRECATED and used
13
+ # only as a fallback; with no credentials anywhere the agent is installed
14
+ # stopped and the dashboard toggle starts it once credentials are set.
15
+ #
16
+ # Uninstall:
17
+ # ./scripts/uninstall-openobserve-daemon.sh
18
+
19
+ set -euo pipefail
20
+
21
+ LABEL="com.meridiona.openobserve"
22
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
+ TEMPLATE="${SCRIPT_DIR}/${LABEL}.plist"
24
+
25
+ LAUNCH_AGENTS="${HOME}/Library/LaunchAgents"
26
+ PLIST_DEST="${LAUNCH_AGENTS}/${LABEL}.plist"
27
+
28
+ GUI_TARGET="gui/$(id -u)"
29
+
30
+ if [[ ! -f "${TEMPLATE}" ]]; then
31
+ echo "✗ template not found: ${TEMPLATE}" >&2
32
+ exit 1
33
+ fi
34
+
35
+ # Locate the OpenObserve binary.
36
+ OO_BIN=""
37
+ if [[ -x "${HOME}/.openobserve/openobserve" ]]; then
38
+ OO_BIN="${HOME}/.openobserve/openobserve"
39
+ elif command -v openobserve >/dev/null 2>&1; then
40
+ OO_BIN="$(command -v openobserve)"
41
+ fi
42
+
43
+ if [[ -z "${OO_BIN}" ]]; then
44
+ echo "→ OpenObserve binary not found — downloading v0.11.0 (last release with arm64 binary)..."
45
+ _oo_arch="$(uname -m)"
46
+ case "$_oo_arch" in
47
+ arm64) _oo_arch="arm64" ;;
48
+ x86_64) _oo_arch="amd64" ;;
49
+ *) echo "✗ Unsupported arch: $_oo_arch" >&2; exit 1 ;;
50
+ esac
51
+ _oo_ver="v0.11.0"
52
+ _oo_url="https://github.com/openobserve/openobserve/releases/download/${_oo_ver}/openobserve-${_oo_ver}-darwin-${_oo_arch}.tar.gz"
53
+ mkdir -p "${HOME}/.openobserve"
54
+ if curl -fsSL -o "${HOME}/.openobserve/openobserve.tar.gz" "$_oo_url" \
55
+ && tar -xzf "${HOME}/.openobserve/openobserve.tar.gz" -C "${HOME}/.openobserve" \
56
+ && [[ -x "${HOME}/.openobserve/openobserve" ]]; then
57
+ rm -f "${HOME}/.openobserve/openobserve.tar.gz"
58
+ OO_BIN="${HOME}/.openobserve/openobserve"
59
+ echo "✓ OpenObserve ${_oo_ver} downloaded"
60
+ else
61
+ rm -f "${HOME}/.openobserve/openobserve.tar.gz"
62
+ echo "✗ Download failed from ${_oo_url}" >&2
63
+ echo " Install manually: https://openobserve.ai/docs/install/" >&2
64
+ exit 1
65
+ fi
66
+ fi
67
+
68
+ # Resolve OpenObserve root credentials. settings.json (written by the dashboard
69
+ # Settings page) is the canonical source; MERIDIAN_OO_AUTH in <repo>/.env is
70
+ # DEPRECATED and honoured only as a fallback for not-yet-migrated installs.
71
+ # With no credentials anywhere, the plist is written with placeholders and the
72
+ # service is left stopped — enabling OpenObserve Export in the dashboard
73
+ # patches real credentials into the plist (POST /api/openobserve) before the
74
+ # service's first start, which is when OpenObserve creates its root account.
75
+ _get_setting() {
76
+ python3 -c "import json,sys;print(json.load(open(sys.argv[1])).get(sys.argv[2]) or '')" "$1" "$2" 2>/dev/null || true
77
+ }
78
+
79
+ OO_EMAIL=""
80
+ OO_PASSWORD=""
81
+ for _settings in "${HOME}/.meridian/settings.json" "$(cd "${SCRIPT_DIR}/.." && pwd)/settings.json"; do
82
+ [[ -f "${_settings}" ]] || continue
83
+ OO_EMAIL="$(_get_setting "${_settings}" oo_email)"
84
+ OO_PASSWORD="$(_get_setting "${_settings}" oo_password)"
85
+ if [[ -n "${OO_EMAIL}" && -n "${OO_PASSWORD}" ]]; then
86
+ echo "→ using OpenObserve credentials from ${_settings}"
87
+ break
88
+ fi
89
+ OO_EMAIL=""; OO_PASSWORD=""
90
+ done
91
+
92
+ if [[ -z "${OO_EMAIL}" ]]; then
93
+ ENV_FILE="$(cd "${SCRIPT_DIR}/.." && pwd)/.env"
94
+ OO_AUTH=""
95
+ if [[ -f "${ENV_FILE}" ]]; then
96
+ OO_AUTH="$(grep -E '^MERIDIAN_OO_AUTH=' "${ENV_FILE}" | cut -d= -f2- | tr -d '[:space:]')" || true
97
+ fi
98
+ if [[ -n "${OO_AUTH}" ]]; then
99
+ echo " ⚠ MERIDIAN_OO_AUTH is DEPRECATED — set OpenObserve credentials in the dashboard Settings instead" >&2
100
+ OO_CREDENTIALS="$(printf '%s' "${OO_AUTH}" | base64 --decode 2>/dev/null)" || OO_CREDENTIALS=""
101
+ OO_EMAIL="${OO_CREDENTIALS%%:*}"
102
+ OO_PASSWORD="${OO_CREDENTIALS#*:}"
103
+ if [[ -z "${OO_EMAIL}" || -z "${OO_PASSWORD}" || "${OO_EMAIL}" == "${OO_CREDENTIALS}" ]]; then
104
+ OO_EMAIL=""; OO_PASSWORD=""
105
+ fi
106
+ fi
107
+ fi
108
+
109
+ _no_creds=0
110
+ if [[ -z "${OO_EMAIL}" || -z "${OO_PASSWORD}" ]]; then
111
+ _no_creds=1
112
+ OO_EMAIL="setup-pending@meridian.local"
113
+ OO_PASSWORD="setup-pending"
114
+ echo "→ no OpenObserve credentials yet — installing the agent stopped; enable"
115
+ echo " OpenObserve Export in the dashboard Settings to set them and start it"
116
+ fi
117
+
118
+ mkdir -p "${HOME}/.meridian/logs"
119
+ mkdir -p "${HOME}/.openobserve/data"
120
+ mkdir -p "${LAUNCH_AGENTS}"
121
+
122
+ # Remove legacy ai.openobserve agent — it conflicts with com.meridiona.openobserve
123
+ # (both try to bind port 5080, causing a crash-loop on the Meridian plist).
124
+ _legacy_plist="${LAUNCH_AGENTS}/ai.openobserve.plist"
125
+ if [[ -f "${_legacy_plist}" ]]; then
126
+ echo "→ removing legacy ai.openobserve agent"
127
+ launchctl bootout "gui/$(id -u)/ai.openobserve" 2>/dev/null || true
128
+ rm -f "${_legacy_plist}"
129
+ echo "✓ legacy agent removed"
130
+ fi
131
+
132
+ # Write the launcher script. run.sh reads ~/.openobserve/.log_level for
133
+ # RUST_LOG (default: warn) and sets memory caps before exec-ing the binary.
134
+ echo "→ writing ${HOME}/.openobserve/run.sh"
135
+ cat > "${HOME}/.openobserve/run.sh" <<'RUNEOF'
136
+ #!/usr/bin/env bash
137
+ # ambient dev tool that watches what you do and updates your PM tickets automatically, boosting developer productivity
138
+ # OpenObserve launcher. Called by launchd (com.meridiona.openobserve).
139
+ #
140
+ # Log level override (dev):
141
+ # echo info > ~/.openobserve/.log_level # verbose
142
+ # echo warn > ~/.openobserve/.log_level # default (quiet)
143
+ # echo debug > ~/.openobserve/.log_level # very verbose
144
+ # rm ~/.openobserve/.log_level # back to default
145
+ # launchctl kickstart -k gui/$(id -u)/com.meridiona.openobserve
146
+
147
+ set -euo pipefail
148
+
149
+ _level_file="${HOME}/.openobserve/.log_level"
150
+ if [[ -f "${_level_file}" ]]; then
151
+ RUST_LOG="$(tr -d '[:space:]' < "${_level_file}")"
152
+ else
153
+ RUST_LOG="warn"
154
+ fi
155
+ export RUST_LOG
156
+
157
+ export ZO_MEMORY_CACHE_MAX_SIZE=2147483648 # 2 GB (cache layer)
158
+ export ZO_DATAFUSION_POOL_SIZE=4294967296 # 4 GB (query engine)
159
+
160
+ exec "${HOME}/.openobserve/openobserve"
161
+ RUNEOF
162
+ chmod +x "${HOME}/.openobserve/run.sh"
163
+ echo "✓ run.sh written"
164
+
165
+ # Write the plist via Python so email/password values with special characters
166
+ # are substituted safely without sed delimiter collisions.
167
+ echo "→ writing ${PLIST_DEST}"
168
+ python3 - "${TEMPLATE}" "${PLIST_DEST}" "${HOME}" "${OO_BIN}" "${OO_EMAIL}" "${OO_PASSWORD}" <<'PYEOF'
169
+ import sys
170
+ template_path, dest_path, home, oo_bin, oo_email, oo_password = sys.argv[1:]
171
+ with open(template_path) as f:
172
+ content = f.read()
173
+ for placeholder, value in [
174
+ ("{{HOME}}", home),
175
+ ("{{OO_BIN}}", oo_bin),
176
+ ("{{OO_EMAIL}}", oo_email),
177
+ ("{{OO_PASSWORD}}", oo_password),
178
+ ]:
179
+ content = content.replace(placeholder, value)
180
+ with open(dest_path, "w") as f:
181
+ f.write(content)
182
+ PYEOF
183
+
184
+ if ! plutil -lint "${PLIST_DEST}" >/dev/null; then
185
+ echo "✗ plist failed plutil validation" >&2
186
+ exit 1
187
+ fi
188
+
189
+ echo "→ bootout ${LABEL} (if loaded)"
190
+ launchctl bootout "${GUI_TARGET}/${LABEL}" 2>/dev/null || true
191
+ # Wait until launchd confirms the service is gone before re-bootstrapping.
192
+ # A fixed sleep is unreliable — on slower machines or when the prior process
193
+ # takes time to exit, bootstrap can fail with EIO (errno 5) if the domain
194
+ # entry hasn't been fully removed yet.
195
+ _bootout_wait=0
196
+ while launchctl print "${GUI_TARGET}/${LABEL}" >/dev/null 2>&1; do
197
+ sleep 1
198
+ _bootout_wait=$(( _bootout_wait + 1 ))
199
+ if [[ "${_bootout_wait}" -ge 15 ]]; then
200
+ echo "⚠ ${LABEL} still in launchd domain after 15s — proceeding anyway" >&2
201
+ break
202
+ fi
203
+ done
204
+
205
+ # Respect the runtime toggle: the service runs only when "OpenObserve Export"
206
+ # is enabled in Settings. The plist is always installed so the UI's toggle
207
+ # (POST /api/openobserve) can start/stop the service on demand; here we only
208
+ # decide the INITIAL state. No settings.json anywhere → off (matches
209
+ # RuntimeSettings::default and the UI default).
210
+ _otlp_enabled() {
211
+ local f
212
+ for f in "${HOME}/.meridian/settings.json" "$(cd "${SCRIPT_DIR}/.." && pwd)/settings.json"; do
213
+ [[ -f "$f" ]] || continue
214
+ grep -q '"otlp_enabled"[[:space:]]*:[[:space:]]*true' "$f" && return 0
215
+ return 1
216
+ done
217
+ return 1
218
+ }
219
+
220
+ if [[ "${_no_creds}" -eq 0 ]] && _otlp_enabled; then
221
+ echo "→ bootstrap ${LABEL} (OpenObserve Export is enabled in settings)"
222
+ launchctl bootstrap "${GUI_TARGET}" "${PLIST_DEST}"
223
+ launchctl enable "${GUI_TARGET}/${LABEL}"
224
+ launchctl kickstart -k "${GUI_TARGET}/${LABEL}"
225
+ echo
226
+ echo "✓ OpenObserve installed and started"
227
+ else
228
+ launchctl disable "${GUI_TARGET}/${LABEL}" 2>/dev/null || true
229
+ echo
230
+ echo "✓ OpenObserve installed (service left stopped — OpenObserve Export is"
231
+ echo " disabled in Settings; enable the toggle in the dashboard to start it)"
232
+ fi
233
+ echo
234
+ echo " open http://localhost:5080 # the UI"
235
+ echo " tail -f ~/.meridian/logs/openobserve.log # live stdout"
236
+ echo " tail -f ~/.meridian/logs/openobserve-error.log # live stderr"
237
+ echo " ${SCRIPT_DIR}/uninstall-openobserve-daemon.sh # remove"
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+ # ambient dev tool that watches what you do and updates your PM tickets automatically, boosting developer productivity
3
+ # Stop and remove the OpenObserve launchd agent.
4
+ # Data at ~/.openobserve/data/ is left intact.
5
+
6
+ set -euo pipefail
7
+
8
+ LABEL="com.meridiona.openobserve"
9
+ PLIST="${HOME}/Library/LaunchAgents/${LABEL}.plist"
10
+ GUI_TARGET="gui/$(id -u)"
11
+
12
+ # Remove legacy agent if still present.
13
+ _legacy="${HOME}/Library/LaunchAgents/ai.openobserve.plist"
14
+ if [[ -f "${_legacy}" ]]; then
15
+ launchctl bootout "${GUI_TARGET}/ai.openobserve" 2>/dev/null || true
16
+ rm -f "${_legacy}"
17
+ echo "✓ legacy ai.openobserve agent removed"
18
+ fi
19
+
20
+ if [[ ! -f "${PLIST}" ]]; then
21
+ echo "(${LABEL} not installed)"
22
+ exit 0
23
+ fi
24
+
25
+ if launchctl print "${GUI_TARGET}/${LABEL}" >/dev/null 2>&1; then
26
+ echo "→ bootout ${LABEL}"
27
+ launchctl bootout "${GUI_TARGET}" "${PLIST}" || true
28
+ fi
29
+
30
+ rm -f "${PLIST}"
31
+ echo "✓ ${LABEL} uninstalled"
32
+ echo " (trace data at ~/.openobserve/data/ is preserved)"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meridian-agents"
7
- version = "1.51.0"
7
+ version = "1.52.1"
8
8
  description = "Meridian agents — MLX classifier server and Jira worklog synthesis for meridian.db"
9
9
  requires-python = ">=3.11"
10
10
  authors = [{ name = "Meridiona" }]
package/ui.tar.gz CHANGED
Binary file