Metadata-Version: 2.4
Name: nchantdoffice
Version: 0.0.1
Summary: Desktop office automation suite built on the nchantrs framework — provides document management, calendar, contacts, browser, and tabbed workspace capabilities with PySide6.
Author: Maintainers
Author-email: solubrew@solutionsbrewer.com
License: MIT
Platform: Linux
Requires-Python: >=3.12
Requires-Dist: click
Requires-Dist: six==1.16.0
Requires-Dist: decorator==5.3.0
Requires-Dist: diskcache==5.6.1
Requires-Dist: dill>=0.3.9
Requires-Dist: psutil==7.2.1
Requires-Dist: pandas==3.0.3
Requires-Dist: numpy==2.4.6
Requires-Dist: python-dateutil==2.8.2
Requires-Dist: pytz==2026.1.post1
Requires-Dist: tzdata==2026.1
Requires-Dist: pyodbc==5.2.0
Requires-Dist: cryptography==48.0.1
Requires-Dist: rsa==4.9
Requires-Dist: pycryptodome==3.21.0
Requires-Dist: coincurve==20.0.0
Requires-Dist: ecdsa==0.19.1
Requires-Dist: asn1crypto==1.5.0
Requires-Dist: bcrypt==4.3.0
Requires-Dist: requests==2.34.1
Requires-Dist: urllib3==2.6.3
Requires-Dist: certifi==2026.5.20
Requires-Dist: charset-normalizer==3.4.6
Requires-Dist: idna==3.17
Requires-Dist: furl==2.1.3
Requires-Dist: ffmpeg-python==0.1.18
Requires-Dist: ultimate-notion==0.9.10
Requires-Dist: notion-client==2.5.0
Requires-Dist: openpyxl==3.1.5
Requires-Dist: python-docx==1.1.2
Requires-Dist: python-pptx==1.0.1
Requires-Dist: PyPDF2==3.0.0
Requires-Dist: PyMuPDF==1.27.2.2
Requires-Dist: nbformat==5.10.3
Requires-Dist: beautifulsoup4==4.14.3
Requires-Dist: lxml==6.1.1
Requires-Dist: et-xmlfile==1.1.0
Requires-Dist: plotly==6.7.0
Requires-Dist: pydot==4.0.0
Requires-Dist: matplotlib==3.10.9
Requires-Dist: seaborn==0.13.1
Requires-Dist: graphviz==0.20.3
Requires-Dist: colormath==3.0.0
Requires-Dist: Pillow==12.1.1
Requires-Dist: opencv-python>=4.13.0.92
Requires-Dist: imageio==2.37.2
Requires-Dist: imageio_ffmpeg==0.5.1
Requires-Dist: proglog==0.1.11
Requires-Dist: pydub==0.25.0
Requires-Dist: PySide6==6.11.0
Requires-Dist: PySide6-Essentials==6.11.0
Requires-Dist: PySide6-Addons==6.11.0
Requires-Dist: shiboken6==6.11.0
Requires-Dist: webp==0.3.0
Requires-Dist: black==26.5.0
Requires-Dist: pyyaml==6.0.2
Requires-Dist: networkx==3.6
Requires-Dist: jsonschema==4.25.1
Requires-Dist: ruamel-yaml==0.19.1
Requires-Dist: typer==0.26.6
Requires-Dist: RestrictedPython==8.2
Requires-Dist: scapy==2.7.0
Requires-Dist: keyring==25.6.0
Requires-Dist: SecretStorage==3.4.1
Requires-Dist: jaraco.classes==3.3.1
Requires-Dist: jaraco.context==6.1.1
Requires-Dist: jaraco.functools==4.4.0
Requires-Dist: jeepney==0.8.0
Requires-Dist: feedparser>=6.0.11
Requires-Dist: regex==2026.4.4
Requires-Dist: schedule==1.2.1
Requires-Dist: zeroconf==0.149.17
Requires-Dist: sqlite_vec==0.1.1
Requires-Dist: jupyter==1.1.1
Requires-Dist: annotated-doc==0.0.5
Requires-Dist: rich==15.0.0
Requires-Dist: shellingham==1.5.4
Requires-Dist: markdown-it-py==4.2.0
Requires-Dist: mdurl==0.1.2
Requires-Dist: pygments==2.20.0
Requires-Dist: httpx==0.28.1
Requires-Dist: httpcore==1.0.9
Requires-Dist: h11==0.16.0
Requires-Dist: anyio==4.14.2
Requires-Dist: cffi==2.1.1
Requires-Dist: pycparser==3.0
Requires-Dist: contourpy==1.3.3
Requires-Dist: cycler==0.12.1
Requires-Dist: fonttools==4.63.0
Requires-Dist: kiwisolver==1.5.0
Requires-Dist: pyparsing==3.3.2
Requires-Dist: narwhals==2.24.0
Requires-Dist: soupsieve==2.9.1
Requires-Dist: xlsxwriter==3.2.9
Requires-Dist: tqdm==4.70.0
Requires-Dist: future==1.0.0
Requires-Dist: orderedmultidict==1.0.2
Requires-Dist: ifaddr==0.2.0
Requires-Dist: mypy-extensions==1.1.0
Requires-Dist: pathspec==1.1.1
Requires-Dist: platformdirs==4.11.0
Requires-Dist: pytokens==0.4.1
Requires-Dist: packaging==26.3
Requires-Dist: emoji==2.15.0
Requires-Dist: pendulum==3.2.0
Requires-Dist: tabulate==0.10.0
Requires-Dist: tomli==2.4.1
Requires-Dist: tomli-w==1.2.0
Requires-Dist: url-normalize==3.0.0
Requires-Dist: mistune==3.3.4
Requires-Dist: fqdn==1.5.1
Requires-Dist: isoduration==20.11.0
Requires-Dist: jsonpointer==3.1.1
Requires-Dist: jsonschema-specifications==2025.9.1
Requires-Dist: referencing==0.37.0
Requires-Dist: rfc3339-validator==0.1.4
Requires-Dist: rfc3986-validator==0.1.1
Requires-Dist: rfc3987-syntax==1.1.0
Requires-Dist: rpds-py==2026.6.3
Requires-Dist: uri-template==1.3.0
Requires-Dist: webcolors==25.10.0
Requires-Dist: lark==1.3.1
Requires-Dist: arrow==1.4.0
Requires-Dist: fastjsonschema==2.22.1
Requires-Dist: ipykernel==7.3.0
Requires-Dist: ipywidgets==8.1.8
Requires-Dist: jupyter-console==6.6.3
Requires-Dist: jupyterlab==4.6.2
Requires-Dist: notebook==7.6.1
Requires-Dist: nbconvert==7.17.1
Requires-Dist: jupyter-client==8.9.1
Requires-Dist: jupyter-core==5.9.1
Requires-Dist: jupyter-builder==1.2.1
Requires-Dist: jupyter-lsp==2.3.1
Requires-Dist: jupyter-server==2.20.0
Requires-Dist: jupyter-server-terminals==0.5.4
Requires-Dist: jupyter-events==0.12.1
Requires-Dist: jupyterlab-server==2.28.0
Requires-Dist: notebook-shim==0.2.4
Requires-Dist: async-lru==2.3.0
Requires-Dist: comm==0.2.3
Requires-Dist: widgetsnbextension==4.0.15
Requires-Dist: jupyterlab-widgets==3.0.16
Requires-Dist: jupyterlab-pygments==0.3.0
Requires-Dist: babel==2.18.0
Requires-Dist: json5==0.15.0
Requires-Dist: argon2-cffi==25.1.0
Requires-Dist: argon2-cffi-bindings==25.1.0
Requires-Dist: send2trash==2.1.0
Requires-Dist: terminado==0.18.1
Requires-Dist: websocket-client==1.9.0
Requires-Dist: prometheus-client==0.26.0
Requires-Dist: python-json-logger==4.1.0
Requires-Dist: jinja2==3.1.6
Requires-Dist: markupsafe==3.0.3
Requires-Dist: bleach==6.4.0
Requires-Dist: defusedxml==0.7.1
Requires-Dist: pandocfilters==1.5.1
Requires-Dist: nbclient==0.11.0
Requires-Dist: tinycss2==1.5.1
Requires-Dist: webencodings==0.5.1
Requires-Dist: tornado==6.5.7
Requires-Dist: pyzmq==27.1.0
Requires-Dist: traitlets==5.16.1
Requires-Dist: nest-asyncio2==1.7.2
Requires-Dist: ipython==9.16.1
Requires-Dist: ipython-pygments-lexers==1.1.1
Requires-Dist: debugpy==1.8.21
Requires-Dist: matplotlib-inline==0.2.2
Requires-Dist: jedi==0.20.0
Requires-Dist: parso==0.8.7
Requires-Dist: pexpect==4.9.0
Requires-Dist: ptyprocess==0.7.0
Requires-Dist: prompt-toolkit==3.0.53
Requires-Dist: wcwidth==0.8.2
Requires-Dist: stack-data==0.6.3
Requires-Dist: asttokens==3.0.2
Requires-Dist: executing==2.2.1
Requires-Dist: pure-eval==0.2.3
Requires-Dist: annotated-types==0.8.0
Requires-Dist: attrs==26.1.0
Requires-Dist: jaraco-classes==3.3.1
Requires-Dist: jaraco-context==6.1.1
Requires-Dist: jaraco-functools==4.4.0
Requires-Dist: more-itertools==11.1.0
Requires-Dist: pyasn1==0.6.4
Requires-Dist: pydantic==2.13.4
Requires-Dist: pydantic-core==2.46.4
Requires-Dist: typing-extensions==4.16.0
Requires-Dist: typing-inspection==0.4.2
Requires-Dist: nchantrs==0.0.1
Requires-Dist: pyffice==0.0.1
Requires-Dist: kahndor==0.0.1
Requires-Dist: subtrix==0.0.1
Requires-Dist: micromole==0.0.1
Requires-Dist: squirl==0.0.1
Requires-Dist: pycurity==0.0.1
Requires-Dist: thingery==0.0.1
Requires-Dist: pyside6pandas==0.0.1
Requires-Dist: pypdf>=3.0.0 ; extra == "pdf"
Requires-Dist: openpyxl>=3.1.0 ; extra == "spreadsheet"
Requires-Dist: pypdf>=3.0.0 ; extra == "all"
Requires-Dist: openpyxl>=3.1.0 ; extra == "all"
Provides-Extra: pdf
Provides-Extra: spreadsheet
Provides-Extra: internal
Provides-Extra: all
Description: # NchantdOffice
        <img width="1921" height="1043" alt="image" src="https://github.com/user-attachments/assets/aedb19af-b112-47b5-833f-1e8abab62a1c" />
        
        > Office automation suite built on the nchantrs framework
        
        ## Project overview
        
        NchantdOffice is a desktop application providing office automation capabilities including document management, calendar, contacts, and more. Built on PySide6 with deep integration into the nchantrs ecosystem.
        
        ## Features
        
        - **Document Management**: Support for 12+ document types (Notebook, Spreadsheet, Calendar, PDF, etc.)
        - **Calendar Integration**: Full calendar views and scheduling
        - **Contact Management**: Rolodex-style contact storage
        - **Browser Integration**: Built-in web browser with tab pinning and session persistence
        - **Tree Navigation**: Drag-and-drop tree nodes with persistent hierarchy
        - **Image Handling**: Canonical external file storage with deprecation warnings for legacy modes
        - **Agent-Ready**: Structured output (JSON/YAML) for AI agent integration
        - **CLI Interface**: Programmatic access via `nchantdoffice` CLI
        - **Per-user quotas (T-NEW-129, 131, 132, 135, 137)**: app_user
          seeded on first boot; child-node creates denied under
          Home/Journal/Settings; tab creates denied in the Settings tree;
          100-node cap pre-flight-checks both manual creates and `.pyof`
          imports, redirecting to the Nchantd Account upsell page when
          hit.
        
        ## Quick start
        
        Get a working nchantdoffice setup in 3 commands:
        
        ```bash
        # 1. Install with the recommended extras (internal SB packages)
        pip install -e .[internal]
        
        # 2. Launch the GUI
        nchantdoffice
        
        # 3. Or use the CLI for scripted operations
        nchantdoffice-cli --help
        ```
        
        ## Installation
        
        ## Usage
        
        ### GUI Application
        
        ```bash
        nchantdoffice
        ```
        
        ### CLI
        
        ```bash
        nchantdoffice-cli --help
        ```
        
        ## Development
        
        ### Setting up a development environment
        
        ```bash
        # Clone the source repo (uses the gamma branch per team convention)
        git clone -b gamma file:///mnt/overse/SBST01/vein/GitVein/nchantdoffice.git
        cd nchantdoffice
        
        # Create / activate a virtualenv (project's preferred path)
        python -m venv .venv && source .venv/bin/activate
        
        # Install in editable mode with dev + internal extras
        pip install -e .[internal]
        
        # Run the test suite (continue-on-collection-errors is set for aspirational tests)
        pytest tests/ --continue-on-collection-errors
        ```
        
        ### Pointing at a local test server (T-NEW-070)
        
        As of 2026-08-11, **the desktop no longer reads env vars** for
        server URL / cache dir / referral salt / software-render mode
        (per the user's hard-break directive). All runtime config now
        comes from a single user config file:
        
        ```yaml
        # ~/.config/nchantdoffice/config.yaml  (XDG — global default)
        dev_mode: true                          # points at http://localhost:5000
        server:
          url: "http://localhost:5000"
          timeout: 3
        cache:
          dir: /tmp/nchantdoffice-test           # override cache for tests
        webengine:
          software_render: true                 # only on Linux GPU issues
        user:
          uuid: ...                              # auto-generated on first launch
        ```
        
        A per-project override file `./nchantdoffice.yaml` (cwd) takes
        precedence over the XDG file. See `nchantdofficeATNRG/dev-setup.md`
        for the full quick-start and `tests/test_user_config.py` for the
        contract pin (10 tests).
        
        The status bar shows a `[DEV]` badge when `dev_mode: true` is
        active — operators can see at a glance whether they're hitting
        prod or a local server.
        
        ## Recent changes (2026-08)
        
        Cross-repo work that landed 2026-08-11:
        
        - **T-NEW-070 hard-break**: removed env-var reads for
          `NCHANT_API_BASE`, `NCHANT_DATA_DIR`, `NCHANT_REFERRAL_SALT`,
          `NCHANT_WEBENGINE_SOFTWARE`. Replaced with config-file reads.
          Added `nchantdoffice/utilities/user_config.py` (XDG resolver
          with cwd override). Reorganized launcher imports so
          `crow.crowLoad` runs first (sys.path setup before Qt).
          See T-DESK-066 card in `TODOs.md` for the full commit trail.
        - **T-NEW-042 anti-abuse + attribution + NchantdOfficeUser**:
          device-fingerprint anti-abuse check (30-day window),
          first-touch attribution (30-day cookie), 3-opens-minimum
          anti-abuse rule (MIN_APP_OPENS=3), `record_app_open()`
          per-calendar-day idempotency. NchantdOfficeUser is now
          properly integrated as the canonical user UUID source
          (DESK-0 — replaces the hardcoded `application_NCD` string).
          Real-world crash from 2026-08-11 14:21 (T-NEW-042b) fixed:
          `self.device = Device()` set before user instantiation.
        - **T-NEW-070 DESK-5 [DEV] badge**: status bar shows `[DEV]`
          badge whenever `dev_mode: true` is in the config — operators
          can see at a glance whether they're hitting prod or a local
          server.
        - **T-NEW-044 UI-1** (referral panel uses server-side eligibility):
          `ReferralAPIClient.fetch_payout_eligibility(user_id)` calls
          `GET /api/v1/referral/payout-eligibility/<user_id>`.
          `NchantdOfficeReferralPanel._build_earnings_card` renders
          4 distinct states (no data / free_tier / below_threshold /
          eligible). Replaces the client-side `pending >= min_payout`
          shortcut that ignored tier-gating — a free-tier user with
          $30 pending would have been shown "Eligible for payout"
          before this fix. Commit `e8d10d1`.
        - **T-NEW-044 UI-2** (ad-tab-free hours fallback): 4 new helpers
          in `user_config.py` (`get_ad_tab_free_until`,
          `set_ad_tab_free_hours`, `clear_ad_tab_free_hours`,
          `is_ad_tab_free_active`). `NchantdOfficeAdTab
          ._is_visible_for_user()` checks `is_ad_tab_free_active()`
          FIRST — hides the Ad tab for free-tier referrers with an
          active grant (per AppReferralSpec §10). Commit `e4838f3`.
        - **T-NEW-044 UI-3** (affiliate panel for Stripe Connect): new
          `nchantdoffice/widgets/config/affiliate_panel.py` with
          `NchantdOfficeAffiliatePanel` widget — "Connect Stripe
          Account" button + status label. On click → POST
          `/api/v1/affiliate/connect-stripe` → opens the Stripe-hosted
          onboarding URL in the user's browser via `webbrowser.open()`.
          Commit `ded73fc`. Server endpoint: `20673f4`.
        - **T-NEW-045 WIRE-1** (desktop grant trigger):
          `NchantdOfficeReferralPanel._maybe_grant_ad_tab_free_hours()`
          computes hours = floor(pending_total * 24 / 5) (24h per $5
          of pending credit, AppReferralSpec §10), skips if
          `is_ad_tab_free_active()` is True (no stacking), and is
          called from `_fetch_payout_eligibility` when
          `reason='free_tier'`. Commit `b420a06`.
        
        The full cross-repo log (every commit, every T-NEW card,
        every test total) lives at
        [`nchantdofficeATNRG/cross-repo-changelog.md`](../nchantdofficeATNRG/cross-repo-changelog.md)
        — the canonical "current reality" anchor for all 3 repos
        (`nchantdofficeATNRG/`, `nchantdofficeCOM/`, this repo). Path
        is a sibling repo in the same `/home/solubrew/.hermes/projects/`
        directory; the older `gitlab.example.com` URL was a placeholder
        that did not resolve and has been retired.
        
        Latest verified local commit on `gamma`:
        [`07fc18b fix(pyof): guard bare Qt parent access`]. The branch also
        contains the 2026-08-17 T-NEW-117, T-NEW-122, and chart-segfault
        fixes documented in `CHANGES.md`.
        
        **Reality-anchor update (2026-08-19, gamma `655f36b`):** the
        2026-08-18 / 2026-08-19 sweep closed the **T-NEW-144b umbrella**
        (12 children, multi-format `set_location` cleanup across
        13 widget classes) and shipped **T-NEW-152 / 154 / 155 / 156 /
        157 / 158** (P1 operator-asks: ToolBox refresh, add_tab
        timing, Ctrl+D date shortcut, underscore priority sort,
        active_tab_position clamp, T-NEW-XXX → T-NEW-158 marker fix).
        Plus **T-NEW-169 / 170 / 171 / 172** filed 2026-08-19 (standalone
        2-pane boot, pullable-tab dialog, performance campaign,
        async via pyularity). See [`CHANGES.md`](./CHANGES.md) for the
        new `[Unreleased]` anchor that consolidates these 16+
        commits between `18336e5` and `655f36b`. T-NEW-only test files
        report **307 passed / 0 failed** at this branch tip.
        
        For a repo-local cross-reference of every shipped + filed
        T-NEW card with commit SHAs, see
        [`CHANGES.md`](./CHANGES.md) `[Unreleased]` block.
        
        ### Code style
        
        - **Class naming**: All public widget / document / manager classes are named ``Nchantd<Document>`` (preserved per user direction — do not rename).
        - **Logging**: Use ``kahndor.logma.Logma(__name__)`` — never ``print()``.
        - **Configuration**: Read project-wide constants from ``nchantdoffice.config``.
        - **Internal projects**: All SB packages (``nchantrs``, ``pyffice``, ``ladyol``, ``senbai``, ``kahndor``, ``glain``) are internal — never substitute PyPI alternatives.
        
        ### Running sasquatch
        
        The auditor is invoked from any project root via:
        
        ```bash
        sasquatch analyze -p . --skip-pii-secrets
        ```
        
        Score is written to ``PROJECT_TRACKER.yaml`` and ``FALCON_TEST.yaml``.
        
        ### Active work
        
        See [TODOs.md](./TODOs.md) for the active task inventory and H## tracker.
        
        ## Project Structure
        
        > **Snapshot of the `gamma` branch HEAD `5b6397e` (2026-08-16).**
        > For an up-to-date tree see `directory_tree.md` (note: that
        > file's body is a 2026-07-16 snapshot — regenerate with
        > `tree -L 4 -I '__pycache__|*.egg-info|node_modules'`
        > before relying on it).
        
        ```
        nchantdoffice/
        ├── __main__.py            # python -m nchantdoffice entry point
        ├── nchantdoffice/         # Main package
        │   ├── __init__.py        # version + APP_* constants
        │   ├── __main__.py
        │   ├── cli.py             # CLI command surface (used by cmds/)
        │   ├── models.py          # Tabset + document models
        │   ├── views.py
        │   ├── nchantdoffice.py   # Main application (NchantdOfficeCloakModel)
        │   ├── _data_/            # Config and resources
        │   ├── dialogs/           # Document dialogs
        │   ├── sync/              # app<->doc sync helpers
        │   ├── updates/           # Update handlers (checker, db)
        │   ├── utilities/         # Helpers (constants, users, config, pyof_import, …)
        │   ├── widgets/           # UI widgets
        │   └── wizards/           # Wizard dialogs
        ├── cmds/                  # CLI commands and run scripts
        ├── tests/                 # Test suites (1130+ entries — integration + unit + fixtures + qt_parent)
        ├── docs/                  # API and reference docs
        ├── .github/workflows/     # CI + docs deployment
        ├── AXN.md                 # Account-experience notes
        ├── BUGs.md                # Historical stack-trace archive
        ├── CHANGES.md             # Changelog
        ├── CI_CD.md               # CI/CD pipeline reference
        ├── CLI.md                 # CLI reference
        ├── CODING_STANDARDS.md    # V4 standards compliance
        ├── directory_tree.md      # File-tree snapshot (2026-07-16)
        ├── FALCON_TEST.yaml       # Last sasquatch-falcon test run summary
        ├── LICENSE                # MIT
        ├── license_dependencies.txt
        ├── profile.html           # SB workspace profile export
        ├── profile.json           # SB workspace profile export
        ├── PROJECT_TRACKER.yaml   # Last full sasquatch audit
        ├── pyproject.toml         # Package metadata (version 0.0.1.0.1.4)
        ├── pytest.ini             # Test config
        ├── README.md              # This file
        ├── testing-report_20260817.md  # Latest live-testing issues
        └── TODOs.md               # Active task inventory (T-NEW-NNN tracker)
        ```
        
        ## Recent Bug Fixes (2026-07)
        
        | ID | Title | Commit |
        |----|-------|--------|
        | H24 | Toolbox Drawer Stale on Tab Switch | pre-gamma |
        | H25 | Catalog Tab Wrong Child Count | nchantrs `fa05530` |
        | H27 | Image Save Mode (External Storage) | `c45cfc5` |
        | H28 | Browser Pin Tab Persistence | `87a5264` |
        | H29 | Tree Node Drag-and-Drop Regression | nchantrs `fa05530` + `c45cfc5` |
        
        See [TODOs.md](./TODOs.md) for the complete task inventory.
        
        ## Documentation
        
        - [TODOs.md](./TODOs.md) - Active task inventory and T-NEW-NNN tracker
        - [CHANGES.md](./CHANGES.md) - Changelog (current `gamma` `[Unreleased]` block mirrors TODOs.md)
        - [CLI.md](./CLI.md) - CLI reference
        - [CI_CD.md](./CI_CD.md) - CI/CD pipeline reference
        - [CODING_STANDARDS.md](./CODING_STANDARDS.md) - V4 standards compliance
        - [directory_tree.md](./directory_tree.md) - File-tree snapshot (2026-07-16, regenerate before relying)
        - [BUGs.md](./BUGs.md) - Historical stack-trace archive (read-only)
        - [testing-report_20260817.md](./testing-report_20260817.md) - Latest live-testing issues
        
        ## Dependencies
        
        - **Core**: nchantrs, pyffice, kahndor, pycurity, subtrix
        - **GUI**: PySide6
        - **Data**: pandas (DataFrames only — used in calendars.py, filesystems.py, atnrg/browsers.py); **persistence via `squirl` + `micromole` (NOT SQLAlchemy — this is a hard working agreement).**
        
        ## License
        
        See [LICENSE](./LICENSE) and [license_dependencies.txt](./license_dependencies.txt)
Description-Content-Type: text/markdown
