@kmlckj/licos-ai-cli 1.6.1 → 1.6.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 (48) hide show
  1. package/README.md +10 -0
  2. package/lib/__templates__/agent/AGENTS.md +10 -0
  3. package/lib/__templates__/agent/README.md +10 -0
  4. package/lib/__templates__/agent/config/licos-auth.json +3 -0
  5. package/lib/__templates__/agent/pyproject.toml +3 -3
  6. package/lib/__templates__/agent/requirements.txt +3 -3
  7. package/lib/__templates__/expo/AGENTS.md +10 -0
  8. package/lib/__templates__/expo/README.md +10 -0
  9. package/lib/__templates__/expo/pnpm-lock.yaml +10 -10
  10. package/lib/__templates__/expo/server/package.json +2 -2
  11. package/lib/__templates__/expo/server/src/index.ts +13 -0
  12. package/lib/__templates__/expo/server/src/project-auth.ts +5 -0
  13. package/lib/__templates__/nextjs/AGENTS.md +10 -0
  14. package/lib/__templates__/nextjs/README.md +10 -0
  15. package/lib/__templates__/nextjs/package.json +2 -2
  16. package/lib/__templates__/nextjs/pnpm-lock.yaml +10 -10
  17. package/lib/__templates__/nextjs/src/app/api/licos/auth/config/route.ts +5 -0
  18. package/lib/__templates__/nextjs/src/app/api/licos/auth/me/route.ts +12 -0
  19. package/lib/__templates__/nextjs/src/app/layout.tsx +1 -0
  20. package/lib/__templates__/nextjs/src/lib/project-auth.ts +5 -0
  21. package/lib/__templates__/nextjs/src/lib/project-user-fetch.ts +27 -0
  22. package/lib/__templates__/nuxt-vue/AGENTS.md +10 -0
  23. package/lib/__templates__/nuxt-vue/README.md +10 -0
  24. package/lib/__templates__/nuxt-vue/app/composables/useProjectUserFetch.ts +17 -0
  25. package/lib/__templates__/nuxt-vue/package.json +2 -2
  26. package/lib/__templates__/nuxt-vue/pnpm-lock.yaml +10 -10
  27. package/lib/__templates__/nuxt-vue/server/api/licos/auth/config.get.ts +3 -0
  28. package/lib/__templates__/nuxt-vue/server/api/licos/auth/me.get.ts +12 -0
  29. package/lib/__templates__/nuxt-vue/server/utils/project-auth.ts +5 -0
  30. package/lib/__templates__/taro/AGENTS.md +10 -0
  31. package/lib/__templates__/taro/README.md +10 -0
  32. package/lib/__templates__/taro/pnpm-lock.yaml +10 -10
  33. package/lib/__templates__/taro/server/package.json +2 -2
  34. package/lib/__templates__/taro/server/src/app.controller.ts +18 -1
  35. package/lib/__templates__/taro/server/src/project-auth.ts +5 -0
  36. package/lib/__templates__/vite/AGENTS.md +10 -0
  37. package/lib/__templates__/vite/README.md +10 -0
  38. package/lib/__templates__/vite/package.json +2 -2
  39. package/lib/__templates__/vite/pnpm-lock.yaml +10 -10
  40. package/lib/__templates__/vite/server/project-auth.ts +5 -0
  41. package/lib/__templates__/vite/server/routes/index.ts +13 -0
  42. package/lib/__templates__/vite/src/project-user-fetch.ts +17 -0
  43. package/lib/__templates__/workflow/AGENTS.md +10 -0
  44. package/lib/__templates__/workflow/README.md +10 -0
  45. package/lib/__templates__/workflow/config/licos-auth.json +3 -0
  46. package/lib/__templates__/workflow/pyproject.toml +3 -3
  47. package/lib/__templates__/workflow/requirements.txt +3 -3
  48. package/package.json +1 -1
package/README.md CHANGED
@@ -123,3 +123,13 @@ export const paramsSchema = {
123
123
  ## 许可证
124
124
 
125
125
  MIT
126
+
127
+ ## 编程项目登录身份
128
+
129
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
130
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
131
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
132
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
133
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
134
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
135
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -47,3 +47,13 @@
47
47
  - 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
48
48
  - CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
49
49
  - 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
50
+
51
+ ## 编程项目登录身份
52
+
53
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
54
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
55
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
56
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
57
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
58
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
59
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -152,3 +152,13 @@ bash scripts/runtime.sh -m verify --cases tests/agent_cases.json --report .tmp/a
152
152
  预览、本地运行和验收共用 `scripts/runtime.sh`:显式设置 `PYTHON_BIN` 时使用该解释器,否则使用已创建的项目 `.venv`,全局安装模式使用 `python`。选定环境损坏会直接失败。验收已启用会话记忆的项目时,先把测试用户的 Bearer 令牌放入环境变量 `LICOS_AGENT_VERIFY_BEARER_TOKEN`;验收报告不会记录令牌。
153
153
 
154
154
  验收默认读取 `LICOS_AGENT_RUN_TIMEOUT_SECONDS`,可用 `--request-timeout` 覆盖 HTTP 等待时间;非法超时配置直接失败。图须符合运行时的 `ainvoke/stream/astream/astream_events` 契约,执行错误不会通过换参数重试或改成非流式调用绕过。订阅状态与投递记录分别读取,记录接口为 `/agent/subscriptions/{id}/deliveries?limit=...&offset=...`。
155
+
156
+ ## 编程项目登录身份
157
+
158
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
159
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
160
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
161
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
162
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
163
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
164
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -0,0 +1,3 @@
1
+ {
2
+ "mode": "platform"
3
+ }
@@ -4,9 +4,9 @@ version = "0.1.0"
4
4
  description = "LICOS LangGraph agent project"
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
7
- "licos-agent-runtime>=0.5.1",
8
- "licos-platform-sdk>=0.7.1",
9
- "licos-dev-sdk>=0.6.1",
7
+ "licos-agent-runtime>=0.5.3",
8
+ "licos-platform-sdk>=0.7.3",
9
+ "licos-dev-sdk>=0.6.3",
10
10
  ]
11
11
 
12
12
  [tool.uv]
@@ -1,3 +1,3 @@
1
- licos-agent-runtime>=0.5.1
2
- licos-platform-sdk>=0.7.1
3
- licos-dev-sdk>=0.6.1
1
+ licos-agent-runtime>=0.5.3
2
+ licos-platform-sdk>=0.7.3
3
+ licos-dev-sdk>=0.6.3
@@ -270,3 +270,13 @@ import { Screen } from '../../../components/Screen';
270
270
  - 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
271
271
  - CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
272
272
  - 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
273
+
274
+ ## 编程项目登录身份
275
+
276
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
277
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
278
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
279
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
280
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
281
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
282
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -257,3 +257,13 @@ import { Screen } from '../../../components/Screen';
257
257
  ## 本地开发
258
258
 
259
259
  `licos dev`:用来首次启动前后端服务,也可以用来重启前后端服务(该命令会先尝试杀掉占用端口的进程,再启动服务)
260
+
261
+ ## 编程项目登录身份
262
+
263
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
264
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
265
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
266
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
267
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
268
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
269
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -266,11 +266,11 @@ importers:
266
266
  server:
267
267
  dependencies:
268
268
  '@kmlckj/licos-dev-sdk':
269
- specifier: 0.4.1
270
- version: 0.4.1
269
+ specifier: 0.4.2
270
+ version: 0.4.2
271
271
  '@kmlckj/licos-platform-sdk':
272
- specifier: 0.12.1
273
- version: 0.12.1
272
+ specifier: 0.12.2
273
+ version: 0.12.2
274
274
  cors:
275
275
  specifier: ^2.8.5
276
276
  version: 2.8.6
@@ -1324,13 +1324,13 @@ packages:
1324
1324
  '@jridgewell/trace-mapping@0.3.31':
1325
1325
  resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
1326
1326
 
1327
- '@kmlckj/licos-dev-sdk@0.4.1':
1328
- resolution: {integrity: sha512-iW4r4+sG2SehekAHNQd8Bzn1IFPXnRXcIC3lbodEEYri8bFDOzrjvNBjs8UDprgRrp876uXHlMKehKNYnrIKSA==}
1327
+ '@kmlckj/licos-dev-sdk@0.4.2':
1328
+ resolution: {integrity: sha512-dK6qzoTzVxEhvxE08B9ox0qel8s233gjWFdCvpOM+ekUctGjleyj1OJCOFXNvapY6U3HVDqeU+MvnBhJ0ne2dw==}
1329
1329
  engines: {node: '>=18'}
1330
1330
 
1331
- '@kmlckj/licos-platform-sdk@0.12.1':
1331
+ '@kmlckj/licos-platform-sdk@0.12.2':
1332
1332
  resolution:
1333
- integrity: sha512-j3ESLWG6j4LKi8ac5VZxcxqML5lAgBx4V+YdVyVCiGM7xthuF6v9Luw+VEzQXZJqwu4PktH+gotUVr6srHhTpA==
1333
+ integrity: sha512-DQLfhX1RgRWxLoX28iQAna9dZ78EIhfX6JKoveaWJq9fvYaitIug+IJkt1eRllJhnKKAXcPuUAazn9DrBD4izA==
1334
1334
 
1335
1335
  '@napi-rs/wasm-runtime@0.2.12':
1336
1336
  resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
@@ -7515,9 +7515,9 @@ snapshots:
7515
7515
  '@jridgewell/resolve-uri': 3.1.2
7516
7516
  '@jridgewell/sourcemap-codec': 1.5.5
7517
7517
 
7518
- '@kmlckj/licos-dev-sdk@0.4.1': {}
7518
+ '@kmlckj/licos-dev-sdk@0.4.2': {}
7519
7519
 
7520
- '@kmlckj/licos-platform-sdk@0.12.1':
7520
+ '@kmlckj/licos-platform-sdk@0.12.2':
7521
7521
  dependencies:
7522
7522
  ajv: 8.17.1
7523
7523
  ajv-formats: 3.0.1(ajv@8.17.1)
@@ -10,8 +10,8 @@
10
10
  "lint": "tsc --noEmit"
11
11
  },
12
12
  "dependencies": {
13
- "@kmlckj/licos-dev-sdk": "0.4.1",
14
- "@kmlckj/licos-platform-sdk": "0.12.1",
13
+ "@kmlckj/licos-dev-sdk": "0.4.2",
14
+ "@kmlckj/licos-platform-sdk": "0.12.2",
15
15
  "cors": "^2.8.5",
16
16
  "dayjs": "^1.11.19",
17
17
  "dotenv": "^17.2.3",
@@ -2,6 +2,8 @@ import express from "express";
2
2
  import cors from "cors";
3
3
  import fs from "fs";
4
4
  import path from "path";
5
+ import { getCurrentUser, ApiError } from '@kmlckj/licos-platform-sdk';
6
+ import { projectAuth, getProjectAuthConfig } from './project-auth';
5
7
 
6
8
  const app = express();
7
9
  const port = process.env.PORT || 5001;
@@ -11,6 +13,17 @@ app.use(cors());
11
13
  app.use(express.json({ limit: '50mb' }));
12
14
  app.use(express.urlencoded({ limit: '50mb', extended: true }));
13
15
 
16
+ app.get('/api/licos/auth/config', (_req, res) => res.json(getProjectAuthConfig()));
17
+ app.get('/api/licos/auth/me', async (req, res, next) => {
18
+ try {
19
+ const userToken = await projectAuth.userToken(req);
20
+ res.json(await getCurrentUser({ userToken }));
21
+ } catch (error) {
22
+ if (error instanceof ApiError) res.status(error.status || 401).json({ error: error.message });
23
+ else next(error);
24
+ }
25
+ });
26
+
14
27
  app.get('/api/v1/health', (req, res) => {
15
28
  console.log('Health check success');
16
29
  res.status(200).json({ status: 'ok' });
@@ -0,0 +1,5 @@
1
+ import { createProjectAuth, projectAuthConfig } from '@kmlckj/licos-platform-sdk';
2
+
3
+ // Connect an existing application login with mode: 'builtin' and resolveBuiltinToken.
4
+ export const projectAuth = createProjectAuth({ mode: 'platform' });
5
+ export const getProjectAuthConfig = () => projectAuthConfig(projectAuth.mode);
@@ -71,3 +71,13 @@
71
71
  - 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
72
72
  - CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
73
73
  - 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
74
+
75
+ ## 编程项目登录身份
76
+
77
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
78
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
79
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
80
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
81
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
82
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
83
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -361,3 +361,13 @@ export const useStore = create<Store>((set) => ({
361
361
  3. **遵循 Next.js App Router 规范**,正确区分服务端/客户端组件
362
362
  4. **使用 TypeScript** 进行类型安全开发
363
363
  5. **使用 `@/` 路径别名** 导入模块(已配置)
364
+
365
+ ## 编程项目登录身份
366
+
367
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
368
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
369
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
370
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
371
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
372
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
373
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -14,8 +14,8 @@
14
14
  "ts-check": "tsc -p tsconfig.json"
15
15
  },
16
16
  "dependencies": {
17
- "@kmlckj/licos-dev-sdk": "0.4.1",
18
- "@kmlckj/licos-platform-sdk": "0.12.1",
17
+ "@kmlckj/licos-dev-sdk": "0.4.2",
18
+ "@kmlckj/licos-platform-sdk": "0.12.2",
19
19
  "@aws-sdk/client-s3": "^3.958.0",
20
20
  "@aws-sdk/lib-storage": "^3.958.0",
21
21
  "@hookform/resolvers": "^5.2.2",
@@ -18,11 +18,11 @@ importers:
18
18
  specifier: ^5.2.2
19
19
  version: 5.4.0(react-hook-form@7.77.0(react@19.2.3))
20
20
  '@kmlckj/licos-dev-sdk':
21
- specifier: 0.4.1
22
- version: 0.4.1
21
+ specifier: 0.4.2
22
+ version: 0.4.2
23
23
  '@kmlckj/licos-platform-sdk':
24
- specifier: 0.12.1
25
- version: 0.12.1
24
+ specifier: 0.12.2
25
+ version: 0.12.2
26
26
  '@radix-ui/react-accordion':
27
27
  specifier: ^1.2.12
28
28
  version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -1380,13 +1380,13 @@ packages:
1380
1380
  '@jridgewell/trace-mapping@0.3.31':
1381
1381
  resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
1382
1382
 
1383
- '@kmlckj/licos-dev-sdk@0.4.1':
1384
- resolution: {integrity: sha512-iW4r4+sG2SehekAHNQd8Bzn1IFPXnRXcIC3lbodEEYri8bFDOzrjvNBjs8UDprgRrp876uXHlMKehKNYnrIKSA==}
1383
+ '@kmlckj/licos-dev-sdk@0.4.2':
1384
+ resolution: {integrity: sha512-dK6qzoTzVxEhvxE08B9ox0qel8s233gjWFdCvpOM+ekUctGjleyj1OJCOFXNvapY6U3HVDqeU+MvnBhJ0ne2dw==}
1385
1385
  engines: {node: '>=18'}
1386
1386
 
1387
- '@kmlckj/licos-platform-sdk@0.12.1':
1387
+ '@kmlckj/licos-platform-sdk@0.12.2':
1388
1388
  resolution:
1389
- integrity: sha512-j3ESLWG6j4LKi8ac5VZxcxqML5lAgBx4V+YdVyVCiGM7xthuF6v9Luw+VEzQXZJqwu4PktH+gotUVr6srHhTpA==
1389
+ integrity: sha512-DQLfhX1RgRWxLoX28iQAna9dZ78EIhfX6JKoveaWJq9fvYaitIug+IJkt1eRllJhnKKAXcPuUAazn9DrBD4izA==
1390
1390
 
1391
1391
  '@modelcontextprotocol/sdk@1.29.0':
1392
1392
  resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==}
@@ -6716,9 +6716,9 @@ snapshots:
6716
6716
  '@jridgewell/resolve-uri': 3.1.2
6717
6717
  '@jridgewell/sourcemap-codec': 1.5.5
6718
6718
 
6719
- '@kmlckj/licos-dev-sdk@0.4.1': {}
6719
+ '@kmlckj/licos-dev-sdk@0.4.2': {}
6720
6720
 
6721
- '@kmlckj/licos-platform-sdk@0.12.1':
6721
+ '@kmlckj/licos-platform-sdk@0.12.2':
6722
6722
  dependencies:
6723
6723
  ajv: 8.17.1
6724
6724
  ajv-formats: 3.0.1(ajv@8.17.1)
@@ -0,0 +1,5 @@
1
+ import { getProjectAuthConfig } from '@/lib/project-auth';
2
+
3
+ export function GET() {
4
+ return Response.json(getProjectAuthConfig());
5
+ }
@@ -0,0 +1,12 @@
1
+ import { getCurrentUser, ApiError } from '@kmlckj/licos-platform-sdk';
2
+ import { projectAuth } from '@/lib/project-auth';
3
+
4
+ export async function GET(request: Request) {
5
+ try {
6
+ const userToken = await projectAuth.userToken(request);
7
+ return Response.json(await getCurrentUser({ userToken }));
8
+ } catch (error) {
9
+ if (error instanceof ApiError) return Response.json({ error: error.message }, { status: error.status || 401 });
10
+ throw error;
11
+ }
12
+ }
@@ -3,6 +3,7 @@ import { Inspector } from 'react-dev-inspector';
3
3
  import './globals.css';
4
4
 
5
5
  export const metadata: Metadata = {
6
+ other: { 'licos-project-base': (process.env.LICOS_PREVIEW_BASE_PATH || process.env.BASE_PATH || '/').replace(/\/+$/, '') + '/' },
6
7
  title: {
7
8
  default: '新应用 | LICOS AI',
8
9
  template: '%s | LICOS AI',
@@ -0,0 +1,5 @@
1
+ import { createProjectAuth, projectAuthConfig } from '@kmlckj/licos-platform-sdk';
2
+
3
+ // Adding built-in login requires mode: 'builtin' and its session token resolver here.
4
+ export const projectAuth = createProjectAuth({ mode: 'platform' });
5
+ export const getProjectAuthConfig = () => projectAuthConfig(projectAuth.mode);
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+
3
+ import { createProjectUserFetch } from '@kmlckj/licos-platform-sdk/browser';
4
+
5
+ let userApi: ReturnType<typeof createUserApi> | undefined;
6
+
7
+ export async function projectUserFetch(path: string, init?: RequestInit) {
8
+ if (!userApi) {
9
+ const meta = document.querySelector<HTMLMetaElement>('meta[name="licos-project-base"]');
10
+ if (!meta) throw new Error('Project base path is not configured');
11
+ userApi = createUserApi(new URL(meta.content, window.location.origin).href);
12
+ }
13
+ return userApi(path, init);
14
+ }
15
+
16
+ export function createUserApi(projectBaseUrl: string) {
17
+ let client: Promise<ReturnType<typeof createProjectUserFetch>> | undefined;
18
+ async function loadClient() {
19
+ const response = await fetch(new URL('api/licos/auth/config', projectBaseUrl));
20
+ if (!response.ok) throw new Error('Cannot load project login configuration');
21
+ return createProjectUserFetch({ ...await response.json(), projectBaseUrl });
22
+ }
23
+ return async (path: string, init?: RequestInit) => {
24
+ client ??= loadClient();
25
+ return (await client)(path, init);
26
+ };
27
+ }
@@ -52,3 +52,13 @@
52
52
  - 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
53
53
  - CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
54
54
  - 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
55
+
56
+ ## 编程项目登录身份
57
+
58
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
59
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
60
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
61
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
62
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
63
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
64
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -71,3 +71,13 @@ You can add server API by creating files in `server/api/` directory. See [server
71
71
  - [Vue 3 Documentation](https://vuejs.org/)
72
72
  - [Vite Documentation](https://vitejs.dev/)
73
73
  - [Deployment Guide](https://nuxt.com/docs/getting-started/deployment)
74
+
75
+ ## 编程项目登录身份
76
+
77
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
78
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
79
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
80
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
81
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
82
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
83
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -0,0 +1,17 @@
1
+ import { createProjectUserFetch } from '@kmlckj/licos-platform-sdk/browser';
2
+
3
+ export function useProjectUserFetch() {
4
+ const runtime = useRuntimeConfig();
5
+ let client: Promise<ReturnType<typeof createProjectUserFetch>> | undefined;
6
+ async function loadClient() {
7
+ const previewBase = (window as Window & { __LICOS_PREVIEW_BASE_PATH__?: string }).__LICOS_PREVIEW_BASE_PATH__;
8
+ const base = new URL((previewBase || runtime.public.baseURL).replace(/\/+$/, '') + '/', window.location.origin);
9
+ const response = await fetch(new URL('api/licos/auth/config', base));
10
+ if (!response.ok) throw new Error('Cannot load project login configuration');
11
+ return createProjectUserFetch({ ...await response.json(), projectBaseUrl: base.href });
12
+ }
13
+ return async (path: string, init?: RequestInit) => {
14
+ client ??= loadClient();
15
+ return (await client)(path, init);
16
+ };
17
+ }
@@ -17,8 +17,8 @@
17
17
  "start": "bash ./scripts/start.sh"
18
18
  },
19
19
  "dependencies": {
20
- "@kmlckj/licos-dev-sdk": "0.4.1",
21
- "@kmlckj/licos-platform-sdk": "0.12.1",
20
+ "@kmlckj/licos-dev-sdk": "0.4.2",
21
+ "@kmlckj/licos-platform-sdk": "0.12.2",
22
22
  "@nuxt/image": "2.0.0",
23
23
  "nuxt": "4.3.1",
24
24
  "tailwind-merge": "2.6.0",
@@ -13,11 +13,11 @@ importers:
13
13
  .:
14
14
  dependencies:
15
15
  '@kmlckj/licos-dev-sdk':
16
- specifier: 0.4.1
17
- version: 0.4.1
16
+ specifier: 0.4.2
17
+ version: 0.4.2
18
18
  '@kmlckj/licos-platform-sdk':
19
- specifier: 0.12.1
20
- version: 0.12.1
19
+ specifier: 0.12.2
20
+ version: 0.12.2
21
21
  '@nuxt/image':
22
22
  specifier: 2.0.0
23
23
  version: 2.0.0(db0@0.3.4)(ioredis@5.11.0)(magicast@0.5.3)(srvx@0.11.16)
@@ -731,13 +731,13 @@ packages:
731
731
  '@jridgewell/trace-mapping@0.3.31':
732
732
  resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
733
733
 
734
- '@kmlckj/licos-dev-sdk@0.4.1':
735
- resolution: {integrity: sha512-iW4r4+sG2SehekAHNQd8Bzn1IFPXnRXcIC3lbodEEYri8bFDOzrjvNBjs8UDprgRrp876uXHlMKehKNYnrIKSA==}
734
+ '@kmlckj/licos-dev-sdk@0.4.2':
735
+ resolution: {integrity: sha512-dK6qzoTzVxEhvxE08B9ox0qel8s233gjWFdCvpOM+ekUctGjleyj1OJCOFXNvapY6U3HVDqeU+MvnBhJ0ne2dw==}
736
736
  engines: {node: '>=18'}
737
737
 
738
- '@kmlckj/licos-platform-sdk@0.12.1':
738
+ '@kmlckj/licos-platform-sdk@0.12.2':
739
739
  resolution:
740
- integrity: sha512-j3ESLWG6j4LKi8ac5VZxcxqML5lAgBx4V+YdVyVCiGM7xthuF6v9Luw+VEzQXZJqwu4PktH+gotUVr6srHhTpA==
740
+ integrity: sha512-DQLfhX1RgRWxLoX28iQAna9dZ78EIhfX6JKoveaWJq9fvYaitIug+IJkt1eRllJhnKKAXcPuUAazn9DrBD4izA==
741
741
 
742
742
  '@koa/router@12.0.2':
743
743
  resolution: {integrity: sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==}
@@ -4773,9 +4773,9 @@ snapshots:
4773
4773
  '@jridgewell/resolve-uri': 3.1.2
4774
4774
  '@jridgewell/sourcemap-codec': 1.5.5
4775
4775
 
4776
- '@kmlckj/licos-dev-sdk@0.4.1': {}
4776
+ '@kmlckj/licos-dev-sdk@0.4.2': {}
4777
4777
 
4778
- '@kmlckj/licos-platform-sdk@0.12.1':
4778
+ '@kmlckj/licos-platform-sdk@0.12.2':
4779
4779
  dependencies:
4780
4780
  ajv: 8.17.1
4781
4781
  ajv-formats: 3.0.1(ajv@8.17.1)
@@ -0,0 +1,3 @@
1
+ import { getProjectAuthConfig } from '../../../utils/project-auth';
2
+
3
+ export default defineEventHandler(() => getProjectAuthConfig());
@@ -0,0 +1,12 @@
1
+ import { getCurrentUser, ApiError } from '@kmlckj/licos-platform-sdk';
2
+ import { projectAuth } from '../../../utils/project-auth';
3
+
4
+ export default defineEventHandler(async event => {
5
+ try {
6
+ const userToken = await projectAuth.userToken(event.node.req);
7
+ return await getCurrentUser({ userToken });
8
+ } catch (error) {
9
+ if (error instanceof ApiError) throw createError({ statusCode: error.status || 401, message: error.message });
10
+ throw error;
11
+ }
12
+ });
@@ -0,0 +1,5 @@
1
+ import { createProjectAuth, projectAuthConfig } from '@kmlckj/licos-platform-sdk';
2
+
3
+ // Adding built-in login requires mode: 'builtin' and its session token resolver here.
4
+ export const projectAuth = createProjectAuth({ mode: 'platform' });
5
+ export const getProjectAuthConfig = () => projectAuthConfig(projectAuth.mode);
@@ -583,3 +583,13 @@ import { Input } from '@/components/ui/input'
583
583
  - 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
584
584
  - CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
585
585
  - 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
586
+
587
+ ## 编程项目登录身份
588
+
589
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
590
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
591
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
592
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
593
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
594
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
595
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -761,3 +761,13 @@ create(@Body() body: unknown) {
761
761
  return this.userService.create(result.data);
762
762
  }
763
763
  ```
764
+
765
+ ## 编程项目登录身份
766
+
767
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
768
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
769
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
770
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
771
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
772
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
773
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -181,11 +181,11 @@ importers:
181
181
  server:
182
182
  dependencies:
183
183
  '@kmlckj/licos-dev-sdk':
184
- specifier: 0.4.1
185
- version: 0.4.1
184
+ specifier: 0.4.2
185
+ version: 0.4.2
186
186
  '@kmlckj/licos-platform-sdk':
187
- specifier: 0.12.1
188
- version: 0.12.1
187
+ specifier: 0.12.2
188
+ version: 0.12.2
189
189
  '@nestjs/common':
190
190
  specifier: ^10.4.15
191
191
  version: 10.4.22(reflect-metadata@0.2.2)(rxjs@7.8.2)
@@ -2590,12 +2590,12 @@ packages:
2590
2590
  '@keyv/serialize@1.1.1':
2591
2591
  resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
2592
2592
 
2593
- '@kmlckj/licos-dev-sdk@0.4.1':
2594
- resolution: {integrity: sha512-iW4r4+sG2SehekAHNQd8Bzn1IFPXnRXcIC3lbodEEYri8bFDOzrjvNBjs8UDprgRrp876uXHlMKehKNYnrIKSA==}
2593
+ '@kmlckj/licos-dev-sdk@0.4.2':
2594
+ resolution: {integrity: sha512-dK6qzoTzVxEhvxE08B9ox0qel8s233gjWFdCvpOM+ekUctGjleyj1OJCOFXNvapY6U3HVDqeU+MvnBhJ0ne2dw==}
2595
2595
  engines: {node: '>=18'}
2596
2596
 
2597
- '@kmlckj/licos-platform-sdk@0.12.1':
2598
- resolution: {integrity: sha512-j3ESLWG6j4LKi8ac5VZxcxqML5lAgBx4V+YdVyVCiGM7xthuF6v9Luw+VEzQXZJqwu4PktH+gotUVr6srHhTpA==}
2597
+ '@kmlckj/licos-platform-sdk@0.12.2':
2598
+ resolution: {integrity: sha512-DQLfhX1RgRWxLoX28iQAna9dZ78EIhfX6JKoveaWJq9fvYaitIug+IJkt1eRllJhnKKAXcPuUAazn9DrBD4izA==}
2599
2599
 
2600
2600
  '@leejim/wxml-parser@0.1.6':
2601
2601
  resolution: {integrity: sha512-1u4ULGK4GKkWhTlc3Hmac8PknrmpGd7qxZOTnT/Bm6EZ/wtonLgFhJ4vyuiUZpeCptnknOLkRpGx2Um9npwdZw==}
@@ -12408,9 +12408,9 @@ snapshots:
12408
12408
 
12409
12409
  '@keyv/serialize@1.1.1': {}
12410
12410
 
12411
- '@kmlckj/licos-dev-sdk@0.4.1': {}
12411
+ '@kmlckj/licos-dev-sdk@0.4.2': {}
12412
12412
 
12413
- '@kmlckj/licos-platform-sdk@0.12.1':
12413
+ '@kmlckj/licos-platform-sdk@0.12.2':
12414
12414
  dependencies:
12415
12415
  ajv: 8.17.1
12416
12416
  ajv-formats: 3.0.1(ajv@8.17.1)
@@ -11,8 +11,8 @@
11
11
  "start:prod": "node dist/main"
12
12
  },
13
13
  "dependencies": {
14
- "@kmlckj/licos-dev-sdk": "0.4.1",
15
- "@kmlckj/licos-platform-sdk": "0.12.1",
14
+ "@kmlckj/licos-dev-sdk": "0.4.2",
15
+ "@kmlckj/licos-platform-sdk": "0.12.2",
16
16
  "@nestjs/common": "^10.4.15",
17
17
  "@nestjs/core": "^10.4.15",
18
18
  "@nestjs/platform-express": "^10.4.15",
@@ -1,8 +1,25 @@
1
- import { Controller, Get } from '@nestjs/common';
1
+ import { Controller, Get, Req, HttpException } from '@nestjs/common';
2
+ import type { Request } from 'express';
3
+ import { getCurrentUser, ApiError } from '@kmlckj/licos-platform-sdk';
4
+ import { projectAuth, getProjectAuthConfig } from './project-auth';
2
5
  import { AppService } from '@/app.service';
3
6
 
4
7
  @Controller()
5
8
  export class AppController {
9
+ @Get('licos/auth/config')
10
+ loginConfig() { return getProjectAuthConfig(); }
11
+
12
+ @Get('licos/auth/me')
13
+ async currentUser(@Req() request: Request) {
14
+ try {
15
+ const userToken = await projectAuth.userToken(request);
16
+ return await getCurrentUser({ userToken });
17
+ } catch (error) {
18
+ if (error instanceof ApiError) throw new HttpException(error.message, error.status || 401);
19
+ throw error;
20
+ }
21
+ }
22
+
6
23
  constructor(private readonly appService: AppService) {}
7
24
 
8
25
  @Get('hello')
@@ -0,0 +1,5 @@
1
+ import { createProjectAuth, projectAuthConfig } from '@kmlckj/licos-platform-sdk';
2
+
3
+ // Connect an existing application login with mode: 'builtin' and resolveBuiltinToken.
4
+ export const projectAuth = createProjectAuth({ mode: 'platform' });
5
+ export const getProjectAuthConfig = () => projectAuthConfig(projectAuth.mode);
@@ -52,3 +52,13 @@
52
52
  - 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
53
53
  - CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
54
54
  - 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
55
+
56
+ ## 编程项目登录身份
57
+
58
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
59
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
60
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
61
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
62
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
63
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
64
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -416,3 +416,13 @@ const pool = new Pool({ connectionString: process.env.DATABASE_URL });
416
416
  2. 将整个项目上传到服务器
417
417
  3. 运行 `pnpm install --registry=https://registry.npmmirror.com --prod`
418
418
  4. 运行 `licos start` 启动服务
419
+
420
+ ## 编程项目登录身份
421
+
422
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
423
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
424
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
425
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
426
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
427
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
428
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -14,8 +14,8 @@
14
14
  "ts-check": "tsc -p tsconfig.json"
15
15
  },
16
16
  "dependencies": {
17
- "@kmlckj/licos-dev-sdk": "0.4.1",
18
- "@kmlckj/licos-platform-sdk": "0.12.1",
17
+ "@kmlckj/licos-dev-sdk": "0.4.2",
18
+ "@kmlckj/licos-platform-sdk": "0.12.2",
19
19
  "dotenv": "^17.2.3",
20
20
  "express": "^4.21.2"
21
21
  },
@@ -13,11 +13,11 @@ importers:
13
13
  .:
14
14
  dependencies:
15
15
  '@kmlckj/licos-dev-sdk':
16
- specifier: 0.4.1
17
- version: 0.4.1
16
+ specifier: 0.4.2
17
+ version: 0.4.2
18
18
  '@kmlckj/licos-platform-sdk':
19
- specifier: 0.12.1
20
- version: 0.12.1
19
+ specifier: 0.12.2
20
+ version: 0.12.2
21
21
  dotenv:
22
22
  specifier: ^17.2.3
23
23
  version: 17.2.4
@@ -291,13 +291,13 @@ packages:
291
291
  '@jridgewell/trace-mapping@0.3.31':
292
292
  resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
293
293
 
294
- '@kmlckj/licos-dev-sdk@0.4.1':
295
- resolution: {integrity: sha512-iW4r4+sG2SehekAHNQd8Bzn1IFPXnRXcIC3lbodEEYri8bFDOzrjvNBjs8UDprgRrp876uXHlMKehKNYnrIKSA==}
294
+ '@kmlckj/licos-dev-sdk@0.4.2':
295
+ resolution: {integrity: sha512-dK6qzoTzVxEhvxE08B9ox0qel8s233gjWFdCvpOM+ekUctGjleyj1OJCOFXNvapY6U3HVDqeU+MvnBhJ0ne2dw==}
296
296
  engines: {node: '>=18'}
297
297
 
298
- '@kmlckj/licos-platform-sdk@0.12.1':
298
+ '@kmlckj/licos-platform-sdk@0.12.2':
299
299
  resolution:
300
- integrity: sha512-j3ESLWG6j4LKi8ac5VZxcxqML5lAgBx4V+YdVyVCiGM7xthuF6v9Luw+VEzQXZJqwu4PktH+gotUVr6srHhTpA==
300
+ integrity: sha512-DQLfhX1RgRWxLoX28iQAna9dZ78EIhfX6JKoveaWJq9fvYaitIug+IJkt1eRllJhnKKAXcPuUAazn9DrBD4izA==
301
301
 
302
302
  '@nodelib/fs.scandir@2.1.5':
303
303
  resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@@ -1751,9 +1751,9 @@ snapshots:
1751
1751
  '@jridgewell/resolve-uri': 3.1.2
1752
1752
  '@jridgewell/sourcemap-codec': 1.5.5
1753
1753
 
1754
- '@kmlckj/licos-dev-sdk@0.4.1': {}
1754
+ '@kmlckj/licos-dev-sdk@0.4.2': {}
1755
1755
 
1756
- '@kmlckj/licos-platform-sdk@0.12.1':
1756
+ '@kmlckj/licos-platform-sdk@0.12.2':
1757
1757
  dependencies:
1758
1758
  ajv: 8.17.1
1759
1759
  ajv-formats: 3.0.1(ajv@8.17.1)
@@ -0,0 +1,5 @@
1
+ import { createProjectAuth, projectAuthConfig } from '@kmlckj/licos-platform-sdk';
2
+
3
+ // Adding built-in login requires mode: 'builtin' and its session token resolver here.
4
+ export const projectAuth = createProjectAuth({ mode: 'platform' });
5
+ export const getProjectAuthConfig = () => projectAuthConfig(projectAuth.mode);
@@ -1,7 +1,20 @@
1
1
  import { Router } from 'express';
2
+ import { getCurrentUser, ApiError } from '@kmlckj/licos-platform-sdk';
3
+ import { projectAuth, getProjectAuthConfig } from '../project-auth';
2
4
 
3
5
  const router = Router();
4
6
 
7
+ router.get('/api/licos/auth/config', (_req, res) => res.json(getProjectAuthConfig()));
8
+ router.get('/api/licos/auth/me', async (req, res, next) => {
9
+ try {
10
+ const userToken = await projectAuth.userToken(req);
11
+ res.json(await getCurrentUser({ userToken }));
12
+ } catch (error) {
13
+ if (error instanceof ApiError) res.status(error.status || 401).json({ error: error.message });
14
+ else next(error);
15
+ }
16
+ });
17
+
5
18
  // API 路由示例
6
19
  router.get('/api/hello', (req, res) => {
7
20
  res.json({
@@ -0,0 +1,17 @@
1
+ import { createProjectUserFetch } from '@kmlckj/licos-platform-sdk/browser';
2
+
3
+ let client: Promise<ReturnType<typeof createProjectUserFetch>> | undefined;
4
+
5
+ async function loadClient() {
6
+ const previewBase = (window as Window & { __LICOS_PREVIEW_BASE_PATH__?: string }).__LICOS_PREVIEW_BASE_PATH__;
7
+ const base = new URL((previewBase || import.meta.env.BASE_URL).replace(/\/+$/, '') + '/', window.location.origin);
8
+ const response = await fetch(new URL('api/licos/auth/config', base));
9
+ if (!response.ok) throw new Error('Cannot load project login configuration');
10
+ const config = await response.json();
11
+ return createProjectUserFetch({ ...config, projectBaseUrl: base.href });
12
+ }
13
+
14
+ export async function projectUserFetch(path: string, init?: RequestInit) {
15
+ client ??= loadClient();
16
+ return (await client)(path, init);
17
+ }
@@ -46,3 +46,13 @@
46
46
  - 普通知识库、模型与积分接口默认使用项目身份;需要按网页登录用户执行时显式传 Token。数据库、存储、可观测性和 OAuth 应用管理使用项目身份。项目归属与平台签发的计费上下文独立保留。
47
47
  - CLI 用户操作默认按 `LICOS_CURRENT_USER_ID` 换 Token;HTTP 服务调用 CLI 时使用 `--token-stdin`。Dev CLI 可用 `--identity project` 明确选择项目身份。
48
48
  - 每个请求单独传 Token 或创建客户端,不把请求 Token、用户 ID 写进共享环境变量。
49
+
50
+ ## 编程项目登录身份
51
+
52
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
53
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
54
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
55
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
56
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
57
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
58
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -138,3 +138,13 @@ MES、ERP、审批等有副作用的节点必须使用稳定幂等键。推荐
138
138
  ## 项目上下文
139
139
 
140
140
  项目内的 `AGENTS.md` 用于记录可由用户维护的项目上下文,例如业务目标、节点清单、输入输出样例和测试方式。
141
+
142
+ ## 编程项目登录身份
143
+
144
+ - 有内置登录时使用内置登录会话;没有内置登录时使用当前 LICOS 网页登录。内置登录未登录或过期时不能切换成平台用户。
145
+ - Node 服务端使用 `createProjectAuth({ mode: 'builtin', resolveBuiltinToken })` 或 `createProjectAuth({ mode: 'platform' })`,每次请求调用 `await projectAuth.userToken(request)`。内置解析器必须读取已有认证会话并返回用户已授权的 LICOS 凭证。
146
+ - 无内置登录的浏览器用户接口使用 `@kmlckj/licos-platform-sdk/browser` 的 `createProjectUserFetch`:平台登录桥领取一次性票据,项目后端兑换 Token。不要直接读取跨域平台 localStorage,不在 URL 中传 Token,不修改全局 fetch。项目级 API 保持原有请求方法。
147
+ - Python 使用 `ProjectAuth`;Agent/Workflow 通过 `config/licos-auth.json` 配置模式,内置登录设置 `resolver: "模块:函数"`,业务代码使用 `ctx.identity.user_token`。
148
+ - 当前用户、企业知识库、本体用户操作显式传 `userToken`/`user_token`。模型、积分和普通知识库按业务选择用户或项目身份。数据库、对象存储和可观测性继续使用项目身份。
149
+ - 沿用现有 OAuth 授权范围与接口权限。凭证无权访问目标接口时返回现有鉴权错误,不扩大权限或换用其他身份。
150
+ - 修改已有项目时先接它的现有登录机制,不能用新模板的默认平台模式覆盖。真实 Token 只存在于运行时请求/会话,不写入源代码、共享环境变量或 Agent 提示词。
@@ -0,0 +1,3 @@
1
+ {
2
+ "mode": "platform"
3
+ }
@@ -4,9 +4,9 @@ version = "0.1.0"
4
4
  description = "LICOS LangGraph workflow project"
5
5
  requires-python = ">=3.12"
6
6
  dependencies = [
7
- "licos-agent-runtime>=0.5.1",
8
- "licos-platform-sdk>=0.7.1",
9
- "licos-dev-sdk>=0.6.1",
7
+ "licos-agent-runtime>=0.5.3",
8
+ "licos-platform-sdk>=0.7.3",
9
+ "licos-dev-sdk>=0.6.3",
10
10
  ]
11
11
 
12
12
  [tool.uv]
@@ -1,3 +1,3 @@
1
- licos-agent-runtime>=0.5.1
2
- licos-platform-sdk>=0.7.1
3
- licos-dev-sdk>=0.6.1
1
+ licos-agent-runtime>=0.5.3
2
+ licos-platform-sdk>=0.7.3
3
+ licos-dev-sdk>=0.6.3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kmlckj/licos-ai-cli",
3
- "version": "1.6.1",
3
+ "version": "1.6.2",
4
4
  "description": "LICOS AI coding workspace CLI - project template engine and dev tools",
5
5
  "license": "MIT",
6
6
  "author": "kmlckj",