@eduwork/dsh-oidc 0.1.0 → 0.2.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 (58) hide show
  1. package/CHANGELOG.en.md +40 -1
  2. package/CHANGELOG.md +40 -1
  3. package/README.en.md +23 -21
  4. package/README.md +17 -15
  5. package/THIRD_PARTY_NOTICES.en.md +7 -5
  6. package/THIRD_PARTY_NOTICES.md +7 -5
  7. package/cordis.patch.yml +2 -1
  8. package/docs/EDUWORK-MIGRATION.en.md +14 -2
  9. package/docs/EDUWORK-MIGRATION.md +14 -2
  10. package/docs/account-extensions.en.md +40 -0
  11. package/docs/account-extensions.md +42 -0
  12. package/docs/architecture.en.md +9 -9
  13. package/docs/architecture.md +11 -10
  14. package/docs/compatibility.en.md +11 -2
  15. package/docs/compatibility.md +11 -2
  16. package/docs/desktop-host.en.md +69 -0
  17. package/docs/desktop-host.md +79 -0
  18. package/docs/development.en.md +42 -0
  19. package/docs/development.md +42 -0
  20. package/docs/dsh-integration.en.md +23 -7
  21. package/docs/dsh-integration.md +23 -7
  22. package/docs/ecnu-reference.en.md +3 -3
  23. package/docs/ecnu-reference.md +3 -3
  24. package/docs/enterprise-profile.en.md +19 -11
  25. package/docs/enterprise-profile.md +18 -10
  26. package/docs/getting-started.en.md +12 -12
  27. package/docs/getting-started.md +16 -14
  28. package/docs/key-binding-protocol.en.md +2 -2
  29. package/docs/key-binding-protocol.md +2 -2
  30. package/docs/oidc-interoperability.en.md +3 -3
  31. package/docs/oidc-interoperability.md +2 -2
  32. package/docs/public-resource-protocol.en.md +51 -0
  33. package/docs/public-resource-protocol.md +50 -0
  34. package/docs/release-checklist.en.md +4 -2
  35. package/docs/release-checklist.md +4 -2
  36. package/docs/server-integration-contract.en.md +124 -8
  37. package/docs/server-integration-contract.md +136 -8
  38. package/examples/ecnu.enterprise-profile.example.json +2 -2
  39. package/examples/enterprise-profile.example.json +78 -77
  40. package/examples/identity-only.example.json +10 -0
  41. package/examples/resources-discovery.example.json +20 -0
  42. package/lib/callback-page.js +42 -0
  43. package/lib/client.js +935 -295
  44. package/lib/desktop-oidc.js +205 -0
  45. package/lib/index.js +148 -18
  46. package/lib/oidc.js +314 -58
  47. package/lib/profile.js +53 -24
  48. package/lib/provider/core.js +76 -15
  49. package/lib/provider/index.js +33 -20
  50. package/lib/provider/transform-adapter.js +31 -10
  51. package/lib/resources.js +23 -0
  52. package/lib/typert-schemas.js +34 -3
  53. package/lib/typert.host.js +42 -36
  54. package/lib/typert.remote-client.js +41 -35
  55. package/package.json +100 -29
  56. package/protocol/openapi.yaml +2 -2
  57. package/protocol/resources.openapi.yaml +51 -0
  58. package/schema/enterprise-profile.v1alpha1.schema.json +193 -188
@@ -1,38 +1,44 @@
1
- import {
2
- accountResult, baseURLSchema, beginResult, configurationResult, jsonParameter, managementResult,
3
- modelCatalogModeSchema, profileIdSchema, reconcileOptionsSchema, restartResult, runtimeModelsSchema,
4
- } from './typert-schemas.js'
5
-
6
- const pkg = '@eduwork/dsh-oidc'
7
- const source = { file: 'lib/index.js', line: 1, column: 1 }
8
- const profile = () => jsonParameter('profileID', profileIdSchema, `${pkg}#ProfileID`)
9
- const options = () => jsonParameter('options', reconcileOptionsSchema, `${pkg}#ReconcileOptions`)
10
- const baseURL = () => jsonParameter('baseURL', baseURLSchema, `${pkg}#BaseURL`)
11
- const modelMode = () => jsonParameter('modelMode', modelCatalogModeSchema, `${pkg}#ModelCatalogMode`)
12
- const models = () => jsonParameter('models', runtimeModelsSchema, `${pkg}#RuntimeModels`)
13
- const descriptor = (method, parameters, result) => ({
14
- id: `${pkg}#oidcAccounts/${method}`, service: 'oidcAccounts', namespace: 'oidcAccounts', method,
15
- invocation: { kind: 'direct' }, parameters, result, sourceLocation: source,
16
- })
17
-
18
- export const TYPERT = {
19
- package: pkg, face: 'host', schemas: [],
20
- invocations: [
1
+ import {
2
+ accountResult, baseURLSchema, beginResult, configurationResult, configurationTargetSchema, openConfigurationResult, jsonParameter, managementResult, loginIdSchema, loginResult,
3
+ modelCatalogModeSchema, profileIdSchema, reconcileOptionsSchema, restartResult, runtimeModelsSchema, resourcesResult, enterpriseSelectionResult, enterpriseSelectionOptionsSchema,
4
+ } from './typert-schemas.js'
5
+
6
+ const pkg = '@eduwork/dsh-oidc'
7
+ const source = { file: 'lib/index.js', line: 1, column: 1 }
8
+ const profile = () => jsonParameter('profileID', profileIdSchema, `${pkg}#ProfileID`)
9
+ const login = () => jsonParameter('loginID', loginIdSchema, `${pkg}#LoginID`)
10
+ const options = () => jsonParameter('options', reconcileOptionsSchema, `${pkg}#ReconcileOptions`)
11
+ const baseURL = () => jsonParameter('baseURL', baseURLSchema, `${pkg}#BaseURL`)
12
+ const modelMode = () => jsonParameter('modelMode', modelCatalogModeSchema, `${pkg}#ModelCatalogMode`)
13
+ const models = () => jsonParameter('models', runtimeModelsSchema, `${pkg}#RuntimeModels`)
14
+ const descriptor = (method, parameters, result) => ({
15
+ id: `${pkg}#oidcAccounts/${method}`, service: 'oidcAccounts', namespace: 'oidcAccounts', method,
16
+ invocation: { kind: 'direct' }, parameters, result, sourceLocation: source,
17
+ })
18
+
19
+ export const TYPERT = {
20
+ package: pkg, face: 'host', schemas: [],
21
+ invocations: [
21
22
  descriptor('configuration', [], configurationResult),
22
- descriptor('status', [profile()], accountResult),
23
- descriptor('begin', [profile()], beginResult),
23
+ descriptor('openConfiguration', [jsonParameter('target', configurationTargetSchema, `${pkg}#ConfigurationTarget`)], openConfigurationResult),
24
+ descriptor('status', [profile()], accountResult),
25
+ descriptor('resources', [profile()], resourcesResult),
26
+ descriptor('begin', [profile()], beginResult),
27
+ descriptor('loginStatus', [login()], loginResult),
28
+ descriptor('cancelLogin', [login()], loginResult),
24
29
  descriptor('reconcile', [profile(), options()], accountResult),
25
- descriptor('logout', [profile()], accountResult),
26
- descriptor('management', [], managementResult),
27
- descriptor('activate', [profile()], managementResult),
28
- descriptor('configure', [profile()], managementResult),
29
- descriptor('addCustom', [baseURL()], managementResult),
30
- descriptor('updateCustom', [profile(), baseURL()], managementResult),
31
- descriptor('removeProfile', [profile()], managementResult),
32
- descriptor('configureModels', [profile(), modelMode(), models()], managementResult),
33
- descriptor('restart', [], restartResult),
34
- ],
35
- model: { services: [], events: [], objects: [] },
36
- }
37
-
38
- export default TYPERT
30
+ descriptor('selectEnterpriseModel', [profile(), jsonParameter('options', enterpriseSelectionOptionsSchema, `${pkg}#EnterpriseSelectionOptions`)], enterpriseSelectionResult),
31
+ descriptor('logout', [profile()], accountResult),
32
+ descriptor('management', [], managementResult),
33
+ descriptor('activate', [profile()], managementResult),
34
+ descriptor('configure', [profile()], managementResult),
35
+ descriptor('addCustom', [baseURL()], managementResult),
36
+ descriptor('updateCustom', [profile(), baseURL()], managementResult),
37
+ descriptor('removeProfile', [profile()], managementResult),
38
+ descriptor('configureModels', [profile(), modelMode(), models()], managementResult),
39
+ descriptor('restart', [], restartResult),
40
+ ],
41
+ model: { services: [], events: [], objects: [] },
42
+ }
43
+
44
+ export default TYPERT
@@ -1,37 +1,43 @@
1
- import {
2
- accountResult, baseURLSchema, beginResult, configurationResult, jsonParameter, managementResult,
3
- modelCatalogModeSchema, profileIdSchema, reconcileOptionsSchema, restartResult, runtimeModelsSchema,
4
- } from './typert-schemas.js'
5
-
6
- const pkg = '@eduwork/dsh-oidc'
7
- const source = { file: 'lib/index.js', line: 1, column: 1 }
8
- const profile = () => jsonParameter('profileID', profileIdSchema, `${pkg}#ProfileID`)
9
- const options = () => jsonParameter('options', reconcileOptionsSchema, `${pkg}#ReconcileOptions`)
10
- const baseURL = () => jsonParameter('baseURL', baseURLSchema, `${pkg}#BaseURL`)
11
- const modelMode = () => jsonParameter('modelMode', modelCatalogModeSchema, `${pkg}#ModelCatalogMode`)
12
- const models = () => jsonParameter('models', runtimeModelsSchema, `${pkg}#RuntimeModels`)
13
- const descriptor = (method, parameters, result) => ({
14
- id: `${pkg}#oidcAccounts/${method}`, service: 'oidcAccounts', namespace: 'oidcAccounts', method,
15
- invocation: { kind: 'direct' }, parameters, result, sourceLocation: source,
16
- })
17
-
18
- export const TYPERT_REMOTE = {
19
- package: pkg,
20
- descriptors: [
1
+ import {
2
+ accountResult, baseURLSchema, beginResult, configurationResult, configurationTargetSchema, openConfigurationResult, jsonParameter, managementResult, loginIdSchema, loginResult,
3
+ modelCatalogModeSchema, profileIdSchema, reconcileOptionsSchema, restartResult, runtimeModelsSchema, resourcesResult, enterpriseSelectionResult, enterpriseSelectionOptionsSchema,
4
+ } from './typert-schemas.js'
5
+
6
+ const pkg = '@eduwork/dsh-oidc'
7
+ const source = { file: 'lib/index.js', line: 1, column: 1 }
8
+ const profile = () => jsonParameter('profileID', profileIdSchema, `${pkg}#ProfileID`)
9
+ const login = () => jsonParameter('loginID', loginIdSchema, `${pkg}#LoginID`)
10
+ const options = () => jsonParameter('options', reconcileOptionsSchema, `${pkg}#ReconcileOptions`)
11
+ const baseURL = () => jsonParameter('baseURL', baseURLSchema, `${pkg}#BaseURL`)
12
+ const modelMode = () => jsonParameter('modelMode', modelCatalogModeSchema, `${pkg}#ModelCatalogMode`)
13
+ const models = () => jsonParameter('models', runtimeModelsSchema, `${pkg}#RuntimeModels`)
14
+ const descriptor = (method, parameters, result) => ({
15
+ id: `${pkg}#oidcAccounts/${method}`, service: 'oidcAccounts', namespace: 'oidcAccounts', method,
16
+ invocation: { kind: 'direct' }, parameters, result, sourceLocation: source,
17
+ })
18
+
19
+ export const TYPERT_REMOTE = {
20
+ package: pkg,
21
+ descriptors: [
21
22
  descriptor('configuration', [], configurationResult),
22
- descriptor('status', [profile()], accountResult),
23
- descriptor('begin', [profile()], beginResult),
23
+ descriptor('openConfiguration', [jsonParameter('target', configurationTargetSchema, `${pkg}#ConfigurationTarget`)], openConfigurationResult),
24
+ descriptor('status', [profile()], accountResult),
25
+ descriptor('resources', [profile()], resourcesResult),
26
+ descriptor('begin', [profile()], beginResult),
27
+ descriptor('loginStatus', [login()], loginResult),
28
+ descriptor('cancelLogin', [login()], loginResult),
24
29
  descriptor('reconcile', [profile(), options()], accountResult),
25
- descriptor('logout', [profile()], accountResult),
26
- descriptor('management', [], managementResult),
27
- descriptor('activate', [profile()], managementResult),
28
- descriptor('configure', [profile()], managementResult),
29
- descriptor('addCustom', [baseURL()], managementResult),
30
- descriptor('updateCustom', [profile(), baseURL()], managementResult),
31
- descriptor('removeProfile', [profile()], managementResult),
32
- descriptor('configureModels', [profile(), modelMode(), models()], managementResult),
33
- descriptor('restart', [], restartResult),
34
- ],
35
- }
36
-
37
- export default TYPERT_REMOTE
30
+ descriptor('selectEnterpriseModel', [profile(), jsonParameter('options', enterpriseSelectionOptionsSchema, `${pkg}#EnterpriseSelectionOptions`)], enterpriseSelectionResult),
31
+ descriptor('logout', [profile()], accountResult),
32
+ descriptor('management', [], managementResult),
33
+ descriptor('activate', [profile()], managementResult),
34
+ descriptor('configure', [profile()], managementResult),
35
+ descriptor('addCustom', [baseURL()], managementResult),
36
+ descriptor('updateCustom', [profile(), baseURL()], managementResult),
37
+ descriptor('removeProfile', [profile()], managementResult),
38
+ descriptor('configureModels', [profile(), modelMode(), models()], managementResult),
39
+ descriptor('restart', [], restartResult),
40
+ ],
41
+ }
42
+
43
+ export default TYPERT_REMOTE
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eduwork/dsh-oidc",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Standards-based OIDC identity, enterprise API-key binding, declarative branding, and OpenAI-compatible model integration for DeepSeek Harness",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -31,6 +31,7 @@
31
31
  "examples/**/*.json",
32
32
  "schema/**/*.json",
33
33
  "protocol/openapi.yaml",
34
+ "protocol/resources.openapi.yaml",
34
35
  "README.md",
35
36
  "README.en.md",
36
37
  "CODE_OF_CONDUCT.md",
@@ -81,10 +82,12 @@
81
82
  "check:secrets": "node scripts/check-secrets.mjs",
82
83
  "check:licenses": "node scripts/check-licenses.mjs",
83
84
  "check:docs": "node scripts/check-doc-links.mjs",
84
- "check:dsh": "node scripts/check-dsh-rc1.mjs",
85
+ "check:dsh": "npm run check:lock && node scripts/check-dsh-rc1.mjs",
85
86
  "check:build": "node scripts/smoke-build.mjs",
86
87
  "check": "npm run typecheck && npm run check:dsh && npm run build && npm run check:build && npm test && npm run check:schemas && npm run check:docs && npm run check:secrets && npm run check:licenses && npm pack --dry-run",
87
- "prepare": "npm run build"
88
+ "prepare": "npm run build",
89
+ "check:browser": "node scripts/check-account-menu-browser.mjs",
90
+ "check:lock": "node scripts/check-dependency-lock.mjs"
88
91
  },
89
92
  "engines": {
90
93
  "node": ">=22.0.0"
@@ -106,36 +109,104 @@
106
109
  },
107
110
  "peerDependencies": {
108
111
  "@deepseek-ai/cordis": "4.0.2",
109
- "@deepseek-ai/dsh-api-remotes": "0.1.2-rc.1",
110
- "@deepseek-ai/dsh-attachment": "0.1.2-rc.1",
111
- "@deepseek-ai/dsh-authorization": "0.1.2-rc.1",
112
- "@deepseek-ai/dsh-brand": "0.1.2-rc.1",
113
- "@deepseek-ai/dsh-client-ui-renderer": "0.1.2-rc.1",
114
- "@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1",
115
- "@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1",
116
- "@deepseek-ai/dsh-client-ui-settings-general": "0.1.2-rc.1",
117
- "@deepseek-ai/dsh-client-ui-settings-models": "0.1.2-rc.1",
118
- "@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-rc.1",
119
- "@deepseek-ai/dsh-client-ui-theme": "0.1.2-rc.1",
120
- "@deepseek-ai/dsh-credentials": "0.1.2-rc.1",
121
- "@deepseek-ai/dsh-fs": "0.1.2-rc.1",
122
- "@deepseek-ai/dsh-host-webserver": "0.1.2-rc.1",
123
- "@deepseek-ai/dsh-invariants": "0.1.2-rc.1",
124
- "@deepseek-ai/dsh-launch-environment": "0.1.2-rc.1",
125
- "@deepseek-ai/dsh-llm": "0.1.2-rc.1",
126
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.2-rc.1",
127
- "@deepseek-ai/dsh-sandbox": "0.1.2-rc.1",
128
- "@deepseek-ai/dsh-scope": "0.1.2-rc.1",
129
- "@deepseek-ai/dsh-session": "0.1.2-rc.1",
130
- "@deepseek-ai/dsh-settings": "0.1.2-rc.1",
131
- "@deepseek-ai/dsh-timeout": "0.1.2-rc.1",
132
- "@deepseek-ai/dsh-typert-protocol": "0.1.2-rc.1",
133
- "@earendil-works/pi-ai": "^0.84.2",
134
- "react": "^18.2.0"
112
+ "@deepseek-ai/dsh-api-remotes": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
113
+ "@deepseek-ai/dsh-attachment": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
114
+ "@deepseek-ai/dsh-authorization": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
115
+ "@deepseek-ai/dsh-brand": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
116
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
117
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
118
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
119
+ "@deepseek-ai/dsh-client-ui-settings-general": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
120
+ "@deepseek-ai/dsh-client-ui-settings-models": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
121
+ "@deepseek-ai/dsh-client-ui-sidebar": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
122
+ "@deepseek-ai/dsh-client-ui-theme": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
123
+ "@deepseek-ai/dsh-credentials": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
124
+ "@deepseek-ai/dsh-fs": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
125
+ "@deepseek-ai/dsh-host-webserver": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
126
+ "@deepseek-ai/dsh-invariants": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
127
+ "@deepseek-ai/dsh-launch-environment": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
128
+ "@deepseek-ai/dsh-llm": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
129
+ "@deepseek-ai/dsh-llm-pi-ai": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
130
+ "@deepseek-ai/dsh-sandbox": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
131
+ "@deepseek-ai/dsh-scope": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
132
+ "@deepseek-ai/dsh-session": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
133
+ "@deepseek-ai/dsh-settings": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
134
+ "@deepseek-ai/dsh-timeout": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
135
+ "@deepseek-ai/dsh-typert-protocol": "0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.3-alpha.2 || 0.1.5-alpha.1 || 0.1.5-rc.1",
136
+ "@earendil-works/pi-ai": "^0.84.2 || ^0.85.1",
137
+ "react": "^18.2.0",
138
+ "react-dom": "^18.2.0"
135
139
  },
136
140
  "devDependencies": {
141
+ "@deepseek-ai/cordis": "4.0.2",
142
+ "@deepseek-ai/dsh-agent": "0.1.5-rc.1",
143
+ "@deepseek-ai/dsh-agent-default-model": "0.1.5-rc.1",
144
+ "@deepseek-ai/dsh-agent-presets": "0.1.5-rc.1",
145
+ "@deepseek-ai/dsh-api-gateway": "0.1.5-rc.1",
146
+ "@deepseek-ai/dsh-api-remotes": "0.1.5-rc.1",
147
+ "@deepseek-ai/dsh-api-session-controller": "0.1.5-rc.1",
148
+ "@deepseek-ai/dsh-atomic-write": "0.1.5-rc.1",
149
+ "@deepseek-ai/dsh-attachment": "0.1.5-rc.1",
150
+ "@deepseek-ai/dsh-authorization": "0.1.5-rc.1",
151
+ "@deepseek-ai/dsh-brand": "0.1.5-rc.1",
152
+ "@deepseek-ai/dsh-chunked-list": "0.1.5-rc.1",
153
+ "@deepseek-ai/dsh-client-connection": "0.1.5-rc.1",
154
+ "@deepseek-ai/dsh-client-file-upload": "0.1.5-rc.1",
155
+ "@deepseek-ai/dsh-client-ui-conversation": "0.1.5-rc.1",
156
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.1.5-rc.1",
157
+ "@deepseek-ai/dsh-client-ui-renderer": "0.1.5-rc.1",
158
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.1",
159
+ "@deepseek-ai/dsh-client-ui-settings-general": "0.1.5-rc.1",
160
+ "@deepseek-ai/dsh-client-ui-settings-models": "0.1.5-rc.1",
161
+ "@deepseek-ai/dsh-client-ui-sidebar": "0.1.5-rc.1",
162
+ "@deepseek-ai/dsh-client-ui-theme": "0.1.5-rc.1",
163
+ "@deepseek-ai/dsh-code-runtime": "0.1.5-rc.1",
164
+ "@deepseek-ai/dsh-commands": "0.1.5-rc.1",
165
+ "@deepseek-ai/dsh-credentials": "0.1.5-rc.1",
166
+ "@deepseek-ai/dsh-deque": "0.1.5-rc.1",
167
+ "@deepseek-ai/dsh-file-reference": "0.1.5-rc.1",
168
+ "@deepseek-ai/dsh-fs": "0.1.5-rc.1",
169
+ "@deepseek-ai/dsh-home-paths": "0.1.5-rc.1",
170
+ "@deepseek-ai/dsh-host-webserver": "0.1.5-rc.1",
171
+ "@deepseek-ai/dsh-invariants": "0.1.5-rc.1",
172
+ "@deepseek-ai/dsh-jobs": "0.1.5-rc.1",
173
+ "@deepseek-ai/dsh-launch-environment": "0.1.5-rc.1",
174
+ "@deepseek-ai/dsh-llm": "0.1.5-rc.1",
175
+ "@deepseek-ai/dsh-llm-pi-ai": "0.1.5-rc.1",
176
+ "@deepseek-ai/dsh-native-command": "0.1.5-rc.1",
177
+ "@deepseek-ai/dsh-sandbox": "0.1.5-rc.1",
178
+ "@deepseek-ai/dsh-sandbox-policy": "0.1.5-rc.1",
179
+ "@deepseek-ai/dsh-scope": "0.1.5-rc.1",
180
+ "@deepseek-ai/dsh-session": "0.1.5-rc.1",
181
+ "@deepseek-ai/dsh-session-persistence": "0.1.5-rc.1",
182
+ "@deepseek-ai/dsh-session-projection": "0.1.5-rc.1",
183
+ "@deepseek-ai/dsh-session-projection-cache": "0.1.5-rc.1",
184
+ "@deepseek-ai/dsh-session-query": "0.1.5-rc.1",
185
+ "@deepseek-ai/dsh-session-title": "0.1.5-rc.1",
186
+ "@deepseek-ai/dsh-settings": "0.1.5-rc.1",
187
+ "@deepseek-ai/dsh-skill": "0.1.5-rc.1",
188
+ "@deepseek-ai/dsh-storage": "0.1.5-rc.1",
189
+ "@deepseek-ai/dsh-storage-domain": "0.1.5-rc.1",
190
+ "@deepseek-ai/dsh-subagent": "0.1.5-rc.1",
191
+ "@deepseek-ai/dsh-system-prompt": "0.1.5-rc.1",
192
+ "@deepseek-ai/dsh-timeout": "0.1.5-rc.1",
193
+ "@deepseek-ai/dsh-tool-todo": "0.1.5-rc.1",
194
+ "@deepseek-ai/dsh-tools": "0.1.5-rc.1",
195
+ "@deepseek-ai/dsh-typert-protocol": "0.1.5-rc.1",
196
+ "@deepseek-ai/dsh-typert-registry": "0.1.5-rc.1",
197
+ "@deepseek-ai/dsh-user-approval": "0.1.5-rc.1",
198
+ "@deepseek-ai/dsh-util-crypto": "0.1.5-rc.1",
199
+ "@deepseek-ai/dsh-util-time": "0.1.5-rc.1",
200
+ "@deepseek-ai/dsh-util-values": "0.1.5-rc.1",
201
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.5-rc.1",
202
+ "@deepseek-ai/dsh-workspace": "0.1.5-rc.1",
203
+ "@earendil-works/pi-ai": "0.85.1",
137
204
  "@types/react": "^18.3.28",
205
+ "@types/react-dom": "^18.3.7",
138
206
  "ajv": "^8.17.1",
207
+ "playwright-core": "1.63.0",
208
+ "react": "18.3.1",
209
+ "react-dom": "18.3.1",
139
210
  "tsdown": "0.22.14",
140
211
  "typescript": "^5.9.3",
141
212
  "yaml": "^2.8.1"
@@ -123,8 +123,8 @@ components:
123
123
  properties:
124
124
  protocol_version:
125
125
  type: string
126
- const: worker-user-center/v1
127
- description: Optional during v1 adoption; if present it MUST equal this value.
126
+ enum: [worker.user-center.v1, worker-user-center/v1, eduwork-resources/v1]
127
+ description: Optional during v1 adoption; all three version labels share the deployed credential lifecycle wire.
128
128
  subject:
129
129
  $ref: '#/components/schemas/InformationalSubject'
130
130
  provider:
@@ -0,0 +1,51 @@
1
+ openapi: 3.1.0
2
+ info:
3
+ title: EduWork Identity and Resource Protocol
4
+ version: 1.0.0
5
+ description: >-
6
+ Optional resource integration for a local single-user OIDC client.
7
+ Management uses worker-user-center-v1 bootstrap and credential operations. Quota and activity heartbeat are institution extensions, absent from this contract.
8
+ Model discovery uses the resulting runtime API key, never the
9
+ identity token. Pure OIDC deployments may omit resource integration.
10
+ license: { name: MIT, identifier: MIT }
11
+ servers:
12
+ - url: https://ai.example.edu/open/api/v1
13
+ security:
14
+ - runtimeKey: []
15
+ paths:
16
+ /models:
17
+ get:
18
+ operationId: listResourceModels
19
+ responses:
20
+ '200':
21
+ description: Available model identifiers; reviewed capabilities remain in the client Profile
22
+ content:
23
+ application/json:
24
+ schema:
25
+ type: object
26
+ required: [data]
27
+ properties:
28
+ data:
29
+ type: array
30
+ minItems: 1
31
+ maxItems: 128
32
+ items:
33
+ type: object
34
+ required: [id]
35
+ properties:
36
+ id: { type: string, minLength: 1, maxLength: 256 }
37
+ '401': { description: Runtime key is invalid or expired }
38
+ '403': { description: Model discovery is not permitted; keep the reviewed catalog }
39
+ '404': { description: Discovery not supported; client keeps reviewed model catalog }
40
+ '429': { $ref: '#/components/responses/RateLimited' }
41
+ '5XX': { $ref: '#/components/responses/Unavailable' }
42
+ components:
43
+ responses:
44
+ RateLimited:
45
+ description: Temporarily limited; current client reports unavailable and allows a later manual refresh
46
+ headers:
47
+ Retry-After: { schema: { type: string }, description: Seconds or HTTP date for a future retry; never a refresh-token grant }
48
+ Unavailable:
49
+ description: Temporary resource failure; do not clear identity or the model key
50
+ securitySchemes:
51
+ runtimeKey: { type: http, scheme: bearer, description: Model runtime credential }