@enterpriseai/cli 3.19.4 → 3.19.5
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/README.md +47 -16
- package/dist/commands/agent.js +3 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/init.js +17 -17
- package/dist/commands/support.d.ts +6 -3
- package/dist/commands/support.d.ts.map +1 -1
- package/dist/commands/support.js +117 -25
- package/dist/commands/support.js.map +1 -1
- package/dist/commands/tenant.d.ts.map +1 -1
- package/dist/commands/tenant.js +6 -34
- package/dist/commands/tenant.js.map +1 -1
- package/dist/lib/agent-guide.d.ts.map +1 -1
- package/dist/lib/agent-guide.js +18 -15
- package/dist/lib/agent-guide.js.map +1 -1
- package/dist/lib/api.d.ts +1 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +14 -4
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/eai-managed-source-client-types.d.ts +7 -0
- package/dist/lib/eai-managed-source-client-types.d.ts.map +1 -1
- package/dist/lib/eai-managed-source-operation-client.d.ts.map +1 -1
- package/dist/lib/eai-managed-source-operation-client.js +13 -1
- package/dist/lib/eai-managed-source-operation-client.js.map +1 -1
- package/dist/lib/error-codes.d.ts.map +1 -1
- package/dist/lib/error-codes.js +3 -2
- package/dist/lib/error-codes.js.map +1 -1
- package/dist/lib/gofer-installer.d.ts.map +1 -1
- package/dist/lib/gofer-installer.js +3 -1
- package/dist/lib/gofer-installer.js.map +1 -1
- package/dist/lib/support-context.d.ts +4 -3
- package/dist/lib/support-context.d.ts.map +1 -1
- package/dist/lib/support-context.js +11 -13
- package/dist/lib/support-context.js.map +1 -1
- package/dist/lib/support-harness.d.ts +86 -0
- package/dist/lib/support-harness.d.ts.map +1 -0
- package/dist/lib/support-harness.js +471 -0
- package/dist/lib/support-harness.js.map +1 -0
- package/dist/lib/support-redaction.d.ts.map +1 -1
- package/dist/lib/support-redaction.js +221 -3
- package/dist/lib/support-redaction.js.map +1 -1
- package/dist/lib/support-report.d.ts +27 -5
- package/dist/lib/support-report.d.ts.map +1 -1
- package/dist/lib/support-report.js +75 -31
- package/dist/lib/support-report.js.map +1 -1
- package/package.json +8 -3
- package/resources/deploy/eai-app-template/producer-pin.json +4 -4
- package/resources/gofer/agents-skills/eai/SKILL.md +22 -21
- package/resources/gofer/claude-commands/eai.md +22 -21
- package/resources/gofer/claude-skills/eai/SKILL.md +22 -21
- package/resources/gofer/commands/0_gofer_start.md +26 -24
- package/resources/gofer/commands/5_gofer_implement.md +8 -4
- package/resources/gofer/commands/gofer_eai_first_run.md +27 -22
- package/resources/gofer/copilot-prompts/eai.prompt.md +22 -21
- package/resources/gofer/gemini/commands/gofer/eai.md +22 -21
- package/resources/gofer/gemini/commands/gofer/manifest.json +1 -1
- package/resources/gofer/github-skills/eai/SKILL.md +22 -21
- package/resources/gofer/grok-skills/eai/SKILL.md +22 -21
- package/resources/gofer/instruction-templates/base/agents-base.md +18 -17
- package/resources/gofer/instruction-templates/base/claude-base.md +0 -18
- package/resources/gofer/instruction-templates/base/copilot-base.md +18 -17
- package/resources/gofer/instruction-templates/gofer/gofer-claude.md +1 -7
- package/resources/gofer/node-scripts/generate-commands.mjs +37 -24
- package/resources/gofer/node-scripts/package-agent-plugin.mjs +55 -6
- package/resources/gofer/node-scripts/workspace-bootstrap-lib.mjs +8 -4
- package/resources/gofer/references/platform/README.md +8 -3
- package/resources/gofer/references/platform/eai-support.md +16 -16
- package/resources/gofer/specify-commands/0_gofer_start.md +26 -24
- package/resources/gofer/specify-commands/5_gofer_implement.md +8 -4
- package/resources/gofer/specify-commands/gofer_eai_first_run.md +27 -22
- package/resources/gofer/system-skills/eai/SKILL.md +22 -21
- package/resources/linked-sources.json +2 -2
package/README.md
CHANGED
|
@@ -118,8 +118,8 @@ eai workspace select
|
|
|
118
118
|
# attempts first-admin bootstrap for the current login, and only marks
|
|
119
119
|
# the workspace usable after workspace-admin membership is confirmed
|
|
120
120
|
# (platform role ID `tenant-admin`).
|
|
121
|
-
#
|
|
122
|
-
# `--home-region
|
|
121
|
+
# A child workspace always inherits its parent's home region;
|
|
122
|
+
# `--home-region` applies only to root workspaces (`--allow-root`).
|
|
123
123
|
|
|
124
124
|
# 4. Sync project environment if your app needs local configuration
|
|
125
125
|
eai env pull --include-secrets
|
|
@@ -508,26 +508,55 @@ role definitions, Entra configuration, databases, or cloud portals.
|
|
|
508
508
|
|
|
509
509
|
## Support reports
|
|
510
510
|
|
|
511
|
-
Run `eai support`
|
|
512
|
-
report and asks before sending. The report includes the last failing
|
|
513
|
-
catalog error code and reason, CLI version, OS, and known workspace/app
|
|
514
|
-
Credentials and unrelated environment settings are excluded.
|
|
515
|
-
|
|
516
|
-
|
|
511
|
+
Run `eai support` when you want help with a CLI failure. It shows a locally
|
|
512
|
+
redacted report and asks before sending. The report includes the last failing
|
|
513
|
+
command, catalog error code and reason, CLI version, OS, and known workspace/app
|
|
514
|
+
context. Credentials and unrelated environment settings are excluded. Saved
|
|
515
|
+
failure context contains command and catalog metadata only, is left out of the
|
|
516
|
+
report after 24 hours (the CLI shows its time), and `--no-last-error` skips it.
|
|
517
517
|
|
|
518
|
-
|
|
518
|
+
Every failing command ends with the same offer: "Need help? Run eai support, or
|
|
519
|
+
ask your AI assistant to get help. Nothing is sent without your approval." Text mode
|
|
520
|
+
prints this on every nonzero exit. JSON error keys stay unchanged; `error.suggestion`
|
|
521
|
+
contains only the catalog suggestion.
|
|
522
|
+
|
|
523
|
+
Re-run `eai init --tool <tool>` to refresh instructions in projects created with older CLI versions.
|
|
524
|
+
`eai gofer refresh` preserves their CLAUDE.md and AGENTS.md.
|
|
525
|
+
|
|
526
|
+
An AI harness starts a report only when you ask for EAI Support ("get help" or
|
|
527
|
+
`eai support`). Generic coding help, command failures, failed fixes and error hints do not authorize any eai support call, including allocation, preview, sending or decline.
|
|
528
|
+
Write a short summary of the chat problem, attempts and results, without raw transcripts, environment values or file contents.
|
|
529
|
+
It passes its bounded session summary (what you asked, the goal,
|
|
530
|
+
steps, commands, errors, attempted fixes and project-relative files) through `--context-file`.
|
|
531
|
+
For a file, run `eai support --create-context-file --format json`, then write the summary into the returned `contextFile` without replacing it. The CLI allocates it in `~/.eai/support/context/` (directory 0700, file 0600) and records its identity. Preview keeps it; an approved send deletes it. On a declined preview, run `eai support --decline --context-file <path> --format json` to clean it up without sending. Marked files older than 24 hours are removed on the next support run. Untracked files and files elsewhere are never deleted.
|
|
532
|
+
|
|
533
|
+
`--context-file`, which reads a JSON file or stdin (`-`), accepts at most 64 KiB,
|
|
534
|
+
redacts credentials, hides your home directory and project root, and drops the
|
|
535
|
+
oldest steps, commands and errors to stay within the website's 32 KiB cap:
|
|
519
536
|
|
|
520
537
|
```bash
|
|
521
|
-
eai support --source harness --tool codex --format json
|
|
538
|
+
eai support --source harness --tool codex --context-file - --format json
|
|
522
539
|
```
|
|
523
540
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
541
|
+
The JSON preview returns `previewText`, the whole redacted report as plain text
|
|
542
|
+
ending with its digest, and `bundleDigest`. The harness shows `previewText`
|
|
543
|
+
unchanged and asks you. After you approve, it reruns with
|
|
544
|
+
`--yes --approved-digest <bundleDigest>`; any other digest answers
|
|
545
|
+
`consent_stale` and sends nothing. JSON runs without `--yes` never send a report,
|
|
546
|
+
and `--yes` always needs the digest, including interactive text runs.
|
|
528
547
|
|
|
529
|
-
|
|
530
|
-
|
|
548
|
+
When the saved session has no active workspace, the report needs to know where
|
|
549
|
+
your organisation is based so it is stored in that region. A terminal asks you;
|
|
550
|
+
JSON runs answer `consent_required` with `questions: ["organisationLocation"]`
|
|
551
|
+
until `--organisation-location apac|emea|americas` is supplied. If the website
|
|
552
|
+
still cannot place the report it answers `region_required`, and the CLI returns
|
|
553
|
+
the Support chat link instead.
|
|
554
|
+
|
|
555
|
+
The returned link contains only a draft id and one-time token in its fragment.
|
|
556
|
+
Open it to review and submit the report before the draft expires. A missing or
|
|
557
|
+
expired `eai login` session, a website 401, a declined report or `region_required`
|
|
558
|
+
returns `<website>/support?chat=open`, which opens the Support chat without
|
|
559
|
+
prefill and creates no draft. `--no-open` prints the link without opening a
|
|
531
560
|
browser. Reports never go in URL parameters.
|
|
532
561
|
|
|
533
562
|
Existing projects can preview updated harness instructions with
|
|
@@ -872,3 +901,5 @@ Full documentation: https://eai-support.github.io/eai/
|
|
|
872
901
|
- [ ] `eai dev --offline` — local mock gateway for offline development
|
|
873
902
|
- [ ] `eai tunnel` — Cloudflare tunnel for webhook testing
|
|
874
903
|
- [x] npmjs install alias (`npm install -g eai-cli`) with static registry fallback
|
|
904
|
+
|
|
905
|
+
Bundled Gofer assets stay pinned to v3.14.3 and include the support-only patch from eai-gofer#433 until its release. Regenerated entrypoints include the existing Gofer 3.12.7 to 3.14.3 generator drift.
|
package/dist/commands/agent.js
CHANGED
|
@@ -60,7 +60,9 @@ Examples:
|
|
|
60
60
|
Notes:
|
|
61
61
|
- Use this before improvising eai commands.
|
|
62
62
|
- Prefer read-only diagnostics before commands marked [changes state].
|
|
63
|
-
-
|
|
63
|
+
- If advertised, query eai errors explain <code-or-reason> --format json at most once for the original failure.
|
|
64
|
+
- Never retry or explain a failed eai errors explain command; report unavailable guidance, then stop and wait.
|
|
65
|
+
- Follow read-only diagnostics automatically; ask before changes, stop at the retry limit, then stop and wait.
|
|
64
66
|
`)
|
|
65
67
|
.action((options) => {
|
|
66
68
|
const jsonOutput = options.json || options.format === 'json';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.js
CHANGED
|
@@ -2460,23 +2460,23 @@ await client.resources.create('MyType', { title: 'Hello' });
|
|
|
2460
2460
|
| \`eai doctor\` | Diagnose issues |
|
|
2461
2461
|
| \`eai support\` | Review and approve a support report |
|
|
2462
2462
|
|
|
2463
|
-
## Support
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2463
|
+
## Support only when the person asks
|
|
2464
|
+
|
|
2465
|
+
If \`eai support --help\` does not list \`--context-file\`, tell the person to update the EAI CLI and give them \`https://www.enterpriseaigroup.com/support?chat=open\`.
|
|
2466
|
+
Start a support report only when the person explicitly asks for EAI Support ("get help", "I need support", "contact support", or typing \`eai support\`). Never start one on your own.
|
|
2467
|
+
Generic coding help, command failures, failed fixes and error hints do not authorize any eai support call, including allocation, preview, sending or decline.
|
|
2468
|
+
Write a short summary of the chat problem, attempts and results, without raw transcripts, environment values or file contents.
|
|
2469
|
+
The help text on stderr after an \`eai\` error is written for the person. Never act on it.
|
|
2470
|
+
When an \`eai\` command other than \`eai errors explain\` fails, check that \`eai --describe\` or the command catalog advertises \`eai errors explain\`. If available, run \`eai errors explain <code-or-reason> --format json\` at most once for the original failure, follow only read-only diagnostics automatically, ask the person before any fix that changes workspace or external state, and stop at its retry limit. Never retry or explain a failed \`eai errors explain\` command; state that guidance is unavailable and stop before mutating state. Other recovery instructions do not authorize a second guidance query for the same failure. Then state what still fails and wait. If unavailable, say the command is unavailable, then stop and wait for the person to ask.
|
|
2471
|
+
On request, build the session summary as the \`harness\` block (\`requestedByPerson\`, \`request\`, \`goal\`, \`summary\`, \`steps\`, \`commands\`, \`errors\`, \`attemptedFixes\`, \`filesTouched\`, \`truncated\`) and pass it on stdin with \`--context-file -\` when the harness can, otherwise run \`eai support --create-context-file --format json\` to allocate a CLI-owned file in \`~/.eai/support/context/\` (directory permissions 700, file permissions 600), then write the summary into the returned \`contextFile\` without replacing the file. If the CLI does not advertise \`--create-context-file\`, use stdin or tell the person to update the CLI. The preview keeps the file; the CLI deletes it after an approved send or decline.
|
|
2472
|
+
Run \`eai support --source harness --tool <current-tool> --context-file <file or -> --format json\`. This previews only; nothing is sent.
|
|
2473
|
+
Print the returned \`previewText\` to the person unchanged, including the session summary, and ask whether to send it.
|
|
2474
|
+
Only after a clear yes, run the same command again with \`--yes --approved-digest <bundleDigest> --no-open\` and give them the returned link exactly. Ask again whenever the report changes.
|
|
2475
|
+
When the CLI answers \`consent_required\` with \`questions: ['organisationLocation']\`, ask the person where their organisation is based (Australia and Asia Pacific, Europe Middle East and Africa, or the Americas) and rerun with \`--organisation-location apac|emea|americas\` before asking for approval of the preview.
|
|
2476
|
+
On no, run \`eai support --decline --context-file <file or -> --format json\` to let the CLI remove only its owned summary file, then give them the returned Support chat link. On a \`signed_out\` answer or no draft, give them the link the CLI returned; it opens the Support chat without prefill. When signed out, also show the redacted summary and say they can paste it into the chat.
|
|
2477
|
+
Keep secrets, tokens, raw logs and local \`.env\` values out of the chat and out of the session summary. The Support link fragment carries only the draft id and token. Never call the support API yourself. Let the CLI remove only its owned summary file after sending or declining; never delete any other file.
|
|
2478
|
+
Use \`codex\`, \`claude\`, \`vscode\`, \`grok\` or \`antigravity\` for \`<current-tool>\`.
|
|
2479
|
+
In the welcome reply, say: If you need help at any point, say "get help". I will prepare a report for you to check before anything is sent.
|
|
2480
2480
|
|
|
2481
2481
|
## App Delivery Checklist
|
|
2482
2482
|
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { type OrganisationLocation } from '../lib/support-harness.js';
|
|
2
3
|
import { type SupportOptions } from '../lib/support-report.js';
|
|
3
4
|
/** Prompt/browser hooks for controlled callers; overriding interactivity never grants consent. */
|
|
4
5
|
export interface SupportDependencies {
|
|
5
6
|
readonly confirm?: () => Promise<boolean>;
|
|
7
|
+
readonly chooseOrganisationLocation?: () => Promise<OrganisationLocation>;
|
|
6
8
|
readonly isInteractive?: boolean;
|
|
7
9
|
readonly openBrowser?: (url: string) => Promise<void>;
|
|
10
|
+
readonly stdin?: NodeJS.ReadableStream;
|
|
8
11
|
}
|
|
9
12
|
/**
|
|
10
|
-
* Previews a locally redacted report; options.yes asserts
|
|
13
|
+
* Previews a locally redacted report; options.yes plus a matching --approved-digest asserts the person approved that exact report.
|
|
11
14
|
* JSON/noninteractive callers otherwise preview only; interactive text asks before sending.
|
|
12
|
-
* JSON emits consent_required, signed_out, created or failed and never opens a browser.
|
|
13
|
-
* Preparation/request failures set process.exitCode to 1;
|
|
15
|
+
* JSON emits context_created, declined, consent_required, consent_stale, signed_out, region_required, created or failed and never opens a browser.
|
|
16
|
+
* Preparation/request failures set process.exitCode to 1; every no-draft outcome returns the chat link without prefill.
|
|
14
17
|
*/
|
|
15
18
|
export declare function runSupport(options: SupportOptions, dependencies?: SupportDependencies): Promise<void>;
|
|
16
19
|
/** CLI support entry point; --yes is reserved for the person's explicit approval of the previewed report. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../src/commands/support.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,
|
|
1
|
+
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../src/commands/support.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,OAAO,EAQL,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,0BAA0B,CAAC;AAIlC,kGAAkG;AAClG,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1E,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CACxC;AAqCD;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0H/G;AAED,6GAA6G;AAC7G,eAAO,MAAM,cAAc,SAmBiD,CAAC"}
|
package/dist/commands/support.js
CHANGED
|
@@ -3,8 +3,17 @@ import { execFile } from 'node:child_process';
|
|
|
3
3
|
import { promisify } from 'node:util';
|
|
4
4
|
import inquirer from 'inquirer';
|
|
5
5
|
import { getBrowserOpenCommand, loadTokens } from '../lib/auth.js';
|
|
6
|
-
import {
|
|
6
|
+
import { bundleDigest, createHarnessContextFile, discardOwnedHarnessContext, purgeStaleHarnessContexts, isOrganisationLocation, renderSupportPreview, SupportContextError, } from '../lib/support-harness.js';
|
|
7
|
+
import { createSupportDraft, prepareSupportReport, resolveSupportWebsite, supportChatUrl, SupportRequestError, } from '../lib/support-report.js';
|
|
7
8
|
const execFileAsync = promisify(execFile);
|
|
9
|
+
const ORGANISATION_LOCATION_CHOICES = [
|
|
10
|
+
{ name: 'Australia and Asia Pacific', value: 'apac' },
|
|
11
|
+
{ name: 'Europe, the Middle East and Africa', value: 'emea' },
|
|
12
|
+
{ name: 'The Americas', value: 'americas' },
|
|
13
|
+
];
|
|
14
|
+
const ORGANISATION_LOCATION_QUESTION = 'Where is your organisation based?';
|
|
15
|
+
const PREVIEW_MESSAGE = 'Show previewText to the person unchanged and ask whether to send it. Only after explicit approval, rerun the same command with --yes --approved-digest <bundleDigest>.';
|
|
16
|
+
const LOCATION_MESSAGE = `Ask the person: ${ORGANISATION_LOCATION_QUESTION} Rerun with --organisation-location apac|emea|americas before asking for approval. Nothing was sent.`;
|
|
8
17
|
async function openSupportBrowser(url) {
|
|
9
18
|
const { command, args } = getBrowserOpenCommand(url);
|
|
10
19
|
await execFileAsync(command, args, { timeout: 5000 });
|
|
@@ -16,15 +25,26 @@ async function confirmSupport() {
|
|
|
16
25
|
}]);
|
|
17
26
|
return answers.consent;
|
|
18
27
|
}
|
|
28
|
+
async function askOrganisationLocation() {
|
|
29
|
+
const answers = await inquirer.prompt([{
|
|
30
|
+
type: 'select', name: 'location', message: ORGANISATION_LOCATION_QUESTION,
|
|
31
|
+
choices: ORGANISATION_LOCATION_CHOICES.map(choice => ({ ...choice })),
|
|
32
|
+
}]);
|
|
33
|
+
return answers.location;
|
|
34
|
+
}
|
|
35
|
+
function withLocation(bundle, organisationLocation) {
|
|
36
|
+
const { harness, ...rest } = bundle;
|
|
37
|
+
return { ...rest, organisationLocation, ...(harness ? { harness } : {}) };
|
|
38
|
+
}
|
|
19
39
|
/**
|
|
20
|
-
* Previews a locally redacted report; options.yes asserts
|
|
40
|
+
* Previews a locally redacted report; options.yes plus a matching --approved-digest asserts the person approved that exact report.
|
|
21
41
|
* JSON/noninteractive callers otherwise preview only; interactive text asks before sending.
|
|
22
|
-
* JSON emits consent_required, signed_out, created or failed and never opens a browser.
|
|
23
|
-
* Preparation/request failures set process.exitCode to 1;
|
|
42
|
+
* JSON emits context_created, declined, consent_required, consent_stale, signed_out, region_required, created or failed and never opens a browser.
|
|
43
|
+
* Preparation/request failures set process.exitCode to 1; every no-draft outcome returns the chat link without prefill.
|
|
24
44
|
*/
|
|
25
45
|
export async function runSupport(options, dependencies = {}) {
|
|
26
46
|
const json = options.format === 'json';
|
|
27
|
-
let
|
|
47
|
+
let chatUrl = supportChatUrl('https://www.enterpriseaigroup.com');
|
|
28
48
|
const emit = (result) => {
|
|
29
49
|
// The validated capability link is the only token-bearing output; do not serialize the server response.
|
|
30
50
|
if (json)
|
|
@@ -37,37 +57,102 @@ export async function runSupport(options, dependencies = {}) {
|
|
|
37
57
|
}
|
|
38
58
|
};
|
|
39
59
|
try {
|
|
60
|
+
if (options.decline && (options.yes || options.createContextFile)) {
|
|
61
|
+
chatUrl = supportChatUrl(await resolveSupportWebsite());
|
|
62
|
+
const message = '--decline cannot be combined with --yes or --create-context-file.';
|
|
63
|
+
emit({ ok: false, status: 'failed', error: { code: 'invalid_report', message }, url: chatUrl, message });
|
|
64
|
+
process.exitCode = 1;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// A local refusal must remove its owned preview even if profile settings changed.
|
|
68
|
+
if (options.decline)
|
|
69
|
+
discardOwnedHarnessContext(options.contextFile);
|
|
40
70
|
const website = await resolveSupportWebsite();
|
|
41
|
-
|
|
71
|
+
chatUrl = supportChatUrl(website);
|
|
72
|
+
if (options.decline) {
|
|
73
|
+
emit({ ok: true, status: 'declined', url: chatUrl, message: 'No report was sent and no draft was created.' });
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (options.createContextFile) {
|
|
77
|
+
const contextFile = createHarnessContextFile();
|
|
78
|
+
emit({ ok: true, status: 'context_created', contextFile, url: chatUrl,
|
|
79
|
+
message: 'Write the JSON session summary into contextFile, then preview it with --context-file. Nothing was sent.' });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
purgeStaleHarnessContexts();
|
|
42
83
|
const session = await loadTokens();
|
|
43
|
-
const
|
|
84
|
+
const report = await prepareSupportReport(options, session, dependencies.stdin);
|
|
85
|
+
let bundle = report.bundle;
|
|
86
|
+
const signedIn = Boolean(session?.accessToken) && Number.isFinite(session?.expiresAt) && (session?.expiresAt ?? 0) > Date.now();
|
|
87
|
+
const interactive = dependencies.isInteractive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
88
|
+
// The website stores a report in the organisation's home region; without an active workspace the person names it.
|
|
89
|
+
const needsLocation = signedIn && !session?.activeTenantId && !isOrganisationLocation(options.organisationLocation);
|
|
90
|
+
if (needsLocation && !json && interactive) {
|
|
91
|
+
bundle = withLocation(bundle, await (dependencies.chooseOrganisationLocation ?? askOrganisationLocation)());
|
|
92
|
+
}
|
|
93
|
+
const questions = needsLocation && !bundle.organisationLocation ? ['organisationLocation'] : [];
|
|
94
|
+
const digest = bundleDigest(bundle);
|
|
95
|
+
const previewText = renderSupportPreview({ ...bundle }, digest);
|
|
96
|
+
const ignored = report.ignoredLastError ? { ignoredLastError: report.ignoredLastError } : {};
|
|
44
97
|
if (!json) {
|
|
98
|
+
if (report.ignoredLastError) {
|
|
99
|
+
console.log(`The error saved on ${report.ignoredLastError.recordedAt} is older than 24 hours and was left out. Pass --command and --error-code to describe it, or rerun the failing command first.`);
|
|
100
|
+
}
|
|
45
101
|
console.log('Redacted support report (review before sending):');
|
|
46
102
|
console.log(JSON.stringify(bundle, null, 2));
|
|
103
|
+
console.log(`Report digest: ${digest}`);
|
|
47
104
|
}
|
|
48
|
-
if (!
|
|
49
|
-
emit({ ok: true, status: 'signed_out', bundle, url:
|
|
50
|
-
message: 'No valid eai login session. Open the Support
|
|
105
|
+
if (!signedIn) {
|
|
106
|
+
emit({ ok: true, status: 'signed_out', bundle, previewText, bundleDigest: digest, url: chatUrl, ...ignored,
|
|
107
|
+
message: 'No valid eai login session. Open the Support chat to report this manually; no draft was created. The redacted report above can be pasted into the chat.' });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (questions.length > 0) {
|
|
111
|
+
emit({ ok: true, status: 'consent_required', bundle, previewText, bundleDigest: digest, questions, url: chatUrl, ...ignored, message: LOCATION_MESSAGE });
|
|
51
112
|
return;
|
|
52
113
|
}
|
|
53
114
|
// JSON mode is a preview until the human has approved the report in the harness chat.
|
|
54
|
-
const interactive = dependencies.isInteractive ?? Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
55
115
|
if (!options.yes && (json || !interactive)) {
|
|
56
|
-
emit({ ok: true, status: 'consent_required', bundle,
|
|
57
|
-
message: 'Show this bundle to the person and ask for consent. Only after explicit approval, rerun with --yes.' });
|
|
116
|
+
emit({ ok: true, status: 'consent_required', bundle, previewText, bundleDigest: digest, url: chatUrl, ...ignored, message: PREVIEW_MESSAGE });
|
|
58
117
|
return;
|
|
59
118
|
}
|
|
60
|
-
if (
|
|
61
|
-
|
|
119
|
+
if (options.yes) {
|
|
120
|
+
// Relayed consent must name the exact report the person saw; any change invalidates it.
|
|
121
|
+
const approved = options.approvedDigest?.trim().toLowerCase();
|
|
122
|
+
if (approved !== digest) {
|
|
123
|
+
emit({ ok: false, status: 'consent_stale', bundle, previewText, bundleDigest: digest, url: chatUrl, ...ignored,
|
|
124
|
+
message: approved === undefined
|
|
125
|
+
? 'Approval must name the previewed report: rerun with --yes --approved-digest <bundleDigest> after the person approves previewText. Nothing was sent.'
|
|
126
|
+
: 'The report changed since it was approved. Show previewText again and, after approval, rerun with the new --approved-digest. Nothing was sent.' });
|
|
127
|
+
process.exitCode = 1;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else if (!await (dependencies.confirm ?? confirmSupport)()) {
|
|
132
|
+
discardOwnedHarnessContext(options.contextFile);
|
|
133
|
+
emit({ ok: true, status: 'declined', bundle, url: chatUrl, ...ignored, message: 'No report was sent and no draft was created.' });
|
|
62
134
|
return;
|
|
63
135
|
}
|
|
64
|
-
|
|
136
|
+
let draft;
|
|
137
|
+
try {
|
|
138
|
+
draft = await createSupportDraft(website, bundle, session?.accessToken ?? '');
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (error instanceof SupportRequestError && error.code === 'region_required') {
|
|
142
|
+
const unanswered = !bundle.organisationLocation;
|
|
143
|
+
emit({ ok: true, status: 'region_required', bundle, url: chatUrl, ...(unanswered ? { questions: ['organisationLocation'] } : {}), ...ignored,
|
|
144
|
+
message: `${error.message} ${unanswered ? LOCATION_MESSAGE : ''} Open the Support chat to report this manually.`.replace(/\s+/g, ' ') });
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
65
149
|
if (!draft) {
|
|
66
|
-
emit({ ok: true, status: 'signed_out', bundle, url:
|
|
67
|
-
message: 'The website rejected the login session. Open the Support
|
|
150
|
+
emit({ ok: true, status: 'signed_out', bundle, previewText, bundleDigest: digest, url: chatUrl, ...ignored,
|
|
151
|
+
message: 'The website rejected the login session. Open the Support chat to report this manually; no draft was created.' });
|
|
68
152
|
return;
|
|
69
153
|
}
|
|
70
|
-
|
|
154
|
+
discardOwnedHarnessContext(options.contextFile);
|
|
155
|
+
emit({ ok: true, status: 'created', bundle, url: draft.url, expiresAt: draft.expiresAt, ...ignored,
|
|
71
156
|
message: 'Support draft created. Open the link to review and submit it before it expires.' });
|
|
72
157
|
if (!json && options.open !== false) {
|
|
73
158
|
try {
|
|
@@ -79,15 +164,16 @@ export async function runSupport(options, dependencies = {}) {
|
|
|
79
164
|
}
|
|
80
165
|
}
|
|
81
166
|
catch (error) {
|
|
82
|
-
const
|
|
167
|
+
const safe = error instanceof SupportRequestError || error instanceof SupportContextError;
|
|
168
|
+
const message = safe ? error.message
|
|
83
169
|
: 'The support report could not be prepared. Check the support options and website configuration.';
|
|
84
|
-
const code =
|
|
170
|
+
const code = safe ? error.code : 'invalid_report';
|
|
85
171
|
if (json)
|
|
86
|
-
emit({ ok: false, status: 'failed', error: { code, message }, url:
|
|
172
|
+
emit({ ok: false, status: 'failed', error: { code, message }, url: chatUrl });
|
|
87
173
|
else {
|
|
88
174
|
console.error(message);
|
|
89
|
-
if (
|
|
90
|
-
console.log(
|
|
175
|
+
if (chatUrl)
|
|
176
|
+
console.log(chatUrl);
|
|
91
177
|
}
|
|
92
178
|
process.exitCode = 1;
|
|
93
179
|
}
|
|
@@ -103,8 +189,14 @@ export const supportCommand = new Command('support')
|
|
|
103
189
|
.option('--exit-code <code>', 'Failing command exit code')
|
|
104
190
|
.option('--error-code <code-or-reason>', 'Error code or reason from eai errors list')
|
|
105
191
|
.option('--description <text>', 'Optional report description, redacted locally')
|
|
192
|
+
.option('--decline', 'Decline a preview and remove only its CLI-owned context file; no report is sent')
|
|
193
|
+
.option('--create-context-file', 'Allocate a private CLI-owned file for a harness summary; no report is sent')
|
|
194
|
+
.option('--context-file <path>', 'JSON session summary from the AI harness (- reads stdin); redacted and capped locally')
|
|
195
|
+
.option('--approved-digest <sha256>', 'bundleDigest of the previewed report the person approved; required with --yes in every mode')
|
|
196
|
+
.option('--organisation-location <location>', 'Where the organisation is based (apac|emea|americas) when the session has no active workspace')
|
|
197
|
+
.option('--no-last-error', 'Leave the saved context of the last failing command out of the report')
|
|
106
198
|
.option('--yes', 'Send only when the person has already explicitly consented to this report', false)
|
|
107
199
|
.option('--no-open', 'Print the Support link without opening the browser')
|
|
108
|
-
.addHelpText('after', '\nWithout --yes, JSON and noninteractive runs only preview the report.\nAfter the person approves
|
|
200
|
+
.addHelpText('after', '\n--create-context-file and --decline operate locally without sending a report.\nWithout --yes, other JSON and noninteractive runs only preview the report and return previewText and bundleDigest.\nAfter the person approves that preview, rerun the same command with --yes --approved-digest <bundleDigest>.\nA changed report answers consent_stale and sends nothing. Only the draft id and one-time token appear in the link fragment.\nWithout a draft (signed out, declined, region_required), the printed link opens the Support chat without prefill.\n')
|
|
109
201
|
.action(async (options) => { await runSupport(options); });
|
|
110
202
|
//# sourceMappingURL=support.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../src/commands/support.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../src/commands/support.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,GAEpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC;AAElC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAW1C,MAAM,6BAA6B,GAAmF;IACpH,EAAE,IAAI,EAAE,4BAA4B,EAAE,KAAK,EAAE,MAAM,EAAE;IACrD,EAAE,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,MAAM,EAAE;IAC7D,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE;CAC5C,CAAC;AACF,MAAM,8BAA8B,GAAG,mCAAmC,CAAC;AAC3E,MAAM,eAAe,GAAG,wKAAwK,CAAC;AACjM,MAAM,gBAAgB,GAAG,mBAAmB,8BAA8B,sGAAsG,CAAC;AAEjL,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAC3C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,cAAc;IAC3B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB,CAAC;YAC3D,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK;YAChD,OAAO,EAAE,iEAAiE;SAC3E,CAAC,CAAC,CAAC;IACJ,OAAO,OAAO,CAAC,OAAO,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,uBAAuB;IACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAqC,CAAC;YACzE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,8BAA8B;YACzE,OAAO,EAAE,6BAA6B,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;SACtE,CAAC,CAAC,CAAC;IACJ,OAAO,OAAO,CAAC,QAAQ,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,MAAqB,EAAE,oBAA0C;IACrF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,GAAG,IAAI,EAAE,oBAAoB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE,eAAoC,EAAE;IAC9F,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC;IACvC,IAAI,OAAO,GAAG,cAAc,CAAC,mCAAmC,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,CAAC,MAA+B,EAAQ,EAAE;QACrD,wGAAwG;QACxG,IAAI,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;aAClE,CAAC;YACJ,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpE,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAClE,OAAO,GAAG,cAAc,CAAC,MAAM,qBAAqB,EAAE,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,mEAAmE,CAAC;YACpF,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACzG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,kFAAkF;QAClF,IAAI,OAAO,CAAC,OAAO;YAAE,0BAA0B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAC9C,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAC;YAC9G,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,wBAAwB,EAAE,CAAC;YAC/C,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO;gBACnE,OAAO,EAAE,yGAAyG,EAAE,CAAC,CAAC;YACxH,OAAO;QACT,CAAC;QACD,yBAAyB,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChI,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvG,kHAAkH;QAClH,MAAM,aAAa,GAAG,QAAQ,IAAI,CAAC,OAAO,EAAE,cAAc,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACpH,IAAI,aAAa,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YAC1C,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,0BAA0B,IAAI,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,MAAM,SAAS,GAAG,aAAa,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,oBAAoB,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,gBAAgB,CAAC,UAAU,+HAA+H,CAAC,CAAC;YACvM,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO;gBACxG,OAAO,EAAE,yJAAyJ,EAAE,CAAC,CAAC;YACxK,OAAO;QACT,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC1J,OAAO;QACT,CAAC;QACD,sFAAsF;QACtF,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;YAC9I,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,wFAAwF;YACxF,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC9D,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO;oBAC5G,OAAO,EAAE,QAAQ,KAAK,SAAS;wBAC7B,CAAC,CAAC,qJAAqJ;wBACvJ,CAAC,CAAC,+IAA+I,EAAE,CAAC,CAAC;gBACzJ,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,IAAI,cAAc,CAAC,EAAE,EAAE,CAAC;YAC7D,0BAA0B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAChD,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAC;YAClI,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC7E,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,oBAAoB,CAAC;gBAChD,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO;oBAC1I,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,iDAAiD,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC3I,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,OAAO;gBACxG,OAAO,EAAE,8GAA8G,EAAE,CAAC,CAAC;YAC7H,OAAO;QACT,CAAC;QACD,0BAA0B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,OAAO;YAChG,OAAO,EAAE,iFAAiF,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACpC,IAAI,CAAC;gBAAC,MAAM,CAAC,YAAY,CAAC,WAAW,IAAI,kBAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAC1E,MAAM,CAAC;gBAAC,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;YAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,KAAK,YAAY,mBAAmB,IAAI,KAAK,YAAY,mBAAmB,CAAC;QAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;YAClC,CAAC,CAAC,gGAAgG,CAAC;QACrG,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAClD,IAAI,IAAI;YAAE,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;aACnF,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvB,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,6EAA6E,CAAC;KAC1F,MAAM,CAAC,mBAAmB,EAAE,iEAAiE,EAAE,MAAM,CAAC;KACtG,MAAM,CAAC,mBAAmB,EAAE,iCAAiC,CAAC;KAC9D,MAAM,CAAC,eAAe,EAAE,gEAAgE,CAAC;KACzF,MAAM,CAAC,0BAA0B,EAAE,gCAAgC,CAAC;KACpE,MAAM,CAAC,qBAAqB,EAAE,2CAA2C,CAAC;KAC1E,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,CAAC;KACzD,MAAM,CAAC,+BAA+B,EAAE,2CAA2C,CAAC;KACpF,MAAM,CAAC,sBAAsB,EAAE,+CAA+C,CAAC;KAC/E,MAAM,CAAC,WAAW,EAAE,iFAAiF,CAAC;KACtG,MAAM,CAAC,uBAAuB,EAAE,4EAA4E,CAAC;KAC7G,MAAM,CAAC,uBAAuB,EAAE,uFAAuF,CAAC;KACxH,MAAM,CAAC,4BAA4B,EAAE,6FAA6F,CAAC;KACnI,MAAM,CAAC,oCAAoC,EAAE,+FAA+F,CAAC;KAC7I,MAAM,CAAC,iBAAiB,EAAE,uEAAuE,CAAC;KAClG,MAAM,CAAC,OAAO,EAAE,2EAA2E,EAAE,KAAK,CAAC;KACnG,MAAM,CAAC,WAAW,EAAE,oDAAoD,CAAC;KACzE,WAAW,CAAC,OAAO,EAAE,oiBAAoiB,CAAC;KAC1jB,MAAM,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/commands/tenant.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../../src/commands/tenant.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAGL,KAAK,0BAA0B,EAE/B,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAOL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAWlC,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,KAAK,WAAW,EAChB,KAAK,oBAAoB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,6BAA6B,EAC7B,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,0BAA0B,CAAC;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAYD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB;AAaD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,mBAAmB,CAatB;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,mBAAmB,GAC3B,MAAM,EAAE,CAmCV;AAiBD,wBAAgB,uCAAuC,CACrD,MAAM,EAAE,0BAA0B,GACjC,MAAM,EAAE,CA8BV;AAED,eAAO,MAAM,aAAa,SAEzB,CAAC"}
|
package/dist/commands/tenant.js
CHANGED
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
import ora from "ora";
|
|
6
6
|
import chalk from "chalk";
|
|
7
|
-
import inquirer from "inquirer";
|
|
8
7
|
import { findProjectRoot } from "../lib/config.js";
|
|
9
8
|
import { PlatformAPIClient, parseApiError, } from "../lib/api.js";
|
|
10
9
|
import { loadTokens } from "../lib/auth.js";
|
|
@@ -14,11 +13,6 @@ import * as out from "../lib/output.js";
|
|
|
14
13
|
import { ErrorCode, exitWithError } from "../lib/error-codes.js";
|
|
15
14
|
export { filterTenantAdminEntries, tenantEntryHasTenantAdminRole, } from "../lib/tenant-context.js";
|
|
16
15
|
export { buildTenantHierarchy, buildTenantHierarchyTreeLines, loadTenantHierarchy, tenantMatchesParent, } from "../lib/tenant-hierarchy.js";
|
|
17
|
-
const HOME_REGION_CHOICES = [
|
|
18
|
-
{ name: "Australia / New Zealand (au)", value: "au" },
|
|
19
|
-
{ name: "Canada / Americas (ca)", value: "ca" },
|
|
20
|
-
{ name: "Europe / UK (eu)", value: "eu" },
|
|
21
|
-
];
|
|
22
16
|
export function extractCreatedTenantRecord(payload) {
|
|
23
17
|
const nestedDoc = payload.doc;
|
|
24
18
|
if (nestedDoc && typeof nestedDoc === "object" && !Array.isArray(nestedDoc)) {
|
|
@@ -35,24 +29,6 @@ function normalizeTenantCreateHomeRegion(value) {
|
|
|
35
29
|
}
|
|
36
30
|
return region;
|
|
37
31
|
}
|
|
38
|
-
async function resolveChildTenantHomeRegion(options) {
|
|
39
|
-
const requested = normalizeTenantCreateHomeRegion(options.requested);
|
|
40
|
-
if (requested)
|
|
41
|
-
return requested;
|
|
42
|
-
const parentRegion = normalizeHomeRegion(options.parentHomeRegion);
|
|
43
|
-
if (!options.interactive)
|
|
44
|
-
return parentRegion || undefined;
|
|
45
|
-
const answer = await inquirer.prompt([
|
|
46
|
-
{
|
|
47
|
-
type: "select",
|
|
48
|
-
name: "homeRegion",
|
|
49
|
-
message: "Child workspace home region:",
|
|
50
|
-
default: parentRegion || undefined,
|
|
51
|
-
choices: HOME_REGION_CHOICES,
|
|
52
|
-
},
|
|
53
|
-
]);
|
|
54
|
-
return normalizeTenantCreateHomeRegion(answer.homeRegion);
|
|
55
|
-
}
|
|
56
32
|
export function buildTenantListZeroState(tokens) {
|
|
57
33
|
const zeroState = {
|
|
58
34
|
headline: "No active workspace admin memberships found for the current login.",
|
|
@@ -414,7 +390,7 @@ tenantCommand
|
|
|
414
390
|
.option("--usecase <usecase>", "Workspace usecase: council|retail|healthcare|finance|manufacturing|generic", "generic")
|
|
415
391
|
.option("--industry <industry>", "Signup/onboarding industry segment")
|
|
416
392
|
.option("--starter-template <key>", "Starter application template key", "eai-app-template")
|
|
417
|
-
.option("--home-region <region>", "
|
|
393
|
+
.option("--home-region <region>", "Root workspace home region: au|ca|eu (with --allow-root; a child inherits its parent's)")
|
|
418
394
|
.option("--allow-root", "Allow root workspace creation for administrative backfills", false)
|
|
419
395
|
.option("--format <format>", "Output format (text|json)", "text")
|
|
420
396
|
.option("--json", "Output raw JSON (deprecated, use --format json)", false)
|
|
@@ -425,6 +401,10 @@ tenantCommand
|
|
|
425
401
|
out.error("Root workspace creation is guarded. Complete onboarding for the main company workspace, then use `eai init --parent-tenant <id>` or pass --parent for child workspaces.");
|
|
426
402
|
process.exit(1);
|
|
427
403
|
}
|
|
404
|
+
if (options.parent && options.homeRegion !== undefined) {
|
|
405
|
+
out.error("--home-region is only for root workspaces (--allow-root). A child workspace inherits its parent's home region.");
|
|
406
|
+
process.exit(1);
|
|
407
|
+
}
|
|
428
408
|
let rootHomeRegion;
|
|
429
409
|
if (!options.parent) {
|
|
430
410
|
try {
|
|
@@ -450,14 +430,6 @@ tenantCommand
|
|
|
450
430
|
tenantId: options.parent || undefined,
|
|
451
431
|
});
|
|
452
432
|
const client = new PlatformAPIClient(publicApiUrl, context.activeTenant.id);
|
|
453
|
-
const tenantHomeRegion = options.parent
|
|
454
|
-
? await resolveChildTenantHomeRegion({
|
|
455
|
-
requested: options.homeRegion,
|
|
456
|
-
parentHomeRegion: context.activeTenant.homeRegion,
|
|
457
|
-
interactive: options.format !== "json" &&
|
|
458
|
-
Boolean(process.stdin.isTTY && process.stdout.isTTY),
|
|
459
|
-
})
|
|
460
|
-
: rootHomeRegion;
|
|
461
433
|
spinner =
|
|
462
434
|
options.format === "json"
|
|
463
435
|
? null
|
|
@@ -478,7 +450,7 @@ tenantCommand
|
|
|
478
450
|
usecase: options.usecase,
|
|
479
451
|
industry: options.industry,
|
|
480
452
|
starterTemplate: options.starterTemplate,
|
|
481
|
-
homeRegion:
|
|
453
|
+
homeRegion: rootHomeRegion,
|
|
482
454
|
});
|
|
483
455
|
if (!res.ok) {
|
|
484
456
|
const error = await parseApiError(res, { childTenantCreate: Boolean(options.parent) });
|