@aifabrix/builder 2.53.0 → 2.54.1
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/bin/aifabrix.js +2 -2
- package/lib/api/assistants.api.js +8 -5
- package/lib/api/channel-identity.api.js +41 -0
- package/lib/api/evidence-authoring.api.js +5 -1
- package/lib/api/evidence.api.js +2 -0
- package/lib/api/types/evidence.types.js +2 -0
- package/lib/api/work-search.api.js +136 -0
- package/lib/channels/add-channel.js +163 -126
- package/lib/channels/approval-guides/chatgpt.js +14 -18
- package/lib/channels/approval-guides/claude.js +29 -0
- package/lib/channels/approval-guides/index.js +88 -22
- package/lib/channels/approval-guides/mcp-client.js +27 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +52 -3
- package/lib/channels/approval-guides/slack.js +10 -10
- package/lib/channels/approval-guides/teams-bot.js +8 -12
- package/lib/channels/channel-add-continuations.js +91 -0
- package/lib/channels/channel-add-ensure.js +124 -27
- package/lib/channels/channel-add-existing.js +160 -28
- package/lib/channels/channel-add-failure.js +60 -0
- package/lib/channels/channel-add-remaining.js +486 -0
- package/lib/channels/channel-add-tty.js +190 -0
- package/lib/channels/channel-add-wizard-config.js +138 -0
- package/lib/channels/channel-add-wizard.js +250 -0
- package/lib/channels/channel-artifact-generator.js +27 -13
- package/lib/channels/channel-cardinality.js +83 -0
- package/lib/channels/channel-catalog-icon.js +45 -0
- package/lib/channels/channel-cli-instructions.js +75 -0
- package/lib/channels/channel-configuration-map.js +213 -0
- package/lib/channels/channel-credential.js +11 -14
- package/lib/channels/channel-definition-project.js +101 -0
- package/lib/channels/channel-definition-registry.js +154 -0
- package/lib/channels/channel-description.js +59 -2
- package/lib/channels/channel-discovery.js +16 -2
- package/lib/channels/channel-external-system.js +86 -9
- package/lib/channels/channel-install-envelope-actions.js +88 -0
- package/lib/channels/channel-install-envelope-microsoft.js +155 -0
- package/lib/channels/channel-install-envelope.js +356 -0
- package/lib/channels/channel-install-help-md.js +172 -0
- package/lib/channels/channel-install-http-payload.js +62 -0
- package/lib/channels/channel-install-inventory.js +115 -0
- package/lib/channels/channel-install-profiles.js +90 -0
- package/lib/channels/channel-instance-collision.js +118 -0
- package/lib/channels/channel-instance-key.js +100 -0
- package/lib/channels/channel-instance-materialize.js +240 -0
- package/lib/channels/channel-integration-generator.js +16 -9
- package/lib/channels/channel-integration-template.js +101 -22
- package/lib/channels/channel-inventory-fetch.js +79 -0
- package/lib/channels/channel-oauth-preflight.js +104 -0
- package/lib/channels/channel-package-version.js +76 -0
- package/lib/channels/channel-predefined-client.js +154 -0
- package/lib/channels/channel-probe.js +7 -2
- package/lib/channels/channel-runtime-resolver.js +180 -72
- package/lib/channels/channel-status-display.js +86 -16
- package/lib/channels/channel-targets.js +106 -92
- package/lib/channels/chatgpt-callback.js +318 -0
- package/lib/channels/chatgpt-channel-add.js +229 -0
- package/lib/channels/chatgpt-preflight.js +396 -0
- package/lib/channels/chatgpt-runtime-contract.js +17 -0
- package/lib/channels/chatgpt-setup-values.js +124 -0
- package/lib/channels/claude-callback.js +67 -0
- package/lib/channels/claude-channel-add.js +254 -0
- package/lib/channels/claude-runtime-contract.js +40 -0
- package/lib/channels/claude-runtime.js +58 -0
- package/lib/channels/claude-setup-values.js +89 -0
- package/lib/channels/mcp-client/config-merge.js +148 -0
- package/lib/channels/mcp-client/ensure-client.js +231 -0
- package/lib/channels/mcp-client/paths.js +53 -0
- package/lib/channels/mcp-client/profiles.js +122 -0
- package/lib/channels/mcp-client/redirect-uris.js +99 -0
- package/lib/channels/mcp-client/runtime.js +59 -0
- package/lib/channels/mcp-client-channel-add.js +186 -0
- package/lib/channels/microsoft-copilot-channel-add.js +117 -7
- package/lib/channels/microsoft-copilot-entra-identifier-uris.js +187 -0
- package/lib/channels/microsoft-copilot-entra-sso-form.js +106 -18
- package/lib/channels/microsoft-copilot-entra-sso.js +31 -2
- package/lib/channels/microsoft-copilot-package-prior.js +107 -0
- package/lib/channels/microsoft-copilot-package.js +29 -28
- package/lib/channels/microsoft-provisioning/a365.js +80 -0
- package/lib/channels/microsoft-provisioning/auth-config.js +240 -0
- package/lib/channels/microsoft-provisioning/auth.js +179 -0
- package/lib/channels/microsoft-provisioning/cli.js +71 -0
- package/lib/channels/microsoft-provisioning/constants.js +75 -0
- package/lib/channels/microsoft-provisioning/errors.js +117 -0
- package/lib/channels/microsoft-provisioning/index.js +55 -0
- package/lib/channels/microsoft-provisioning/install-atk.js +158 -0
- package/lib/channels/microsoft-provisioning/install-teams.js +115 -0
- package/lib/channels/microsoft-provisioning/login-portal-device.js +236 -0
- package/lib/channels/microsoft-provisioning/login-portal-parse.js +71 -0
- package/lib/channels/microsoft-provisioning/login-portal-teams.js +193 -0
- package/lib/channels/microsoft-provisioning/login-portal.js +230 -0
- package/lib/channels/microsoft-provisioning/persist.js +110 -0
- package/lib/channels/microsoft-provisioning/teams-bot-args.js +119 -0
- package/lib/channels/microsoft-provisioning/teams-bot-controller.js +123 -0
- package/lib/channels/microsoft-provisioning/teams-bot-parse.js +134 -0
- package/lib/channels/microsoft-provisioning/teams-bot-persist.js +113 -0
- package/lib/channels/microsoft-provisioning/teams-bot-provision.js +234 -0
- package/lib/channels/microsoft-provisioning/teams-bot-secrets.js +45 -0
- package/lib/channels/microsoft-provisioning/teams-cli.js +82 -0
- package/lib/channels/runtime-tool-catalog.js +5 -2
- package/lib/channels/slack-channel-add-portal.js +130 -0
- package/lib/channels/slack-channel-add-tty-auth.js +95 -0
- package/lib/channels/slack-channel-add.js +258 -0
- package/lib/channels/slack-provisioning/apps.js +181 -0
- package/lib/channels/slack-provisioning/auth-store.js +110 -0
- package/lib/channels/slack-provisioning/auth-ticket.js +185 -0
- package/lib/channels/slack-provisioning/auth.js +115 -0
- package/lib/channels/slack-provisioning/callbacks.js +41 -0
- package/lib/channels/slack-provisioning/cli.js +226 -0
- package/lib/channels/slack-provisioning/constants.js +37 -0
- package/lib/channels/slack-provisioning/credentials.js +169 -0
- package/lib/channels/slack-provisioning/curl-shim.js +132 -0
- package/lib/channels/slack-provisioning/developer-install.js +118 -0
- package/lib/channels/slack-provisioning/env-file.js +120 -0
- package/lib/channels/slack-provisioning/errors.js +47 -0
- package/lib/channels/slack-provisioning/go-ca-bundle.js +137 -0
- package/lib/channels/slack-provisioning/index.js +250 -0
- package/lib/channels/slack-provisioning/install-cli.js +323 -0
- package/lib/channels/slack-provisioning/manifest.js +89 -0
- package/lib/channels/slack-provisioning/oauth-lock.js +33 -0
- package/lib/channels/slack-provisioning/offer-cli.js +113 -0
- package/lib/channels/slack-provisioning/onboard-members.js +122 -0
- package/lib/channels/slack-provisioning/onboard.js +89 -0
- package/lib/channels/slack-provisioning/persist.js +95 -0
- package/lib/channels/slack-provisioning/remaining-urls.js +158 -0
- package/lib/channels/slack-provisioning/with-curl-on-path.js +48 -0
- package/lib/channels/teams-bot-channel-add.js +94 -0
- package/lib/channels/vendor-dataplane-url.js +249 -0
- package/lib/cli/setup-certification.help.js +2 -0
- package/lib/cli/setup-external-system-help.js +2 -0
- package/lib/cli/setup-external-system.js +1 -1
- package/lib/commands/channel-add-help.js +366 -0
- package/lib/commands/channel-add-setup.js +162 -80
- package/lib/commands/channel-configure.js +118 -0
- package/lib/commands/channel.js +10 -1
- package/lib/commands/governance-upload-external.js +6 -3
- package/lib/commands/lifecycle-command-action.js +2 -5
- package/lib/commands/lifecycle-external.js +93 -21
- package/lib/commands/repair-datasource-test-payload.js +4 -2
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +23 -2
- package/lib/commands/repair-datasource.js +3 -0
- package/lib/commands/repair-external-run.js +59 -25
- package/lib/commands/repair-openapi-rest-runtime.js +127 -0
- package/lib/commands/repair-orchestration-tag-merge.js +339 -0
- package/lib/commands/repair-rbac-catalog-defaults.js +96 -0
- package/lib/commands/repair-rbac-platform-preset.js +26 -15
- package/lib/commands/repair-rbac-reader-roles.js +8 -21
- package/lib/commands/repair-rbac.js +10 -34
- package/lib/commands/repair-system-permissions.js +24 -22
- package/lib/commands/role-assistant-test-output.js +14 -0
- package/lib/commands/role-assistant.js +59 -21
- package/lib/commands/test-e2e-external.js +148 -21
- package/lib/commands/upload-credential-push-log.js +2 -1
- package/lib/commands/upload-publish-context.js +1 -1
- package/lib/commands/upload-role-assistant-shell.js +124 -0
- package/lib/commands/upload-sidecar-followups.js +6 -3
- package/lib/commands/upload.js +18 -3
- package/lib/core/secrets-docker-env.js +4 -1
- package/lib/core/secrets-env-content.js +17 -3
- package/lib/datasource/capability/capability-manifest.js +0 -3
- package/lib/datasource/capability/copy-test-payload.js +3 -0
- package/lib/external-system/deploy-helpers.js +26 -1
- package/lib/external-system/deploy.js +10 -6
- package/lib/external-system/download-helpers.js +29 -2
- package/lib/external-system/download-role-assistant.js +83 -4
- package/lib/external-system/download.js +40 -30
- package/lib/external-system/sync-deploy-manifest.js +3 -2
- package/lib/external-system/upload-identity.js +42 -0
- package/lib/generator/index.js +19 -15
- package/lib/generator/split.js +13 -2
- package/lib/lifecycle/role-assistant-governance.js +146 -0
- package/lib/lifecycle/scenario-upload.js +181 -30
- package/lib/programmatic/builder-api-cors.js +143 -0
- package/lib/programmatic/builder-api-request.js +6 -0
- package/lib/programmatic/builder-api-route-dispatch.js +56 -42
- package/lib/programmatic/builder-api-server.js +8 -1
- package/lib/programmatic/capability-registry.js +54 -0
- package/lib/programmatic/channel-install-help-resolve.js +359 -0
- package/lib/programmatic/channel-install-session.js +218 -0
- package/lib/programmatic/help-content/channel-onboarding.md +2 -0
- package/lib/programmatic/help-content/cip-overview.md +3 -1
- package/lib/programmatic/http-raw-response.js +62 -0
- package/lib/programmatic/openapi-channel-install-bindings.js +179 -0
- package/lib/programmatic/openapi-channel-install-schemas.js +286 -0
- package/lib/programmatic/openapi-component-schemas.js +18 -1
- package/lib/programmatic/openapi-description-enricher.js +3 -1
- package/lib/programmatic/openapi-descriptions.js +74 -3
- package/lib/programmatic/openapi-envelope-examples.js +117 -0
- package/lib/programmatic/openapi-operation-bindings.js +4 -1
- package/lib/programmatic/openapi-schema-descriptions-channel.js +316 -0
- package/lib/programmatic/openapi-spec.js +12 -8
- package/lib/programmatic/platform-rbac-catalog.js +36 -18
- package/lib/programmatic/route-handler-map.js +51 -1
- package/lib/programmatic/route-handlers-context.js +2 -1
- package/lib/programmatic/run-auth-permissions.js +54 -0
- package/lib/programmatic/run-channel-catalog.js +196 -0
- package/lib/programmatic/run-channel-install-artifacts.js +137 -0
- package/lib/programmatic/run-channel-install-copilot.js +353 -0
- package/lib/programmatic/run-channel-install-options.js +232 -0
- package/lib/programmatic/run-channel-install-teams-bot.js +204 -0
- package/lib/programmatic/run-channel-install.js +346 -0
- package/lib/programmatic/run-channel-package.js +87 -7
- package/lib/programmatic/workspace-context.js +2 -0
- package/lib/role-assistant/evidence-sync.js +4 -2
- package/lib/role-assistant/evidence-validation-issues.js +51 -0
- package/lib/role-assistant/knowledge-sync.js +10 -4
- package/lib/role-assistant/settings.js +49 -2
- package/lib/role-assistant/test-cases-evaluate.js +30 -2
- package/lib/role-assistant/test-cases-evidence.js +175 -0
- package/lib/role-assistant/test-cases-search.js +229 -0
- package/lib/role-assistant/test-cases.js +37 -4
- package/lib/role-assistant/test-runner-search.js +149 -0
- package/lib/role-assistant/test-runner-workhub-helpers.js +40 -2
- package/lib/role-assistant/test-runner-workhub-soft.js +9 -3
- package/lib/role-assistant/test-runner-workhub.js +29 -11
- package/lib/role-assistant/test-runner.js +16 -1
- package/lib/schema/external-datasource.schema.json +119 -16
- package/lib/schema/external-system.schema.json +159 -2
- package/lib/schema/mcp-client-profile.schema.json +103 -0
- package/lib/utils/app-path-resolve.js +4 -0
- package/lib/utils/authentication-env-template.js +44 -6
- package/lib/utils/credential-secrets-env.js +6 -1
- package/lib/utils/env-copy.js +19 -7
- package/lib/utils/external-env-template.js +20 -2
- package/lib/utils/paths.js +18 -1
- package/lib/utils/platform-shell-package.js +69 -0
- package/lib/utils/port-resolver.js +50 -1
- package/lib/utils/rewrite-name-flag.js +20 -0
- package/lib/utils/role-assistant-paths.js +13 -10
- package/lib/utils/schema-resolver.js +11 -1
- package/lib/utils/secrets-helpers.js +12 -21
- package/lib/utils/token-manager.js +10 -5
- package/lib/validation/validate.js +40 -0
- package/package.json +1 -1
- package/templates/README.md +1 -1
- package/templates/applications/builder-api/Dockerfile +1 -1
- package/templates/applications/builder-api/env.template +7 -0
- package/templates/applications/dataplane/application.yaml +6 -5
- package/templates/applications/dataplane/env.template +2 -2
- package/templates/applications/dataplane/rbac.yaml +7 -2
- package/templates/applications/keycloak/Dockerfile +30 -4
- package/templates/applications/keycloak/application.yaml +2 -2
- package/templates/applications/keycloak/cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java +896 -0
- package/templates/applications/keycloak/cimd-lenient-parse/SOURCE.md +19 -0
- package/templates/applications/keycloak/env.template +3 -0
- package/templates/applications/miso-controller/application.yaml +1 -2
- package/templates/applications/miso-controller/env.template +2 -0
- package/templates/channels/README.md +5 -5
- package/templates/channels/chatgpt/TROUBLESHOOTING.md +51 -0
- package/templates/channels/chatgpt/channel.json +59 -0
- package/templates/channels/chatgpt/icon.svg +1 -0
- package/templates/channels/chatgpt/install.template.md.hbs +20 -95
- package/templates/channels/chatgpt/integration/README.md +1 -1
- package/templates/channels/chatgpt/integration/application.json +2 -2
- package/templates/channels/chatgpt/integration/chatgpt-system.json +49 -4
- package/templates/channels/chatgpt/integration/env.template +2 -4
- package/templates/channels/chatgpt/integration/rbac.json +13 -0
- package/templates/channels/claude/TROUBLESHOOTING.md +41 -0
- package/templates/channels/claude/channel.json +59 -0
- package/templates/channels/claude/icon.svg +1 -0
- package/templates/channels/claude/install.template.md.hbs +21 -0
- package/templates/channels/claude/integration/README.md +14 -0
- package/templates/channels/claude/integration/application.json +15 -0
- package/templates/channels/claude/integration/claude-system.json +59 -0
- package/templates/channels/claude/integration/env.template +2 -0
- package/templates/channels/claude/integration/rbac.json +13 -0
- package/templates/channels/claude/manifest.template.json.hbs +40 -0
- package/templates/channels/mcp-client/channel.json +72 -0
- package/templates/channels/mcp-client/icon.svg +1 -0
- package/templates/channels/mcp-client/install.template.md.hbs +24 -0
- package/templates/channels/mcp-client/integration/README.md +13 -0
- package/templates/channels/mcp-client/integration/application.json +15 -0
- package/templates/channels/mcp-client/integration/env.template +2 -0
- package/templates/channels/mcp-client/integration/mcp-client-system.json +72 -0
- package/templates/channels/mcp-client/integration/rbac.json +13 -0
- package/templates/channels/mcp-client/manifest.template.json.hbs +41 -0
- package/templates/channels/mcp-client/profiles/cursor.json +26 -0
- package/templates/channels/mcp-client/profiles/github-copilot.json +29 -0
- package/templates/channels/mcp-client/profiles/vscode.json +29 -0
- package/templates/channels/microsoft-copilot/channel.json +73 -0
- package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +8 -4
- package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +65 -5
- package/templates/channels/microsoft-copilot/icon.svg +1 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +9 -9
- package/templates/channels/microsoft-copilot/integration/README.md +1 -1
- package/templates/channels/microsoft-copilot/integration/application.json +2 -2
- package/templates/channels/microsoft-copilot/integration/env.template +3 -6
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +63 -4
- package/templates/channels/microsoft-copilot/integration/rbac.json +13 -0
- package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +5 -5
- package/templates/channels/slack/channel.json +223 -0
- package/templates/channels/slack/icon.svg +1 -0
- package/templates/channels/slack/install.template.md.hbs +36 -28
- package/templates/channels/slack/integration/README.md +245 -22
- package/templates/channels/slack/integration/application.json +44 -7
- package/templates/channels/slack/integration/env.template +15 -6
- package/templates/channels/slack/integration/openapi/openapi.json +126 -0
- package/templates/channels/slack/integration/rbac.json +84 -0
- package/templates/channels/slack/integration/slack-datasource-commands.json +154 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +28 -3
- package/templates/channels/slack/integration/slack-datasource-events.json +154 -0
- package/templates/channels/slack/integration/slack-datasource-interactive.json +154 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +40 -2
- package/templates/channels/slack/integration/slack-system.json +155 -77
- package/templates/channels/slack/manifest.template.json.hbs +5 -2
- package/templates/channels/teams-bot/channel.json +161 -0
- package/templates/channels/teams-bot/icon.svg +1 -0
- package/templates/channels/teams-bot/install.template.md.hbs +12 -13
- package/templates/channels/teams-bot/integration/README.md +5 -4
- package/templates/channels/teams-bot/integration/application.json +6 -4
- package/templates/channels/teams-bot/integration/env.template +5 -4
- package/templates/channels/teams-bot/integration/openapi/openapi.json +68 -0
- package/templates/channels/teams-bot/integration/rbac.json +21 -0
- package/templates/channels/teams-bot/integration/teams-bot-datasource-activities.json +154 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +128 -23
- package/templates/channels/web-embed/channel.json +60 -0
- package/templates/channels/web-embed/install.template.md.hbs +1 -1
- package/templates/channels/web-embed/integration/README.md +2 -2
- package/templates/channels/web-embed/integration/application.json +2 -2
- package/templates/channels/web-embed/integration/env.template +1 -1
- package/templates/channels/web-embed/integration/rbac.json +13 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +50 -4
|
@@ -1,108 +1,153 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Register `channel add` (and optional deprecated aliases).
|
|
3
3
|
*
|
|
4
|
-
* @fileoverview Shared Commander wiring for assistant channel install
|
|
4
|
+
* @fileoverview Shared Commander wiring for assistant channel install
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
9
|
const chalk = require('chalk');
|
|
10
10
|
const logger = require('../utils/logger');
|
|
11
|
-
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
12
11
|
const {
|
|
13
|
-
|
|
12
|
+
formatUnknownChannelTargetError,
|
|
14
13
|
isChannelTargetKey
|
|
15
14
|
} = require('../channels/channel-targets');
|
|
16
|
-
const { addChannelCommand } = require('../channels/add-channel');
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
--oauth-plugin-vault-reference-id "<Teams-Entra-SSO-auth-config-id>"
|
|
30
|
-
|
|
31
|
-
# Slack slash-command prefix (registers /{prefix}-help in manifest)
|
|
32
|
-
$ aifabrix channel add slack --name "Elsa" --command-prefix af
|
|
33
|
-
|
|
34
|
-
# Generate artifacts only; no dataplane patch / upload
|
|
35
|
-
$ aifabrix channel add slack --name "Elsa" --dry-run
|
|
36
|
-
|
|
37
|
-
# Re-upload communication system + regenerate channel config (does not rotate secrets)
|
|
38
|
-
$ aifabrix channel add slack --name "Elsa" --force
|
|
39
|
-
|
|
40
|
-
# Validate callbacks and assistant catalog after install
|
|
41
|
-
$ aifabrix channel add slack --name "Elsa" --probe
|
|
15
|
+
const { addChannelCommand, runAddChannel } = require('../channels/add-channel');
|
|
16
|
+
const { toChannelInstallEnvelope } = require('../channels/channel-install-envelope');
|
|
17
|
+
const {
|
|
18
|
+
isChannelAddCancelled,
|
|
19
|
+
promptChannelAddWizard
|
|
20
|
+
} = require('../channels/channel-add-wizard');
|
|
21
|
+
const { formatChannelAddFailure } = require('../channels/channel-add-failure');
|
|
22
|
+
const {
|
|
23
|
+
CHANNEL_ADD_HELP_AFTER,
|
|
24
|
+
channelAddHelpAfter,
|
|
25
|
+
configureChannelAddHelp,
|
|
26
|
+
resolveChannelAddHelpTarget
|
|
27
|
+
} = require('./channel-add-help');
|
|
42
28
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
29
|
+
/**
|
|
30
|
+
* @param {Object} options
|
|
31
|
+
* @returns {Object}
|
|
32
|
+
*/
|
|
33
|
+
function toAddChannelCommandOptions(options) {
|
|
34
|
+
return {
|
|
35
|
+
name: options.name,
|
|
36
|
+
description: options.description,
|
|
37
|
+
icon: options.icon,
|
|
38
|
+
template: options.template,
|
|
39
|
+
commandPrefix: options.commandPrefix,
|
|
40
|
+
systemKey: options.systemKey,
|
|
41
|
+
oauthPluginVaultReferenceId: options.oauthPluginVaultReferenceId,
|
|
42
|
+
packageVersion: options.packageVersion,
|
|
43
|
+
callbackUrl: options.callbackUrl,
|
|
44
|
+
allowExperimental: options.allowExperimental === true,
|
|
45
|
+
dryRun: options.dryRun === true,
|
|
46
|
+
force: options.force === true,
|
|
47
|
+
probe: options.probe === true,
|
|
48
|
+
verbose: options.verbose === true,
|
|
49
|
+
onboardUsers:
|
|
50
|
+
options.noOnboardUsers === true ? false : options.onboardUsers === true ? true : undefined,
|
|
51
|
+
target: options.target,
|
|
52
|
+
profile: options.profile,
|
|
53
|
+
mcpClientProfile: options.mcpClientProfile
|
|
54
|
+
};
|
|
55
|
+
}
|
|
49
56
|
|
|
50
|
-
|
|
51
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Resolve wizard vs explicit target. Explicit path still requires --name.
|
|
59
|
+
* @param {string|undefined} channelTarget
|
|
60
|
+
* @param {Object} options
|
|
61
|
+
* @returns {Promise<{ channelTarget: string, name: string }>}
|
|
62
|
+
*/
|
|
63
|
+
async function resolveChannelAddSelection(channelTarget, options) {
|
|
64
|
+
if (!channelTarget) {
|
|
65
|
+
return promptChannelAddWizard(options);
|
|
66
|
+
}
|
|
67
|
+
if (!isChannelTargetKey(channelTarget)) {
|
|
68
|
+
throw new Error(formatUnknownChannelTargetError(channelTarget));
|
|
69
|
+
}
|
|
70
|
+
if (!options.name || typeof options.name !== 'string' || !options.name.trim()) {
|
|
71
|
+
throw new Error('--name is required for channel add');
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
channelTarget,
|
|
75
|
+
name: options.name,
|
|
76
|
+
mcpClientProfile: options.target || options.profile
|
|
77
|
+
};
|
|
78
|
+
}
|
|
52
79
|
|
|
53
80
|
/**
|
|
54
81
|
* @param {string} channelTarget
|
|
55
82
|
* @param {Object} options
|
|
56
83
|
* @param {{ deprecatedVia?: string }} [meta]
|
|
84
|
+
* @returns {Promise<void>}
|
|
57
85
|
*/
|
|
58
86
|
async function runChannelAddAction(channelTarget, options, meta = {}) {
|
|
59
87
|
if (meta.deprecatedVia) {
|
|
60
88
|
logger.warn(
|
|
61
89
|
chalk.yellow(
|
|
62
|
-
`Deprecated: use "aifabrix channel add ${channelTarget} ..." instead of "${meta.deprecatedVia}".`
|
|
90
|
+
`Deprecated: use "aifabrix channel add ${channelTarget || ''} ..." instead of "${meta.deprecatedVia}".`
|
|
63
91
|
)
|
|
64
92
|
);
|
|
65
93
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
name: options.name,
|
|
73
|
-
description: options.description,
|
|
74
|
-
icon: options.icon,
|
|
75
|
-
template: options.template,
|
|
76
|
-
commandPrefix: options.commandPrefix,
|
|
77
|
-
oauthPluginVaultReferenceId: options.oauthPluginVaultReferenceId,
|
|
78
|
-
dryRun: options.dryRun === true,
|
|
79
|
-
force: options.force === true,
|
|
80
|
-
probe: options.probe === true
|
|
94
|
+
const selection = await resolveChannelAddSelection(channelTarget, options);
|
|
95
|
+
const addOptions = toAddChannelCommandOptions({
|
|
96
|
+
...options,
|
|
97
|
+
...selection,
|
|
98
|
+
name: selection.name,
|
|
99
|
+
mcpClientProfile: selection.mcpClientProfile || options.target || options.profile
|
|
81
100
|
});
|
|
101
|
+
if (options.json === true) {
|
|
102
|
+
addOptions.quiet = true;
|
|
103
|
+
const result = await runAddChannel(selection.channelTarget, addOptions);
|
|
104
|
+
const envelope = toChannelInstallEnvelope({
|
|
105
|
+
channelTarget: selection.channelTarget,
|
|
106
|
+
displayName: addOptions.name,
|
|
107
|
+
runtimeValues: (result && result.runtimeValues) || { appName: addOptions.name },
|
|
108
|
+
ctx: { projectRoot: process.cwd() }
|
|
109
|
+
});
|
|
110
|
+
process.stdout.write(`${JSON.stringify(envelope)}\n`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
await addChannelCommand(selection.channelTarget, addOptions);
|
|
82
114
|
}
|
|
83
115
|
|
|
84
116
|
/**
|
|
85
|
-
* @param {
|
|
86
|
-
* @
|
|
117
|
+
* @param {Error} error
|
|
118
|
+
* @returns {void}
|
|
119
|
+
*/
|
|
120
|
+
function handleChannelAddError(error) {
|
|
121
|
+
if (isChannelAddCancelled(error)) {
|
|
122
|
+
process.exit(0);
|
|
123
|
+
}
|
|
124
|
+
if (!error.message?.includes('Authentication required')) {
|
|
125
|
+
logger.error(formatChannelAddFailure(error));
|
|
126
|
+
}
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* @param {import('commander').Command} cmd
|
|
87
132
|
* @returns {import('commander').Command}
|
|
88
133
|
*/
|
|
89
|
-
function
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
: parent.command(commandName);
|
|
96
|
-
cmd
|
|
97
|
-
.description(meta.deprecatedVia ? `(deprecated) ${description}` : description)
|
|
98
|
-
.requiredOption('-n, --name <name>', 'Customer-visible channel name (e.g. "Elsa")')
|
|
134
|
+
function attachChannelAddOptions(cmd) {
|
|
135
|
+
return cmd
|
|
136
|
+
.option(
|
|
137
|
+
'-n, --name <name>',
|
|
138
|
+
'Customer-visible channel name (e.g. "Elsa"); required when the target is specified. Quoted names may contain spaces'
|
|
139
|
+
)
|
|
99
140
|
.option('-d, --description <text>', 'Channel description (default generated)')
|
|
100
141
|
.option('--icon <path>', 'Path to channel icon asset')
|
|
101
142
|
.option('--template <name>', 'Template override (default from channel target)')
|
|
102
143
|
.option('--dry-run', 'Generate artifacts only; do not upload, patch, or set credentials')
|
|
103
144
|
.option(
|
|
104
145
|
'--force',
|
|
105
|
-
'
|
|
146
|
+
'Refresh integration files from the channel template, re-upload, and regenerate channel config (does not rotate secrets)'
|
|
147
|
+
)
|
|
148
|
+
.option(
|
|
149
|
+
'--system-key <key>',
|
|
150
|
+
'Connected System instance key (default: derived from the channel and --name)'
|
|
106
151
|
)
|
|
107
152
|
.option(
|
|
108
153
|
'--command-prefix <key>',
|
|
@@ -110,26 +155,63 @@ function registerChannelAddCommand(parent, meta = {}) {
|
|
|
110
155
|
)
|
|
111
156
|
.option(
|
|
112
157
|
'--oauth-plugin-vault-reference-id <id>',
|
|
113
|
-
'Teams
|
|
158
|
+
'Teams Entra SSO auth-config id (microsoft-copilot); optional when Agents Toolkit can create it'
|
|
159
|
+
)
|
|
160
|
+
.option(
|
|
161
|
+
'--package-version <semver>',
|
|
162
|
+
'Teams manifest version (microsoft-copilot); default auto-bumps minor on regenerate'
|
|
114
163
|
)
|
|
115
164
|
.option('--probe', 'After install, validate callbacks and assistant catalog')
|
|
116
|
-
.
|
|
117
|
-
.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
165
|
+
.option('--onboard-users', 'Onboard Slack users by matching email after install')
|
|
166
|
+
.option('--no-onboard-users', 'Skip Slack user onboard')
|
|
167
|
+
.option('-v, --verbose', 'Print scaffold file list and upload internals')
|
|
168
|
+
.option('--callback-url <url>', 'ChatGPT or Claude OAuth callback URL to register on the matching profile')
|
|
169
|
+
.option(
|
|
170
|
+
'--target <profile>',
|
|
171
|
+
'MCP client installation profile when the channel is mcp-client (cursor, vscode, github-copilot)'
|
|
172
|
+
)
|
|
173
|
+
.option('--profile <profile>', 'Alias for --target (MCP client installation profile)')
|
|
174
|
+
.option('--allow-experimental', 'Allow experimental targets such as web-embed')
|
|
175
|
+
.option('--json', 'Machine-readable install envelope (no TTY glyphs)');
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* @param {{ deprecatedVia?: string }} meta
|
|
180
|
+
* @returns {Function}
|
|
181
|
+
*/
|
|
182
|
+
function handleChannelAddAction(meta) {
|
|
183
|
+
return async(channelTarget, options) => {
|
|
184
|
+
try {
|
|
185
|
+
await runChannelAddAction(channelTarget, options, meta);
|
|
186
|
+
} catch (error) {
|
|
187
|
+
handleChannelAddError(error);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @param {import('commander').Command} parent
|
|
194
|
+
* @param {{ deprecatedVia?: string, commandName?: string, hidden?: boolean }} [meta]
|
|
195
|
+
* @returns {import('commander').Command}
|
|
196
|
+
*/
|
|
197
|
+
function registerChannelAddCommand(parent, meta = {}) {
|
|
198
|
+
const description =
|
|
199
|
+
'Scaffold (if needed), upload (if needed/--force), then configure channel install';
|
|
200
|
+
const commandName = meta.commandName || 'add [channelTarget]';
|
|
201
|
+
const cmd = meta.hidden
|
|
202
|
+
? parent.command(commandName, { hidden: true })
|
|
203
|
+
: parent.command(commandName);
|
|
204
|
+
cmd.description(meta.deprecatedVia ? `(deprecated) ${description}` : description);
|
|
205
|
+
attachChannelAddOptions(cmd);
|
|
206
|
+
configureChannelAddHelp(cmd);
|
|
207
|
+
cmd.addHelpText('after', () => channelAddHelpAfter(resolveChannelAddHelpTarget()));
|
|
208
|
+
cmd.action(handleChannelAddAction(meta));
|
|
128
209
|
return cmd;
|
|
129
210
|
}
|
|
130
211
|
|
|
131
212
|
module.exports = {
|
|
132
213
|
CHANNEL_ADD_HELP_AFTER,
|
|
133
214
|
registerChannelAddCommand,
|
|
134
|
-
runChannelAddAction
|
|
215
|
+
runChannelAddAction,
|
|
216
|
+
resolveChannelAddSelection
|
|
135
217
|
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register `channel configure` (callback URL on the existing Integration Client).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Thin wrapper over Integration Client redirect URI update
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const logger = require('../utils/logger');
|
|
10
|
+
const {
|
|
11
|
+
formatWarningLine,
|
|
12
|
+
formatBlockingError
|
|
13
|
+
} = require('../utils/cli-layout-chalk');
|
|
14
|
+
const { printCallbackRegistered } = require('../channels/channel-add-tty');
|
|
15
|
+
const { isChannelTargetKey, formatUnknownChannelTargetError } = require('../channels/channel-targets');
|
|
16
|
+
const { resolveChannelAuthContext } = require('../channels/channel-auth-context');
|
|
17
|
+
const { registerChatGptCallbackUrl } = require('../channels/chatgpt-callback');
|
|
18
|
+
const { runChatGptConfigureValidate } = require('../channels/chatgpt-channel-add');
|
|
19
|
+
const { registerClaudeCallbackUrl } = require('../channels/claude-callback');
|
|
20
|
+
const { runClaudeConfigureValidate } = require('../channels/claude-channel-add');
|
|
21
|
+
|
|
22
|
+
const CONFIGURE_TARGETS = new Set(['chatgpt', 'claude']);
|
|
23
|
+
|
|
24
|
+
const CHANNEL_CONFIGURE_HELP_AFTER = `
|
|
25
|
+
Examples:
|
|
26
|
+
$ aifabrix channel configure chatgpt --callback-url "https://chatgpt.com/connector/oauth/callback"
|
|
27
|
+
$ aifabrix channel configure claude --callback-url "https://claude.ai/api/mcp/auth_callback"
|
|
28
|
+
|
|
29
|
+
Registers an HTTPS OAuth callback on the existing ChatGPT or Claude Integration Client.
|
|
30
|
+
Does not rotate the client secret. Extra redirect URIs are preserved.
|
|
31
|
+
|
|
32
|
+
Requires: aifabrix login and integration-client:read plus integration-client:update
|
|
33
|
+
`;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {string} channelTarget
|
|
37
|
+
* @param {Object} ctx
|
|
38
|
+
* @param {string} callbackUrl
|
|
39
|
+
* @returns {Promise<Object>}
|
|
40
|
+
*/
|
|
41
|
+
async function registerConfigureCallback(channelTarget, ctx, callbackUrl) {
|
|
42
|
+
if (channelTarget === 'claude') {
|
|
43
|
+
return registerClaudeCallbackUrl({ ctx, callbackUrl });
|
|
44
|
+
}
|
|
45
|
+
return registerChatGptCallbackUrl({ ctx, callbackUrl });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @param {string} channelTarget
|
|
50
|
+
* @param {Object} ctx
|
|
51
|
+
* @returns {Promise<void>}
|
|
52
|
+
*/
|
|
53
|
+
async function validateAfterConfigure(channelTarget, ctx) {
|
|
54
|
+
if (channelTarget === 'claude') {
|
|
55
|
+
await runClaudeConfigureValidate(ctx);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
await runChatGptConfigureValidate(ctx);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {string} channelTarget
|
|
63
|
+
* @param {Object} options
|
|
64
|
+
* @returns {Promise<void>}
|
|
65
|
+
*/
|
|
66
|
+
async function runChannelConfigure(channelTarget, options = {}) {
|
|
67
|
+
if (!isChannelTargetKey(channelTarget)) {
|
|
68
|
+
throw new Error(formatUnknownChannelTargetError(channelTarget));
|
|
69
|
+
}
|
|
70
|
+
if (!CONFIGURE_TARGETS.has(channelTarget)) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
`channel configure currently supports chatgpt and claude. Received "${channelTarget}".`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
const callbackUrl =
|
|
76
|
+
typeof options.callbackUrl === 'string' ? options.callbackUrl.trim() : '';
|
|
77
|
+
if (!callbackUrl) {
|
|
78
|
+
throw new Error(`--callback-url is required for channel configure ${channelTarget}.`);
|
|
79
|
+
}
|
|
80
|
+
const ctx = await resolveChannelAuthContext(channelTarget, { silent: true });
|
|
81
|
+
const result = await registerConfigureCallback(channelTarget, ctx, callbackUrl);
|
|
82
|
+
if (result.fallback) {
|
|
83
|
+
logger.log(
|
|
84
|
+
formatWarningLine(
|
|
85
|
+
`Missing integration-client:update. Add the callback on the ${channelTarget} profile: ${result.profileUrl}`
|
|
86
|
+
)
|
|
87
|
+
);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
printCallbackRegistered();
|
|
91
|
+
await validateAfterConfigure(channelTarget, ctx);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @param {import('commander').Command} parent
|
|
96
|
+
* @returns {import('commander').Command}
|
|
97
|
+
*/
|
|
98
|
+
function registerChannelConfigureCommand(parent) {
|
|
99
|
+
return parent
|
|
100
|
+
.command('configure <channelTarget>')
|
|
101
|
+
.description('Register a ChatGPT or Claude callback URL on the existing OAuth2 profile')
|
|
102
|
+
.option('--callback-url <url>', 'HTTPS redirect URI from ChatGPT or Claude OAuth')
|
|
103
|
+
.addHelpText('after', CHANNEL_CONFIGURE_HELP_AFTER)
|
|
104
|
+
.action(async(channelTarget, options) => {
|
|
105
|
+
try {
|
|
106
|
+
await runChannelConfigure(channelTarget, options);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
logger.error(formatBlockingError(error.message || String(error)));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
module.exports = {
|
|
115
|
+
CHANNEL_CONFIGURE_HELP_AFTER,
|
|
116
|
+
registerChannelConfigureCommand,
|
|
117
|
+
runChannelConfigure
|
|
118
|
+
};
|
package/lib/commands/channel.js
CHANGED
|
@@ -22,15 +22,23 @@ const {
|
|
|
22
22
|
} = require('../channels/channel-targets');
|
|
23
23
|
const { scaffoldChannelIntegration } = require('../channels/channel-integration-generator');
|
|
24
24
|
const { registerChannelAddCommand } = require('./channel-add-setup');
|
|
25
|
+
const { registerChannelConfigureCommand } = require('./channel-configure');
|
|
25
26
|
|
|
26
27
|
const CHANNEL_HELP_AFTER = `
|
|
27
28
|
Subcommands:
|
|
28
|
-
add
|
|
29
|
+
add [target] One command: scaffold (if needed) → upload (if needed/--force) → install
|
|
30
|
+
configure chatgpt Register the ChatGPT callback URL on the existing OAuth2 profile
|
|
29
31
|
scaffold <target> Optional: create integration/<target>/ files only (local)
|
|
30
32
|
|
|
31
33
|
${formatSupportedChannelTargetsHelp()}
|
|
32
34
|
|
|
35
|
+
Examples:
|
|
36
|
+
$ aifabrix channel add
|
|
37
|
+
$ aifabrix channel add slack --name "Elsa" --probe
|
|
38
|
+
$ aifabrix channel configure chatgpt --callback-url "https://chatgpt.com/connector/oauth/callback"
|
|
39
|
+
|
|
33
40
|
Typical flow:
|
|
41
|
+
aifabrix channel add
|
|
34
42
|
aifabrix channel add slack --name "Elsa" --probe
|
|
35
43
|
|
|
36
44
|
# Force re-upload of the communication system, then reinstall channel
|
|
@@ -102,6 +110,7 @@ function setupChannelCommands(program) {
|
|
|
102
110
|
});
|
|
103
111
|
|
|
104
112
|
registerChannelAddCommand(channel);
|
|
113
|
+
registerChannelConfigureCommand(channel);
|
|
105
114
|
}
|
|
106
115
|
|
|
107
116
|
module.exports = { setupChannelCommands };
|
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
'use strict';
|
|
6
6
|
|
|
7
|
-
const {
|
|
7
|
+
const {
|
|
8
|
+
uploadGovernanceScenarioPacks,
|
|
9
|
+
normalizeGovernanceUploadResult
|
|
10
|
+
} = require('../lifecycle/scenario-upload');
|
|
8
11
|
const { resolveGovernanceIntegrationContext } = require('./governance-cli-shared');
|
|
9
12
|
|
|
10
13
|
/**
|
|
@@ -18,7 +21,7 @@ async function runGovernanceUploadForExternalSystem(systemKey, options = {}) {
|
|
|
18
21
|
systemKey,
|
|
19
22
|
options
|
|
20
23
|
);
|
|
21
|
-
const
|
|
24
|
+
const result = await uploadGovernanceScenarioPacks(
|
|
22
25
|
resolvedKey,
|
|
23
26
|
dataplaneUrl,
|
|
24
27
|
authConfig,
|
|
@@ -27,7 +30,7 @@ async function runGovernanceUploadForExternalSystem(systemKey, options = {}) {
|
|
|
27
30
|
return {
|
|
28
31
|
systemKey: resolvedKey,
|
|
29
32
|
command: 'governance upload',
|
|
30
|
-
|
|
33
|
+
...normalizeGovernanceUploadResult(result)
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
36
|
|
|
@@ -14,6 +14,7 @@ const { displayLifecycleReportTTY } = require('../lifecycle/report-display');
|
|
|
14
14
|
const { VERDICT } = require('../lifecycle/product-model');
|
|
15
15
|
const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
|
|
16
16
|
const { lifecycleHasGovernanceSubjects } = require('../lifecycle/lifecycle-governance-options');
|
|
17
|
+
const { lifecyclePillarSatisfied } = require('../lifecycle/role-assistant-governance');
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* @param {Object} options
|
|
@@ -48,11 +49,7 @@ function lifecycleVerdictFromReport(report) {
|
|
|
48
49
|
if (ops === VERDICT.FAILED || trust === VERDICT.FAILED || gov === VERDICT.FAILED) {
|
|
49
50
|
return VERDICT.FAILED;
|
|
50
51
|
}
|
|
51
|
-
if (
|
|
52
|
-
ops === VERDICT.VERIFIED &&
|
|
53
|
-
trust === VERDICT.VERIFIED &&
|
|
54
|
-
gov === VERDICT.VERIFIED
|
|
55
|
-
) {
|
|
52
|
+
if (lifecyclePillarSatisfied(ops) && lifecyclePillarSatisfied(trust) && lifecyclePillarSatisfied(gov)) {
|
|
56
53
|
return VERDICT.VERIFIED;
|
|
57
54
|
}
|
|
58
55
|
return VERDICT.NOT_VERIFIED;
|