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.
- package/knowledge/1.0/apps/library/features/app-cloud-aws-credentials.md +2 -3
- package/knowledge/2.0/apps/worker2/features/creating-worker-actions.md +7 -2
- package/knowledge/INDEX.md +1 -1
- package/knowledge/clients/office-depot/INDEX.md +1 -0
- package/knowledge/clients/office-depot/features/odp-call-transcript-monthly-report.md +48 -0
- package/knowledge/clients/office-depot/profile.md +6 -2
- package/package.json +1 -1
|
@@ -6,7 +6,7 @@ project: Library
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-10-
|
|
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);
|
|
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-
|
|
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)
|
package/knowledge/INDEX.md
CHANGED
|
@@ -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) —
|
|
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-
|
|
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