Plugin Directory

Changeset 3802637


Ignore:
Timestamp:
11/15/2026 01:34:19 AM (less than one hour ago)
Author:
owenfar
Message:

Deploy version 2.1.3

Location:
debugbundle
Files:
272 added
16 edited

Legend:

Unmodified
Added
Removed
  • debugbundle/trunk/CHANGELOG.md

    r3792513 r3802637  
    66
    77## [Unreleased]
     8
     9## [2.1.3] - 2026-11-15
     10
     11- Bundle the qualified PHP SDK 2.1.3 and Browser SDK 3.2.3 documentation patches.
     12
     13- Align installation, initialization, integrations, first-event verification and configuration documentation with the shared SDK pattern. Keep credentials, delivery modes and runtime lifecycle requirements explicit.
     14- Runtime APIs and capture behavior are unchanged; this patch updates distributed documentation and package version metadata.
     15
    816
    917## [2.1.2] - 2026-11-09
  • debugbundle/trunk/README.md

    r3792513 r3802637  
    11# DebugBundle WordPress Plugin
    22
    3 Patch 2.1.2 protects invitation and organisation-transfer credentials in captured text while preserving public APIs and event schemas. Upgrade the DebugBundle distribution to adopt the protection.
     3Patch 2.1.3 protects invitation and organisation-transfer credentials in captured text while preserving public APIs and event schemas. Upgrade the DebugBundle distribution to adopt the protection.
    44
    55WordPress plugin for DebugBundle.
    … …  
    88
    99![CI](https://img.shields.io/github/actions/workflow/status/debugbundle/debugbundle-wordpress/ci.yml?branch=main&label=ci)
    10 ![Version](https://img.shields.io/badge/version-2.1.2-blue)
     10![Version](https://img.shields.io/badge/version-2.1.3-blue)
    1111![License](https://img.shields.io/badge/license-GPL--2.0--or--later-blue)
    1212
    … …  
    2020for activation and runtime limits.
    2121
    22 ## Requirements
     22## Installation
     23
     24<a id="requirements"></a>
     25
     26<a id="install"></a>
    2327
    2428- WordPress 6.5 or newer (tested through WordPress 7.1)
    2529- PHP 8.2 or newer
    2630
    27 ## Installation
    28 
    29311. Install **DebugBundle** from the [WordPress.org plugin directory](https://wordpress.org/plugins/debugbundle/).
    30 2. Activate the plugin.
    31 3. Open **Settings -> DebugBundle**.
    32 4. Paste your DebugBundle project token and save.
    33 5. Use the backend and frontend test-event buttons to verify delivery.
    3432
    3533Manual ZIP installs are available from the [`debugbundle-wordpress` GitHub releases](https://github.com/debugbundle/debugbundle-wordpress/releases) page when a host or deployment process cannot install from WordPress.org.
    3634
    37 The plugin can also read the project token from `wp-config.php`:
    38 
    39 ```php
    40 define('DEBUGBUNDLE_PROJECT_TOKEN', 'dbundle_proj_xxxxxxxxxxxx');
    41 ```
    42 
    43 Version 2.0 reads remote capture policy from a local cache on visitor requests. WP-Cron refreshes it using the project token; the cache is scoped by endpoint and token hash, and an unavailable cache falls back to the minimal capture policy. WP-Cron must run for remote policy changes to arrive.
    44 
    45 ## What It Captures
     35## Initialize
     36
     37Activate the plugin, then open **Settings -> DebugBundle**, save your project token, environment and service, and enable the capture paths you need. The plugin initializes its bundled PHP and browser SDKs; no application `init()` call is required.
     38
     39## Integrations
     40
     41### What It Captures
    4642
    4743- Backend PHP errors, exceptions, shutdown failures, request context, logs, runtime facts, and probes through `debugbundle/sdk-php`
    … …  
    5248The first release focuses on public-site capture. It does not capture `wp-admin` traffic by default.
    5349
    54 ## Settings
     50## First-event verification
     51
     52Use the backend and frontend test-event buttons in **Settings -> DebugBundle** from an administrator session. Confirm both service identities in received events or incidents in DebugBundle. Saving settings or an empty relay spool is not a delivery receipt; check the delivery diagnostics and inspect the matching incident.
     53
     54## Configuration
     55
     56<a id="settings"></a>
    5557
    5658| Setting | Default | Purpose |
    … …  
    7173| Delete settings on uninstall | disabled | Remove saved settings when the plugin is uninstalled. |
    7274
     75The plugin can also read the project token from `wp-config.php`:
     76
     77```php
     78define('DEBUGBUNDLE_PROJECT_TOKEN', 'dbundle_proj_xxxxxxxxxxxx');
     79```
     80
     81Version 2.0 reads remote capture policy from a local cache on visitor requests. WP-Cron refreshes it using the project token; the cache is scoped by endpoint and token hash, and an unavailable cache falls back to the minimal capture policy. WP-Cron must run for remote policy changes to arrive.
     82
    7383## External Service Behavior
    7484
    … …  
    204214
    205215
    206 ### Unreleased acceptance-credential privacy
    207 
    208 The source candidate also scrubs standalone `dbundle_invite_`,
     216<a id="unreleased-acceptance-credential-privacy"></a>
     217
     218### Acceptance-credential privacy
     219
     220The SDK scrubs standalone `dbundle_invite_`,
    209221`dbundle_org_invite_` and `dbundle_org_transfer_` acceptance secrets before
    210222SDK-owned retention or transmission. See the [shared qualification record](https://github.com/debugbundle/debugbundle/blob/main/spec/business-credential-redaction.md).
    211 Published packages keep their released behaviour until the coordinated dependency
    212 and distribution checks are completed and a new version is published.
     223Existing installations receive this protection when upgraded to a version that includes it.
  • debugbundle/trunk/assets/dist/debugbundle-browser.js

    r3792513 r3802637  
    2344723447  });
    2344823448
    23449   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/privacy.js
     23449  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/privacy.js
    2345023450  function protectBrowserEvent(event, additionalKeys) {
    2345123451    var _a5, _b;
    … …  
    2349523495  }
    2349623496
    23497   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/passive-resources.js
     23497  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/passive-resources.js
    2349823498  var WINDOW = 3e4;
    2349923499  var MAX_BYTES2 = 32 * 1024;
    … …  
    2375423754  };
    2375523755
    23756   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/evidence-controller.js
     23756  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/evidence-controller.js
    2375723757  function browserEvidenceEndpoint(endpoint) {
    2375823758    const hashAt = endpoint.indexOf("#"), clean = hashAt < 0 ? endpoint : endpoint.slice(0, hashAt);
    … …  
    2394223942  };
    2394323943
    23944   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/package.json
     23944  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/package.json
    2394523945  var package_default = {
    2394623946    name: "@debugbundle/sdk-browser",
    23947     version: "3.2.2",
     23947    version: "3.2.3",
    2394823948    private: false,
    2394923949    type: "module",
    … …  
    2398223982  };
    2398323983
    23984   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/types.js
     23984  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/types.js
    2398523985  var SDK_NAME = "@debugbundle/sdk-browser";
    2398623986  var SDK_VERSION = package_default.version;
    … …  
    2400624006  var DEFAULT_LOG_LEVEL = "warning";
    2400724007
    24008   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/diagnostic-capture.js
     24008  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/diagnostic-capture.js
    2400924009  function createBrowserDiagnosticEvent(config3, payload, correlation, service) {
    2401024010    const event = createEventEnvelope({
    … …  
    2402424024  }
    2402524025
    24026   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/browser-stack.js
     24026  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/browser-stack.js
    2402724027  function sanitizeBrowserStack(stack) {
    2402824028    return stack.replace(/https?:\/\/[^\s]+/gi, (source) => {
    … …  
    2403924039  }
    2404024040
    24041   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/native-fields.js
     24041  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/native-fields.js
    2404224042  function readNativeField(value, key2) {
    2404324043    try {
    … …  
    2407024070  }
    2407124071
    24072   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/response-json.js
     24072  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/response-json.js
    2407324073  async function readBoundedBrowserJson(response, signal) {
    2407424074    var _a5, _b;
    … …  
    2412224122  }
    2412324123
    24124   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/fetch-transport.js
     24124  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/fetch-transport.js
    2412524125  function getFetchSource() {
    2412624126    const candidate = globalThis["fetch"];
    … …  
    2417724177  }
    2417824178
    24179   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/runtime.js
     24179  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/runtime.js
    2418024180  var DEFAULT_REQUEST_FAILURE_PRESET = "balanced";
    2418124181  var DEFAULT_REQUEST_CAPTURE_EVENTS = "failures_only";
    … …  
    2485924859  }
    2486024860
    24861   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/exception-evidence.js
     24861  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/exception-evidence.js
    2486224862  var NativeError = Error;
    2486324863  var nativeStackDescriptor;
    … …  
    2501925019  }
    2502025020
    25021   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/capture-exception.js
     25021  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/capture-exception.js
    2502225022  function createBrowserExceptionEvent(input2) {
    2502325023    var _a5, _b, _c;
    … …  
    2507725077  }
    2507825078
    25079   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/analytics-friction.js
     25079  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/analytics-friction.js
    2508025080  var FRICTION_CLICK_THRESHOLD = 3;
    2508125081  var FRICTION_CLICK_WINDOW_MS = 2e3;
    … …  
    2513225132  };
    2513325133
    25134   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/analytics-normalization.js
     25134  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/analytics-normalization.js
    2513525135  var MAX_CUSTOM_DIMENSIONS = 8;
    2513625136  var MAX_CUSTOM_KEY_LENGTH = 64;
    … …  
    2540625406  }
    2540725407
    25408   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/analytics.js
     25408  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/analytics.js
    2540925409  var ANALYTICS_EVENT_SCHEMA_VERSION2 = "2026-07-analytics-01";
    2541025410  var HASH_PATTERN = /^sha256:[a-f0-9]{64}$/i;
    … …  
    2581725817  };
    2581825818
    25819   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/before-send.js
     25819  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/before-send.js
    2582025820  function cloneEvent(event) {
    2582125821    return JSON.parse(JSON.stringify(event));
    … …  
    2584425844  }
    2584525845
    25846   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/capture-helpers.js
     25846  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/capture-helpers.js
    2584725847  var DEFAULT_REQUEST_FAILURE_PRESET2 = "balanced";
    2584825848  var DEFAULT_REQUEST_CAPTURE_EVENTS2 = "failures_only";
    … …  
    2599825998  }
    2599925999
    26000   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/resource-origin.js
     26000  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/resource-origin.js
    2600126001  function httpUrl2(value, base) {
    2600226002    if (typeof value !== "string" || !value || value.length > 4096 || /[\u0000-\u0020\u007f]/.test(value))
    … …  
    2602626026  }
    2602726027
    26028   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/capture-rules.js
     26028  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/capture-rules.js
    2602926029  function asRecord2(value) {
    2603026030    if (value === null || typeof value !== "object" || Array.isArray(value)) {
    … …  
    2657726577  }
    2657826578
    26579   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/event-pipeline.js
     26579  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/event-pipeline.js
    2658026580  function applyBrowserCaptureRules(input2) {
    2658126581    var _a5;
    … …  
    2666326663  }
    2666426664
    26665   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/hooks.js
     26665  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/hooks.js
    2666626666  var MUTATING_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH", "DELETE"]);
    2666726667  var INTERESTING_RESPONSE_HEADERS = [
    … …  
    2704827048  }
    2704927049
    27050   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/native-error-hooks.js
     27050  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/native-error-hooks.js
    2705127051  function captureNativeError(event, capture) {
    2705227052    var _a5;
    … …  
    2706727067  }
    2706827068
    27069   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/suppression.js
     27069  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/suppression.js
    2707027070  var DUPLICATE_WINDOW_MS = 3e4;
    2707127071  var LOOP_WINDOW_MS = 2e3;
    … …  
    2723627236  };
    2723727237
    27238   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/transport-lane.js
     27238  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/transport-lane.js
    2723927239  function createLane() {
    2724027240    return {
    … …  
    2747127471  }
    2747227472
    27473   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/ingestion-acknowledgement.js
     27473  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/ingestion-acknowledgement.js
    2747427474  var RETRYABLE_REASONS = /* @__PURE__ */ new Set([
    2747527475    "rate_limited",
    … …  
    2751827518  }
    2751927519
    27520   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/event-transport.js
     27520  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/event-transport.js
    2752127521  var BrowserEventTransport = class {
    2752227522    constructor(callbacks) {
    … …  
    2810828108  }
    2810928109
    28110   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/trigger-token.js
     28110  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/trigger-token.js
    2811128111  var PROBE_TRIGGER_TOKEN_PREFIX = "dbundle_probe_";
    2811228112  function decodeBase64Url(segment) {
    … …  
    2819728197  }
    2819828198
    28199   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/probes.js
     28199  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/probes.js
    2820028200  var evidencePolicySchema = ResolvedCapturePolicySchema.partial();
    2820128201  function validEvidenceConfig(payload, status) {
    … …  
    2841928419  }
    2842028420
    28421   // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.2/node_modules/@debugbundle/sdk-browser/dist/index.js
     28421  // node_modules/.pnpm/@debugbundle+sdk-browser@3.2.3/node_modules/@debugbundle/sdk-browser/dist/index.js
    2842228422  var BrowserSdk = class {
    2842328423    constructor() {
  • debugbundle/trunk/assets/dist/sdk-build.json

    r3792513 r3802637  
    11{
    22  "package": "@debugbundle/sdk-browser",
    3   "version": "3.2.2",
    4   "asset_sha256": "0832f7083e5e601cdda0c8e7d3ec9b4d110726927dcbe2379727f651c8ce5b82"
     3  "version": "3.2.3",
     4  "asset_sha256": "6e279e3d58477d3ac533f97982faba8895c0c8adb2277411459fb28be93d4338"
    55}
  • debugbundle/trunk/composer.json

    r3792513 r3802637  
    1111  "require": {
    1212    "php": ">=8.2",
    13     "debugbundle/sdk-php": "^2.1.2"
     13    "debugbundle/sdk-php": "^2.1.3"
    1414  },
    1515  "require-dev": {
  • debugbundle/trunk/composer.lock

    r3792513 r3802637  
    55        "This file is @generated automatically"
    66    ],
    7     "content-hash": "f0f0f6e4562f3578dcec53826f2b8e96",
     7    "content-hash": "d243f7d1032e30dfd8ec7d0b85544ddb",
    88    "packages": [
    99        {
    1010            "name": "debugbundle/sdk-php",
    11             "version": "v2.1.2",
     11            "version": "v2.1.3",
    1212            "source": {
    1313                "type": "git",
    1414                "url": "https://github.com/debugbundle/debugbundle-php.git",
    15                 "reference": "7a9dec787a2703c50108d6f8a30067ed547f8c04"
    16             },
    17             "dist": {
    18                 "type": "zip",
    19                 "url": "https://api.github.com/repos/debugbundle/debugbundle-php/zipball/7a9dec787a2703c50108d6f8a30067ed547f8c04",
    20                 "reference": "7a9dec787a2703c50108d6f8a30067ed547f8c04",
     15                "reference": "6d7d16eaf45dbeeededd86599fe86c149836b895"
     16            },
     17            "dist": {
     18                "type": "zip",
     19                "url": "https://api.github.com/repos/debugbundle/debugbundle-php/zipball/6d7d16eaf45dbeeededd86599fe86c149836b895",
     20                "reference": "6d7d16eaf45dbeeededd86599fe86c149836b895",
    2121                "shasum": ""
    2222            },
    … …  
    6464                "source": "https://github.com/debugbundle/debugbundle-php"
    6565            },
    66             "time": "2026-11-09T12:40:40+00:00"
     66            "time": "2026-11-15T01:03:57+00:00"
    6767        },
    6868        {
  • debugbundle/trunk/debugbundle.php

    r3792513 r3802637  
    44 * Plugin URI:        https://debugbundle.com/docs/integrations/wordpress
    55 * Description:       Capture backend and frontend production incidents from WordPress into DebugBundle.
    6  * Version:           2.1.2
     6 * Version:           2.1.3
    77 * Requires at least: 6.5
    88 * Requires PHP:      8.2
    … …  
    2222
    2323if (!defined('DEBUGBUNDLE_WORDPRESS_VERSION')) {
    24     define('DEBUGBUNDLE_WORDPRESS_VERSION', '2.1.2');
     24    define('DEBUGBUNDLE_WORDPRESS_VERSION', '2.1.3');
    2525}
    2626
    2727if (!defined('DEBUGBUNDLE_WORDPRESS_BROWSER_SDK_VERSION')) {
    28     define('DEBUGBUNDLE_WORDPRESS_BROWSER_SDK_VERSION', '3.2.2');
     28    define('DEBUGBUNDLE_WORDPRESS_BROWSER_SDK_VERSION', '3.2.3');
    2929}
    3030
  • debugbundle/trunk/readme.txt

    r3792513 r3802637  
    44Requires at least: 6.5
    55Tested up to: 7.1
    6 Stable tag: 2.1.2
     6Stable tag: 2.1.3
    77Requires PHP: 8.2
    88License: GPLv2 or later
    … …  
    104104== Changelog ==
    105105
     106= 2.1.3 =
     107* Align SDK setup documentation and bundle PHP SDK 2.1.3 with Browser SDK 3.2.3.
     108
    106109= 2.1.2 =
    107110* Protect organisation invitation and transfer credentials before retention or transport. Bundle PHP SDK 2.1.2 and Browser SDK 3.2.2.
  • debugbundle/trunk/vendor/autoload.php

    r3792513 r3802637  
    2020require_once __DIR__ . '/composer/autoload_real.php';
    2121
    22 return ComposerAutoloaderInitf0f0f6e4562f3578dcec53826f2b8e96::getLoader();
     22return ComposerAutoloaderInitd243f7d1032e30dfd8ec7d0b85544ddb::getLoader();
  • debugbundle/trunk/vendor/composer/autoload_real.php

    r3792513 r3802637  
    33// autoload_real.php @generated by Composer
    44
    5 class ComposerAutoloaderInitf0f0f6e4562f3578dcec53826f2b8e96
     5class ComposerAutoloaderInitd243f7d1032e30dfd8ec7d0b85544ddb
    66{
    77    private static $loader;
    … …  
    2525        require __DIR__ . '/platform_check.php';
    2626
    27         spl_autoload_register(array('ComposerAutoloaderInitf0f0f6e4562f3578dcec53826f2b8e96', 'loadClassLoader'), true, true);
     27        spl_autoload_register(array('ComposerAutoloaderInitd243f7d1032e30dfd8ec7d0b85544ddb', 'loadClassLoader'), true, true);
    2828        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
    29         spl_autoload_unregister(array('ComposerAutoloaderInitf0f0f6e4562f3578dcec53826f2b8e96', 'loadClassLoader'));
     29        spl_autoload_unregister(array('ComposerAutoloaderInitd243f7d1032e30dfd8ec7d0b85544ddb', 'loadClassLoader'));
    3030
    3131        require __DIR__ . '/autoload_static.php';
    32         call_user_func(\Composer\Autoload\ComposerStaticInitf0f0f6e4562f3578dcec53826f2b8e96::getInitializer($loader));
     32        call_user_func(\Composer\Autoload\ComposerStaticInitd243f7d1032e30dfd8ec7d0b85544ddb::getInitializer($loader));
    3333
    3434        $loader->register(true);
  • debugbundle/trunk/vendor/composer/autoload_static.php

    r3792513 r3802637  
    55namespace Composer\Autoload;
    66
    7 class ComposerStaticInitf0f0f6e4562f3578dcec53826f2b8e96
     7class ComposerStaticInitd243f7d1032e30dfd8ec7d0b85544ddb
    88{
    99    public static $prefixLengthsPsr4 = array (
    … …  
    4949    {
    5050        return \Closure::bind(function () use ($loader) {
    51             $loader->prefixLengthsPsr4 = ComposerStaticInitf0f0f6e4562f3578dcec53826f2b8e96::$prefixLengthsPsr4;
    52             $loader->prefixDirsPsr4 = ComposerStaticInitf0f0f6e4562f3578dcec53826f2b8e96::$prefixDirsPsr4;
    53             $loader->classMap = ComposerStaticInitf0f0f6e4562f3578dcec53826f2b8e96::$classMap;
     51            $loader->prefixLengthsPsr4 = ComposerStaticInitd243f7d1032e30dfd8ec7d0b85544ddb::$prefixLengthsPsr4;
     52            $loader->prefixDirsPsr4 = ComposerStaticInitd243f7d1032e30dfd8ec7d0b85544ddb::$prefixDirsPsr4;
     53            $loader->classMap = ComposerStaticInitd243f7d1032e30dfd8ec7d0b85544ddb::$classMap;
    5454
    5555        }, null, ClassLoader::class);
  • debugbundle/trunk/vendor/composer/installed.json

    r3792513 r3802637  
    33        {
    44            "name": "debugbundle/sdk-php",
    5             "version": "v2.1.2",
    6             "version_normalized": "2.1.2.0",
     5            "version": "v2.1.3",
     6            "version_normalized": "2.1.3.0",
    77            "source": {
    88                "type": "git",
    99                "url": "https://github.com/debugbundle/debugbundle-php.git",
    10                 "reference": "7a9dec787a2703c50108d6f8a30067ed547f8c04"
     10                "reference": "6d7d16eaf45dbeeededd86599fe86c149836b895"
    1111            },
    1212            "dist": {
    1313                "type": "zip",
    14                 "url": "https://api.github.com/repos/debugbundle/debugbundle-php/zipball/7a9dec787a2703c50108d6f8a30067ed547f8c04",
    15                 "reference": "7a9dec787a2703c50108d6f8a30067ed547f8c04",
     14                "url": "https://api.github.com/repos/debugbundle/debugbundle-php/zipball/6d7d16eaf45dbeeededd86599fe86c149836b895",
     15                "reference": "6d7d16eaf45dbeeededd86599fe86c149836b895",
    1616                "shasum": ""
    1717            },
    … …  
    3434                "symfony/http-kernel": "^7.2"
    3535            },
    36             "time": "2026-11-09T12:40:40+00:00",
     36            "time": "2026-11-15T01:03:57+00:00",
    3737            "type": "library",
    3838            "installation-source": "dist",
  • debugbundle/trunk/vendor/composer/installed.php

    r3792513 r3802637  
    22    'root' => array(
    33        'name' => 'debugbundle/wordpress-plugin',
    4         'pretty_version' => 'v2.1.2',
    5         'version' => '2.1.2.0',
    6         'reference' => '311c4a30c0fec4716664a71d286ddfa4982378f6',
     4        'pretty_version' => 'dev-main',
     5        'version' => 'dev-main',
     6        'reference' => 'bcc9536c0d72c087b3ea97a2c58501df4576f7a1',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
    … …  
    1212    'versions' => array(
    1313        'debugbundle/sdk-php' => array(
    14             'pretty_version' => 'v2.1.2',
    15             'version' => '2.1.2.0',
    16             'reference' => '7a9dec787a2703c50108d6f8a30067ed547f8c04',
     14            'pretty_version' => 'v2.1.3',
     15            'version' => '2.1.3.0',
     16            'reference' => '6d7d16eaf45dbeeededd86599fe86c149836b895',
    1717            'type' => 'library',
    1818            'install_path' => __DIR__ . '/../debugbundle/sdk-php',
    … …  
    2121        ),
    2222        'debugbundle/wordpress-plugin' => array(
    23             'pretty_version' => 'v2.1.2',
    24             'version' => '2.1.2.0',
    25             'reference' => '311c4a30c0fec4716664a71d286ddfa4982378f6',
     23            'pretty_version' => 'dev-main',
     24            'version' => 'dev-main',
     25            'reference' => 'bcc9536c0d72c087b3ea97a2c58501df4576f7a1',
    2626            'type' => 'wordpress-plugin',
    2727            'install_path' => __DIR__ . '/../../',
  • debugbundle/trunk/vendor/debugbundle/sdk-php/CHANGELOG.md

    r3792513 r3802637  
    22
    33## [Unreleased]
     4
     5## [2.1.3] - 2026-11-15
     6
     7- Align installation, initialization, integrations, first-event verification and configuration documentation with the shared SDK pattern. Keep credentials, delivery modes and runtime lifecycle requirements explicit.
     8- Runtime APIs and capture behavior are unchanged; this patch updates distributed documentation and package version metadata.
     9
    410
    511## [2.1.2] - 2026-11-09
  • debugbundle/trunk/vendor/debugbundle/sdk-php/README.md

    r3792513 r3802637  
    11# DebugBundle PHP SDK
    22
    3 Patch 2.1.2 protects invitation and organisation-transfer credentials in captured text while preserving public APIs and event schemas. Upgrade the DebugBundle distribution to adopt the protection.
     3Patch 2.1.3 protects invitation and organisation-transfer credentials in captured text while preserving public APIs and event schemas. Upgrade the DebugBundle distribution to adopt the protection.
    44
    55PHP SDK for DebugBundle.
    6 
    7 `make evidence-performance` compares identical exception/recovery calls with
    8 evidence disabled and enabled, including a full warning queue, with networking
    9 disabled. It reports capture time and PHP peak/live allocated memory after fixture
    10 setup, and checks native previous causes, original-error priority and existing
    11 retention ceilings. Memory measurements describe the PHP allocator, not cumulative
    12 allocation churn or total process RSS. `make smoke-fpm` separately verifies the
    13 existing request-end delivery deadline with evidence disabled and enabled.
    146
    157![Packagist](https://img.shields.io/packagist/v/debugbundle/sdk-php?label=packagist)
    … …  
    2113Requires PHP 8.2 or newer.
    2214
    23 ## Evidence in 2.1.0
    24 
    25 Version 2.1.0 adds bounded native previous-exception graphs and structured
    26 locations while retaining the original redacted error fields. Normal additional
    27 exception evidence is limited to 32 KiB; fatal evidence uses at most two nodes,
    28 eight frames per node and 4 KiB including operation metadata. Arguments and object
    29 dumps are excluded from the graph. Custom throwable formatters are not invoked.
    30 Native fatal file/line evidence is separate from the SDK's constructed trace.
    31 PHP 8.5 can supply a native fatal backtrace when its existing setting permits it;
    32 the SDK never enables that setting. Earlier runtimes report partial evidence.
    33 
    34 New fields require proof that the complete delivery path and readers accept them.
    35 Discovery adds `debugbundle_evidence=1` to existing config/ingestion requests;
    36 capture makes no discovery request. Short-lived PHP processes and file/custom
    37 transports may set `['evidenceCapabilities' => ['version' => 1, 'features' =>
    38 ['exception_evidence_v1', 'recovery_v1']]]` as an explicit assertion of complete-path support. Missing,
    39 unknown or revoked proof preserves legacy exception delivery. Only a negotiated
    40 `invalid_event` can retry the same original exception without optional additions;
    41 policy/security rejections and standalone context do not use that fallback.
    42 
    43 `captureExceptionEvidence` defaults to true behind verified support. Explicit
    44 recovery additionally requires `'captureRecoveryObservations' => true`, `recovery_v1`
    45 and capture-policy permission; the minimal preset always disables it. Call
    46 `captureRecovery(['failureRef' => $freshUuidV4, 'attemptId' => $attemptUuidV4,
    47 'state' => 'attempt_completed', 'evidenceScope' => $scope])` for an explicit
    48 technical observation. States are `attempt_started`, `attempt_completed`,
    49 `attempt_failed`, `recovery_observed` and `failure_persisted`. An HTTP 200 or a
    50 completed attempt does not assert recovery. Optional fields are `operation`,
    51 `statusCode`, `durationMs` and ordinary correlation; arbitrary application data
    52 belongs in existing context/probes. Never use user identifiers or URLs as these
    53 fresh references. Include the same `failureRef` and scope with the original
    54 exception. Page scope also requires the same session correlation.
    55 
    56 `runWithOperationContext(['kind' => 'job', 'name' =>
    57 $technicalName, 'limitMs' => $knownLimit], $callback)` supplies an operation scope
    58 and monotonic elapsed time. Kinds are `job`, `command` and `request`. Results and thrown application errors are preserved.
    59 Existing Laravel/Symfony request owners and concurrent Fibers are isolated;
    60 completion/reset revokes ownership. Unknown names and limits stay unknown.
    61 The SDK never infers a wall-clock request limit from PHP's execution-time setting.
    62 
    63 Recovery uses the ordinary bounded queue and mandatory privacy/hook policy. A
    64 per-instance tracker admits at most 50 failures, five attempts and 20 observations
    65 per five-minute window; tracker metadata and pending diagnostic payloads share a
    66 64 KiB budget. ACK/drop/reset releases pending ownership without renewing the
    67 window. Valid hook identity/type replacements remain supported and are checked
    68 against the resulting event's policy. Complete returned envelopes are checked
    69 against the vendored accepting Draft 7 schema and semantic evidence rules. Hook
    70 JSON is copied without application serializers, clone handlers or foreign-object
    71 inspection. Invalid/throwing hooks preserve the protected original; exhausted
    72 validation and unfit valid replacements are withheld without undoing redaction.
    73 Mandatory privacy output is checked again before policy and delivery.
    74 
    75 Native HTTP uses byte-sized ordered prefixes under the receiving 256-KiB limit,
    76 including wrapper/comma bytes. A flush shares the existing 250-ms monotonic
    77 budget across chunks; pending tails retain their ownership for a later explicit
    78 attempt. Request-end delivery remains one bounded best-effort request. Optional
    79 SDK evidence is reduced before withholding an unfit primary. PHP empty-map array
    80 idioms are projected into JSON objects using the accepting schema. A first fatal
    81 capture uses already canonical SDK shapes without allocating that interpreter.
    82 Relays count injected server credentials, reject unfit events before acceptance,
    83 and share the same native forwarding budget. Legacy custom success remains
    84 accepted; only complete canonical ACKs mark a durable spool delivered. Exclusive
    85 private markers preserve existing files and do not follow symlinks. PHP request-end loss and custom-transport
    86 limitations described below still apply.
    87 
    88 PHP relays preserve typed context, graphs and browser observations after privacy,
    89 intersect support with downstream proof and keep legacy responses unchanged.
    90 Opted-in responses add a descriptor and indexed `evidence_errors`; the existing
    91 string `errors` array remains available. Local/spooled readers require explicit
    92 complete-path proof. Passive browser collection belongs to the browser SDK;
    93 PHP only preserves that evidence.
    94 
    95 Local qualification: `make check-docker`, `make coverage-docker`,
    96 `make evidence-runtime-docker`, `make smoke-worktree` and `make smoke-fpm`.
    97 Publication and installed-site adoption remain separate release actions.
    98 
    99 ## Automatic capture and application filtering
    100 
    101 `captureErrors()` checks the current `error_reporting()` mask for each error. Warnings, notices and deprecations suppressed with `@` or excluded by that mask are ignored. Enabled errors still follow the existing PHP handler behavior. Explicit `captureException()` calls and fatal shutdown capture remain available independently of the warning mask.
    102 
    103 Exception capture uses the throwable class as the message when `getMessage()` is empty, before `beforeSend` and duplicate suppression. Nonempty messages (including `"0"`) and the original stack are preserved, subject to mandatory redaction. Captures without request context use empty JSON objects for request headers and query parameters.
    104 
    105 ### Version 2.0 delivery limit
    106 
    107 Version 2.0 keeps the ordinary Composer install and requires no resident collector. Capturing a batch no longer calls the network. PHP's shutdown hook makes one best-effort send of at most 25 priority-selected events and 256 KiB, with exceptions ahead of routine logs. The built-in stream timeout is 250 ms but is advisory; DNS, slow peers, and custom transports may exceed it. The send occupies a PHP worker while it runs, and unsent events are lost when the request ends or the endpoint is unavailable. Use an application-owned background runner if your deployment requires stronger delivery or zero request-end wait.
    108 
    109 `init()` no longer calls `configFetcher`. If you supply one, invoke `refreshRemoteConfig()` from a controlled background or administrative task; do not call it on the request path. `flush()` is an explicit synchronous operation intended for CLI, diagnostics, or controlled shutdown. Existing installed 1.x versions retain their prior behavior until a major upgrade. Review the request-end worker-cost and loss tradeoff before upgrading.
    110 
    11115## Installation
    11216
    … …  
    11519```
    11620
    117 ## Quick Start
     21## Initialize
     22
     23<a id="quick-start"></a>
     24
     25Initialize in your application bootstrap after loading Composer’s autoloader. Set `DEBUGBUNDLE_PROJECT_TOKEN` in the server environment, initialization installs error, exception and shutdown hooks. Add framework and logger adapters in Integrations.
    11826
    11927```php
    … …  
    12432DebugBundle::init([
    12533    'projectToken' => getenv('DEBUGBUNDLE_PROJECT_TOKEN'),
    126     'service' => 'checkout-api',
    12734    'environment' => 'production',
    128 ]);
    129 
     35    'service' => 'api',
     36]);
     37```
     38
     39## Integrations
     40
     41Laravel, Symfony, Monolog and browser relay adapters are supported.
     42
     43### Capture hooks
     44
     45```php
    13046DebugBundle::captureErrors();
    13147DebugBundle::captureExceptions();
    13248DebugBundle::captureShutdown();
    13349```
     50
     51### Capture setup details
    13452
    13553Capture handled errors, logs, messages, and probes explicitly:
    … …  
    14260```
    14361
    144 ## Framework Integrations
     62### Framework Integrations
    14563
    14664| Runtime | Integration |
    … …  
    15371Example apps live in `examples/laravel` and `examples/symfony`.
    15472
    155 ## Browser Relay
     73### Browser Relay
    15674
    15775PHP backends can host the browser relay endpoint used by `@debugbundle/sdk-browser`.
    … …  
    17593- Connected relay mode without a usable project token still accepts and can spool events, but forwarding remains disabled until the server provides credentials. This is the relay missing token behavior.
    17694
    177 ## Configuration Reference
     95### Laravel Logging
     96
     97For Laravel's Monolog-backed stack, add the SDK tap class to a channel in `config/logging.php`:
     98
     99```php
     100use DebugBundle\Framework\Laravel\DebugBundleLogTap;
     101
     102'channels' => [
     103    'stack' => [
     104        'driver' => 'stack',
     105        'channels' => ['single'],
     106        'tap' => [DebugBundleLogTap::class],
     107    ],
     108],
     109```
     110
     111### Symfony Logging
     112
     113For Symfony applications using MonologBundle, register the SDK handler as a Monolog service:
     114
     115```yaml
     116services:
     117  DebugBundle\Logging\DebugBundleHandler:
     118    arguments:
     119      $sdk: '@DebugBundle\DebugBundleSdk'
     120
     121monolog:
     122  handlers:
     123    debugbundle:
     124      type: service
     125      id: DebugBundle\Logging\DebugBundleHandler
     126      level: warning
     127```
     128
     129## First-event verification
     130
     131Use an explicit setup event in a development or staging application, then confirm the matching service and environment in a received event or incident. Initialization, a healthy status and an empty queue are not delivery receipts. Keep the application running long enough for delivery; use bounded flushing only in tests or controlled teardown, never in a request handler.
     132
     133Use the repo-local smoke target to prove a fresh install end to end against a mock ingestion endpoint:
     134
     135```bash
     136make smoke
     137```
     138
     139That command builds a Composer archive, installs the package into a fresh consumer fixture, emits an application-owned `captureMessage()` plus `captureRequest()` event, submits a browser relay request through the Symfony relay controller, validates the received event envelopes, and confirms both paths reach the mock ingestion endpoint with the expected `service`, `environment`, SDK metadata, and correlation fields.
     140
     141For published-package verification during release validation, run the same smoke path against Packagist:
     142
     143```bash
     144php smoke/run_app_driven_smoke.php --package debugbundle/sdk-php:2.1.3
     145```
     146
     147For a manual verification snippet inside your own app:
     148
     149```php
     150<?php
     151
     152use DebugBundle\DebugBundle;
     153
     154DebugBundle::init([
     155  'projectToken' => getenv('DEBUGBUNDLE_PROJECT_TOKEN'),
     156  'service' => 'checkout-api',
     157  'environment' => 'staging',
     158]);
     159
     160DebugBundle::captureMessage('debugbundle first-event verification', 'error');
     161DebugBundle::flush();
     162var_dump(DebugBundle::getStatus(), DebugBundle::getLastEventAt());
     163```
     164
     165For connected delivery, confirm the event in DebugBundle and inspect its incident with the CLI. For local-only browser relay files, run `debugbundle process` and `debugbundle inspect <incident-id>` in the backend repository. A local file or mock endpoint receipt proves only that destination; it does not prove cloud acceptance.
     166
     167## Configuration
     168
     169The built-in application client uses HTTP in every environment. A literal `local` token does not select file transport. Browser relay local-only files are a separate delivery path; use a real ingestion token and endpoint for backend capture.
     170
     171<a id="configuration-reference"></a>
    178172
    179173Configuration sources and precedence:
    … …  
    208202- Generic PHP: initialize with `DebugBundle::init([...])`, then opt into `captureErrors()`, `captureExceptions()`, and `captureShutdown()`.
    209203
     204## Evidence in 2.1.0
     205
     206Version 2.1.0 adds bounded native previous-exception graphs and structured
     207locations while retaining the original redacted error fields. Normal additional
     208exception evidence is limited to 32 KiB; fatal evidence uses at most two nodes,
     209eight frames per node and 4 KiB including operation metadata. Arguments and object
     210dumps are excluded from the graph. Custom throwable formatters are not invoked.
     211Native fatal file/line evidence is separate from the SDK's constructed trace.
     212PHP 8.5 can supply a native fatal backtrace when its existing setting permits it;
     213the SDK never enables that setting. Earlier runtimes report partial evidence.
     214
     215New fields require proof that the complete delivery path and readers accept them.
     216Discovery adds `debugbundle_evidence=1` to existing config/ingestion requests;
     217capture makes no discovery request. Short-lived PHP processes and file/custom
     218transports may set `['evidenceCapabilities' => ['version' => 1, 'features' =>
     219['exception_evidence_v1', 'recovery_v1']]]` as an explicit assertion of complete-path support. Missing,
     220unknown or revoked proof preserves legacy exception delivery. Only a negotiated
     221`invalid_event` can retry the same original exception without optional additions;
     222policy/security rejections and standalone context do not use that fallback.
     223
     224`captureExceptionEvidence` defaults to true behind verified support. Explicit
     225recovery additionally requires `'captureRecoveryObservations' => true`, `recovery_v1`
     226and capture-policy permission; the minimal preset always disables it. Call
     227`captureRecovery(['failureRef' => $freshUuidV4, 'attemptId' => $attemptUuidV4,
     228'state' => 'attempt_completed', 'evidenceScope' => $scope])` for an explicit
     229technical observation. States are `attempt_started`, `attempt_completed`,
     230`attempt_failed`, `recovery_observed` and `failure_persisted`. An HTTP 200 or a
     231completed attempt does not assert recovery. Optional fields are `operation`,
     232`statusCode`, `durationMs` and ordinary correlation; arbitrary application data
     233belongs in existing context/probes. Never use user identifiers or URLs as these
     234fresh references. Include the same `failureRef` and scope with the original
     235exception. Page scope also requires the same session correlation.
     236
     237`runWithOperationContext(['kind' => 'job', 'name' =>
     238$technicalName, 'limitMs' => $knownLimit], $callback)` supplies an operation scope
     239and monotonic elapsed time. Kinds are `job`, `command` and `request`. Results and thrown application errors are preserved.
     240Existing Laravel/Symfony request owners and concurrent Fibers are isolated;
     241completion/reset revokes ownership. Unknown names and limits stay unknown.
     242The SDK never infers a wall-clock request limit from PHP's execution-time setting.
     243
     244Recovery uses the ordinary bounded queue and mandatory privacy/hook policy. A
     245per-instance tracker admits at most 50 failures, five attempts and 20 observations
     246per five-minute window; tracker metadata and pending diagnostic payloads share a
     24764 KiB budget. ACK/drop/reset releases pending ownership without renewing the
     248window. Valid hook identity/type replacements remain supported and are checked
     249against the resulting event's policy. Complete returned envelopes are checked
     250against the vendored accepting Draft 7 schema and semantic evidence rules. Hook
     251JSON is copied without application serializers, clone handlers or foreign-object
     252inspection. Invalid/throwing hooks preserve the protected original; exhausted
     253validation and unfit valid replacements are withheld without undoing redaction.
     254Mandatory privacy output is checked again before policy and delivery.
     255
     256Native HTTP uses byte-sized ordered prefixes under the receiving 256-KiB limit,
     257including wrapper/comma bytes. A flush shares the existing 250-ms monotonic
     258budget across chunks; pending tails retain their ownership for a later explicit
     259attempt. Request-end delivery remains one bounded best-effort request. Optional
     260SDK evidence is reduced before withholding an unfit primary. PHP empty-map array
     261idioms are projected into JSON objects using the accepting schema. A first fatal
     262capture uses already canonical SDK shapes without allocating that interpreter.
     263Relays count injected server credentials, reject unfit events before acceptance,
     264and share the same native forwarding budget. Legacy custom success remains
     265accepted; only complete canonical ACKs mark a durable spool delivered. Exclusive
     266private markers preserve existing files and do not follow symlinks. PHP request-end loss and custom-transport
     267limitations described below still apply.
     268
     269PHP relays preserve typed context, graphs and browser observations after privacy,
     270intersect support with downstream proof and keep legacy responses unchanged.
     271Opted-in responses add a descriptor and indexed `evidence_errors`; the existing
     272string `errors` array remains available. Local/spooled readers require explicit
     273complete-path proof. Passive browser collection belongs to the browser SDK;
     274PHP only preserves that evidence.
     275
     276Local qualification: `make check-docker`, `make coverage-docker`,
     277`make evidence-runtime-docker`, `make smoke-worktree` and `make smoke-fpm`.
     278Publication and installed-site adoption remain separate release actions.
     279
     280## Automatic capture and application filtering
     281
     282`captureErrors()` checks the current `error_reporting()` mask for each error. Warnings, notices and deprecations suppressed with `@` or excluded by that mask are ignored. Enabled errors still follow the existing PHP handler behavior. Explicit `captureException()` calls and fatal shutdown capture remain available independently of the warning mask.
     283
     284Exception capture uses the throwable class as the message when `getMessage()` is empty, before `beforeSend` and duplicate suppression. Nonempty messages (including `"0"`) and the original stack are preserved, subject to mandatory redaction. Captures without request context use empty JSON objects for request headers and query parameters.
     285
     286### Version 2.0 delivery limit
     287
     288Version 2.0 keeps the ordinary Composer install and requires no resident collector. Capturing a batch no longer calls the network. PHP's shutdown hook makes one best-effort send of at most 25 priority-selected events and 256 KiB, with exceptions ahead of routine logs. The built-in stream timeout is 250 ms but is advisory; DNS, slow peers, and custom transports may exceed it. The send occupies a PHP worker while it runs, and unsent events are lost when the request ends or the endpoint is unavailable. Use an application-owned background runner if your deployment requires stronger delivery or zero request-end wait.
     289
     290`init()` no longer calls `configFetcher`. If you supply one, invoke `refreshRemoteConfig()` from a controlled background or administrative task; do not call it on the request path. `flush()` is an explicit synchronous operation intended for CLI, diagnostics, or controlled shutdown. Existing installed 1.x versions retain their prior behavior until a major upgrade. Review the request-end worker-cost and loss tradeoff before upgrading.
     291
    210292## Install Examples by Mode
    211293
    … …  
    328410- Public snippets should not mix SDK package versions across separate repos or examples.
    329411
    330 ## Laravel Logging
    331 
    332 For Laravel's Monolog-backed stack, add the SDK tap class to a channel in `config/logging.php`:
    333 
    334 ```php
    335 use DebugBundle\Framework\Laravel\DebugBundleLogTap;
    336 
    337 'channels' => [
    338     'stack' => [
    339         'driver' => 'stack',
    340         'channels' => ['single'],
    341         'tap' => [DebugBundleLogTap::class],
    342     ],
    343 ],
    344 ```
    345 
    346 ## Symfony Logging
    347 
    348 For Symfony applications using MonologBundle, register the SDK handler as a Monolog service:
    349 
    350 ```yaml
    351 services:
    352   DebugBundle\Logging\DebugBundleHandler:
    353     arguments:
    354       $sdk: '@DebugBundle\DebugBundleSdk'
    355 
    356 monolog:
    357   handlers:
    358     debugbundle:
    359       type: service
    360       id: DebugBundle\Logging\DebugBundleHandler
    361       level: warning
    362 ```
    363 
    364412## Safety Defaults
    365413
    … …  
    386434- Connected mode without a usable project token does not silently report healthy connected capture.
    387435
    388 ## First-Event Verification
    389 
    390 Use the repo-local smoke target to prove a fresh install end to end against a mock ingestion endpoint:
    391 
    392 ```bash
    393 make smoke
    394 ```
    395 
    396 That command builds a Composer archive, installs the package into a fresh consumer fixture, emits an application-owned `captureMessage()` plus `captureRequest()` event, submits a browser relay request through the Symfony relay controller, validates the received event envelopes, and confirms both paths reach the mock ingestion endpoint with the expected `service`, `environment`, SDK metadata, and correlation fields.
    397 
    398 For published-package verification during release validation, run the same smoke path against Packagist:
    399 
    400 ```bash
    401 php smoke/run_app_driven_smoke.php --package debugbundle/sdk-php:1.5.0
    402 ```
    403 
    404 For a manual verification snippet inside your own app:
    405 
    406 ```php
    407 <?php
    408 
    409 use DebugBundle\DebugBundle;
    410 
    411 DebugBundle::init([
    412   'projectToken' => getenv('DEBUGBUNDLE_PROJECT_TOKEN'),
    413   'service' => 'checkout-api',
    414   'environment' => 'staging',
    415 ]);
    416 
    417 DebugBundle::captureMessage('debugbundle first-event verification', 'error');
    418 DebugBundle::flush();
    419 var_dump(DebugBundle::getStatus(), DebugBundle::getLastEventAt());
    420 ```
    421 
    422436## Development
    423437
    … …  
    468482
    469483
    470 ### Unreleased acceptance-credential privacy
    471 
    472 The source candidate also scrubs standalone `dbundle_invite_`,
     484<a id="unreleased-acceptance-credential-privacy"></a>
     485
     486### Acceptance-credential privacy
     487
     488The SDK scrubs standalone `dbundle_invite_`,
    473489`dbundle_org_invite_` and `dbundle_org_transfer_` acceptance secrets before
    474490SDK-owned retention or transmission. See the [shared qualification record](https://github.com/debugbundle/debugbundle/blob/main/spec/business-credential-redaction.md).
    475 Published packages keep their released behaviour until the coordinated dependency
    476 and distribution checks are completed and a new version is published.
     491Existing installations receive this protection when upgraded to a version that includes it.
     492
     493## Maintainer performance checks
     494
     495`make evidence-performance` compares identical exception/recovery calls with
     496evidence disabled and enabled, including a full warning queue, with networking
     497disabled. It reports capture time and PHP peak/live allocated memory after fixture
     498setup, and checks native previous causes, original-error priority and existing
     499retention ceilings. Memory measurements describe the PHP allocator, not cumulative
     500allocation churn or total process RSS. `make smoke-fpm` separately verifies the
     501existing request-end delivery deadline with evidence disabled and enabled.
  • debugbundle/trunk/vendor/debugbundle/sdk-php/src/DebugBundleSdk.php

    r3792513 r3802637  
    2222
    2323    private const SDK_NAME = 'debugbundle/sdk-php';
    24     private const SDK_VERSION = '2.1.2';
     24    private const SDK_VERSION = '2.1.3';
    2525    private const SCHEMA_VERSION = '2026-03-01';
    2626    private const DEFAULT_ENDPOINT = 'https://api.debugbundle.com/v1/events';
Note: See TracChangeset for help on using the changeset viewer.