@aifabrix/builder 2.50.0 → 2.51.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.
Files changed (236) hide show
  1. package/.cursor/plans/Done/157.1-security-quality-violations-by-type.csv +374 -0
  2. package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
  3. package/integration/hubspot-test/create-hubspot.js +1 -16
  4. package/jest.isolated-projects.js +77 -1
  5. package/jest.projects.js +5 -426
  6. package/lib/api/assistants.api.js +67 -0
  7. package/lib/api/datasources-extended.api.js +6 -6
  8. package/lib/api/evidence-authoring-helpers.js +267 -0
  9. package/lib/api/evidence-authoring.api.js +337 -0
  10. package/lib/api/evidence-kinds.api.js +128 -0
  11. package/lib/api/evidence.api.js +57 -1
  12. package/lib/api/index.js +24 -7
  13. package/lib/api/pipeline.api.js +47 -3
  14. package/lib/api/records-bulk.api.js +28 -3
  15. package/lib/api/resource-types.api.js +4 -4
  16. package/lib/api/roles.api.js +121 -0
  17. package/lib/api/types/evidence-kinds.types.js +42 -0
  18. package/lib/api/types/evidence.types.js +156 -8
  19. package/lib/api/types/roles.types.js +36 -0
  20. package/lib/api/work.api.js +283 -0
  21. package/lib/app/certification-verify-rows.js +1 -1
  22. package/lib/app/run-deploy-job.js +108 -0
  23. package/lib/app/run-helpers.js +10 -3
  24. package/lib/app/run.js +8 -0
  25. package/lib/app/show.js +2 -2
  26. package/lib/certification/merge-certification-from-artifact.js +1 -1
  27. package/lib/channels/add-channel.js +54 -23
  28. package/lib/channels/approval-guides/chatgpt.js +8 -7
  29. package/lib/channels/approval-guides/microsoft-copilot.js +7 -8
  30. package/lib/channels/channel-artifact-generator.js +16 -3
  31. package/lib/channels/channel-credential.js +3 -1
  32. package/lib/channels/channel-probe-evidence.js +79 -0
  33. package/lib/channels/channel-probe.js +265 -13
  34. package/lib/channels/channel-runtime-resolver.js +120 -29
  35. package/lib/channels/channel-status-display.js +44 -0
  36. package/lib/channels/channel-targets.js +7 -0
  37. package/lib/channels/chatgpt-runtime-contract.js +29 -0
  38. package/lib/channels/microsoft-copilot-package.js +280 -0
  39. package/lib/channels/runtime-tool-catalog.js +165 -0
  40. package/lib/cli/index.js +6 -0
  41. package/lib/cli/setup-app.js +26 -5
  42. package/lib/cli/setup-dev.js +23 -7
  43. package/lib/cli/setup-external-system-help.js +8 -2
  44. package/lib/cli/setup-external-system.js +12 -0
  45. package/lib/cli/setup-utility-help-after.js +12 -0
  46. package/lib/cli/setup-utility-validate.js +41 -2
  47. package/lib/commands/app-test.js +2 -14
  48. package/lib/commands/datasource-load-export-cli.js +6 -1
  49. package/lib/commands/deploy-gate-failure-details.js +23 -0
  50. package/lib/commands/deploy-gate-orchestrator.js +64 -18
  51. package/lib/commands/dev-cli-handlers.js +6 -3
  52. package/lib/commands/dev-down.js +2 -6
  53. package/lib/commands/dev-init.js +7 -109
  54. package/lib/commands/dev-refresh.js +197 -0
  55. package/lib/commands/evidence-kind.js +478 -0
  56. package/lib/commands/governance-command-action.js +4 -2
  57. package/lib/commands/governance-generate-external.js +56 -21
  58. package/lib/commands/lifecycle-external.js +10 -4
  59. package/lib/commands/repair-datasource-apply.js +10 -1
  60. package/lib/commands/repair-datasource-run.js +4 -2
  61. package/lib/commands/repair-datasource-test-payload.js +80 -19
  62. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +42 -3
  63. package/lib/commands/repair-internal.js +9 -1
  64. package/lib/commands/repair-openapi-export.js +1 -1
  65. package/lib/commands/repair-openapi-sync.js +43 -18
  66. package/lib/commands/resource-type.js +101 -18
  67. package/lib/commands/role-assistant.js +313 -0
  68. package/lib/commands/role.js +452 -0
  69. package/lib/commands/setup.js +1 -1
  70. package/lib/commands/upload-data-sync-finalize.js +5 -4
  71. package/lib/commands/upload-sidecar-followups.js +144 -47
  72. package/lib/commands/upload.js +43 -6
  73. package/lib/commands/validate-json.js +230 -0
  74. package/lib/commands/verify-governance-combined-external.js +73 -9
  75. package/lib/commands/verify-governance-db.js +80 -25
  76. package/lib/commands/verify-governance-external.js +29 -5
  77. package/lib/commands/verify-operations-step-plan.js +78 -40
  78. package/lib/commands/wizard-core-helpers.js +7 -3
  79. package/lib/commands/wizard-core.js +78 -9
  80. package/lib/core/audit-logger.js +1 -1
  81. package/lib/core/secrets-load.js +1 -3
  82. package/lib/datasource/bulk-loader-run-batches.js +4 -2
  83. package/lib/datasource/bulk-loader-service.js +5 -1
  84. package/lib/datasource/capability/relate-operations.js +1 -1
  85. package/lib/datasource/datasource-validate-summary.js +2 -2
  86. package/lib/datasource/validate.js +13 -6
  87. package/lib/external-system/deploy-helpers.js +35 -1
  88. package/lib/external-system/deploy.js +23 -10
  89. package/lib/external-system/download-helpers.js +111 -2
  90. package/lib/external-system/download-role-assistant.js +55 -0
  91. package/lib/external-system/download.js +45 -26
  92. package/lib/external-system/test-helpers.js +1 -1
  93. package/lib/external-system/test.js +39 -3
  94. package/lib/generator/builders.js +3 -0
  95. package/lib/generator/helpers.js +13 -5
  96. package/lib/generator/split-variables.js +9 -3
  97. package/lib/generator/wizard.js +51 -4
  98. package/lib/infrastructure/helpers-docker-check.js +6 -0
  99. package/lib/infrastructure/helpers.js +1 -1
  100. package/lib/lifecycle/access-control-abac.js +121 -0
  101. package/lib/lifecycle/lifecycle-governance-options.js +4 -1
  102. package/lib/lifecycle/product-model.js +3 -2
  103. package/lib/lifecycle/report-display.js +14 -2
  104. package/lib/programmatic/auth-config.js +3 -2
  105. package/lib/programmatic/bearer-auth.js +1 -1
  106. package/lib/programmatic/capability-registry.js +20 -1
  107. package/lib/programmatic/command-options.js +1 -0
  108. package/lib/programmatic/enterprise-mcp-client.js +18 -2
  109. package/lib/programmatic/index.js +4 -0
  110. package/lib/programmatic/manifest-patch-section.js +48 -9
  111. package/lib/programmatic/manifest-section-registry-data.js +3 -2
  112. package/lib/programmatic/manifest-section-registry.js +18 -1
  113. package/lib/programmatic/openapi-apply-result-schemas.js +44 -0
  114. package/lib/programmatic/openapi-component-schemas.js +16 -1
  115. package/lib/programmatic/openapi-description-enricher.js +3 -1
  116. package/lib/programmatic/openapi-descriptions.js +55 -5
  117. package/lib/programmatic/openapi-evidence-schemas.js +161 -0
  118. package/lib/programmatic/openapi-manifest-schemas.js +6 -2
  119. package/lib/programmatic/openapi-operation-bindings.js +99 -0
  120. package/lib/programmatic/openapi-request-schemas.js +36 -1
  121. package/lib/programmatic/openapi-result-schemas.js +29 -12
  122. package/lib/programmatic/openapi-schema-descriptions-certify.js +5 -1
  123. package/lib/programmatic/openapi-schema-descriptions-core.js +6 -3
  124. package/lib/programmatic/openapi-schema-descriptions-evidence.js +156 -0
  125. package/lib/programmatic/openapi-schema-descriptions-manifest.js +4 -3
  126. package/lib/programmatic/openapi-schema-descriptions-operations.js +70 -0
  127. package/lib/programmatic/openapi-schema-helpers.js +16 -1
  128. package/lib/programmatic/openapi-spec.js +48 -29
  129. package/lib/programmatic/orchestration-openapi-meta.js +5 -0
  130. package/lib/programmatic/request-timeout.js +3 -0
  131. package/lib/programmatic/route-handler-map.js +89 -2
  132. package/lib/programmatic/run-certify.js +15 -2
  133. package/lib/programmatic/run-deploy.js +74 -0
  134. package/lib/programmatic/run-evidence-authoring.js +80 -0
  135. package/lib/programmatic/run-protection.js +124 -0
  136. package/lib/programmatic/run-repository-emcp.js +11 -3
  137. package/lib/programmatic/run-template-workspace.js +42 -2
  138. package/lib/programmatic/workspace-context.js +6 -0
  139. package/lib/protection/auth-context.js +48 -6
  140. package/lib/protection/paths.js +22 -0
  141. package/lib/protection/run-protection-create-helpers.js +22 -1
  142. package/lib/protection/run-protection-create.js +1 -1
  143. package/lib/protection/sync-after-upload.js +1 -1
  144. package/lib/resolvers/evidence-kind-file.js +230 -0
  145. package/lib/resolvers/resource-type-file.js +36 -1
  146. package/lib/resolvers/role-file.js +227 -0
  147. package/lib/role-assistant/evidence-sync.js +450 -0
  148. package/lib/role-assistant/github-workflow.js +96 -0
  149. package/lib/role-assistant/knowledge-sync.js +465 -0
  150. package/lib/role-assistant/settings.js +126 -0
  151. package/lib/role-assistant/test-cases-evaluate.js +170 -0
  152. package/lib/role-assistant/test-cases-honesty.js +184 -0
  153. package/lib/role-assistant/test-cases.js +364 -0
  154. package/lib/role-assistant/test-runner-workhub-answers.js +203 -0
  155. package/lib/role-assistant/test-runner-workhub.js +385 -0
  156. package/lib/role-assistant/test-runner.js +500 -0
  157. package/lib/schema/application-schema.json +36 -2
  158. package/lib/schema/deployment-rules.yaml +1 -0
  159. package/lib/schema/external-datasource.schema.json +121 -4
  160. package/lib/schema/external-system.schema.json +20 -6
  161. package/lib/schema/infra.parameter.yaml +45 -1
  162. package/lib/schema/role-assistant-settings.schema.json +108 -0
  163. package/lib/schema/type/credential-field-registry.json +19 -3
  164. package/lib/utils/api.js +52 -21
  165. package/lib/utils/app-path-resolve.js +72 -24
  166. package/lib/utils/app-register-config.js +4 -3
  167. package/lib/utils/authentication-shape.js +3 -1
  168. package/lib/utils/cli-sync-options.js +59 -3
  169. package/lib/utils/cli-utils.js +11 -3
  170. package/lib/utils/deployment-validation.js +28 -3
  171. package/lib/utils/dev-ca-install.js +5 -6
  172. package/lib/utils/dev-config.js +2 -2
  173. package/lib/utils/dev-list-sort.js +145 -0
  174. package/lib/utils/dev-platform-tls.js +0 -63
  175. package/lib/utils/docker-build.js +46 -27
  176. package/lib/utils/docker-daemon-tls-ca.js +1 -1
  177. package/lib/utils/docker-exec.js +91 -6
  178. package/lib/utils/docker-run-ephemeral.js +55 -0
  179. package/lib/utils/enterprise-knowledge-paths.js +29 -12
  180. package/lib/utils/env-copy-keycloak.js +196 -0
  181. package/lib/utils/env-copy.js +35 -4
  182. package/lib/utils/error-formatters/error-parser.js +0 -3
  183. package/lib/utils/external-env-template.js +1 -1
  184. package/lib/utils/external-system-readiness-compact-blocks.js +28 -1
  185. package/lib/utils/external-system-readiness-compact-display.js +3 -0
  186. package/lib/utils/health-check-request.js +2 -3
  187. package/lib/utils/help-builder.js +4 -0
  188. package/lib/utils/image-name.js +22 -4
  189. package/lib/utils/logger.js +37 -4
  190. package/lib/utils/manifest-source-emit.js +1 -1
  191. package/lib/utils/paths.js +98 -26
  192. package/lib/utils/pipeline-upload-auth-retry.js +19 -3
  193. package/lib/utils/postgres-platform-bootstrap.js +24 -17
  194. package/lib/utils/postgres-wipe.js +5 -2
  195. package/lib/utils/remote-dev-auth.js +39 -4
  196. package/lib/utils/resolve-docker-image-ref.js +36 -6
  197. package/lib/utils/role-assistant-paths.js +98 -0
  198. package/lib/utils/schema-loader.js +41 -0
  199. package/lib/utils/schema-resolver.js +36 -4
  200. package/lib/utils/token-manager.js +47 -22
  201. package/lib/utils/upload-sync-options.js +17 -3
  202. package/lib/utils/url-declarative-resolve-load-doc.js +38 -1
  203. package/lib/validation/external-manifest-validator.js +31 -8
  204. package/lib/validation/openapi-contract-surface-validator.js +4 -0
  205. package/lib/validation/validate-external-file.js +8 -1
  206. package/lib/validation/validator.js +6 -5
  207. package/package.json +35 -12
  208. package/scripts/export-builder-api-evidence.js +3 -3
  209. package/scripts/lib/plan-actor.js +2 -2
  210. package/scripts/lib/plan-meta.js +1 -1
  211. package/scripts/lib/plan-parse.js +1 -1
  212. package/scripts/lib/plan-prevalidate-gates.js +12 -1
  213. package/scripts/lib/plan-run-report.js +13 -2
  214. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +10 -10
  215. package/templates/applications/dataplane/application.yaml +47 -17
  216. package/templates/applications/dataplane/env.template +28 -9
  217. package/templates/applications/dataplane/rbac.yaml +78 -2
  218. package/templates/applications/miso-controller/application.yaml +10 -1
  219. package/templates/applications/miso-controller/env.template +13 -8
  220. package/templates/applications/miso-controller/rbac.yaml +72 -0
  221. package/templates/channels/chatgpt/install.template.md.hbs +42 -24
  222. package/templates/channels/chatgpt/integration/README.md +10 -7
  223. package/templates/channels/chatgpt/integration/application.json +2 -2
  224. package/templates/channels/chatgpt/integration/chatgpt-system.json +3 -3
  225. package/templates/channels/chatgpt/integration/env.template +1 -1
  226. package/templates/channels/chatgpt/manifest.template.json.hbs +36 -5
  227. package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +28 -0
  228. package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +22 -0
  229. package/templates/channels/microsoft-copilot/install.template.md.hbs +32 -22
  230. package/templates/channels/microsoft-copilot/integration/README.md +9 -7
  231. package/templates/channels/microsoft-copilot/integration/application.json +2 -2
  232. package/templates/channels/microsoft-copilot/integration/env.template +1 -1
  233. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +7 -6
  234. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +34 -6
  235. package/templates/channels/slack/integration/slack-system.json +60 -2
  236. package/templates/python/requirements.txt +1 -1
@@ -303,6 +303,78 @@ permissions:
303
303
  roles: ['aifabrix-platform-admin', 'aifabrix-security-admin']
304
304
  description: 'Delete dimensions and dimension values'
305
305
 
306
+ # Resource Type Management
307
+ - name: 'resource-types:read'
308
+ roles:
309
+ [
310
+ 'aifabrix-platform-admin',
311
+ 'aifabrix-security-admin',
312
+ 'aifabrix-deployment-admin',
313
+ 'aifabrix-developer',
314
+ 'aifabrix-observer'
315
+ ]
316
+ description: 'View resource types'
317
+
318
+ - name: 'resource-types:create'
319
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin', 'aifabrix-deployment-admin']
320
+ description: 'Create resource types'
321
+
322
+ - name: 'resource-types:update'
323
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin', 'aifabrix-deployment-admin']
324
+ description: 'Update resource types'
325
+
326
+ - name: 'resource-types:delete'
327
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin']
328
+ description: 'Delete resource types'
329
+
330
+ # Business Role Management (COM — not RBAC auth roles)
331
+ - name: 'roles:read'
332
+ roles:
333
+ [
334
+ 'aifabrix-platform-admin',
335
+ 'aifabrix-security-admin',
336
+ 'aifabrix-deployment-admin',
337
+ 'aifabrix-developer',
338
+ 'aifabrix-observer'
339
+ ]
340
+ description: 'View business roles'
341
+
342
+ - name: 'roles:create'
343
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin', 'aifabrix-deployment-admin']
344
+ description: 'Create business roles'
345
+
346
+ - name: 'roles:update'
347
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin', 'aifabrix-deployment-admin']
348
+ description: 'Update business roles'
349
+
350
+ - name: 'roles:delete'
351
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin']
352
+ description: 'Delete business roles'
353
+
354
+ # Evidence Kind Management
355
+ - name: 'evidence-kinds:read'
356
+ roles:
357
+ [
358
+ 'aifabrix-platform-admin',
359
+ 'aifabrix-security-admin',
360
+ 'aifabrix-deployment-admin',
361
+ 'aifabrix-developer',
362
+ 'aifabrix-observer'
363
+ ]
364
+ description: 'View evidence kinds'
365
+
366
+ - name: 'evidence-kinds:create'
367
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin', 'aifabrix-deployment-admin']
368
+ description: 'Create evidence kinds'
369
+
370
+ - name: 'evidence-kinds:update'
371
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin', 'aifabrix-deployment-admin']
372
+ description: 'Update evidence kinds'
373
+
374
+ - name: 'evidence-kinds:delete'
375
+ roles: ['aifabrix-platform-admin', 'aifabrix-security-admin']
376
+ description: 'Delete evidence kinds'
377
+
306
378
  # Token Providers
307
379
  - name: 'token-provider:read'
308
380
  roles:
@@ -1,46 +1,64 @@
1
- # {{appName}} — ChatGPT assistant channel install
1
+ # {{appName}} — ChatGPT custom MCP app setup
2
2
 
3
3
  {{appDescription}}
4
4
 
5
5
  Environment: **{{environment}}** · Credential key: `{{credentialKey}}`
6
6
 
7
- ## Connect ChatGPT workspace (admin)
7
+ This output is connection and administration material (`channel-chatgpt.json` + `INSTALL.md`), not a plugin archive.
8
8
 
9
- 1. Sign in to [OpenAI Platform](https://platform.openai.com/) or your **ChatGPT Enterprise** workspace admin console.
10
- 2. Create a custom GPT, workspace connector, or MCP integration using the generated manifest from `dist/channels/chatgpt/channel-chatgpt.json`.
11
- 3. Configure the **OpenAPI specification URL** and **MCP endpoint** from **Platform endpoints** below.
12
- 4. Complete OAuth or API key setup as required by your ChatGPT deployment model.
13
- 5. Save the **API key** or **OAuth client credentials** in AI Fabrix: [Authentication settings]({{credentialPortalUrl}})
14
- 6. Publish the connector to your workspace and complete admin approval if your organization requires it.
9
+ ## Workspace admin setup (manual)
15
10
 
16
- ## Platform endpoints
11
+ 1. Sign in to your ChatGPT workspace as an admin and enable **Developer mode / custom MCP apps** if required by workspace policy.
12
+ 2. Create a custom MCP app and use the generated artifact from `dist/channels/chatgpt/channel-chatgpt.json` as the connection reference.
13
+ 3. Configure the remote MCP URL and transport from **Runtime connection** below.
14
+ 4. Complete authentication setup for your workspace policy. Store credential references in AI Fabrix: [Authentication settings]({{credentialPortalUrl}})
15
+ 5. Refresh tools in ChatGPT after configuration changes so ChatGPT reads the latest Runtime tool list.
16
+ 6. Publish the app to the workspace and configure workspace access controls (RBAC or equivalent).
17
17
 
18
- Configure these on the ChatGPT connector / custom GPT. Do not embed secrets in generated files — use AI Fabrix credential storage only.
18
+ ## Runtime connection
19
+
20
+ Configure these values in the ChatGPT custom MCP app. Do not place secrets in generated files.
19
21
 
20
- {{#if openapiUrl}}
21
- - **OpenAPI spec:** {{openapiUrl}}
22
- {{/if}}
23
22
  {{#if mcpUrl}}
24
- - **MCP:** {{mcpUrl}}
25
- {{/if}}
26
- {{#if actionsBaseUrl}}
27
- - **Actions base:** {{actionsBaseUrl}}
23
+ - **Remote MCP URL:** {{mcpUrl}}
28
24
  {{/if}}
25
+ - **Runtime system key:** {{runtimeSystemKey}}
26
+ - **Transport:** {{runtimeTransport}}
27
+ - **Auth mode:** {{runtimeAuthMode}}
28
+ - **Expected Layer B tools:**
29
+ {{#each layerBToolNames}}
30
+ - `{{this}}`
31
+ {{/each}}
29
32
 
30
- ## Assistant catalog
33
+ AI Fabrix `--probe` validates Runtime through the first-party MCP gateway
34
+ (`/api/v1/mcp/servers/tools` and MCP docs for `{{runtimeSystemKey}}`), including
35
+ Layer B discovery and BTA Evidence authoring reachability. ChatGPT workspace apps still
36
+ require a working streamable-http Remote MCP URL and admin publication.
31
37
 
32
- Runtime lists **assistants** available to each user from:
38
+ ## Runtime and Role Assistant boundary checks
39
+
40
+ - Runtime should resolve assistants dynamically per user from:
33
41
 
34
42
  {{assistantCatalogUrl}}
35
43
 
36
- ## After workspace approval
44
+ - The ChatGPT top-level tool surface should stay at Runtime Layer B tools.
45
+ - Evidence authoring remains an internal Business Transformation Assistant capability path, not top-level ChatGPT tools.
37
46
 
38
- ```bash
39
- aifabrix channel add {{channelTarget}} --name "{{baseName}}"
40
- ```
47
+ ## BTA Evidence-authoring proof scenario
48
+
49
+ Use this scenario to verify ChatGPT → Runtime → BTA path without exposing Evidence commands as top-level ChatGPT tools:
50
+
51
+ 1. Ask ChatGPT to improve an existing Role Assistant from process documentation.
52
+ 2. Confirm ChatGPT starts or continues Business Transformation Assistant work through Runtime.
53
+ 3. Confirm BTA performs evidence metadata/download/upload reasoning and presents certified proposals.
54
+ 4. Approve selected proposals and confirm activation remains an explicit human action.
41
55
 
42
- Optional validation:
56
+ ## AI Fabrix validation commands
57
+
58
+ After workspace publication and authentication setup:
43
59
 
44
60
  ```bash
45
61
  aifabrix channel add {{channelTarget}} --name "{{baseName}}" --probe
46
62
  ```
63
+
64
+ Use `--force` only to regenerate artifacts and patch channel metadata. It does not rotate credentials.
@@ -1,11 +1,14 @@
1
- # ChatGPT assistant channel (lab fixture)
1
+ # ChatGPT custom MCP app channel
2
2
 
3
- SSOT for `aifabrix channel scaffold chatgpt` templates (`make sync-json` → builder).
3
+ Generated by `aifabrix channel scaffold chatgpt`.
4
+
5
+ Recommended flow:
4
6
 
5
7
  ```bash
6
- cd aifabrix-dataplane
7
- aifabrix validate chatgpt
8
- aifabrix upload chatgpt --probe
9
- aifabrix deploy chatgpt
10
- aifabrix app add-channel chatgpt --name "Your Assistant"
8
+ aifabrix upload chatgpt --force
9
+ aifabrix channel add chatgpt --name "Your Assistant" --probe
11
10
  ```
11
+
12
+ The `channel add` step generates `dist/channels/chatgpt/channel-chatgpt.json` and
13
+ `INSTALL.md` for ChatGPT workspace admins to connect a custom MCP app to the
14
+ runtime-orchestration server.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "app": {
3
3
  "key": "chatgpt",
4
- "displayName": "ChatGPT assistant channel",
5
- "description": "Assistant communication channel — deploy then app add-channel",
4
+ "displayName": "ChatGPT custom MCP app channel",
5
+ "description": "Assistant communication channel — deploy then channel add",
6
6
  "type": "external"
7
7
  },
8
8
  "externalIntegration": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "key": "chatgpt",
3
- "displayName": "ChatGPT assistant channel",
4
- "description": "Communication external system for ChatGPT assistant channel install",
3
+ "displayName": "ChatGPT custom MCP app channel",
4
+ "description": "Communication external system for ChatGPT custom MCP app onboarding",
5
5
  "type": "custom",
6
6
  "systemKind": "communication",
7
7
  "enabled": true,
@@ -9,7 +9,7 @@
9
9
  "authType": "credential",
10
10
  "credential": {
11
11
  "credentialKey": "chatgpt-channel",
12
- "displayName": "ChatGPT assistant channel",
12
+ "displayName": "ChatGPT custom MCP app channel",
13
13
  "method": "apikey",
14
14
  "writeOnce": true,
15
15
  "variables": {
@@ -1,4 +1,4 @@
1
- # ChatGPT assistant channel — lab fixture secrets
1
+ # ChatGPT custom MCP app channel credential reference
2
2
  # aifabrix secret set chatgpt/apiKey "<value>" --shared
3
3
 
4
4
  KV_CHATGPT_APIKEY=kv://chatgpt/apiKey
@@ -1,9 +1,40 @@
1
1
  {
2
+ "channelTarget": "{{channelTarget}}",
2
3
  "name": "{{appName}}",
4
+ "baseName": "{{baseName}}",
3
5
  "description": "{{appDescription}}",
4
- "credentialKey": "{{credentialKey}}",
5
- "openapiUrl": "{{openapiUrl}}",
6
- "mcpUrl": "{{mcpUrl}}",
7
- "actionsBaseUrl": "{{actionsBaseUrl}}",
8
- "assistantCatalogUrl": "{{assistantCatalogUrl}}"
6
+ "environment": "{{environment}}",
7
+ "runtime": {
8
+ "runtimeSystemKey": "{{runtimeSystemKey}}",
9
+ "remoteMcpUrl": "{{mcpUrl}}",
10
+ "transport": "{{runtimeTransport}}",
11
+ "assistantCatalogUrl": "{{assistantCatalogUrl}}",
12
+ "roleAssistantResolution": "dynamic-runtime",
13
+ "layerBToolNames": [
14
+ {{#each layerBToolNames}}
15
+ "{{this}}"{{#unless @last}},{{/unless}}
16
+ {{/each}}
17
+ ]
18
+ },
19
+ "authentication": {
20
+ "mode": "{{runtimeAuthMode}}",
21
+ "credentialKey": "{{credentialKey}}",
22
+ "credentialPortalUrl": "{{credentialPortalUrl}}",
23
+ "scopes": {{{scopesJson}}}
24
+ },
25
+ "boundaries": {
26
+ "oneConnectionSupportsManyRoleAssistants": true,
27
+ "topLevelEvidenceToolsExposed": false,
28
+ "runtimeOwnsWorkInterface": true,
29
+ "evidenceCapabilityPath": "ChatGPT -> runtime-orchestration -> Business Transformation Assistant -> internal evidence capabilities"
30
+ },
31
+ "lifecycle": {
32
+ "locallyValidated": true,
33
+ "runtimeValidated": false,
34
+ "requiresChatGptWorkspaceAdmin": true
35
+ },
36
+ "artifact": {
37
+ "format": "chatgpt-custom-mcp-app",
38
+ "version": "1.0.0"
39
+ }
9
40
  }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json",
3
+ "schema_version": "v2.4",
4
+ "name_for_human": "{{appName}}",
5
+ "name_for_model": "aifabrix_runtime_orchestration",
6
+ "description_for_human": "{{appDescription}}",
7
+ "description_for_model": "Runtime orchestration tools for governed enterprise work.",
8
+ "runtimes": [
9
+ {
10
+ "type": "RemoteMCPServer",
11
+ "spec": {
12
+ "url": "{{mcpUrl}}"
13
+ },
14
+ "auth": {
15
+ "type": "oauth",
16
+ "scopes": {{{scopesJson}}}
17
+ }
18
+ }
19
+ ],
20
+ "mcp_tool_description": {
21
+ "mode": "dynamic",
22
+ "layerBToolNames": [
23
+ {{#each layerBToolNames}}
24
+ "{{this}}"{{#unless @last}},{{/unless}}
25
+ {{/each}}
26
+ ]
27
+ }
28
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "{{packageAppId}}-agent",
3
+ "name": "{{appName}}",
4
+ "description": "{{appDescription}}",
5
+ "instructions": "Use Runtime Layer B tools only. Resolve Role Assistants dynamically and keep business reasoning inside authorized Role Assistant boundaries.",
6
+ "conversation_starters": [
7
+ {
8
+ "title": "Show my role assistants",
9
+ "text": "List my available Role Assistants and what they can do."
10
+ },
11
+ {
12
+ "title": "Start guided work",
13
+ "text": "Help me start work for my current business objective."
14
+ }
15
+ ],
16
+ "actions": [
17
+ {
18
+ "id": "{{pluginId}}",
19
+ "file": "ai-plugin.json"
20
+ }
21
+ ]
22
+ }
@@ -1,29 +1,37 @@
1
- # {{appName}} — Microsoft Copilot assistant channel install
1
+ # {{appName}} — Microsoft 365 Copilot package setup
2
2
 
3
3
  {{appDescription}}
4
4
 
5
5
  Environment: **{{environment}}** · Credential key: `{{credentialKey}}`
6
6
 
7
- ## Publish the Copilot extension (M365 admin)
7
+ This channel output is a Microsoft 365 Copilot app package:
8
8
 
9
- 1. Sign in to [Microsoft 365 admin](https://admin.cloud.microsoft.com/) or **Copilot Studio** as a tenant admin.
10
- 2. Create or open a Copilot extensibility project (declarative agent or API plugin).
11
- 3. Import or configure using the generated manifest JSON from `dist/channels/microsoft-copilot/channel-microsoft-copilot.json`.
12
- 4. Point the **OpenAPI** and **action** endpoints to the URLs in **Platform endpoints** below.
13
- 5. Register OAuth client credentials for the API provider connection when the platform prompts for them.
14
- 6. Save the **OAuth client ID** and **client secret** in AI Fabrix: [Authentication settings]({{credentialPortalUrl}})
15
- 7. Submit for M365 admin approval and publish to your organization when review completes.
9
+ ```text
10
+ dist/channels/microsoft-copilot/source/manifest.json
11
+ dist/channels/microsoft-copilot/source/declarativeAgent.json
12
+ dist/channels/microsoft-copilot/source/ai-plugin.json
13
+ dist/channels/microsoft-copilot/build/appPackage.{{environment}}.zip
14
+ ```
15
+
16
+ ## Microsoft admin workflow (manual)
16
17
 
17
- ## Platform endpoints
18
+ 1. Sign in to [Microsoft 365 admin](https://admin.cloud.microsoft.com/) or Copilot Studio as a tenant admin.
19
+ 2. Upload or sideload `appPackage.{{environment}}.zip` to your organization app catalog.
20
+ 3. Review the declarative agent + Remote MCP plugin metadata and approve tenant distribution.
21
+ 4. Configure workspace authentication and consent according to your Entra/OAuth policy.
22
+ 5. Store credential references in AI Fabrix authentication settings: [Authentication settings]({{credentialPortalUrl}})
23
+ 6. Assign the app to users/groups and complete first-user sign-in.
18
24
 
19
- Configure these on the Copilot connector / API plugin. Do not embed secrets in generated files — use AI Fabrix credential storage only.
25
+ ## Runtime connection contract
20
26
 
21
- {{#if openapiUrl}}
22
- - **OpenAPI spec:** {{openapiUrl}}
23
- {{/if}}
24
- {{#if actionsBaseUrl}}
25
- - **Actions base:** {{actionsBaseUrl}}
26
- {{/if}}
27
+ - **Runtime system key:** `{{runtimeSystemKey}}`
28
+ - **Remote MCP URL:** `{{mcpUrl}}`
29
+ - **Transport:** `{{runtimeTransport}}`
30
+ - **Auth mode:** `{{runtimeAuthMode}}`
31
+ - **Layer B tools expected:**
32
+ {{#each layerBToolNames}}
33
+ - `{{this}}`
34
+ {{/each}}
27
35
 
28
36
  ## Assistant catalog
29
37
 
@@ -31,14 +39,16 @@ Runtime lists **assistants** available to each user from:
31
39
 
32
40
  {{assistantCatalogUrl}}
33
41
 
34
- ## After M365 admin approval
42
+ ## Probe truthfulness
35
43
 
36
- ```bash
37
- aifabrix channel add {{channelTarget}} --name "{{baseName}}"
38
- ```
44
+ - `builderValidated` means package files, ZIP, hashes, and secret checks passed.
45
+ - `runtimeValidated` means Runtime MCP is reachable and tool boundary checks pass.
46
+ - `requiresMicrosoftAdmin` remains true until tenant upload/approval/assignment is complete.
39
47
 
40
- Optional validation:
48
+ ## Validate after admin setup
41
49
 
42
50
  ```bash
43
51
  aifabrix channel add {{channelTarget}} --name "{{baseName}}" --probe
44
52
  ```
53
+
54
+ `--force` regenerates artifacts but does not rotate credentials.
@@ -1,11 +1,13 @@
1
- # Microsoft Copilot assistant channel (lab fixture)
1
+ # Microsoft 365 Copilot package channel
2
2
 
3
- SSOT for `aifabrix channel scaffold microsoft-copilot` templates (`make sync-json` → builder).
3
+ Generated by `aifabrix channel scaffold microsoft-copilot`.
4
+
5
+ Recommended flow:
4
6
 
5
7
  ```bash
6
- cd aifabrix-dataplane
7
- aifabrix validate microsoft-copilot
8
- aifabrix upload microsoft-copilot --probe
9
- aifabrix deploy microsoft-copilot
10
- aifabrix app add-channel microsoft-copilot --name "Your Assistant"
8
+ aifabrix upload microsoft-copilot --force
9
+ aifabrix channel add microsoft-copilot --name "Your Assistant" --probe
11
10
  ```
11
+
12
+ `channel add` generates package artifacts under
13
+ `dist/channels/microsoft-copilot/` for Microsoft 365 tenant admins.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "app": {
3
3
  "key": "microsoft-copilot",
4
- "displayName": "Microsoft Copilot assistant channel",
5
- "description": "Assistant communication channel — deploy then app add-channel",
4
+ "displayName": "Microsoft Copilot package channel",
5
+ "description": "Assistant communication channel — deploy then channel add",
6
6
  "type": "external"
7
7
  },
8
8
  "externalIntegration": {
@@ -1,4 +1,4 @@
1
- # Microsoft Copilot assistant channel — lab fixture secrets
1
+ # Microsoft Copilot package channel credential references
2
2
  # aifabrix secret set microsoft-copilot/clientId "<value>" --shared
3
3
  # aifabrix secret set microsoft-copilot/clientSecret "<value>" --shared
4
4
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "key": "microsoft-copilot",
3
- "displayName": "Microsoft Copilot assistant channel",
4
- "description": "Communication external system for Microsoft Copilot assistant channel install",
3
+ "displayName": "Microsoft Copilot package channel",
4
+ "description": "Communication external system for Microsoft Copilot package onboarding",
5
5
  "type": "custom",
6
6
  "systemKind": "communication",
7
7
  "enabled": true,
@@ -9,14 +9,15 @@
9
9
  "authType": "credential",
10
10
  "credential": {
11
11
  "credentialKey": "microsoft-copilot-channel",
12
- "displayName": "Microsoft Copilot assistant channel",
12
+ "displayName": "Microsoft Copilot package channel",
13
13
  "method": "oauth2",
14
14
  "writeOnce": true,
15
15
  "variables": {
16
+ "baseUrl": "https://login.microsoftonline.com",
17
+ "authorizationUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
16
18
  "tokenUrl": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
17
- "grantType": "client_credentials",
18
- "scope": "https://graph.microsoft.com/.default",
19
- "baseUrl": "https://graph.microsoft.com/v1.0"
19
+ "grantType": "authorization_code",
20
+ "scope": "openid profile offline_access"
20
21
  },
21
22
  "security": {
22
23
  "clientId": "kv://microsoft-copilot/clientId",
@@ -1,8 +1,36 @@
1
1
  {
2
- "name": "{{appName}}",
3
- "description": "{{appDescription}}",
4
- "credentialKey": "{{credentialKey}}",
5
- "openapiUrl": "{{openapiUrl}}",
6
- "actionsBaseUrl": "{{actionsBaseUrl}}",
7
- "assistantCatalogUrl": "{{assistantCatalogUrl}}"
2
+ "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.21/MicrosoftTeams.schema.json",
3
+ "manifestVersion": "1.21",
4
+ "version": "{{packageVersion}}",
5
+ "id": "{{packageAppId}}",
6
+ "name": {
7
+ "short": "{{baseName}}",
8
+ "full": "{{appName}}"
9
+ },
10
+ "description": {
11
+ "short": "{{appDescription}}",
12
+ "full": "{{appDescription}}"
13
+ },
14
+ "developer": {
15
+ "name": "AI Fabrix",
16
+ "websiteUrl": "{{dataplaneBaseUrl}}",
17
+ "privacyUrl": "{{dataplaneBaseUrl}}/privacy",
18
+ "termsOfUseUrl": "{{dataplaneBaseUrl}}/terms"
19
+ },
20
+ "icons": {
21
+ "color": "color.png",
22
+ "outline": "outline.png"
23
+ },
24
+ "accentColor": "#0F172A",
25
+ "copilotAgents": {
26
+ "declarativeAgents": [
27
+ {
28
+ "id": "{{packageAppId}}-agent",
29
+ "file": "declarativeAgent.json"
30
+ }
31
+ ]
32
+ },
33
+ "validDomains": [
34
+ "{{runtimeDomain}}"
35
+ ]
8
36
  }
@@ -17,7 +17,9 @@
17
17
  "signatureHeader": "X-Slack-Signature",
18
18
  "timestampHeader": "X-Slack-Request-Timestamp",
19
19
  "signaturePrefix": "v0=",
20
- "timestampMaxAge": "300"
20
+ "timestampMaxAge": "300",
21
+ "baseUrl": "https://slack.com",
22
+ "testEndpoint": "https://slack.com/api/auth.test"
21
23
  },
22
24
  "security": {
23
25
  "signingSecret": "kv://slack/signingSecret",
@@ -36,7 +38,63 @@
36
38
  ]
37
39
  }
38
40
  },
39
- "configuration": [],
41
+ "configuration": [
42
+ {
43
+ "name": "ENABLE_PROACTIVE_MESSAGING",
44
+ "value": "true",
45
+ "location": "variable",
46
+ "required": false,
47
+ "portalInput": {
48
+ "field": "select",
49
+ "label": "Enable proactive messaging",
50
+ "options": ["true", "false"]
51
+ }
52
+ },
53
+ {
54
+ "name": "ENABLE_CHANNEL_NOTIFICATIONS",
55
+ "value": "true",
56
+ "location": "variable",
57
+ "required": false,
58
+ "portalInput": {
59
+ "field": "select",
60
+ "label": "Enable channel notifications",
61
+ "options": ["true", "false"]
62
+ }
63
+ },
64
+ {
65
+ "name": "ENABLE_DIRECT_MESSAGES",
66
+ "value": "true",
67
+ "location": "variable",
68
+ "required": false,
69
+ "portalInput": {
70
+ "field": "select",
71
+ "label": "Enable direct messages",
72
+ "options": ["true", "false"]
73
+ }
74
+ },
75
+ {
76
+ "name": "ENABLE_MODALS",
77
+ "value": "true",
78
+ "location": "variable",
79
+ "required": false,
80
+ "portalInput": {
81
+ "field": "select",
82
+ "label": "Enable modals",
83
+ "options": ["true", "false"]
84
+ }
85
+ },
86
+ {
87
+ "name": "ENABLE_SHORTCUTS",
88
+ "value": "true",
89
+ "location": "variable",
90
+ "required": false,
91
+ "portalInput": {
92
+ "field": "select",
93
+ "label": "Enable shortcuts",
94
+ "options": ["true", "false"]
95
+ }
96
+ }
97
+ ],
40
98
  "dataSources": ["slack-messages", "slack-conversations"],
41
99
  "endpoints": [
42
100
  {
@@ -1,4 +1,4 @@
1
1
  Flask==3.1.3
2
- gunicorn==21.2.0
2
+ gunicorn==23.0.0
3
3
  psycopg2-binary==2.9.9
4
4