toga-ai 1.0.1106 → 1.0.1107

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.
@@ -6,7 +6,7 @@ project: Library
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-10-20
9
+ updated: 2026-10-19
10
10
  owners: [jcardinal, mhammontree, bala, snaredla]
11
11
  files:
12
12
  - library/app/cloud.php
@@ -75,7 +75,7 @@ CodePipeline `Worker` (502, us-west-2) sources `_production` of **both** `agilan
75
75
  - `togadesk` `ebs/check_s3fs.php` + `ebs/register_instance_to_shared_application_load_balancer.php` now assume `WorkloadsRuntime` (TRUE-82718, PR #622, merged 2026-10-13); togaview fix is PR #307 (opened). The s3fs **mount** cannot assume a role — it uses the instance role directly: see [asifiles s3fs mount](../../togadesk/features/s3fs-asifiles-file-storage.md).
76
76
  - **Every 1.0 app that bootstraps `library` needs `aws/aws-sdk-php` in its own `composer.json`** (since TRUE-82705). Without it any App_Cloud call fatals `Class 'Aws\Credentials\CredentialProvider' not found`. Hidden trigger: on prod/worker/bigworker, `App_Database::getDatabaseReaderHost()` (`library/app/database.php` ~156) calls `App_Cloud::getParameter('database_reader_endpoint')` whenever its cache file `databaseReadHost.txt` is older than 30-60 s. The fatal hits before the cache is rewritten, so the cache stays stale and **every** reader-DB request fails — the app looks fully down (TRUE-82793: Vision PunchOut for Canon / S&P Global via SAP Ariba returned HTTP 500). Fix = add `"aws/aws-sdk-php": "^3.328"` and pin `composer.lock` to worker's prod versions (aws-sdk-php 3.328.1, guzzle 7.9.2, promises 2.0.4, psr7 2.7.0, jmespath 2.8.0 — PHP 7.2 safe); EB runs `composer install --no-dev` on deploy (`vendor/` is gitignored).
77
77
  - Has it (`_production`): worker, togadesk (`^3.337`), togaview, tools, toga (TRUE-82714, 63c5ed0; confirmed 2026-10-16), vision (TRUE-82793, merged + deployed 2026-10-15).
78
- - store: fixed on branch (TRUE-82856, ae1861f4f — same pins plus aws-crt-php 1.2.7, psr/http-client 1.0.3, polyfill-mbstring 1.31.0; verified on PHP 7.2.33); **still unmerged on 2026-10-20** — caused the S&P Global Ariba PunchOut outage (TRUE-82959: every store page HTTP 500 at `library/app/cloud.php:127`; Guided Buying shows "Unable to connect to supplier's website"). Needs merge + deploy. Its `.ebextensions/015_install_composer.config` already runs `composer install --no-dev`.
78
+ - store: fixed on branch (TRUE-82856, ae1861f4f — same pins plus aws-crt-php 1.2.7, psr/http-client 1.0.3, polyfill-mbstring 1.31.0; verified on PHP 7.2.33); needs merge + deploy. Its `.ebextensions/015_install_composer.config` already runs `composer install --no-dev`.
79
79
  - **Missed by the audit (TRUE-82935): the 1.0 `api` repo** (no composer at all) and **togadesk's email cron** (`crons/tickets.php` loads only `desk/vendor/autoload.php`; the root togadesk composer with aws is not loaded there). Both stopped `App_Cloud`: [Talos ticket API](../../api/features/talos-ticket-endpoint.md), [email intake](../../togadesk/features/email-to-ticket-intake.md). Audit per **entry point**, not per repo: a CLI cron or sub-app can load a different autoloader than the web app.
80
80
  - The missing class throws **`Error`, not `Exception`** — `catch (Exception)` around an App_Cloud call does not catch it; use `\Throwable` where a fallback is meant.
81
81
  - Not changed on TRUE-82856: walmarttechservices — GitHub repo `agilantsolutions/walmarttechservices` no longer exists ("Repository not found", checked 2026-10-16); webhook — reported no longer active by the developer (2026-10-16). Removal / deprecation is left to the owners.
@@ -84,7 +84,6 @@ CodePipeline `Worker` (502, us-west-2) sources `_production` of **both** `agilan
84
84
  - Every long-lived key still in code across repos (SES SMTP, s3fs, ALB scripts, other accounts): [audit 2026-10-13](../../../../2.0/apps/worker2/features/cross-account-aws-access.md#long-lived-keys-still-in-code-audit-2026-10-13).
85
85
 
86
86
  ## Change history
87
- - 2026-10-20 — store aws-sdk fix still unmerged; caused S&P Global PunchOut outage (TRUE-82959) (snaredla)
88
87
  - 2026-10-19 — aws-sdk-php audit missed `api` + togadesk email cron; `Error` not `Exception` (TRUE-82935) (jcardinal)
89
88
  - 2026-10-16 — aws-sdk-php: store fixed (TRUE-82856), vision deployed, walmarttechservices + webhook not changed (repo gone / reported inactive) (mhammontree)
90
89
  - 2026-10-15 — aws-sdk-php requirement: reader-host crash path, per-app audit, vision fixed (TRUE-82793) (mhammontree)
@@ -6,8 +6,8 @@ project: Worker
6
6
  client: shared
7
7
  type: feature
8
8
  status: active
9
- updated: 2026-10-20
10
- owners: [jcardinal, dfranks, mhammontree, tcox, bala, ajean, rgirish]
9
+ updated: 2026-10-22
10
+ owners: [jcardinal, dfranks, mhammontree, tcox, bala, ajean, rgirish, snaredla]
11
11
  files:
12
12
  - worker2/Worker/
13
13
  - worker2/Controller/Index.php
@@ -544,10 +544,15 @@ Rules: rename **both sides in one PR and one deploy**; grep every repo for the o
544
544
  host — a separate connection that cannot see the job's own uncommitted insert (not replication
545
545
  lag). Call `_Database::setIsReadHostEnabled(false)` for the job, as `_Email` (TRUE-80448) and
546
546
  [8x8 survey import](./8x8-post-call-survey-import.md) do.
547
+ - **Vendor named args must match the vendor's param names exactly** (PhpSpreadsheet
548
+ `Alignment::setVertical(verticalAlignment:)`, not `vertical:`). A wrong name is a runtime fatal;
549
+ `php -l` does not catch it. The vendor tree needs PHP 8.5; an older local PHP can load it only by
550
+ registering composer's `ClassLoader` by hand (skip `platform_check.php`).
547
551
  - See [architecture.md](../architecture.md) for the always-HTTP-200 rule and the
548
552
  commit-before-SQS transaction pattern that the worker relies on.
549
553
 
550
554
  ## Change history
555
+ - 2026-10-22 — Gotcha: vendor named args must match vendor param names; PHP 8.5 vendor tree. (snaredla)
551
556
  - 2026-10-20 — Debug-mode `runTask` capped at depth 5 (`X-Toga-Worker-Depth`), throws on non-2xx, 300 s timeout; local ini needs `[api] worker` (TRUE-82934). (jcardinal)
552
557
  - 2026-10-08 — Direct POST needs the worker key in `Authorization`, runs synchronously, writes no `WorkerJobs` row. (rgirish)
553
558
  - 2026-10-06 — Absent-row section: a 200 + MessageId send can still produce no row for up to 1h (failed first delivery hidden by the visibility timeout). (ajean)
@@ -23,7 +23,7 @@ _Auto-generated by `knowledge.js index`. Do not hand-edit._
23
23
  ## 2.0 framework
24
24
 
25
25
  - **_underscore** (_Underscore) _(framework core)_ — 114 doc(s) → [2.0/apps/_underscore/INDEX.md](2.0/apps/_underscore/INDEX.md)
26
- - **worker2** (Worker) — 92 doc(s) → [2.0/apps/worker2/INDEX.md](2.0/apps/worker2/INDEX.md)
26
+ - **worker2** (Worker) — 93 doc(s) → [2.0/apps/worker2/INDEX.md](2.0/apps/worker2/INDEX.md)
27
27
  - **api2** (API) — 27 doc(s) → [2.0/apps/api2/INDEX.md](2.0/apps/api2/INDEX.md)
28
28
  - **dbchanges2** (Database Changes) _(framework core)_ — 23 doc(s) → [2.0/apps/dbchanges2/INDEX.md](2.0/apps/dbchanges2/INDEX.md)
29
29
  - **toga2-supply** (TOGa Supply) — 9 doc(s) → [2.0/apps/toga2-supply/INDEX.md](2.0/apps/toga2-supply/INDEX.md)
@@ -2,6 +2,7 @@
2
2
 
3
3
  | Doc | Framework | Summary |
4
4
  |-----|-----------|---------|
5
+ | [ODP Monthly Talos Call Transcript Report (worker2 cron)](features/odp-call-transcript-monthly-report.md) | 2.0 | Monthly xlsx of ODP Talos voice-agent calls, built from S3 session reports and emailed; open before any ODP call reporting work. |
5
6
  | [Office Depot Phone Tech Support](features/odp-tech-support.md) | standalone | Office Depot's phone agent guides store associates through Tier-1 support and records Desk tickets; open for its client-specific prompt, tools, tuning and deplo |
6
7
  | [TOGaRefresh 2026 — linkBuilderRefresh URL Routing (ODP)](features/togarefresh2026-linkbuilder-routing.md) | 1.0 | In TOGaRefresh 2026, service-builder buttons must route via `App_Model_ServiceRequest::linkBuilderRefresh()` (`serviceselection`), not legacy `linkBuilder()` (` |
7
8
  | [Office Depot](profile.md) | standalone | Office Depot uses TOGa Voice for inbound store-associate tech support and Desk ticketing; open for client scope and links to its voice configuration. |
@@ -0,0 +1,48 @@
1
+ ---
2
+ title: ODP Monthly Talos Call Transcript Report (worker2 cron)
3
+ framework: "2.0"
4
+ repo: worker2
5
+ project: Worker
6
+ client: office-depot
7
+ type: client-feature
8
+ status: draft
9
+ updated: 2026-10-22
10
+ owners: [snaredla]
11
+ files:
12
+ - worker2/Worker/Client/OfficeDepot/CallTranscriptReport.php
13
+ - dbchanges2/Core/2026-10-16a - ODP call transcript monthly report cron.sql
14
+ related:
15
+ - ../profile.md
16
+ - odp-tech-support.md
17
+ - ../../../2.0/apps/worker2/features/creating-worker-actions.md
18
+ - ../../../2.0/apps/worker2/features/cross-account-aws-access.md
19
+ - ../../../standalone/apps/voice-to-voice/features/post-call-lambda.md
20
+ ---
21
+
22
+ Monthly xlsx of ODP Talos voice-agent calls, built from S3 session reports and emailed; open before any ODP call reporting work.
23
+
24
+ ## Summary
25
+
26
+ worker2 cron action `Client/OfficeDepot/CallTranscriptReport/Generate`. PHP port of the Talos team's one-time `build_report.py` (handover 2026-10-19). Source of truth is S3, not TOGaDesk. Status: code reviewed, NOT yet run against real S3 data.
27
+
28
+ ## How it works
29
+
30
+ 1. Lists `s3://talos-voice-to-voice/odp/processed/` and `odp/upload/`; keys `{ticket}_{sessionId}_{ticketRefId}/session_report.json`.
31
+ 2. Prefilters by S3 `LastModified` within the month ±2 days, then keeps rows whose `ended_at` falls in the month (wall-clock, offset dropped).
32
+ 3. Builds sheets Summary / All Calls / `YYYY-MM` (16 columns). Ticket number links to `https://togadesk.togatech.com/desk/?route=tickets/manage&id={tickets.id}` via one batched lookup on `DB_TOGADESK1` (TOGaDeskSupport). Lookup failure = no links; report still sends.
33
+ 4. Emails serviceops@ and jhammontree@togatech.com. Params: `month` (`YYYY-MM`), `emailTo` (array, for tests).
34
+ 5. Cron row (Core, dbchanges2) ships `isActive=0`, `0 6 1 * *`, `maxExecutionTime` 600.
35
+
36
+ Decisions:
37
+ - S3 read error throws — never email a partial report. Only unparsable JSON is skipped and listed in job output.
38
+ - Temp xlsx holds caller PII: written in a random 0700 folder, always deleted.
39
+ - Fewer than 50 (or zero) calls adds a warning to the email body and subject.
40
+ - Credentials: `_Cloud::getCredentialProvider()` (WorkloadsRuntime role, s3:* in every account; no IAM change).
41
+
42
+ ## Gotchas
43
+
44
+ - Why not the DB: TOGaDeskSupport has the ODP Talos tickets (clientid 3, origin `TALOS`, dept 322) and transcripts in `tickets_replies` (`=== Updated/Full Conversation Transcript ===`, `[Customer]:` / `[AI Assistant]:`), and `tickets.referenceId` = session report `ticket_reference_id` (251/251 for Aug). But Session ID and caller ID exist only in S3, and Talos QA writes test tickets (`[BEHAVIOR TEST]`, `AUTOMATED ... TEST`) into the live ODP dept. Start ODP call reporting from S3.
45
+ - Open: bucket owner account and region (`us-east-1` assumed) not confirmed. Confirm before setting `isActive=1`.
46
+
47
+ ## Change history
48
+ - 2026-10-22 — Built the cron action and cron row (inactive); S3 chosen as source over TOGaDesk. (snaredla)
@@ -7,15 +7,18 @@ apps:
7
7
  - togadesk
8
8
  - api
9
9
  - dbchanges
10
+ - worker2
11
+ - dbchanges2
10
12
  project: TOGa Voice
11
13
  client: office-depot
12
14
  type: profile
13
15
  status: active
14
- updated: 2026-10-19
15
- owners: [akhokhani, mhammontree, jcardinal]
16
+ updated: 2026-10-22
17
+ owners: [akhokhani, mhammontree, jcardinal, snaredla]
16
18
  files: []
17
19
  related:
18
20
  - features/odp-tech-support.md
21
+ - features/odp-call-transcript-monthly-report.md
19
22
  - ../../standalone/apps/voice-to-voice/architecture.md
20
23
  - ../../standalone/apps/voice-to-voice/features/ticket-api-integration.md
21
24
  - ../../1.0/apps/togadesk/architecture.md
@@ -32,6 +35,7 @@ Office Depot is the production support client of the standalone Python/LiveKit T
32
35
 
33
36
  - [ODP support agent](features/odp-tech-support.md) owns ODP prompt, settings, billing tenant and deployment target.
34
37
  - Talos call files reach Desk tickets (TOGaDesk clientid 3) through the 1.0 `api`: [Talos ticket API](../../1.0/apps/api/features/talos-ticket-endpoint.md). ODP's own Desk env `odp-togadesk-prod` has an open deploy failure: [asifiles s3fs mount](../../1.0/apps/togadesk/features/s3fs-asifiles-file-storage.md).
38
+ - [Monthly call transcript report](features/odp-call-transcript-monthly-report.md) — worker2 cron, built from S3 session reports.
35
39
  - [Voice architecture](../../standalone/apps/voice-to-voice/architecture.md) maps SIP, LiveKit, shared services and operational checks.
36
40
  - [Ticket API](../../standalone/apps/voice-to-voice/features/ticket-api-integration.md) owns signing and client/department routing.
37
41
  - [Post-call Lambda](../../standalone/apps/voice-to-voice/features/post-call-lambda.md) owns recordings/transcript attachments and its dated outage evidence.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toga-ai",
3
- "version": "1.0.1106",
3
+ "version": "1.0.1107",
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",