@numa-tech/numa 1.20.0 → 1.20.2

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 (107) hide show
  1. package/README.md +31 -2
  2. package/dist/ai-registry/bridge.js +3 -2
  3. package/dist/ai-registry/bridge.js.map +1 -1
  4. package/dist/ai-registry/client.d.ts +8 -1
  5. package/dist/ai-registry/client.js +11 -1
  6. package/dist/ai-registry/client.js.map +1 -1
  7. package/dist/ai-registry/commands.d.ts +3 -0
  8. package/dist/ai-registry/commands.js +48 -36
  9. package/dist/ai-registry/commands.js.map +1 -1
  10. package/dist/ai-registry/mcp-management.d.ts +2 -0
  11. package/dist/ai-registry/mcp-management.js +74 -0
  12. package/dist/ai-registry/mcp-management.js.map +1 -0
  13. package/dist/ai-registry/mcp-runtime-commands.d.ts +15 -0
  14. package/dist/ai-registry/mcp-runtime-commands.js +101 -0
  15. package/dist/ai-registry/mcp-runtime-commands.js.map +1 -0
  16. package/dist/ai-registry/mcp-runtime.d.ts +37 -0
  17. package/dist/ai-registry/mcp-runtime.js +134 -0
  18. package/dist/ai-registry/mcp-runtime.js.map +1 -0
  19. package/dist/ai-registry/mcp-stdio.d.ts +2 -0
  20. package/dist/ai-registry/mcp-stdio.js +18 -0
  21. package/dist/ai-registry/mcp-stdio.js.map +1 -0
  22. package/dist/authorization/application-client.d.ts +1271 -0
  23. package/dist/authorization/application-client.js +391 -0
  24. package/dist/authorization/application-client.js.map +1 -0
  25. package/dist/authorization/application-commands.d.ts +15 -0
  26. package/dist/authorization/application-commands.js +240 -0
  27. package/dist/authorization/application-commands.js.map +1 -0
  28. package/dist/authorization/application-schemas.d.ts +731 -0
  29. package/dist/authorization/application-schemas.js +521 -0
  30. package/dist/authorization/application-schemas.js.map +1 -0
  31. package/dist/authorization/{client.d.ts → bootstrap-client.d.ts} +5 -26
  32. package/dist/authorization/{client.js → bootstrap-client.js} +4 -27
  33. package/dist/authorization/bootstrap-client.js.map +1 -0
  34. package/dist/authorization/commands.d.ts +6 -21
  35. package/dist/authorization/commands.js +8 -130
  36. package/dist/authorization/commands.js.map +1 -1
  37. package/dist/authorization/enrollment-client.d.ts +40 -0
  38. package/dist/authorization/enrollment-client.js +56 -0
  39. package/dist/authorization/enrollment-client.js.map +1 -0
  40. package/dist/authorization/enrollment-commands.d.ts +5 -0
  41. package/dist/authorization/enrollment-commands.js +30 -0
  42. package/dist/authorization/enrollment-commands.js.map +1 -0
  43. package/dist/authorization/enrollment.d.ts +2 -2
  44. package/dist/authorization/enrollment.js +2 -2
  45. package/dist/authorization/enrollment.js.map +1 -1
  46. package/dist/authorization/schemas.d.ts +0 -90
  47. package/dist/authorization/schemas.js +0 -48
  48. package/dist/authorization/schemas.js.map +1 -1
  49. package/dist/backend.d.ts +1 -0
  50. package/dist/backend.js +4 -1
  51. package/dist/backend.js.map +1 -1
  52. package/dist/business-issuer.d.ts +4 -0
  53. package/dist/business-issuer.js +30 -0
  54. package/dist/business-issuer.js.map +1 -0
  55. package/dist/cli.js +61 -30
  56. package/dist/cli.js.map +1 -1
  57. package/dist/cloud/bootstrap.js +1 -1
  58. package/dist/cloud/bootstrap.js.map +1 -1
  59. package/dist/command-catalog.js +11 -36
  60. package/dist/command-catalog.js.map +1 -1
  61. package/dist/config.d.ts +1 -1
  62. package/dist/config.js +15 -6
  63. package/dist/config.js.map +1 -1
  64. package/dist/login-configuration.d.ts +8 -0
  65. package/dist/login-configuration.js +17 -0
  66. package/dist/login-configuration.js.map +1 -0
  67. package/dist/login-recovery.d.ts +2 -0
  68. package/dist/login-recovery.js +15 -0
  69. package/dist/login-recovery.js.map +1 -0
  70. package/dist/mcp/commands.js +12 -2
  71. package/dist/mcp/commands.js.map +1 -1
  72. package/dist/mcp-gateway/commands.d.ts +2 -0
  73. package/dist/mcp-gateway/commands.js +11 -0
  74. package/dist/mcp-gateway/commands.js.map +1 -1
  75. package/dist/oss/commands.js +15 -15
  76. package/dist/oss/commands.js.map +1 -1
  77. package/dist/oss/file-operations.d.ts +11 -1
  78. package/dist/oss/file-operations.js +61 -5
  79. package/dist/oss/file-operations.js.map +1 -1
  80. package/dist/oss/tools.js +1 -1
  81. package/dist/oss/tools.js.map +1 -1
  82. package/dist/oss/web-page.js +58 -14
  83. package/dist/oss/web-page.js.map +1 -1
  84. package/dist/oss/web.js +1 -1
  85. package/dist/oss/web.js.map +1 -1
  86. package/dist/platform-profile.d.ts +22 -2
  87. package/dist/platform-profile.js +67 -6
  88. package/dist/platform-profile.js.map +1 -1
  89. package/docs/application-default-groups.md +73 -0
  90. package/examples/cloud-bootstrap/README.md +1 -1
  91. package/examples/mcp/README.md +108 -0
  92. package/examples/mcp/management-smoke.py +154 -0
  93. package/examples/mcp/runtime-smoke.mjs +187 -0
  94. package/examples/mcp/server.json +17 -0
  95. package/examples/oss/README.md +78 -0
  96. package/examples/oss/__pycache__/roundtrip.cpython-314.pyc +0 -0
  97. package/examples/oss/__pycache__/test_roundtrip.cpython-314.pyc +0 -0
  98. package/examples/oss/roundtrip.py +84 -0
  99. package/examples/oss/test_roundtrip.py +66 -0
  100. package/package.json +5 -4
  101. package/dist/authorization/client.js.map +0 -1
  102. package/dist/authorization/group-client.d.ts +0 -169
  103. package/dist/authorization/group-client.js +0 -129
  104. package/dist/authorization/group-client.js.map +0 -1
  105. package/dist/authorization/group-commands.d.ts +0 -25
  106. package/dist/authorization/group-commands.js +0 -155
  107. package/dist/authorization/group-commands.js.map +0 -1
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env python3
2
+ """Exercise Grant/STS APIs and OSS list/write/read using an unpublished local Numa build."""
3
+ import argparse
4
+ import hashlib
5
+ import json
6
+ import pathlib
7
+ import subprocess
8
+ import tempfile
9
+ import uuid
10
+
11
+
12
+ def main():
13
+ parser = argparse.ArgumentParser(description=__doc__)
14
+ parser.add_argument('--cli', type=pathlib.Path, default=pathlib.Path(__file__).resolve().parents[2] / 'dist/cli.js', help='Local dist/cli.js; never downloads or installs a CLI')
15
+ parser.add_argument('--issuer', help='Business issuer code from the selected Profile; omit to use its default')
16
+ parser.add_argument('--grant-id', required=True, type=int, help='An exact grant ID from numa oss grants')
17
+ parser.add_argument('--prefix', help='Optional test prefix inside the grant scope')
18
+ args = parser.parse_args()
19
+ if not args.cli.is_file():
20
+ parser.error('Build the local CLI first (npm run build), or pass --cli /absolute/path/dist/cli.js')
21
+ command = ['node', str(args.cli.resolve())]
22
+ if args.issuer:
23
+ command += ['--issuer', args.issuer]
24
+
25
+ def cli(*arguments):
26
+ result = subprocess.run(command + list(arguments) + ['--json'], capture_output=True, text=True)
27
+ try:
28
+ value = json.loads(result.stdout)
29
+ except ValueError:
30
+ raise RuntimeError('CLI did not return JSON; check the local build and Profile configuration') from None
31
+ if result.returncode or not value.get('ok'):
32
+ # Do not echo arbitrary stdout, stderr, API responses or credentials.
33
+ error = value.get('error', {})
34
+ code = error.get('code', 'command_failed') if isinstance(error, dict) else 'command_failed'
35
+ raise RuntimeError(f'CLI command {arguments[0]} {arguments[1]} failed: {code}')
36
+ return value
37
+
38
+ grants = cli('oss', 'grants')['grants']
39
+ grant = next((g for g in grants if g['grantId'] == args.grant_id), None)
40
+ if not grant:
41
+ parser.error(f'Grant {args.grant_id} 未出现在当前身份的授权列表中;请使用相同 --issuer 执行 oss grants 查看授权 ID')
42
+ blockers = []
43
+ if grant['status'] != 'ACTIVE':
44
+ blockers.append('授权未启用(status=' + json.dumps(grant['status'], ensure_ascii=False) + ')')
45
+ if not grant['cloudPolicySynced']:
46
+ blockers.append('云端策略未同步/验证(cloudPolicySynced=false)')
47
+ required_actions = {'oss:ListObjects', 'oss:GetObject', 'oss:PutObject'}
48
+ actions = grant.get('actions')
49
+ permitted = grant.get('effect') == 'Allow' and isinstance(actions, list) and (required_actions.issubset(set(actions)) or 'oss:*' in actions)
50
+ if not permitted:
51
+ blockers.append('读写示例需要 Allow 且同时包含 ListObjects、GetObject、PutObject,当前 actions=' + json.dumps(actions, ensure_ascii=False))
52
+ if blockers:
53
+ parser.error(f'Grant {args.grant_id} 无法运行读写示例:' + ';'.join(blockers) + '。尚未申请 STS 或执行 OSS 对象操作。请选择已同步/验证且具有读写权限的授权。')
54
+ scope = grant['scopeType']
55
+ allowed = grant.get('objectPrefix') or ''
56
+ if scope not in ('BUCKET', 'PREFIX') or scope == 'PREFIX' and not allowed:
57
+ parser.error('Grant scope is incomplete')
58
+ prefix = args.prefix if args.prefix is not None else allowed
59
+ if scope == 'PREFIX' and not prefix.startswith(allowed):
60
+ parser.error('--prefix must be inside the granted objectPrefix')
61
+ if prefix and not prefix.endswith('/'):
62
+ prefix += '/'
63
+ key = prefix + 'numa-cli-example-' + uuid.uuid4().hex + '.txt'
64
+ grant_id = str(args.grant_id)
65
+ print(json.dumps({'bucket': grant['bucketName'], 'object_key': key, 'issuer': args.issuer or 'profile-default'}, ensure_ascii=False))
66
+ cli('oss', 'ls', grant_id, prefix, '--limit', '10')
67
+ with tempfile.TemporaryDirectory(prefix='numa-oss-example-') as directory:
68
+ source = pathlib.Path(directory) / 'source.txt'
69
+ downloaded = pathlib.Path(directory) / 'downloaded.txt'
70
+ source.write_text('Numa OSS CLI roundtrip\n' + str(uuid.uuid4()) + '\n', encoding='utf-8')
71
+ cli('oss', 'put', grant_id, key, str(source)) # No --overwrite.
72
+ cli('oss', 'stat', grant_id, key)
73
+ cli('oss', 'get', grant_id, key, '--output', str(downloaded))
74
+ if source.read_bytes() != downloaded.read_bytes():
75
+ raise RuntimeError('Downloaded contents do not match the uploaded file')
76
+ print(json.dumps({'ok': True, 'verified': ['list', 'write', 'read'], 'sha256': hashlib.sha256(downloaded.read_bytes()).hexdigest(), 'retained_object_key': key}))
77
+ # Deliberately retain the unique remote object. There is no implicit delete.
78
+
79
+
80
+ if __name__ == '__main__':
81
+ try:
82
+ main()
83
+ except (RuntimeError, OSError) as error:
84
+ raise SystemExit(str(error)) from None
@@ -0,0 +1,66 @@
1
+ """Contract tests for the runnable example; all CLI/cloud responses are simulated."""
2
+ import contextlib
3
+ import importlib.util
4
+ import io
5
+ import json
6
+ from pathlib import Path
7
+ import subprocess
8
+ import sys
9
+ import tempfile
10
+ import unittest
11
+ from unittest.mock import patch
12
+
13
+ spec=importlib.util.spec_from_file_location('roundtrip',Path(__file__).with_name('roundtrip.py'))
14
+ module=importlib.util.module_from_spec(spec);spec.loader.exec_module(module)
15
+
16
+ class RoundtripTest(unittest.TestCase):
17
+ def exercise(self,permission='READ_WRITE',prefix=None,corrupt=False,synced=True,status='ACTIVE',missing=False,blocked_message=None):
18
+ calls=[];storage={}
19
+ with tempfile.TemporaryDirectory() as directory:
20
+ entry=Path(directory)/'cli.js';entry.touch()
21
+ argv=['roundtrip','--cli',str(entry),'--grant-id','7','--issuer','cluster-b']
22
+ if prefix is not None:argv += ['--prefix',prefix]
23
+ def run(command,**kwargs):
24
+ self.assertEqual(command[2:4],['--issuer','cluster-b'])
25
+ args=command[4:-1];calls.append(args)
26
+ self.assertEqual(args[0],'oss');self.assertNotIn('--overwrite',args)
27
+ if args[1]=='grants': payload={'grants':[] if missing else [{'grantId':7,'status':status,'cloudPolicySynced':synced,'permissionLevel':permission,'effect':'Allow','actions':['oss:ListObjects','oss:GetObject']+([] if permission=='READ_ONLY' else ['oss:PutObject']),'scopeType':'PREFIX','objectPrefix':'tenant/kb/','bucketName':'example-bucket'}]}
28
+ elif args[1]=='put': storage[args[3]]=Path(args[4]).read_bytes();payload={}
29
+ elif args[1]=='get': Path(args[5]).write_bytes(b'wrong' if corrupt else storage[args[3]]);payload={}
30
+ elif args[1] in ('ls','stat'): payload={}
31
+ else:raise AssertionError('Unexpected object mutation: '+args[1])
32
+ return subprocess.CompletedProcess(command,0,json.dumps({'ok':True,**payload}),'')
33
+ output=io.StringIO();errors=io.StringIO()
34
+ with patch.object(sys,'argv',argv),patch.object(module.subprocess,'run',run),contextlib.redirect_stdout(output),contextlib.redirect_stderr(errors):
35
+ if blocked_message is None:
36
+ module.main()
37
+ else:
38
+ with self.assertRaises(SystemExit) as error:module.main()
39
+ self.assertEqual(error.exception.code,2)
40
+ self.assertRegex(errors.getvalue(),blocked_message)
41
+ self.assertEqual([c[1] for c in calls],['grants'])
42
+ self.assertEqual(storage,{})
43
+ return calls,storage,output.getvalue()
44
+
45
+ def test_roundtrip_selects_one_issuer_and_keeps_unique_object(self):
46
+ calls,storage,output=self.exercise()
47
+ self.assertEqual([c[1] for c in calls],['grants','ls','put','stat','get'])
48
+ key=next(iter(storage));self.assertTrue(key.startswith('tenant/kb/numa-cli-example-'))
49
+ self.assertEqual(json.loads(output.splitlines()[-1])['retained_object_key'],key)
50
+
51
+ def test_refuses_readonly_and_out_of_scope_before_write(self):
52
+ with self.assertRaises(SystemExit):self.exercise(permission='READ_ONLY')
53
+ with self.assertRaises(SystemExit):self.exercise(prefix='another-tenant/')
54
+
55
+ def test_detects_corrupted_download(self):
56
+ with self.assertRaisesRegex(RuntimeError,'do not match'):self.exercise(corrupt=True)
57
+
58
+ def test_reports_all_fixture_blockers_without_requesting_sts_or_objects(self):
59
+ self.exercise(permission='READ_ONLY',synced=False,blocked_message=r'Grant 7.*cloudPolicySynced=false.*actions=.*oss:GetObject.*尚未申请 STS')
60
+
61
+ def test_distinguishes_missing_inactive_and_synced_readonly_grants(self):
62
+ self.exercise(missing=True,blocked_message=r'Grant 7 未出现在当前身份')
63
+ self.exercise(status='DISABLED',blocked_message=r'授权未启用.*DISABLED')
64
+ self.exercise(permission='READ_ONLY',blocked_message=r'需要 Allow.*ListObjects.*GetObject.*PutObject.*actions=')
65
+
66
+ if __name__=='__main__':unittest.main()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@numa-tech/numa",
3
- "version": "1.20.0",
3
+ "version": "1.20.2",
4
4
  "description": "Cross-platform CLI for the Numa internal developer platform with Keycloak authentication and MCP support.",
5
5
  "author": "numa-tech",
6
6
  "keywords": [
@@ -22,6 +22,7 @@
22
22
  "dist",
23
23
  "README.md",
24
24
  "docs/wecom-messaging.md",
25
+ "docs/application-default-groups.md",
25
26
  "docs/module-maintenance-and-skills-updates.md",
26
27
  "examples",
27
28
  "skills",
@@ -37,7 +38,7 @@
37
38
  "dev:oss-web": "tsx src/cli.ts oss web",
38
39
  "test:oss-web": "node --import tsx --test src/oss/web.test.ts src/oss/web-session.test.ts src/oss/web-transfers.test.ts src/oss/web-command.test.ts src/oss/local-picker.test.ts src/oss/transfer-paths.test.ts src/oss/transfer-worker.test.ts src/oss/transfer-queue.test.ts src/oss/web-page.test.ts src/oss/file-operations.test.ts",
39
40
  "test:oss-auth-code": "node scripts/test-oss-auth-code.mjs",
40
- "root:test": "node --import tsx --test --test-concurrency=4 src/mcp-gateway/profile.test.ts src/mcp-gateway/runtime.test.ts src/mcp-gateway/install.test.ts src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/wecom/client.test.ts src/wecom/commands.test.ts src/wecom/tools.test.ts src/ai-registry/client.test.ts src/ai-registry/bootstrap.test.ts src/ai-registry/install-defaults.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/skill-uninstaller.test.ts src/ai-registry/skill-dependencies.test.ts src/ai-registry/updates.test.ts src/maintenance/scheduler.test.ts src/maintenance/codex.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/oss/client.test.ts src/oss/commands.test.ts src/oss/auth-code.test.ts src/oss/clipboard.test.ts src/oss/web.test.ts src/oss/web-session.test.ts src/oss/web-transfers.test.ts src/oss/web-command.test.ts src/oss/local-picker.test.ts src/oss/transfer-paths.test.ts src/oss/transfer-worker.test.ts src/oss/transfer-queue.test.ts src/oss/web-page.test.ts src/oss/file-operations.test.ts src/oss/bootstrap.test.ts src/oss/transfers.test.ts src/oss/search.test.ts src/oss/tools.test.ts src/mcp/install.test.ts src/mcp/catalog.test.ts src/interactive/wizard.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs src/authorization/enrollment.test.ts src/authorization/group-client.test.ts src/authorization/group-commands.test.ts src/notion/client.test.ts src/notion/commands.test.ts src/notion/tools.test.ts src/notion/machine-cli.test.ts src/cloud/accounts.test.ts src/cloud/bootstrap.test.ts src/cloud/business-bootstrap.test.ts src/cloud/maintenance.test.ts src/cloud/wizard.test.ts src/cloud/oss-bootstrap.test.ts",
41
+ "root:test": "node --import tsx --test --test-concurrency=4 src/mcp-gateway/profile.test.ts src/mcp-gateway/runtime.test.ts src/mcp-gateway/install.test.ts src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/wecom/client.test.ts src/wecom/commands.test.ts src/wecom/tools.test.ts src/ai-registry/client.test.ts src/ai-registry/bootstrap.test.ts src/ai-registry/install-defaults.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/skill-uninstaller.test.ts src/ai-registry/skill-dependencies.test.ts src/ai-registry/updates.test.ts src/maintenance/scheduler.test.ts src/maintenance/codex.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/oss/client.test.ts src/oss/commands.test.ts src/oss/auth-code.test.ts src/oss/clipboard.test.ts src/oss/web.test.ts src/oss/web-session.test.ts src/oss/web-transfers.test.ts src/oss/web-command.test.ts src/oss/local-picker.test.ts src/oss/transfer-paths.test.ts src/oss/transfer-worker.test.ts src/oss/transfer-queue.test.ts src/oss/web-page.test.ts src/oss/file-operations.test.ts src/oss/bootstrap.test.ts src/oss/transfers.test.ts src/oss/search.test.ts src/oss/tools.test.ts src/mcp/install.test.ts src/mcp/catalog.test.ts src/interactive/wizard.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/bootstrap-client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs src/authorization/enrollment.test.ts src/authorization/application-commands.test.ts src/authorization/application-client.test.ts src/authorization/application-schemas.test.ts src/authorization/enrollment-client.test.ts src/notion/client.test.ts src/notion/commands.test.ts src/notion/tools.test.ts src/notion/machine-cli.test.ts src/cloud/accounts.test.ts src/cloud/bootstrap.test.ts src/cloud/business-bootstrap.test.ts src/cloud/maintenance.test.ts src/cloud/wizard.test.ts src/cloud/oss-bootstrap.test.ts src/business-issuer.test.ts src/login-configuration.test.ts src/login-recovery.test.ts src/ai-registry/mcp-management.test.ts src/ai-registry/mcp-runtime.test.ts src/ai-registry/mcp-stdio.test.ts",
41
42
  "pack:check": "turbo run pack:check root:pack:check",
42
43
  "root:pack:check": "node scripts/check-root-package.mjs",
43
44
  "boundaries": "node scripts/check-workspace-boundaries.mjs",
@@ -60,8 +61,8 @@
60
61
  "dependencies": {
61
62
  "@clack/prompts": "^1.7.0",
62
63
  "@modelcontextprotocol/sdk": "^1.29.0",
63
- "@numa-tech/cli-auth": "1.20.0",
64
- "@tokensrc/codex": "1.20.0",
64
+ "@numa-tech/cli-auth": "1.20.2",
65
+ "@tokensrc/codex": "1.20.2",
65
66
  "ali-oss": "^6.23.0",
66
67
  "commander": "^14.0.3",
67
68
  "ink": "^6.8.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/authorization/client.ts"],"names":[],"mappings":"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"}
@@ -1,169 +0,0 @@
1
- import { z } from "zod";
2
- import type { AuthConfig } from "../config.js";
3
- import { type KeycloakTokenProvider } from "../oauth.js";
4
- export declare const EnrollmentSchema: z.ZodObject<{
5
- membershipStatus: z.ZodEnum<{
6
- ACTIVE: "ACTIVE";
7
- NOT_ENROLLED: "NOT_ENROLLED";
8
- REVOKED: "REVOKED";
9
- SUSPENDED: "SUSPENDED";
10
- }>;
11
- syncStatus: z.ZodEnum<{
12
- APPLIED: "APPLIED";
13
- DISABLED: "DISABLED";
14
- FAILED: "FAILED";
15
- PENDING: "PENDING";
16
- UNKNOWN: "UNKNOWN";
17
- }>;
18
- tokenRefreshRequired: z.ZodBoolean;
19
- policyRevision: z.ZodNumber;
20
- blocked: z.ZodOptional<z.ZodBoolean>;
21
- policyEnabled: z.ZodOptional<z.ZodBoolean>;
22
- clientId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
23
- groupId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
24
- blockReason: z.ZodOptional<z.ZodNullable<z.ZodString>>;
25
- expectedClientRoles: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
26
- }, z.core.$strip>;
27
- export type Enrollment = z.infer<typeof EnrollmentSchema>;
28
- /** @deprecated Historical suggestions only; never an enrollment or authorization allowlist. */
29
- export declare const BASELINE_ROLES: readonly ["mci-devops-platform-notion-user", "mci-devops-platform-ai-registry-reader", "mci-devops-platform-oss-user"];
30
- export declare const GroupPlanInputSchema: z.ZodObject<{
31
- operation: z.ZodEnum<{
32
- ADD_MEMBER: "ADD_MEMBER";
33
- CREATE_GROUP: "CREATE_GROUP";
34
- DEACTIVATE_GROUP: "DEACTIVATE_GROUP";
35
- FILL_MISSING: "FILL_MISSING";
36
- LINK_GROUP: "LINK_GROUP";
37
- MIGRATE_POLICY: "MIGRATE_POLICY";
38
- REMOVE_MEMBER: "REMOVE_MEMBER";
39
- RESTORE_MEMBER: "RESTORE_MEMBER";
40
- SET_GROUP_ROLES: "SET_GROUP_ROLES";
41
- SET_MEMBER_STATE: "SET_MEMBER_STATE";
42
- SET_POLICY: "SET_POLICY";
43
- }>;
44
- name: z.ZodOptional<z.ZodString>;
45
- groupId: z.ZodOptional<z.ZodString>;
46
- keycloakGroupId: z.ZodOptional<z.ZodString>;
47
- subject: z.ZodOptional<z.ZodString>;
48
- state: z.ZodOptional<z.ZodEnum<{
49
- ACTIVE: "ACTIVE";
50
- REVOKED: "REVOKED";
51
- SUSPENDED: "SUSPENDED";
52
- }>>;
53
- enabled: z.ZodOptional<z.ZodBoolean>;
54
- roles: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
- }, z.core.$strict>;
56
- export type GroupPlanInput = z.infer<typeof GroupPlanInputSchema>;
57
- declare const GroupPlanSchema: z.ZodObject<{
58
- planId: z.ZodString;
59
- digest: z.ZodString;
60
- status: z.ZodString;
61
- operation: z.ZodString;
62
- policyRevision: z.ZodNumber;
63
- items: z.ZodArray<z.ZodObject<{
64
- action: z.ZodString;
65
- status: z.ZodString;
66
- }, z.core.$loose>>;
67
- summary: z.ZodUnknown;
68
- input: z.ZodUnknown;
69
- totalItems: z.ZodNumber;
70
- businessImpact: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
71
- }, z.core.$strip>;
72
- export type GroupPlan = z.infer<typeof GroupPlanSchema>;
73
- declare const GroupListSchema: z.ZodObject<{
74
- groups: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
75
- total: z.ZodNumber;
76
- page: z.ZodNumber;
77
- limit: z.ZodNumber;
78
- policy: z.ZodObject<{
79
- revision: z.ZodNumber;
80
- enabled: z.ZodBoolean;
81
- groupId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
82
- }, z.core.$loose>;
83
- baselineRoles: z.ZodArray<z.ZodString>;
84
- readiness: z.ZodOptional<z.ZodObject<{
85
- status: z.ZodString;
86
- writesVerified: z.ZodBoolean;
87
- message: z.ZodString;
88
- }, z.core.$strip>>;
89
- }, z.core.$strip>;
90
- declare const MemberListSchema: z.ZodObject<{
91
- members: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
92
- total: z.ZodNumber;
93
- page: z.ZodNumber;
94
- limit: z.ZodNumber;
95
- }, z.core.$strip>;
96
- export type GroupList = z.infer<typeof GroupListSchema>;
97
- export type MemberList = z.infer<typeof MemberListSchema>;
98
- declare const PlanItemListSchema: z.ZodObject<{
99
- items: z.ZodArray<z.ZodObject<{
100
- action: z.ZodString;
101
- status: z.ZodString;
102
- }, z.core.$loose>>;
103
- total: z.ZodNumber;
104
- page: z.ZodNumber;
105
- limit: z.ZodNumber;
106
- }, z.core.$strip>;
107
- declare const DirectoryUsersSchema: z.ZodObject<{
108
- users: z.ZodArray<z.ZodObject<{
109
- subject: z.ZodString;
110
- username: z.ZodString;
111
- email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
112
- }, z.core.$strip>>;
113
- page: z.ZodNumber;
114
- limit: z.ZodNumber;
115
- }, z.core.$loose>;
116
- declare const DirectoryGroupsSchema: z.ZodObject<{
117
- groups: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
118
- total: z.ZodNumber;
119
- page: z.ZodNumber;
120
- limit: z.ZodNumber;
121
- }, z.core.$strip>;
122
- export type PlanItemList = z.infer<typeof PlanItemListSchema>;
123
- export type DirectoryUsers = z.infer<typeof DirectoryUsersSchema>;
124
- export type DirectoryGroups = z.infer<typeof DirectoryGroupsSchema>;
125
- export declare const ImpactKindSchema: z.ZodEnum<{
126
- notionRoleGrants: "notionRoleGrants";
127
- ossExistingGrants: "ossExistingGrants";
128
- readerNamespaces: "readerNamespaces";
129
- }>;
130
- export type ImpactKind = z.infer<typeof ImpactKindSchema>;
131
- declare const ImpactListSchema: z.ZodObject<{
132
- items: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
133
- total: z.ZodNumber;
134
- page: z.ZodNumber;
135
- limit: z.ZodNumber;
136
- }, z.core.$strip>;
137
- export type ImpactList = z.infer<typeof ImpactListSchema>;
138
- export interface GroupApi {
139
- enrollment(initialize?: boolean): Promise<Enrollment>;
140
- list(page?: number, limit?: number): Promise<GroupList>;
141
- members(query?: string, page?: number, limit?: number, groupId?: string): Promise<MemberList>;
142
- users(query: string, page?: number, limit?: number): Promise<DirectoryUsers>;
143
- directoryGroups(query?: string, page?: number, limit?: number): Promise<DirectoryGroups>;
144
- plan(input: GroupPlanInput): Promise<GroupPlan>;
145
- getPlan(id: string): Promise<GroupPlan>;
146
- planItems(id: string, page?: number, limit?: number): Promise<PlanItemList>;
147
- impact(id: string, kind: ImpactKind, page?: number, limit?: number): Promise<ImpactList>;
148
- apply(id: string, expectedDigest: string, idempotencyKey: string): Promise<GroupPlan>;
149
- }
150
- export declare class GroupClient implements GroupApi {
151
- private readonly config;
152
- private readonly dependencies;
153
- constructor(config: AuthConfig, dependencies?: {
154
- fetch?: typeof fetch;
155
- tokenProvider?: KeycloakTokenProvider;
156
- });
157
- enrollment(initialize?: boolean): Promise<Enrollment>;
158
- list(page?: number, limit?: number): Promise<GroupList>;
159
- members(query?: string, page?: number, limit?: number, groupId?: string): Promise<MemberList>;
160
- users(query: string, page?: number, limit?: number): Promise<DirectoryUsers>;
161
- directoryGroups(query?: string, page?: number, limit?: number): Promise<DirectoryGroups>;
162
- plan(input: GroupPlanInput): Promise<GroupPlan>;
163
- getPlan(id: string): Promise<GroupPlan>;
164
- planItems(id: string, page?: number, limit?: number): Promise<PlanItemList>;
165
- impact(id: string, kind: ImpactKind, page?: number, limit?: number): Promise<ImpactList>;
166
- apply(id: string, expectedDigest: string, idempotencyKey: string): Promise<GroupPlan>;
167
- private json;
168
- }
169
- export {};
@@ -1,129 +0,0 @@
1
- import { z } from "zod";
2
- import { resolveBackendUrl } from "../backend.js";
3
- import { ensureAccessToken, fetchWithKeycloakIdentity } from "../oauth.js";
4
- import { AuthorizationError, authorizationHttpErrorCode } from "./errors.js";
5
- const ROOT = "/api/v1/admin/authorization/groups";
6
- export const EnrollmentSchema = z.object({
7
- membershipStatus: z.enum(["NOT_ENROLLED", "ACTIVE", "SUSPENDED", "REVOKED"]),
8
- syncStatus: z.enum(["DISABLED", "PENDING", "APPLIED", "FAILED", "UNKNOWN"]),
9
- tokenRefreshRequired: z.boolean(), policyRevision: z.number().int().nonnegative(),
10
- blocked: z.boolean().optional(), policyEnabled: z.boolean().optional(), clientId: z.string().nullable().optional(),
11
- groupId: z.string().nullable().optional(), blockReason: z.string().nullable().optional(),
12
- expectedClientRoles: z.record(z.string(), z.array(z.string())).optional()
13
- });
14
- /** @deprecated Historical suggestions only; never an enrollment or authorization allowlist. */
15
- export const BASELINE_ROLES = [
16
- "mci-devops-platform-notion-user",
17
- "mci-devops-platform-ai-registry-reader",
18
- "mci-devops-platform-oss-user"
19
- ];
20
- export const GroupPlanInputSchema = z.object({
21
- operation: z.enum(["CREATE_GROUP", "LINK_GROUP", "SET_GROUP_ROLES", "SET_POLICY", "ADD_MEMBER", "REMOVE_MEMBER", "RESTORE_MEMBER", "DEACTIVATE_GROUP", "SET_MEMBER_STATE", "FILL_MISSING", "MIGRATE_POLICY"]),
22
- name: z.string().trim().min(1).max(160).optional(),
23
- groupId: z.string().uuid().optional(),
24
- keycloakGroupId: z.string().uuid().optional(),
25
- subject: z.string().min(1).max(200).optional(),
26
- state: z.enum(["ACTIVE", "SUSPENDED", "REVOKED"]).optional(),
27
- enabled: z.boolean().optional(),
28
- roles: z.array(z.string().min(1).max(416).refine(value => {
29
- const parts = value.split("/");
30
- const client = parts.length === 1 ? "mci-devops-platform" : parts[0];
31
- const role = parts.at(-1);
32
- return parts.length <= 2 && /^[A-Za-z0-9][A-Za-z0-9_.-]{0,159}$/u.test(client)
33
- && !["realm-management", "account", "account-console", "security-admin-console", "admin-cli", "broker", "web-client", "mcp-client"].includes(client)
34
- && !client.endsWith("-realm") && Boolean(role.trim()) && role.length <= 255 && !/[\u0000-\u001f\u007f]/u.test(role);
35
- })).max(200).optional()
36
- }).strict();
37
- const GroupPlanSchema = z.object({
38
- planId: z.string().uuid(),
39
- digest: z.string().min(1), status: z.string().min(1), operation: z.string(),
40
- policyRevision: z.number().int().nonnegative(),
41
- items: z.array(z.object({ action: z.string(), status: z.string() }).passthrough()),
42
- summary: z.unknown(), input: z.unknown(), totalItems: z.number().int().nonnegative(),
43
- businessImpact: z.record(z.string(), z.unknown()).optional()
44
- });
45
- const GroupListSchema = z.object({
46
- groups: z.array(z.record(z.string(), z.unknown())), total: z.number().int().nonnegative(),
47
- page: z.number().int(), limit: z.number().int(),
48
- policy: z.object({ revision: z.number().int(), enabled: z.boolean(), groupId: z.string().uuid().nullable().optional() }).passthrough(),
49
- baselineRoles: z.array(z.string()),
50
- readiness: z.object({ status: z.string(), writesVerified: z.boolean(), message: z.string() }).optional()
51
- });
52
- const MemberListSchema = z.object({
53
- members: z.array(z.record(z.string(), z.unknown())), total: z.number().int().nonnegative(),
54
- page: z.number().int(), limit: z.number().int()
55
- });
56
- const PlanItemListSchema = z.object({ items: z.array(z.object({ action: z.string(), status: z.string() }).passthrough()), total: z.number().int(), page: z.number().int(), limit: z.number().int() });
57
- const DirectoryUsersSchema = z.object({ users: z.array(z.object({ subject: z.string(), username: z.string(), email: z.string().nullable().optional() })), page: z.number().int(), limit: z.number().int() }).passthrough();
58
- const DirectoryGroupsSchema = z.object({ groups: z.array(z.record(z.string(), z.unknown())), total: z.number().int(), page: z.number().int(), limit: z.number().int() });
59
- export const ImpactKindSchema = z.enum(["notionRoleGrants", "readerNamespaces", "ossExistingGrants"]);
60
- const ImpactListSchema = z.object({ items: z.array(z.record(z.string(), z.unknown())), total: z.number().int(), page: z.number().int(), limit: z.number().int() });
61
- export class GroupClient {
62
- config;
63
- dependencies;
64
- constructor(config, dependencies = {}) {
65
- this.config = config;
66
- this.dependencies = dependencies;
67
- }
68
- enrollment(initialize = false) {
69
- if (this.config.authenticationMode === "client_credentials") {
70
- throw new AuthorizationError("Application enrollment is for human user sessions, not machine identities.", "authorization_input_invalid");
71
- }
72
- return this.json("/api/v1/me/enrollment", EnrollmentSchema, initialize ? {} : undefined);
73
- }
74
- list(page = 1, limit = 20) {
75
- return this.json(`${ROOT}?${new URLSearchParams({ page: String(page), limit: String(limit) })}`, GroupListSchema);
76
- }
77
- members(query = "", page = 1, limit = 20, groupId) {
78
- return this.json(`${ROOT}/members?${new URLSearchParams({ query, page: String(page), limit: String(limit), ...(groupId ? { groupId } : {}) })}`, MemberListSchema);
79
- }
80
- users(query, page = 1, limit = 20) {
81
- return this.json(`${ROOT}/directory/users?${new URLSearchParams({ query, page: String(page), limit: String(limit) })}`, DirectoryUsersSchema);
82
- }
83
- directoryGroups(query = "", page = 1, limit = 20) {
84
- return this.json(`${ROOT}/directory/groups?${new URLSearchParams({ query, page: String(page), limit: String(limit) })}`, DirectoryGroupsSchema);
85
- }
86
- plan(input) {
87
- const parsed = GroupPlanInputSchema.safeParse(input);
88
- if (!parsed.success)
89
- throw new AuthorizationError("Group plan input is invalid; use registered application Client Role references.", "authorization_input_invalid");
90
- return this.json(`${ROOT}/plans`, GroupPlanSchema, parsed.data);
91
- }
92
- getPlan(id) {
93
- return this.json(`${ROOT}/plans/${segment(id)}`, GroupPlanSchema);
94
- }
95
- planItems(id, page = 1, limit = 20) {
96
- return this.json(`${ROOT}/plans/${segment(id)}/items?${new URLSearchParams({ page: String(page), limit: String(limit) })}`, PlanItemListSchema);
97
- }
98
- impact(id, kind, page = 1, limit = 20) {
99
- if (!ImpactKindSchema.safeParse(kind).success)
100
- throw new AuthorizationError("Unsupported business impact kind.", "authorization_input_invalid");
101
- return this.json(`${ROOT}/plans/${segment(id)}/impact?${new URLSearchParams({ kind, page: String(page), limit: String(limit) })}`, ImpactListSchema);
102
- }
103
- apply(id, expectedDigest, idempotencyKey) {
104
- return this.json(`${ROOT}/plans/${segment(id)}/apply`, GroupPlanSchema, { expectedDigest, idempotencyKey });
105
- }
106
- async json(path, schema, body) {
107
- const method = body === undefined ? "GET" : "POST";
108
- const response = await fetchWithKeycloakIdentity(this.config, resolveBackendUrl(this.config, { path, method }), () => ({
109
- method, redirect: "error", signal: AbortSignal.timeout(20_000),
110
- headers: { Accept: "application/json", ...(body === undefined ? {} : { "Content-Type": "application/json" }) },
111
- ...(body === undefined ? {} : { body: JSON.stringify(body) })
112
- }), { fetch: this.dependencies.fetch ?? fetch, tokenProvider: this.dependencies.tokenProvider ?? ensureAccessToken, retryUnauthorized: method === "GET" });
113
- if (!response.ok) {
114
- // Never echo credential-bearing upstream errors or HTML. After write timeouts,
115
- // operators must inspect the same plan instead of submitting a new operation.
116
- throw new AuthorizationError(`Application group API returned HTTP ${response.status}. Inspect the same plan before retrying a write.`, authorizationHttpErrorCode(response.status), response.status);
117
- }
118
- const parsed = schema.safeParse(await response.json().catch(() => undefined));
119
- if (!parsed.success)
120
- throw new AuthorizationError("Application group API response does not match the CLI contract.", "authorization_invalid_response");
121
- return parsed.data;
122
- }
123
- }
124
- function segment(value) {
125
- if (!/^[A-Za-z0-9_-]{1,200}$/u.test(value))
126
- throw new AuthorizationError("Invalid group plan ID.", "authorization_input_invalid");
127
- return encodeURIComponent(value);
128
- }
129
- //# sourceMappingURL=group-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"group-client.js","sourceRoot":"","sources":["../../src/authorization/group-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAA8B,MAAM,aAAa,CAAC;AACvG,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAE7E,MAAM,IAAI,GAAG,oCAAoC,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5E,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3E,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACjF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClH,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACxF,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC1E,CAAC,CAAC;AAEH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,iCAAiC;IACjC,wCAAwC;IACxC,8BAA8B;CACtB,CAAC;AACX,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAC7M,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IACrC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC9C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5D,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QACvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QACtE,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,qCAAqC,CAAC,IAAI,CAAC,MAAM,CAAC;eACzE,CAAC,CAAC,kBAAkB,EAAE,SAAS,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;eACjJ,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxH,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACxB,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC9C,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAClF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACpF,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC7D,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACzF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;IACtI,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzG,CAAC,CAAC;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IAC1F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;CAChD,CAAC,CAAC;AAGH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACtM,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC3N,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAIzK,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAEtG,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAenK,MAAM,OAAO,WAAW;IACO,MAAM;IAA+B,YAAY;IAA9E,YAA6B,MAAkB,EAAmB,YAAY,GAE1E,EAAE;sBAFuB,MAAM;4BAA+B,YAAY;IAErE,CAAC;IAEV,UAAU,CAAC,UAAU,GAAG,KAAK;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,KAAK,oBAAoB,EAAE,CAAC;YAC5D,MAAM,IAAI,kBAAkB,CAAC,4EAA4E,EAAE,6BAA6B,CAAC,CAAC;QAC5I,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IACpH,CAAC;IACD,OAAO,CAAC,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,OAAgB;QACxD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,YAAY,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACrK,CAAC;IACD,KAAK,CAAC,KAAa,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,oBAAoB,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAChJ,CAAC;IACD,eAAe,CAAC,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,qBAAqB,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,qBAAqB,CAAC,CAAC;IAClJ,CAAC;IACD,IAAI,CAAC,KAAqB;QACxB,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,kBAAkB,CAAC,iFAAiF,EAAE,6BAA6B,CAAC,CAAC;QACpK,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,EAAE,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;IACpE,CAAC;IACD,SAAS,CAAC,EAAU,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,CAAC,EAAE,CAAC,UAAU,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAClJ,CAAC;IACD,MAAM,CAAC,EAAU,EAAE,IAAgB,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE;QACvD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO;YAAE,MAAM,IAAI,kBAAkB,CAAC,mCAAmC,EAAE,6BAA6B,CAAC,CAAC;QAChJ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,CAAC,EAAE,CAAC,WAAW,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACvJ,CAAC;IACD,KAAK,CAAC,EAAU,EAAE,cAAsB,EAAE,cAAsB;QAC9D,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;IAC9G,CAAC;IACO,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,MAAoB,EAAE,IAAc;QACtE,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACrH,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9D,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,EAAE;YAC9G,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;SAC9D,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC,CAAC;QAC3J,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,+EAA+E;YAC/E,8EAA8E;YAC9E,MAAM,IAAI,kBAAkB,CAAC,uCAAuC,QAAQ,CAAC,MAAM,kDAAkD,EAAE,0BAA0B,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvM,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,kBAAkB,CAAC,iEAAiE,EAAE,gCAAgC,CAAC,CAAC;QACvJ,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;CACF;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,EAAE,6BAA6B,CAAC,CAAC;IAClI,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}
@@ -1,25 +0,0 @@
1
- import type { Command } from "commander";
2
- import { type GroupApi, type GroupPlanInput } from "./group-client.js";
3
- interface Dependencies {
4
- clientFactory?: () => GroupApi;
5
- }
6
- type PageOptions = {
7
- page: string;
8
- limit: string;
9
- };
10
- type ApplyOptions = {
11
- expectedDigest: string;
12
- idempotencyKey: string;
13
- yes?: boolean;
14
- };
15
- export declare function registerGroupCommands(authorization: Command, dependencies?: Dependencies): void;
16
- export declare function parseGroupPlanInput(value: unknown): GroupPlanInput;
17
- export declare function parseGroupApplyInput(options: ApplyOptions): {
18
- expectedDigest: string;
19
- idempotencyKey: string;
20
- };
21
- export declare function parseGroupPagination(options: PageOptions): {
22
- page: number;
23
- limit: number;
24
- };
25
- export {};