@numa-tech/numa 1.14.31 → 1.14.32

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/wecom/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAG5H,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,YAAY,GAA0B,EAAE;IAC5F,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,IAAI,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,KAAK,UAAU,MAAM,CAAC,SAAiC,EAAE,MAAM,GAAG,KAAK;QACrE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;YAC/B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAG,IAA4B,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,IAA+B,EAAE,CAAC;QACvN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;gBACjH,CAAC,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,6EAA6E,EAAE,CAAC;YAC7H,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC;QACxI,CAAC;IACH,CAAC;IACD,MAAM,eAAe,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAClH,MAAM,CAAC,YAAY,CAAC,yBAAyB,EAAE;QAC7C,WAAW,EAAE,qGAAqG;QAClH,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,eAAe;KAC9C,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,YAAY,CAAC,uBAAuB,EAAE;QAC3C,WAAW,EAAE,mJAAmJ;QAChK,WAAW,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,eAAe;KAC/H,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACrC,WAAW,EAAE,gfAAgf;QAC7f,WAAW,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,yEAAyE,CAAC,EAAE;QACxa,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACxG,EAAE,KAAK,EAAE,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7U,MAAM,CAAC,YAAY,CAAC,0BAA0B,EAAE;QAC9C,WAAW,EAAE,iIAAiI;QAC9I,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,eAAe;KAC5I,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,CAAC,YAAY,CAAC,0BAA0B,EAAE;QAC9C,WAAW,EAAE,oQAAoQ;QACjR,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACzF,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACxG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACnD,IAAI,KAAK,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,UAAU,CAAC,4EAA4E,EAAE,6BAA6B,CAAC,CAAC;QAC3J,OAAO,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,YAAY,CAAC,0BAA0B,EAAE;QAC9C,WAAW,EAAE,iKAAiK;QAC9K,WAAW,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvG,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACxG,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,CAAC,YAAY,CAAC,4BAA4B,EAAE;QAChD,WAAW,EAAE,kKAAkK;QAC/K,WAAW,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC1E,WAAW,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;KACvG,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE;QACvC,WAAW,EAAE,iKAAiK;QAC9K,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,eAAe;KAChI,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACzD,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,iDAAiD,EAAE,qBAAqB,CAAC,CAAC;QAChJ,OAAO,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAW,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,81 @@
1
+ # Enterprise WeCom messaging through Numa
2
+
3
+ Numa calls DevOps platform APIs using its existing Keycloak identity. The WeCom corporate secret, token cache and directory access stay on the server. Do not copy the old `wecom-send-message` skill's credentials into Numa config, environment variables, command arguments or MCP input.
4
+
5
+ ## Identity and availability
6
+
7
+ For PRD, confirm the intended environment and inspect the safe configuration/authentication commands before calling protected APIs:
8
+
9
+ ```sh
10
+ numa config --show --json
11
+ numa auth status --json
12
+ numa wecom capabilities --json
13
+ ```
14
+
15
+ PRD uses issuer `https://kc.mcisaas.com/auth/realms/numa-realm`, CLI client `mcp-client`, application role client `mci-devops-platform`, and API base `https://apps-gw-prd.mcisaas.com/mci-devops-platform`. The browser's `web-client` session is separate from Numa's login. Gateway and backend enforce canonical application Client Roles; the CLI catalog does not make the authorization decision.
16
+
17
+ ## Map enterprise users by email
18
+
19
+ Administrators with `mci-devops-platform-ops-admin` can preview matching Keycloak users and visible WeCom members by unique normalized email. Conflicts and missing email need review; automatic sync preserves manual mappings and manual unbinding records.
20
+
21
+ ```sh
22
+ numa wecom mappings sync --json
23
+ numa wecom mappings sync --apply --yes --json
24
+ numa wecom mappings list --query zhangsan --json
25
+ numa wecom mappings bind <keycloak-subject> --wecom-user zhangsan --yes --json
26
+ numa wecom mappings unbind <keycloak-subject> --yes --json
27
+ ```
28
+
29
+ `sync` defaults to `dryRun:true`. Apply rereads both directories and recomputes the mapping, so changes made after preview can affect its result. Review `status`, `candidate_user_ids` and masked email in the preview. Unbind retains a `MANUAL/UNMAPPED` record to prevent the next automatic sync from recreating the association. Manual binding validates the platform subject and explicit WeCom userid on the server. Resolve and review both identities before changing a mapping.
30
+
31
+ ## Choose recipients and send
32
+
33
+ Search by name or userid (2–100 characters). Review candidates and choose exact userids; matching a name does not authorize sending to all matches. The recipient search returns at most 50 items; `has_more:true` means the query should be narrowed.
34
+
35
+ ```sh
36
+ numa wecom recipients --query 张三 --json
37
+ numa wecom send --to zhangsan --request-id release-20260905-01 --text-file ./message.txt --yes --json
38
+ numa wecom send --platform-user <keycloak-subject> --request-id release-20260905-02 --type markdown --text-file ./message.md --yes --json
39
+ ```
40
+
41
+ Use either `--to <userids...>` or `--platform-user <subjects...>`, never both. Platform user IDs are Keycloak subjects whose mappings must be active and whose Keycloak accounts must be enabled; the backend resolves them to actual WeCom userids. `@all`, duplicate recipients and department/tag broadcasts are not supported. The platform limit is 100 recipients; text and markdown each permit at most 2048 UTF-8 bytes. `--safe` is available for text only.
42
+
43
+ `--text-file -` reads UTF-8 content from standard input. Files and standard input avoid placing message content in shell history. `--text` is supported for short non-sensitive content but can be recorded in history. Neither CLI results nor error messages echo the message content.
44
+
45
+ `--yes` confirms the reviewed recipients and content and immediately sends. The request ID is mandatory, consists of 8–128 ASCII letters, digits or `._:-`, and is sent as `Idempotency-Key`. Numa prints it to stderr before sending; JSON stdout remains machine-readable. Use a stable ID for one logical request, and keep both recipients and content unchanged when recovering it.
46
+
47
+ ```sh
48
+ numa wecom status --request-id release-20260905-01 --json
49
+ numa wecom status <message-id> --json
50
+ ```
51
+
52
+ Send writes the complete result before exiting: `ACCEPTED` exits 0, `PARTIAL` exits 7, `FAILED` exits 1, and `UNKNOWN`/`SENDING` exit 6. A successful status lookup exits 0 regardless of the recorded send status. MCP send returns `isError:true` for every non-`ACCEPTED` result while retaining the full structured record.
53
+
54
+ `ACCEPTED` means acceptance by the WeCom API, not delivery or reading. `PARTIAL` includes invalid recipient userids; inspect them without resending to accepted recipients. `FAILED` means the request failed. `SENDING`, `UNKNOWN`, HTTP 5xx or a lost/malformed send response require read-only status investigation. Do not generate a fresh request ID or blindly repeat the send. A status 404 after a lost response does not prove no message was sent. Numa performs no network/5xx send retry; a definitive 401 may refresh authentication and repeat with the same key and body.
55
+
56
+ ## API and MCP contract
57
+
58
+ Message routes are under `/api/v1/notifications/wecom`: `GET /capabilities`, `GET /recipients?query=&limit=`, `POST /messages`, `GET /messages/{id}`, and `GET /messages/by-request/{requestId}`. A send body contains either `recipientUserIds` or `platformUserIds`, plus `messageType`, `content` and `safe`; the stable key is only in `Idempotency-Key`.
59
+
60
+ Numa bounds response reads while streaming: message APIs allow up to 1 MiB, and mapping APIs up to 32 MiB to accommodate full-directory sync results (up to 9,999 users). An interrupted, malformed or oversized apply response is reported as an unknown operation outcome; inspect mappings before retrying. Keycloak subjects are opaque identifiers up to 256 characters, including federated/Unicode IDs; whitespace padding and control characters are rejected without normalizing the identity.
61
+
62
+ Mapping routes are under `/api/v1/admin/notifications/wecom/mappings`: `GET /?query=&limit=`, `POST /sync` with `{dryRun:true|false}`, `PUT /{subject}` with `{wecomUserId}`, and `DELETE /{subject}` returning a tombstone mapping. Responses include metadata and masked email, never secrets or message content.
63
+
64
+ `numa serve` exposes these tools directly:
65
+
66
+ | Tool | Purpose |
67
+ | --- | --- |
68
+ | `numa_wecom_capabilities` | Read channel state and limits |
69
+ | `numa_wecom_recipients` | Search and explicitly select recipients |
70
+ | `numa_wecom_send` | Send to `recipient_user_ids` or `platform_user_ids`; requires stable `request_id` and `confirmed:true` |
71
+ | `numa_wecom_status` | Read by exactly one `message_id` or `request_id` |
72
+ | `numa_wecom_mappings_list` | Read mappings and review conflicts |
73
+ | `numa_wecom_mappings_sync` | Preview by default; `apply:true` requires `confirmed:true` |
74
+ | `numa_wecom_mappings_bind` | Manual mapping; requires `confirmed:true` |
75
+ | `numa_wecom_mappings_unbind` | Manual unbinding tombstone; requires `confirmed:true` |
76
+
77
+ AI clients must obtain the user's authorization for the exact recipients and content before invoking the send tool. A lookup request alone never authorizes a send. Tool metadata marks send and mapping mutations as external side effects. The client must preserve `request_id` and use the status tool after uncertain outcomes. CLI JSON uses snake_case keys; MCP structured responses follow the API's camelCase DTOs.
78
+
79
+ ## Verification
80
+
81
+ `npm run check` includes WeCom client, Commander registration, bounded UTF-8 input, mapping preview/confirmation, idempotency/unknown-result behavior and actual MCP `tools/list` + `tools/call` tests. These use stubbed platform responses and in-memory MCP transport; they send no real enterprise messages. A separate operator-authorized live smoke test is needed after server configuration and deployment.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@numa-tech/numa",
3
- "version": "1.14.31",
3
+ "version": "1.14.32",
4
4
  "description": "Cross-platform CLI for the Numa internal developer platform with Keycloak authentication and MCP support.",
5
5
  "author": "numa-tech",
6
6
  "keywords": [
@@ -21,6 +21,7 @@
21
21
  "files": [
22
22
  "dist",
23
23
  "README.md",
24
+ "docs/wecom-messaging.md",
24
25
  "examples",
25
26
  "skills",
26
27
  "THIRD_PARTY_NOTICES.md"
@@ -32,7 +33,7 @@
32
33
  "typecheck": "turbo run typecheck root:typecheck",
33
34
  "root:typecheck": "tsc --noEmit",
34
35
  "test": "turbo run test root:test",
35
- "root:test": "node --import tsx --test src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/ai-registry/client.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs",
36
+ "root:test": "node --import tsx --test src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/wecom/client.test.ts src/wecom/commands.test.ts src/wecom/tools.test.ts src/ai-registry/client.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs",
36
37
  "pack:check": "turbo run pack:check root:pack:check",
37
38
  "root:pack:check": "node scripts/check-root-package.mjs",
38
39
  "boundaries": "node scripts/check-workspace-boundaries.mjs",
@@ -55,8 +56,8 @@
55
56
  "dependencies": {
56
57
  "@clack/prompts": "^1.7.0",
57
58
  "@modelcontextprotocol/sdk": "^1.29.0",
58
- "@numa-tech/cli-auth": "1.14.31",
59
- "@tokensrc/codex": "1.14.31",
59
+ "@numa-tech/cli-auth": "1.14.32",
60
+ "@tokensrc/codex": "1.14.32",
60
61
  "commander": "^14.0.3",
61
62
  "ink": "^6.8.0",
62
63
  "open": "^10.2.0",