pluribus-context 0.3.39 → 0.3.40
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/CHANGELOG.md +5 -0
- package/README.md +1 -1
- package/bin/pluribus.js +2 -0
- package/docs/context-budget-receipts.md +43 -0
- package/examples/tool-surface-diff-receipts/tool-surface-diff-receipt.json +61 -0
- package/package.json +6 -1
- package/src/commands/demo.js +120 -1
- package/src/utils/version.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
All notable changes to Pluribus are documented here.
|
|
6
6
|
|
|
7
|
+
## 0.3.40 - 2026-06-09
|
|
8
|
+
|
|
9
|
+
- Added `pluribus demo tool-surface-diff`, a tiny npm-runnable MCP dynamic-discovery receipt demo for proving discovered, activated, withheld, and blocked runtime tool-surface changes without logging raw schemas, prompts, or results.
|
|
10
|
+
- Expanded npm discovery keywords around MCP audit, gateways, security, tool discovery, and audit trails so the package is easier to find from the market lane now forming around MCP governance.
|
|
11
|
+
|
|
7
12
|
## 0.3.39 - 2026-06-07
|
|
8
13
|
|
|
9
14
|
- Added `pluribus demo mcp-telemetry-import`, a tiny npm-runnable converter from MCP `rpc-messages.jsonl`-style JSON-RPC traces into privacy-safe audit receipts that preserve attribution, redacted shapes, status, and timing gaps without storing raw tool payloads.
|
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ The original sync workflow is still useful: Pluribus can keep project instructio
|
|
|
14
14
|
|
|
15
15
|
It is **not** a persistent memory layer, retrieval system, agent orchestrator, enterprise ContextOps platform, or agent-merging framework. Think evidence for context boundaries: `CLAUDE.md`, `.cursorrules`, `copilot-instructions.md`, `AGENTS.md`, MCP Tool Search, Agent Skills, RAG/code-search, pruning, and compaction — with privacy-safe receipts instead of raw content dumps.
|
|
16
16
|
|
|
17
|
-
**Reviewer shortcut:** evaluating Pluribus for a list, newsletter, package roundup, or tool directory? Use the [Community Review Packet](docs/community-review-packet.md) for copy-paste directory submission fields, safety/removability notes, feedback links, and disposable 60-second smoke tests. If you only run one command for the cross-tool audit, try `npx --yes pluribus-context@latest audit --json --fidelity-report` to see native discovery surfaces, generic fallbacks, load evidence, duplicate-load selection evidence, manual activation requirements, effective context scope, and semantic differences. For the agent-observability wedge, start with [context-budget receipts](docs/context-budget-receipts.md): privacy-safe evidence for what MCP schemas, skills, memory, subagents, CLI help, retrieval chunks, pruning runs, or compaction summaries crossed an agent boundary. If you want the same idea as a copyable skill, use the [context-receipts Agent Skill recipe](skills/context-receipts/). npm `latest` is currently aligned with the GitHub release; the review packet also documents a GitHub-release smoke fallback for future release-lag windows.
|
|
17
|
+
**Reviewer shortcut:** evaluating Pluribus for a list, newsletter, package roundup, or tool directory? Use the [Community Review Packet](docs/community-review-packet.md) for copy-paste directory submission fields, safety/removability notes, feedback links, and disposable 60-second smoke tests. If you only run one command for the cross-tool audit, try `npx --yes pluribus-context@latest audit --json --fidelity-report` to see native discovery surfaces, generic fallbacks, load evidence, duplicate-load selection evidence, manual activation requirements, effective context scope, and semantic differences. For the agent-observability wedge, start with [context-budget receipts](docs/context-budget-receipts.md): privacy-safe evidence for what MCP schemas, skills, memory, subagents, CLI help, retrieval chunks, pruning runs, or compaction summaries crossed an agent boundary. It now explicitly covers the "Tool Search fixed MCP bloat" objection: the receipt proves which lane stayed deferred, which tool was expanded, and whether schemas leaked through `messages`/bootstrap anyway. For a 60-second runtime-discovery proof, run `npx --yes pluribus-context@latest demo tool-surface-diff --json`; it validates a receipt for discovered → activated → withheld/blocked MCP tools without raw schemas/prompts/results. If you want the same idea as a copyable skill, use the [context-receipts Agent Skill recipe](skills/context-receipts/). npm `latest` is currently aligned with the GitHub release; the review packet also documents a GitHub-release smoke fallback for future release-lag windows.
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
package/bin/pluribus.js
CHANGED
|
@@ -94,6 +94,8 @@ EXAMPLES
|
|
|
94
94
|
pluribus demo mcp-audit-receipt --json
|
|
95
95
|
pluribus demo mcp-telemetry-import
|
|
96
96
|
pluribus demo mcp-telemetry-import --json
|
|
97
|
+
pluribus demo tool-surface-diff
|
|
98
|
+
pluribus demo tool-surface-diff --json
|
|
97
99
|
|
|
98
100
|
DOCS
|
|
99
101
|
https://github.com/caioribeiroclw-pixel/pluribus
|
|
@@ -8,6 +8,49 @@ This is different from generic token accounting. A context-budget receipt should
|
|
|
8
8
|
|
|
9
9
|
If you want a copyable Agent Skill recipe instead of a spec-style guide, see [`skills/context-receipts/`](../skills/context-receipts/). It turns the receipt pattern into a 60-second smoke checklist for Tool Search, skills, and subagent boundaries.
|
|
10
10
|
|
|
11
|
+
## If Tool Search already fixed the bloat
|
|
12
|
+
|
|
13
|
+
Modern hosts can defer large MCP catalogs behind Tool Search or similar lazy discovery. That changes the receipt question; it does not remove it.
|
|
14
|
+
|
|
15
|
+
Do not use a context-budget receipt to re-prove that every schema was smaller than before. Use it to prove the boundary that lazy loading promised:
|
|
16
|
+
|
|
17
|
+
- the catalog/index was loaded instead of full definitions;
|
|
18
|
+
- the selected query loaded only the matching tool definitions;
|
|
19
|
+
- unselected tool groups stayed deferred or withheld;
|
|
20
|
+
- a schema did not enter a side lane such as `messages`, subagent bootstrap, skill preamble, or memory hydration; and
|
|
21
|
+
- the receipt records what evidence is missing when only fallback client telemetry exists.
|
|
22
|
+
|
|
23
|
+
This makes the receipt useful in the common objection case: "MCP context bloat is solved by Tool Search." A good receipt should answer: **solved where, for this turn, through which lane, and with what proof?**
|
|
24
|
+
|
|
25
|
+
Runnable fixture for the normal happy path:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
node examples/context-input-evidence/convert-mcp-tool-search-log.mjs
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Public trace:
|
|
32
|
+
|
|
33
|
+
- `examples/context-input-evidence/mcp-tool-search-otel-trace.json`
|
|
34
|
+
|
|
35
|
+
Minimum hidden-bypass fields for managed seats or gateways:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"event.name": "mcp.deferral.evaluated",
|
|
40
|
+
"mcp.defer_loading.enabled": true,
|
|
41
|
+
"mcp.catalog.deferred": true,
|
|
42
|
+
"mcp.tool_search.selected_tool_count": 0,
|
|
43
|
+
"context.messages.remote_mcp_schema_count_bucket": "over_25",
|
|
44
|
+
"context.messages.delta_token_bucket": "under_100k",
|
|
45
|
+
"context.attribution": "remote_mcp_schema_in_messages",
|
|
46
|
+
"expected_behavior": "deferred_until_tool_search_match",
|
|
47
|
+
"verdict": "deferral_bypassed",
|
|
48
|
+
"privacy.raw_schema_included": false
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
That shape deliberately avoids raw schema bodies, connector names, private URLs, and prompt text. It proves attribution, not whether the selected tool was semantically optimal.
|
|
53
|
+
|
|
11
54
|
## When to use this receipt
|
|
12
55
|
|
|
13
56
|
Use a context-budget receipt when a coding agent looks lazy, fails with `prompt is too long`, or returns a tiny summary after a subagent/tool-heavy step and you need to distinguish:
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "pluribus.mcp_tool_surface_diff_receipt.v1",
|
|
3
|
+
"run_id": "tool-surface-diff-demo",
|
|
4
|
+
"generated_at": "2026-06-09T13:00:00Z",
|
|
5
|
+
"platform": {
|
|
6
|
+
"name": "enterprise-mcp-dynamic-discovery",
|
|
7
|
+
"audit_sink": "admin-center-or-siem"
|
|
8
|
+
},
|
|
9
|
+
"catalog": {
|
|
10
|
+
"server_id": "mcp://sales-ops-gateway",
|
|
11
|
+
"previous_hash": "sha256:previous-catalog-redacted",
|
|
12
|
+
"current_hash": "sha256:current-catalog-redacted"
|
|
13
|
+
},
|
|
14
|
+
"runtime_discovery": {
|
|
15
|
+
"enabled": true,
|
|
16
|
+
"trigger": "runtime_tool_catalog_diff"
|
|
17
|
+
},
|
|
18
|
+
"privacy_boundary": {
|
|
19
|
+
"raw_schemas": "omitted_hash_only",
|
|
20
|
+
"raw_prompts": "omitted",
|
|
21
|
+
"raw_results": "omitted"
|
|
22
|
+
},
|
|
23
|
+
"tools": [
|
|
24
|
+
{
|
|
25
|
+
"tool_id": "tool:crm.search_accounts",
|
|
26
|
+
"name_hash": "sha256:0cc2efb4a26f4c5eb4f7d8c99e78d37adbdba07d50ee7873452c0216d02b1f48",
|
|
27
|
+
"schema_hash": "sha256:6f4fbe0a8be41b6e29c0c1c113aac38dfefdd12b89c6e9d4a996df2537acdb71",
|
|
28
|
+
"status": "activated",
|
|
29
|
+
"validation_outcome": "accepted",
|
|
30
|
+
"diff_summary": {
|
|
31
|
+
"added_fields": 1,
|
|
32
|
+
"removed_fields": 0,
|
|
33
|
+
"changed_fields": 0
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"tool_id": "tool:crm.export_contacts",
|
|
38
|
+
"name_hash": "sha256:f38f53f9ba3c348e67332a24a7d15f5e7ab1c9253cf01f3451e15d9e15435e13",
|
|
39
|
+
"schema_hash": "sha256:95ddc9b86a0c2d8bc6f3ca0bcce93dca2469ced51b0d38c8f8c5aa88554e0032",
|
|
40
|
+
"status": "blocked",
|
|
41
|
+
"validation_outcome": "blocked_by_rai",
|
|
42
|
+
"diff_summary": {
|
|
43
|
+
"added_fields": 4,
|
|
44
|
+
"removed_fields": 0,
|
|
45
|
+
"changed_fields": 2
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"tool_id": "tool:billing.refund_invoice",
|
|
50
|
+
"name_hash": "sha256:abfdaf6f0a3f33342aca6d8b0d63c303e99978481d26827843a901cb6237617d",
|
|
51
|
+
"schema_hash": "sha256:3b4fdc3ec15d2fa1cc589c1c7de280a19772d5745b4ef54d27806714be12bb8c",
|
|
52
|
+
"status": "withheld",
|
|
53
|
+
"validation_outcome": "entitlement_filtered",
|
|
54
|
+
"diff_summary": {
|
|
55
|
+
"added_fields": 0,
|
|
56
|
+
"removed_fields": 0,
|
|
57
|
+
"changed_fields": 0
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pluribus-context",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.40",
|
|
4
4
|
"description": "AI context and rules sync CLI for Claude.md, Claude Code, Cursor, and Copilot instructions, with privacy-safe context receipts that prove what memory, tools, skills, compactions, and security findings crossed agent boundaries without logging raw content.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://github.com/caioribeiroclw-pixel/pluribus#readme",
|
|
@@ -68,6 +68,11 @@
|
|
|
68
68
|
"ai-agent-observability",
|
|
69
69
|
"opentelemetry",
|
|
70
70
|
"mcp",
|
|
71
|
+
"mcp-audit",
|
|
72
|
+
"mcp-gateway",
|
|
73
|
+
"mcp-security",
|
|
74
|
+
"tool-discovery",
|
|
75
|
+
"audit-trail",
|
|
71
76
|
"drift-detection",
|
|
72
77
|
"openclaw",
|
|
73
78
|
"rules",
|
package/src/commands/demo.js
CHANGED
|
@@ -11,9 +11,11 @@ const DEFAULT_DEMO = 'skill-use-rate'
|
|
|
11
11
|
const SKILL_USE_RATE_DEMO = 'skill-use-rate'
|
|
12
12
|
const MCP_AUDIT_RECEIPT_DEMO = 'mcp-audit-receipt'
|
|
13
13
|
const MCP_TELEMETRY_IMPORT_DEMO = 'mcp-telemetry-import'
|
|
14
|
-
const
|
|
14
|
+
const TOOL_SURFACE_DIFF_DEMO = 'tool-surface-diff'
|
|
15
|
+
const AVAILABLE_DEMOS = [SKILL_USE_RATE_DEMO, MCP_AUDIT_RECEIPT_DEMO, MCP_TELEMETRY_IMPORT_DEMO, TOOL_SURFACE_DIFF_DEMO]
|
|
15
16
|
const SKILL_USE_RATE_SCHEMA = 'pluribus.skill_use_rate_receipt.v1'
|
|
16
17
|
const MCP_AUDIT_RECEIPT_SCHEMA = 'pluribus.mcp_tool_call_audit_receipt.v1'
|
|
18
|
+
const TOOL_SURFACE_DIFF_SCHEMA = 'pluribus.mcp_tool_surface_diff_receipt.v1'
|
|
17
19
|
|
|
18
20
|
/**
|
|
19
21
|
* @param {Record<string, string | boolean>} args
|
|
@@ -29,6 +31,8 @@ export async function runDemo(args, positional = []) {
|
|
|
29
31
|
return runMcpAuditReceiptDemo(args)
|
|
30
32
|
case MCP_TELEMETRY_IMPORT_DEMO:
|
|
31
33
|
return runMcpTelemetryImportDemo(args)
|
|
34
|
+
case TOOL_SURFACE_DIFF_DEMO:
|
|
35
|
+
return runToolSurfaceDiffDemo(args)
|
|
32
36
|
default:
|
|
33
37
|
console.error(`❌ Unknown demo: ${demoName}`)
|
|
34
38
|
console.error(` Available demos: ${AVAILABLE_DEMOS.join(', ')}`)
|
|
@@ -188,6 +192,44 @@ function bundledMcpTelemetryJsonlPath() {
|
|
|
188
192
|
return fileURLToPath(new URL('../../examples/mcp-telemetry-import/sample-rpc-messages.jsonl', import.meta.url))
|
|
189
193
|
}
|
|
190
194
|
|
|
195
|
+
function bundledToolSurfaceDiffReceiptPath() {
|
|
196
|
+
return fileURLToPath(new URL('../../examples/tool-surface-diff-receipts/tool-surface-diff-receipt.json', import.meta.url))
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function runToolSurfaceDiffDemo(args) {
|
|
200
|
+
const receiptPath = selectedReceiptPath(args, bundledToolSurfaceDiffReceiptPath())
|
|
201
|
+
const receipt = readReceipt(receiptPath, 'tool-surface diff')
|
|
202
|
+
const result = validateToolSurfaceDiffReceipt(receipt)
|
|
203
|
+
|
|
204
|
+
if (Boolean(args.json)) {
|
|
205
|
+
console.log(JSON.stringify({
|
|
206
|
+
ok: result.errors.length === 0,
|
|
207
|
+
demo: TOOL_SURFACE_DIFF_DEMO,
|
|
208
|
+
receipt: path.relative(process.cwd(), receiptPath) || receiptPath,
|
|
209
|
+
summary: result.summary,
|
|
210
|
+
warnings: result.warnings,
|
|
211
|
+
errors: result.errors,
|
|
212
|
+
}, null, 2))
|
|
213
|
+
} else {
|
|
214
|
+
console.log('🧪 Pluribus demo: MCP tool-surface diff receipt')
|
|
215
|
+
console.log(` Receipt: ${path.relative(process.cwd(), receiptPath) || receiptPath}`)
|
|
216
|
+
console.log('')
|
|
217
|
+
|
|
218
|
+
if (result.errors.length === 0) {
|
|
219
|
+
console.log(`✅ tool-surface diff receipt ok: ${result.summary.discoveredCount} discovered, ${result.summary.activatedCount} activated, ${result.summary.withheldCount} withheld/blocked`)
|
|
220
|
+
for (const warning of result.warnings) console.log(` • ${warning}`)
|
|
221
|
+
console.log('')
|
|
222
|
+
console.log('Why this matters: runtime MCP discovery changes the active tool surface. Persist a low-cardinality receipt of discovered → activated → withheld/blocked tools without logging raw schemas, prompts, or results.')
|
|
223
|
+
console.log('Try your own receipt: pluribus demo tool-surface-diff --receipt path/to/tool-surface-diff-receipt.json --json')
|
|
224
|
+
} else {
|
|
225
|
+
console.error('❌ tool-surface diff receipt invalid:')
|
|
226
|
+
for (const error of result.errors) console.error(` • ${error}`)
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (result.errors.length > 0) process.exit(1)
|
|
231
|
+
}
|
|
232
|
+
|
|
191
233
|
export function validateSkillUseRateReceipt(receipt) {
|
|
192
234
|
const errors = []
|
|
193
235
|
const warnings = []
|
|
@@ -537,3 +579,80 @@ export function validateMcpAuditReceipt(receipt) {
|
|
|
537
579
|
},
|
|
538
580
|
}
|
|
539
581
|
}
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
export function validateToolSurfaceDiffReceipt(receipt) {
|
|
585
|
+
const errors = []
|
|
586
|
+
const warnings = []
|
|
587
|
+
|
|
588
|
+
function requireString(value, field) {
|
|
589
|
+
if (typeof value !== 'string' || value.trim() === '') errors.push(`${field} must be a non-empty string`)
|
|
590
|
+
}
|
|
591
|
+
function requireBoolean(value, field) {
|
|
592
|
+
if (typeof value !== 'boolean') errors.push(`${field} must be boolean`)
|
|
593
|
+
}
|
|
594
|
+
function requireNonNegativeInteger(value, field) {
|
|
595
|
+
if (!Number.isInteger(value) || value < 0) errors.push(`${field} must be a non-negative integer`)
|
|
596
|
+
}
|
|
597
|
+
function requireArray(value, field) {
|
|
598
|
+
if (!Array.isArray(value) || value.length === 0) errors.push(`${field} must be a non-empty array`)
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
if (receipt.schema !== TOOL_SURFACE_DIFF_SCHEMA) errors.push(`schema must be ${TOOL_SURFACE_DIFF_SCHEMA}`)
|
|
602
|
+
requireString(receipt.run_id, 'run_id')
|
|
603
|
+
requireString(receipt.generated_at, 'generated_at')
|
|
604
|
+
requireString(receipt.platform?.name, 'platform.name')
|
|
605
|
+
requireString(receipt.platform?.audit_sink, 'platform.audit_sink')
|
|
606
|
+
requireString(receipt.catalog?.server_id, 'catalog.server_id')
|
|
607
|
+
requireString(receipt.catalog?.previous_hash, 'catalog.previous_hash')
|
|
608
|
+
requireString(receipt.catalog?.current_hash, 'catalog.current_hash')
|
|
609
|
+
requireBoolean(receipt.runtime_discovery?.enabled, 'runtime_discovery.enabled')
|
|
610
|
+
requireString(receipt.runtime_discovery?.trigger, 'runtime_discovery.trigger')
|
|
611
|
+
requireArray(receipt.tools, 'tools')
|
|
612
|
+
requireString(receipt.privacy_boundary?.raw_schemas, 'privacy_boundary.raw_schemas')
|
|
613
|
+
requireString(receipt.privacy_boundary?.raw_prompts, 'privacy_boundary.raw_prompts')
|
|
614
|
+
requireString(receipt.privacy_boundary?.raw_results, 'privacy_boundary.raw_results')
|
|
615
|
+
|
|
616
|
+
if (receipt.privacy_boundary?.raw_schemas !== 'omitted_hash_only') errors.push('privacy_boundary.raw_schemas must be omitted_hash_only')
|
|
617
|
+
if (receipt.privacy_boundary?.raw_prompts !== 'omitted') errors.push('privacy_boundary.raw_prompts must be omitted')
|
|
618
|
+
if (receipt.privacy_boundary?.raw_results !== 'omitted') errors.push('privacy_boundary.raw_results must be omitted')
|
|
619
|
+
|
|
620
|
+
const statuses = new Set(['discovered', 'activated', 'withheld', 'blocked', 'removed'])
|
|
621
|
+
const outcomes = new Set(['accepted', 'blocked_by_rai', 'blocked_by_xpia', 'schema_invalid', 'entitlement_filtered', 'not_selected', 'removed'])
|
|
622
|
+
let discoveredCount = 0
|
|
623
|
+
let activatedCount = 0
|
|
624
|
+
let withheldCount = 0
|
|
625
|
+
let rawLeakCount = 0
|
|
626
|
+
|
|
627
|
+
for (const [index, tool] of (receipt.tools || []).entries()) {
|
|
628
|
+
const prefix = `tools[${index}]`
|
|
629
|
+
requireString(tool.tool_id, `${prefix}.tool_id`)
|
|
630
|
+
requireString(tool.name_hash, `${prefix}.name_hash`)
|
|
631
|
+
requireString(tool.schema_hash, `${prefix}.schema_hash`)
|
|
632
|
+
requireString(tool.status, `${prefix}.status`)
|
|
633
|
+
requireString(tool.validation_outcome, `${prefix}.validation_outcome`)
|
|
634
|
+
requireNonNegativeInteger(tool.diff_summary?.added_fields, `${prefix}.diff_summary.added_fields`)
|
|
635
|
+
requireNonNegativeInteger(tool.diff_summary?.removed_fields, `${prefix}.diff_summary.removed_fields`)
|
|
636
|
+
requireNonNegativeInteger(tool.diff_summary?.changed_fields, `${prefix}.diff_summary.changed_fields`)
|
|
637
|
+
|
|
638
|
+
if (!statuses.has(tool.status)) errors.push(`${prefix}.status must be one of ${[...statuses].join('|')}`)
|
|
639
|
+
if (!outcomes.has(tool.validation_outcome)) errors.push(`${prefix}.validation_outcome must be one of ${[...outcomes].join('|')}`)
|
|
640
|
+
if (!String(tool.name_hash || '').startsWith('sha256:')) errors.push(`${prefix}.name_hash must be a sha256: hash, not a raw tool name`)
|
|
641
|
+
if (!String(tool.schema_hash || '').startsWith('sha256:')) errors.push(`${prefix}.schema_hash must be a sha256: hash, not a raw schema`)
|
|
642
|
+
if (typeof tool.raw_schema === 'string' || typeof tool.description === 'string') rawLeakCount++
|
|
643
|
+
|
|
644
|
+
if (['discovered', 'activated', 'withheld', 'blocked'].includes(tool.status)) discoveredCount++
|
|
645
|
+
if (tool.status === 'activated') activatedCount++
|
|
646
|
+
if (['withheld', 'blocked'].includes(tool.status)) withheldCount++
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
if (rawLeakCount > 0) errors.push(`tools must not include raw_schema or description (${rawLeakCount} raw fields found)`)
|
|
650
|
+
if (activatedCount === 0) warnings.push('no activated tools recorded; receipt may only prove discovery/withholding')
|
|
651
|
+
if (withheldCount === 0) warnings.push('no withheld/blocked tools recorded; receipt does not prove negative space')
|
|
652
|
+
|
|
653
|
+
return {
|
|
654
|
+
errors,
|
|
655
|
+
warnings,
|
|
656
|
+
summary: { discoveredCount, activatedCount, withheldCount },
|
|
657
|
+
}
|
|
658
|
+
}
|
package/src/utils/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VERSION = '0.3.
|
|
1
|
+
export const VERSION = '0.3.40'
|