toga-ai 1.0.212 → 1.0.213

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.
@@ -2,8 +2,8 @@
2
2
 
3
3
  | Doc | Summary | Files |
4
4
  |-----|---------|-------|
5
- | [Tools (1.0 Internal-Tools App) Architecture](architecture.md) | **Tools** is a standalone 1.0 (`App_`) application that houses many small internal tools behind simple interfaces, gated by Client_True staff persona. | tools/index.php, tools/_/app/framework.php, tools/_/app/frameworkindex.php, tools/_/app/auth.php, tools/_/app/nav.php, tools/common/header.php, tools/common/footer.php, tools/mvc/get.php, tools/mvc/_TEMPLATE/get.php, tools/docs/ADDING_A_TOOL.md |
5
+ | [Tools (1.0 Internal-Tools App) Architecture](architecture.md) | **Tools** is a standalone 1.0 (`App_`) application that houses many small internal tools behind simple interfaces, gated by Client_True staff persona. | tools/index.php, tools/_/app/framework.php, tools/_/app/frameworkindex.php, tools/assets/img/favicon/favicon.ico, tools/assets/img/favicon/favicon-32x32.png, tools/assets/img/favicon/favicon-16x16.png, tools/assets/img/favicon/apple-touch-icon.png, tools/_/app/auth.php, tools/_/app/nav.php, tools/common/header.php, tools/common/footer.php, tools/mvc/get.php, tools/mvc/_TEMPLATE/get.php, tools/docs/ADDING_A_TOOL.md |
6
6
  | [Tools — Developers Folder (UUID & Password Generators)](features/developer-tools.md) | The first two tools shipped in the Tools app, both under the **Developers** folder and gated to personas **Development Team** / **TOGa Technology**. | tools/mvc/developers/uuid/get.php, tools/mvc/developers/password/get.php |
7
- | [Tools Persona-Gated Navigation (App_Nav)](features/persona-gated-navigation.md) | `App_Nav` is the Tools app's two-level, **persona-gated** navigation. | tools/_/app/nav.php |
7
+ | [Tools Persona-Gated Navigation (App_Nav)](features/persona-gated-navigation.md) | `App_Nav` is the Tools app's two-level, **persona-gated** navigation. | tools/_/app/nav.php, tools/mvc/get.php |
8
8
  | [Tools SAML SSO Consumer & Persona-Gated Auth (App_Auth)](features/saml-sso-auth.md) | `App_Auth` is the Tools app's authentication layer: it consumes the SAML gateway `?saml=` handoff (see the 2.0 SAML downstream integration contract), establishe | tools/_/app/auth.php, tools/mvc/sso/initiate/get.php, tools/mvc/sso/get.php, tools/mvc/login/get.php, tools/mvc/login/post.php, tools/mvc/logout/get.php, tools/mvc/get.php, tools/config.production.ini |
9
9
  | [Deploying Tools to Elastic Beanstalk (PHP 8.5 / Amazon Linux 2023)](workflows/deploy-to-elastic-beanstalk-al2023.md) | How the **Tools** 1.0 app boots on Elastic Beanstalk running `PHP 8.5 on 64bit Amazon Linux 2023/4.13.1 (aarch64)`. | tools/.ebextensions/004_http_to_https.config, tools/.ebextensions/006_mount-s3fs.config, tools/.ebextensions/007_setup_export_cache_folders.config, tools/.ebextensions/008_setup_ldap.config, tools/.ebextensions/009_setup_phpini.config, tools/.ebextensions/020_setup_git_libraries.config, tools/.ebextensions/050_register_instance_to_shared_application_load_balancer.config, tools/ebs/git.json |
@@ -6,12 +6,16 @@ project: Tools
6
6
  client: shared
7
7
  type: architecture
8
8
  status: active
9
- updated: 2026-06-25
9
+ updated: 2026-06-26
10
10
  owners: [jcardinal]
11
11
  files:
12
12
  - tools/index.php
13
13
  - tools/_/app/framework.php
14
14
  - tools/_/app/frameworkindex.php
15
+ - tools/assets/img/favicon/favicon.ico
16
+ - tools/assets/img/favicon/favicon-32x32.png
17
+ - tools/assets/img/favicon/favicon-16x16.png
18
+ - tools/assets/img/favicon/apple-touch-icon.png
15
19
  - tools/_/app/auth.php
16
20
  - tools/_/app/nav.php
17
21
  - tools/common/header.php
@@ -57,14 +61,22 @@ calling the parent initialize.
57
61
 
58
62
  No per-host `stylePath` subfolder — one `assets/css/style.css`. Uses TOGA Technology logos in
59
63
  `assets/img` (`toga-brandmark-white.png` in the dark sidebar; `toga-horizontal-colored.png` on
60
- login/welcome). A fixed left two-column shell: dark left sidebar (`.app-nav`) with brand at top,
64
+ login). **Favicons are app-local** under `assets/img/favicon/` (`apple-touch-icon.png` 180x180,
65
+ `favicon-32x32.png`, `favicon-16x16.png`, `favicon.ico`, sourced from togatech.com) and registered
66
+ in `_/app/frameworkindex.php` — **not** the shared `resources/images/favicon/` (Agilant) set
67
+ referenced via `__ASSETS__`. **Convention:** a per-app favicon/brand asset belongs under that app's
68
+ own `/assets`, never the shared `resources` repo, so changing one 1.0 app's favicon never affects
69
+ sibling apps. A fixed left two-column shell: dark left sidebar (`.app-nav`) with brand at top,
61
70
  persona-filtered nav in the middle, pinned footer with the user's name + a ghost "Log out"
62
71
  button; content area on the right. **No top header bar** (see Critical rules).
63
72
 
64
73
  ## Home route
65
74
 
66
75
  `/` (`mvc/get.php`) renders a persona-filtered dashboard of available tools (tiles grouped by
67
- folder) when logged in, via `App_Nav::visibleGroups()`, or a welcome/sign-in card when not.
76
+ folder) when logged in, via `App_Nav::visibleGroups()`. When **not** logged in, `/` immediately
77
+ routes to `/login` (one-step SSO sign-in — no intermediate welcome card). A persona-less but
78
+ authenticated user gets the dashboard's explicit empty-state (see
79
+ `features/persona-gated-navigation.md`).
68
80
 
69
81
  ## Adding a tool
70
82
 
@@ -79,3 +91,6 @@ Create `mvc/<folder>/<tool>/get.php` (copy `mvc/_TEMPLATE/get.php`), add one ent
79
91
  **accepted this for now** (developer decision, 2026-06-25). Future remediation: git-ignore the
80
92
  config files and rotate all exposed credentials. (Location only — no values recorded here.)
81
93
  - **SSO initiation + replay defense are open items** — see `features/saml-sso-auth.md`.
94
+
95
+ ## Change history
96
+ - 2026-06-26 — Documented app-local favicons under `assets/img/favicon/` (registered in `_/app/frameworkindex.php`, not the shared `resources/` set) + the per-app-asset convention; refreshed the home-route description for one-step SSO sign-in and the persona-less empty-state (jcardinal)
@@ -6,10 +6,11 @@ project: Tools
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-06-25
9
+ updated: 2026-06-26
10
10
  owners: [jcardinal]
11
11
  files:
12
12
  - tools/_/app/nav.php
13
+ - tools/mvc/get.php
13
14
  related:
14
15
  - ../architecture.md
15
16
  - ./saml-sso-auth.md
@@ -40,5 +41,25 @@ An action's `route` (e.g. `/developers/uuid`) maps **1:1** to `mvc/<route>/get.p
40
41
  tool means creating that file and adding one entry to `definition()` — see
41
42
  `docs/ADDING_A_TOOL.md` and the architecture doc.
42
43
 
44
+ ## Authorization model — authentication and authorization are separate
45
+
46
+ **Authentication (SSO) and authorization (persona-gated nav) are independent.** Any valid,
47
+ active Client_True user authenticates and gets a session (see
48
+ [saml-sso-auth](./saml-sso-auth.md)) **regardless of personas** — having zero matching personas
49
+ does **not** block login. Authorization is then applied entirely by `App_Nav::definition()`
50
+ folder/action `personas` gates.
51
+
52
+ **Persona-less user (authenticated, zero tools):** `App_Nav::render()` skips every folder/action
53
+ the user lacks personas for, and skips now-empty groups, so the left rail renders **no links**.
54
+ The home dashboard (`mvc/get.php`) detects the empty result and shows an explicit empty-state
55
+ rather than a blank page:
56
+ - subtitle: *"There are no tools available for you to see."*
57
+ - a card: *"Your account doesn't have access to any tools. Tool access is granted by persona —
58
+ if you believe you should have access, contact the development team."* + a Log out action.
59
+
60
+ This is intentional: a valid user is never shown a broken/blank dashboard, and access is granted
61
+ purely by assigning personas — no code change is needed to grant a user access to an existing tool.
62
+
43
63
  ## Change history
64
+ - 2026-06-26 — Documented the authorization model: authentication (SSO) and authorization (persona-gated nav) are separate — any valid user logs in regardless of personas; a persona-less user gets an empty left rail and an explicit dashboard empty-state ("no tools available", contact-dev card + Log out) instead of a blank page (jcardinal)
44
65
  - 2026-06-25 — Built App_Nav: hard-coded two-level persona-gated navigation; render() for the left rail, visibleGroups() for the dashboard, personasForRoute() for page self-guarding; route maps 1:1 to mvc/<route>/get.php (jcardinal)
@@ -68,6 +68,9 @@ auto-created.
68
68
  ### Page guarding
69
69
  - `requireAuth([personas])` at the top of each page; `hasAnyPersona()` is `array_intersect`
70
70
  against the cached session personas. App_Nav uses the same cached data to filter the nav.
71
+ - **Authentication ≠ authorization.** A session establishes for **any** valid/active user even
72
+ when they have **zero** matching personas; in that case the nav is empty and the dashboard shows
73
+ an explicit empty-state — see [persona-gated-navigation](./persona-gated-navigation.md).
71
74
 
72
75
  ### Dev bypass (double-gated, fails closed in prod)
73
76
  `mvc/login/post.php` permits **email-only** login **only** when config `[internal] dev_mode`
@@ -117,16 +117,18 @@ setup — the git clone (`020`) deliberately does **not** use it (see gotchas).
117
117
  e.g. `GIT=$(which git || echo /usr/bin/git)`.
118
118
  - **cfn-init `files:` runs before `container_commands`** — the correct pattern for writing a
119
119
  script and then executing it in the same config.
120
- - **A SAML SSO return-leg "connection timeout" is usually a missing HTTPS listener, not code.**
120
+ - **A SAML SSO return-leg "connection timeout" is a missing HTTPS listener, not code. (CONFIRMED + RESOLVED.)**
121
121
  When the gateway's return redirect to `https://<host>/sso` times out in the browser, verify the
122
122
  **EB/ALB HTTPS (443) listener + ACM cert cover the EXACT return hostname before debugging
123
- PHP/SAML.** This bit Tools after the domain was switched from `togahub.com` to `togatech.com` and
124
- no 443 listener existed for the new hostname. Diagnosis signature: `curl` to the public `https://`
125
- URL **from the instance itself** returns `http=000` after the full timeout, while
126
- `curl http://127.0.0.1` with a `Host:` header returns `200` fast. Reusable for any TOGA app behind
127
- Elastic Beanstalk.
123
+ PHP/SAML.** Root cause for Tools was **confirmed**: the `tools.togatech.com` EB environment had
124
+ **no HTTPS (443) listener configured at all**. Adding the HTTPS:443 listener (with an ACM cert
125
+ covering the exact return hostname) fixed the SSO return leg completely — **no code change was
126
+ involved.** Diagnosis signature: `curl` to the public `https://` URL **from the instance itself**
127
+ returns `http=000` after the full timeout, while `curl http://127.0.0.1` with a `Host:` header
128
+ returns `200` fast. Reusable for any TOGA app behind Elastic Beanstalk.
128
129
 
129
130
  ## Change history
131
+ - 2026-06-26 — CONFIRMED + RESOLVED the SAML SSO return-leg gotcha: the `tools.togatech.com` EB environment had no HTTPS (443) listener at all; adding the HTTPS:443 listener + ACM cert covering the exact return hostname fixed the SSO return leg with no code change (jcardinal)
130
132
  - 2026-06-26 — Added the SAML SSO return-leg gotcha: a "connection timeout" on `https://<host>/sso` was a missing EB/ALB HTTPS (443) listener for the new `togatech.com` hostname (not PHP/SAML); documented the curl `http=000` vs `127.0.0.1` 200 diagnosis (jcardinal)
131
133
  - 2026-06-26 — Documented the AL2 → AL2023 (PHP 8.5) EB migration for Tools: package renames
132
134
  (`libstdc++48`→`libstdc++`, `php73-ldap`→`php-ldap`, drop `libcurl`), php ini via cfn-init
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.212",
3
+ "version": "1.0.213",
4
4
  "description": "TOGA Technology Team Claude Knowledge System — shared AI coding harness with skills, knowledge base CLI, and project installer for Claude Code.",
5
5
  "keywords": [
6
6
  "claude",