@onlooker-community/ecosystem 0.26.0 → 0.26.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ecosystem",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "description": "Observability substrate for Claude Code. Provides the shared $ONLOOKER_DIR storage root (default $HOME/.onlooker), canonical schema-validated event emission, session and tool tracking hooks, and prompt rules. Required by all other Onlooker plugins.",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -1,5 +1,5 @@
1
1
  {
2
- ".": "0.26.0",
2
+ ".": "0.26.1",
3
3
  "plugins/archivist": "0.1.0",
4
4
  "plugins/tribunal": "1.0.1",
5
5
  "plugins/echo": "0.2.0",
@@ -7,7 +7,7 @@
7
7
  "plugins/governor": "0.2.1",
8
8
  "plugins/compass": "0.2.0",
9
9
  "plugins/scribe": "0.2.1",
10
- "plugins/counsel": "0.3.0",
10
+ "plugins/counsel": "0.3.1",
11
11
  "plugins/warden": "0.2.0",
12
12
  "plugins/librarian": "0.2.0",
13
13
  "plugins/curator": "0.1.0",
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.26.1](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.26.0...ecosystem-v0.26.1) (2026-06-12)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **counsel:** drop unsupported --max-tokens flag from claude synthesis call :relieved: ([#79](https://github.com/onlooker-community/ecosystem/issues/79)) ([ade85ce](https://github.com/onlooker-community/ecosystem/commit/ade85cecb3243781f47e14fea4990ce31e69e8f4))
9
+ * **counsel:** stop pipefail from discarding all events on large logs :relieved: ([#78](https://github.com/onlooker-community/ecosystem/issues/78)) ([638347d](https://github.com/onlooker-community/ecosystem/commit/638347dec3b9df740b7a85c3e475fa2ffe5d054b))
10
+
3
11
  ## [0.26.0](https://github.com/onlooker-community/ecosystem/compare/ecosystem-v0.25.1...ecosystem-v0.26.0) (2026-06-11)
4
12
 
5
13
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onlooker-community/ecosystem",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "description": "Agents, skills, hooks, commands, rules, and MCP configurations that power [Onlooker](https://onlooker.dev)",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "counsel",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Weekly synthesis and recommendations from the full observability stack. Reads all plugin event logs, produces a structured improvement brief, and injects it at session start when the last brief is stale.",
5
5
  "author": {
6
6
  "name": "Onlooker Community",
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.1](https://github.com/onlooker-community/ecosystem/compare/counsel-v0.3.0...counsel-v0.3.1) (2026-06-12)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **counsel:** drop unsupported --max-tokens flag from claude synthesis call :relieved: ([#79](https://github.com/onlooker-community/ecosystem/issues/79)) ([ade85ce](https://github.com/onlooker-community/ecosystem/commit/ade85cecb3243781f47e14fea4990ce31e69e8f4))
9
+ * **counsel:** stop pipefail from discarding all events on large logs :relieved: ([#78](https://github.com/onlooker-community/ecosystem/issues/78)) ([638347d](https://github.com/onlooker-community/ecosystem/commit/638347dec3b9df740b7a85c3e475fa2ffe5d054b))
10
+
3
11
  ## [0.3.0](https://github.com/onlooker-community/ecosystem/compare/counsel-v0.2.0...counsel-v0.3.0) (2026-06-11)
4
12
 
5
13
 
@@ -46,9 +46,15 @@ counsel_read_events() {
46
46
  # Filter to events within the lookback window. If cutoff_ts is empty (date
47
47
  # command unavailable) fall through and include all events.
48
48
  local summary
49
+ # Run inside a subshell with pipefail disabled. head -c closes the pipe once
50
+ # chars_max bytes have arrived, which sends jq SIGPIPE; under the caller's
51
+ # `set -o pipefail` (the SessionStart hook and the /counsel skill both set it)
52
+ # that marks the whole pipeline failed, and the `|| summary=""` fallback would
53
+ # then discard *every* event on any log large enough to exceed chars_max.
54
+ # Disabling pipefail locally keeps the truncated output.
49
55
  # -rc: compact output keeps each object on one line (JSONL-shaped), which
50
56
  # downstream counsel_count_events and counsel_sources_from_events require.
51
- summary=$(jq -rc --arg cutoff "$cutoff_ts" '
57
+ summary=$(set +o pipefail; jq -rc --arg cutoff "$cutoff_ts" '
52
58
  select(.timestamp != null) |
53
59
  select($cutoff == "" or .timestamp >= $cutoff) |
54
60
  {
@@ -53,7 +53,11 @@ counsel_synthesize() {
53
53
  local events_text="${1:-}"
54
54
  local model="${2:-claude-haiku-4-5-20251001}"
55
55
  local timeout_s="${3:-90}"
56
+ # shellcheck disable=SC2034 # accepted for call-site compatibility; the
57
+ # claude CLI print mode exposes no max-tokens/temperature flags, so neither
58
+ # is forwarded (see claude_args below).
56
59
  local max_tokens="${4:-4096}"
60
+ # shellcheck disable=SC2034
57
61
  local temperature="${5:-0.4}"
58
62
 
59
63
  [[ -z "$events_text" ]] && return 1
@@ -74,7 +78,10 @@ counsel_synthesize() {
74
78
  printf '</event_log>\n'
75
79
  } > "$prompt_file"
76
80
 
77
- local claude_args=(-p --max-turns 1 --model "$model" --max-tokens "$max_tokens")
81
+ # NOTE: `claude -p` does not accept --max-tokens (it errors with "unknown
82
+ # option") and has no temperature flag, so we pass neither. Output length is
83
+ # governed by the model/prompt; the synthesis prompt asks for terse JSON.
84
+ local claude_args=(-p --max-turns 1 --model "$model")
78
85
 
79
86
  local response=""
80
87
  if command -v timeout >/dev/null 2>&1; then
@@ -114,6 +114,34 @@ setup() {
114
114
  [ "$output" = "3" ]
115
115
  }
116
116
 
117
+ @test "read_events survives caller pipefail when output exceeds chars_max" {
118
+ # Regression: head -c closes the pipe once chars_max bytes arrive, sending jq
119
+ # SIGPIPE. Under the caller's `set -o pipefail` (as the hook and skill run),
120
+ # the reader must still return the truncated output, not discard everything.
121
+ local log="${BATS_TEST_TMPDIR}/big-events.jsonl"
122
+ local ts
123
+ ts=$(date -u '+%Y-%m-%dT%H:%M:%SZ' 2>/dev/null) || ts="2099-01-01T00:00:00Z"
124
+ : > "$log"
125
+ local i
126
+ for ((i = 0; i < 60; i++)); do
127
+ printf '%s\n' \
128
+ "{\"event_type\":\"tribunal.gate.blocked\",\"timestamp\":\"${ts}\",\"session_id\":\"s${i}\",\"payload\":{\"k\":\"vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\"}}" \
129
+ >> "$log"
130
+ done
131
+ export ONLOOKER_EVENTS_LOG="$log"
132
+
133
+ # Tiny cap so head closes the pipe after the first event or two.
134
+ local out
135
+ set -o pipefail
136
+ out=$(counsel_read_events "30" "200")
137
+ set +o pipefail
138
+
139
+ [ -n "$out" ]
140
+ run counsel_count_events "$out"
141
+ [ "$status" -eq 0 ]
142
+ [ "$output" -ge 1 ]
143
+ }
144
+
117
145
  @test "read_events output preserves source types for sources_from_events" {
118
146
  local log="${BATS_TEST_TMPDIR}/source-events.jsonl"
119
147
  local ts