@m1a0rz/agent-identity 0.4.0 → 0.4.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.
- package/README-cn.md +34 -0
- package/README.md +34 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -6
- package/dist/scripts/demo-get-session.d.ts +15 -0
- package/dist/scripts/demo-get-session.d.ts.map +1 -0
- package/dist/scripts/demo-get-session.js +58 -0
- package/dist/src/actions/identity-actions.d.ts +74 -8
- package/dist/src/actions/identity-actions.d.ts.map +1 -1
- package/dist/src/actions/identity-actions.js +209 -83
- package/dist/src/commands/identity-commands.d.ts.map +1 -1
- package/dist/src/commands/identity-commands.js +139 -11
- package/dist/src/gateway/identity-session-methods.d.ts +67 -0
- package/dist/src/gateway/identity-session-methods.d.ts.map +1 -0
- package/dist/src/gateway/identity-session-methods.js +134 -0
- package/dist/src/hooks/after-tool-call.d.ts.map +1 -1
- package/dist/src/hooks/after-tool-call.js +12 -0
- package/dist/src/hooks/before-agent-start.d.ts +2 -0
- package/dist/src/hooks/before-agent-start.d.ts.map +1 -1
- package/dist/src/hooks/before-agent-start.js +33 -6
- package/dist/src/hooks/before-tool-call.d.ts +1 -0
- package/dist/src/hooks/before-tool-call.d.ts.map +1 -1
- package/dist/src/hooks/before-tool-call.js +29 -5
- package/dist/src/hooks/llm-input.d.ts.map +1 -1
- package/dist/src/hooks/llm-input.js +32 -4
- package/dist/src/hooks/sessions-send-propagation.d.ts.map +1 -1
- package/dist/src/hooks/sessions-send-propagation.js +1 -0
- package/dist/src/hooks/sessions-spawn-propagation.d.ts.map +1 -1
- package/dist/src/hooks/sessions-spawn-propagation.js +1 -0
- package/dist/src/hooks/tool-result-persist.d.ts +20 -0
- package/dist/src/hooks/tool-result-persist.d.ts.map +1 -0
- package/dist/src/hooks/tool-result-persist.js +50 -0
- package/dist/src/preflight/plugin-preflight.d.ts +55 -0
- package/dist/src/preflight/plugin-preflight.d.ts.map +1 -0
- package/dist/src/preflight/plugin-preflight.js +226 -0
- package/dist/src/preflight/plugin-state.d.ts +18 -0
- package/dist/src/preflight/plugin-state.d.ts.map +1 -0
- package/dist/src/preflight/plugin-state.js +19 -0
- package/dist/src/routes/oidc-login.js +2 -2
- package/dist/src/services/identity-client.d.ts +106 -1
- package/dist/src/services/identity-client.d.ts.map +1 -1
- package/dist/src/services/identity-client.js +123 -1
- package/dist/src/services/identity-credentials.d.ts +1 -1
- package/dist/src/services/identity-credentials.d.ts.map +1 -1
- package/dist/src/services/identity-credentials.js +32 -16
- package/dist/src/services/oidc-client.d.ts +12 -1
- package/dist/src/services/oidc-client.d.ts.map +1 -1
- package/dist/src/services/oidc-client.js +20 -3
- package/dist/src/services/session-refresh.d.ts +10 -0
- package/dist/src/services/session-refresh.d.ts.map +1 -1
- package/dist/src/services/session-refresh.js +29 -5
- package/dist/src/services/skill-contract-metadata.d.ts +35 -0
- package/dist/src/services/skill-contract-metadata.d.ts.map +1 -0
- package/dist/src/services/skill-contract-metadata.js +145 -0
- package/dist/src/services/skill-contract-renderer.d.ts +14 -0
- package/dist/src/services/skill-contract-renderer.d.ts.map +1 -0
- package/dist/src/services/skill-contract-renderer.js +120 -0
- package/dist/src/services/tip-propagation.d.ts +2 -0
- package/dist/src/services/tip-propagation.d.ts.map +1 -1
- package/dist/src/services/tip-propagation.js +4 -3
- package/dist/src/services/tip-with-refresh.d.ts +1 -1
- package/dist/src/services/tip-with-refresh.d.ts.map +1 -1
- package/dist/src/services/tip-with-refresh.js +24 -39
- package/dist/src/store/credential-store.d.ts +6 -1
- package/dist/src/store/credential-store.d.ts.map +1 -1
- package/dist/src/store/credential-store.js +3 -0
- package/dist/src/store/oidc-state-store.d.ts +3 -3
- package/dist/src/store/oidc-state-store.d.ts.map +1 -1
- package/dist/src/store/oidc-state-store.js +2 -2
- package/dist/src/store/sender-session-store.d.ts +8 -0
- package/dist/src/store/sender-session-store.d.ts.map +1 -1
- package/dist/src/store/sender-session-store.js +46 -11
- package/dist/src/store/skill-contract-store.d.ts +19 -0
- package/dist/src/store/skill-contract-store.d.ts.map +1 -0
- package/dist/src/store/skill-contract-store.js +65 -0
- package/dist/src/store/skill-path-store.d.ts +5 -0
- package/dist/src/store/skill-path-store.d.ts.map +1 -1
- package/dist/src/store/skill-path-store.js +13 -1
- package/dist/src/tools/identity-approve-tool.d.ts +2 -11
- package/dist/src/tools/identity-approve-tool.d.ts.map +1 -1
- package/dist/src/tools/identity-config-suggest.d.ts +2 -13
- package/dist/src/tools/identity-config-suggest.d.ts.map +1 -1
- package/dist/src/tools/identity-config.d.ts +2 -7
- package/dist/src/tools/identity-config.d.ts.map +1 -1
- package/dist/src/tools/identity-fetch.d.ts +2 -13
- package/dist/src/tools/identity-fetch.d.ts.map +1 -1
- package/dist/src/tools/identity-fetch.js +3 -3
- package/dist/src/tools/identity-get-role-credentials.d.ts +10 -0
- package/dist/src/tools/identity-get-role-credentials.d.ts.map +1 -0
- package/dist/src/tools/identity-get-role-credentials.js +56 -0
- package/dist/src/tools/identity-get-session-token.d.ts +8 -0
- package/dist/src/tools/identity-get-session-token.d.ts.map +1 -0
- package/dist/src/tools/identity-get-session-token.js +46 -0
- package/dist/src/tools/identity-get-tip-token.d.ts +8 -0
- package/dist/src/tools/identity-get-tip-token.d.ts.map +1 -0
- package/dist/src/tools/identity-get-tip-token.js +46 -0
- package/dist/src/tools/identity-list-credentials.d.ts +2 -11
- package/dist/src/tools/identity-list-credentials.d.ts.map +1 -1
- package/dist/src/tools/identity-list-credentials.js +4 -3
- package/dist/src/tools/identity-list-risk-patterns.d.ts +2 -7
- package/dist/src/tools/identity-list-risk-patterns.d.ts.map +1 -1
- package/dist/src/tools/identity-list-roles.d.ts +8 -0
- package/dist/src/tools/identity-list-roles.d.ts.map +1 -0
- package/dist/src/tools/identity-list-roles.js +43 -0
- package/dist/src/tools/identity-list-tips.d.ts +2 -7
- package/dist/src/tools/identity-list-tips.d.ts.map +1 -1
- package/dist/src/tools/identity-login.d.ts +2 -7
- package/dist/src/tools/identity-login.d.ts.map +1 -1
- package/dist/src/tools/identity-logout.d.ts +2 -7
- package/dist/src/tools/identity-logout.d.ts.map +1 -1
- package/dist/src/tools/identity-risk-check.d.ts +3 -17
- package/dist/src/tools/identity-risk-check.d.ts.map +1 -1
- package/dist/src/tools/identity-set-binding.d.ts +2 -10
- package/dist/src/tools/identity-set-binding.d.ts.map +1 -1
- package/dist/src/tools/identity-status.d.ts +2 -7
- package/dist/src/tools/identity-status.d.ts.map +1 -1
- package/dist/src/tools/identity-unset-binding.d.ts +2 -9
- package/dist/src/tools/identity-unset-binding.d.ts.map +1 -1
- package/dist/src/tools/identity-whoami.d.ts +2 -7
- package/dist/src/tools/identity-whoami.d.ts.map +1 -1
- package/dist/src/types.d.ts +21 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/derive-session-key.d.ts +11 -1
- package/dist/src/utils/derive-session-key.d.ts.map +1 -1
- package/dist/src/utils/derive-session-key.js +46 -6
- package/openclaw.plugin.json +18 -0
- package/package.json +33 -7
package/README-cn.md
CHANGED
|
@@ -193,6 +193,9 @@ openclaw plugins install --link .
|
|
|
193
193
|
| `credentialsFile` | string | 否 | 凭证 JSON 文件路径。默认 `VOLCENGINE_CREDENTIALS_FILE` 或 `/var/run/secrets/iam/credential` |
|
|
194
194
|
| `credentialsMetadataUrl` | string | 否 | 远程凭据拉取的完整 URL。与 `roleTrn` 同时配置时拉取后做 AssumeRole。404 时回退到 `credentialsFile` |
|
|
195
195
|
| `sessionToken` | string | 否 | STS 临时会话令牌(或 `VOLCENGINE_SESSION_TOKEN`) |
|
|
196
|
+
| `subagentTipPropagation` | boolean | 否 | 将 TIP 和 session 传播到子 agent。默认 false |
|
|
197
|
+
| `webchatSessionExchange` | boolean | 否 | 启用 `identity.session.put` / `identity.session.get` gateway WS 方法供 webchat 客户端使用。默认 false |
|
|
198
|
+
| `personalSessionMode` | boolean | 否 | 个人/单用户模式:TIP、OIDC session、凭据仅存储在 `agent:main:main`(不做按发送者或 per-channel-peer 隔离)。子 agent 会话不变。默认 false;多租户或群聊共享场景勿开启。 |
|
|
196
199
|
|
|
197
200
|
\* AK/SK 至少通过 `accessKeyId`+`secretAccessKey`、环境变量、`credentialsMetadataUrl`+`roleTrn` 或 `credentialsFile` 之一提供。
|
|
198
201
|
|
|
@@ -235,6 +238,37 @@ TIP token 通过 `GetWorkloadAccessTokenForJWT` 获取。工作负载行为:
|
|
|
235
238
|
|
|
236
239
|
**审批消息**(当高风险工具被拦截时):若要向飞书(或 Telegram、Slack 等)推送审批请求,请在 openclaw.json 中将 `session.dmScope` 设置为 `per-channel-peer` 或 `per-account-channel-peer`。默认 `session.dmScope: "main"` 时,sessionKey 不包含 channel/peer 信息,插件无法推导推送目标,审批消息不会推送。用户仍可在 agent 的错误回复中看到 block/approval_id;使用 `/identity approve <id>` 审批。
|
|
237
240
|
|
|
241
|
+
### WebChat Session Exchange(Gateway WS 方法)
|
|
242
|
+
|
|
243
|
+
当 `identity.webchatSessionExchange` 为 `true` 时,插件注册两个 gateway WebSocket 方法,允许 webchat 客户端直接注入和获取 session token,无需走 OIDC 重定向流程:
|
|
244
|
+
|
|
245
|
+
| 方法 | 参数 | 响应 | 描述 |
|
|
246
|
+
| --- | --- | --- | --- |
|
|
247
|
+
| `identity.session.put` | `{ sessionKey, idToken, refreshToken?, senderId?, channel? }` | `{ sub, expiresAt, effectiveSessionKey, hasTip }` | 将 OIDC id_token 注入到插件 session;可选传入 `refreshToken`(加密存储),用于静默续期。通过 `buildEffectiveSessionKey` 解析实际存储 key(与 hooks/commands 相同的隔离逻辑)。 |
|
|
248
|
+
| `identity.session.get` | `{ sessionKey, senderId?, channel? }` | `{ userToken, sub, expiresAt, effectiveSessionKey, hasRefreshToken }` | 获取指定 session 已存储的 user token。`hasRefreshToken` 表示是否存有 refresh token;响应中不会返回 refresh token 明文。 |
|
|
249
|
+
|
|
250
|
+
- `senderId` 默认值为 `"openclaw-control-ui"`。对于 main session,实际存储 key 为 `agent:main:main:user:<senderId>`。
|
|
251
|
+
- `channel` 可选;当 session 来源于可发送消息的渠道(feishu、telegram 等)时传入,可启用 per-channel-peer key 提升。
|
|
252
|
+
|
|
253
|
+
两个方法均**限制为 webchat WS 连接**(`isWebchatConnect` 检查),非 webchat 客户端会收到 `FORBIDDEN` 错误。
|
|
254
|
+
|
|
255
|
+
**配置:**
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{
|
|
259
|
+
"identity": {
|
|
260
|
+
"webchatSessionExchange": true
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**典型流程(BFF → webchat → plugin):**
|
|
266
|
+
|
|
267
|
+
1. BFF 完成 3LO 登录并获取用户的 OIDC `id_token`
|
|
268
|
+
2. Webchat 客户端调用 `identity.session.put`,传入 session key 和 `id_token`(若需静默续期,可一并传入 token 响应中的 `refresh_token` 作为 `refreshToken`)
|
|
269
|
+
3. 插件校验 token,存储 session,并获取 TIP
|
|
270
|
+
4. 后续该 session 中的 agent 运行拥有有效身份——无需手动登录
|
|
271
|
+
|
|
238
272
|
### WebChat / TUI
|
|
239
273
|
|
|
240
274
|
用户从 WebChat 或 TUI 运行 `/identity` 时,跟进消息不会投递;插件无 API 推送至这些渠道。请使用 `/identity status` 确认结果。
|
package/README.md
CHANGED
|
@@ -193,6 +193,9 @@ Add to `openclaw.json` under `plugins.entries.agent-identity.config`:
|
|
|
193
193
|
| `credentialsFile` | string | No | Path to credential JSON. Default: `VOLCENGINE_CREDENTIALS_FILE` or `/var/run/secrets/iam/credential` |
|
|
194
194
|
| `credentialsMetadataUrl` | string | No | Full URL for remote credential fetch. When set with `roleTrn`, fetches then AssumeRole. 404 falls through to `credentialsFile` |
|
|
195
195
|
| `sessionToken` | string | No | STS session token (or `VOLCENGINE_SESSION_TOKEN`) |
|
|
196
|
+
| `subagentTipPropagation` | boolean | No | Propagate TIP and session to subagents. Default false |
|
|
197
|
+
| `webchatSessionExchange` | boolean | No | Enable `identity.session.put` / `identity.session.get` gateway WS methods for webchat clients. Default false |
|
|
198
|
+
| `personalSessionMode` | boolean | No | Single-user mode: TIP, OIDC session, and credentials are stored only under `agent:main:main` (no per-sender or per-channel-peer keys). Subagent sessions unchanged. Default false — do not enable for multi-tenant or shared groups. |
|
|
196
199
|
|
|
197
200
|
\* AK/SK must be provided via `accessKeyId`+`secretAccessKey`, environment variables, `credentialsMetadataUrl`+`roleTrn`, or `credentialsFile`.
|
|
198
201
|
|
|
@@ -235,6 +238,37 @@ Login success and credential fetch follow-up messages (e.g. "✓ Credential for
|
|
|
235
238
|
|
|
236
239
|
**Approval messages** (when a high-risk tool is blocked): For approval requests to be delivered to Feishu (or Telegram, Slack, etc.), set `session.dmScope` to `per-channel-peer` or `per-account-channel-peer` in openclaw.json. With default `session.dmScope: "main"`, the sessionKey does not include channel/peer info, so the plugin cannot derive a delivery target and approval messages are not pushed. The user will still see the block/approval_id in the agent's error reply; use `/identity approve <id>` to approve.
|
|
237
240
|
|
|
241
|
+
### WebChat Session Exchange (Gateway WS Methods)
|
|
242
|
+
|
|
243
|
+
When `identity.webchatSessionExchange` is `true`, the plugin registers two gateway WebSocket methods for webchat clients to inject and retrieve session tokens without going through the OIDC redirect flow:
|
|
244
|
+
|
|
245
|
+
| Method | Params | Response | Description |
|
|
246
|
+
| --- | --- | --- | --- |
|
|
247
|
+
| `identity.session.put` | `{ sessionKey, idToken, refreshToken?, senderId?, channel? }` | `{ sub, expiresAt, effectiveSessionKey, hasTip }` | Inject an OIDC id_token into a plugin session; optional `refreshToken` is stored encrypted for silent token renewal. Resolves effective storage key via `buildEffectiveSessionKey` (same sender isolation as hooks/commands). |
|
|
248
|
+
| `identity.session.get` | `{ sessionKey, senderId?, channel? }` | `{ userToken, sub, expiresAt, effectiveSessionKey, hasRefreshToken }` | Retrieve the stored user token for a session. `hasRefreshToken` indicates whether a refresh token is stored; the refresh token value is never returned. |
|
|
249
|
+
|
|
250
|
+
- `senderId` defaults to `"openclaw-control-ui"`. The effective storage key is `agent:main:main:user:<senderId>` for main sessions.
|
|
251
|
+
- `channel` is optional; when the session originates from a sendable channel (feishu, telegram, etc.), pass it to enable per-channel-peer key promotion.
|
|
252
|
+
|
|
253
|
+
Both methods are **restricted to webchat WS connections only** (`isWebchatConnect` check). Non-webchat clients receive a `FORBIDDEN` error.
|
|
254
|
+
|
|
255
|
+
**Config:**
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{
|
|
259
|
+
"identity": {
|
|
260
|
+
"webchatSessionExchange": true
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Typical flow (BFF → webchat → plugin):**
|
|
266
|
+
|
|
267
|
+
1. BFF completes 3LO login and obtains an OIDC `id_token` for the user
|
|
268
|
+
2. Webchat client calls `identity.session.put` with the session key and `id_token` (optionally `refreshToken` from the token response if silent renewal is desired)
|
|
269
|
+
3. Plugin verifies the token, stores the session, and acquires TIP
|
|
270
|
+
4. Subsequent agent runs in that session have a valid identity — no manual login needed
|
|
271
|
+
|
|
238
272
|
### WebChat / TUI
|
|
239
273
|
|
|
240
274
|
Follow-up messages (login success, credential fetch done) are not delivered when the user runs `/identity` from WebChat or TUI; the plugin has no API to push to those channels. Use `/identity status` to confirm results.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAkF7D,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,QA8etD"}
|
package/dist/index.js
CHANGED
|
@@ -13,15 +13,18 @@
|
|
|
13
13
|
* See the License for the specific language governing permissions and
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
|
+
import { runPluginPreflight } from "./src/preflight/plugin-preflight.js";
|
|
17
|
+
import { pluginState } from "./src/preflight/plugin-state.js";
|
|
16
18
|
import { createIdentityCommand, createIdCommand } from "./src/commands/identity-commands.js";
|
|
17
19
|
import { createBeforeAgentStartHandler } from "./src/hooks/before-agent-start.js";
|
|
18
20
|
import { createLlmInputHandler } from "./src/hooks/llm-input.js";
|
|
19
21
|
import { createSessionsSendPropagationHandler } from "./src/hooks/sessions-send-propagation.js";
|
|
20
22
|
import { createSessionsSpawnPropagationHandler } from "./src/hooks/sessions-spawn-propagation.js";
|
|
21
23
|
import { createSubagentEndedCleanupHandler } from "./src/hooks/subagent-ended-cleanup.js";
|
|
22
|
-
import { setSender, clearSender } from "./src/store/sender-session-store.js";
|
|
24
|
+
import { setSender, clearSender, setPersonalSessionMode } from "./src/store/sender-session-store.js";
|
|
23
25
|
import { deriveSessionKey, needsSenderIsolation, } from "./src/utils/derive-session-key.js";
|
|
24
26
|
import { createBeforeToolCallHandler } from "./src/hooks/before-tool-call.js";
|
|
27
|
+
import { createToolResultPersistHandler } from "./src/hooks/tool-result-persist.js";
|
|
25
28
|
import { createAfterToolCallHandler } from "./src/hooks/after-tool-call.js";
|
|
26
29
|
import * as skillPathStore from "./src/store/skill-path-store.js";
|
|
27
30
|
import { createOIDCCallbackHandler, createOIDCCallbackHandlerLazy, } from "./src/routes/oidc-login.js";
|
|
@@ -34,7 +37,11 @@ import { createIdentityConfigSuggestTool } from "./src/tools/identity-config-sug
|
|
|
34
37
|
import { createIdentityListRiskPatternsTool } from "./src/tools/identity-list-risk-patterns.js";
|
|
35
38
|
import { createIdentityRiskCheckTool } from "./src/tools/identity-risk-check.js";
|
|
36
39
|
import { createIdentityFetchTool } from "./src/tools/identity-fetch.js";
|
|
40
|
+
import { createIdentityGetRoleCredentialsTool } from "./src/tools/identity-get-role-credentials.js";
|
|
41
|
+
import { createIdentityGetTipTokenTool } from "./src/tools/identity-get-tip-token.js";
|
|
42
|
+
import { createIdentityGetSessionTokenTool } from "./src/tools/identity-get-session-token.js";
|
|
37
43
|
import { createIdentityListCredentialsTool } from "./src/tools/identity-list-credentials.js";
|
|
44
|
+
import { createIdentityListRolesTool } from "./src/tools/identity-list-roles.js";
|
|
38
45
|
import { createIdentityListTipsTool } from "./src/tools/identity-list-tips.js";
|
|
39
46
|
import { createIdentityLoginTool } from "./src/tools/identity-login.js";
|
|
40
47
|
import { createIdentityLogoutTool } from "./src/tools/identity-logout.js";
|
|
@@ -43,6 +50,7 @@ import { createIdentityStatusTool } from "./src/tools/identity-status.js";
|
|
|
43
50
|
import { createIdentityUnsetBindingTool } from "./src/tools/identity-unset-binding.js";
|
|
44
51
|
import { createIdentityWhoamiTool } from "./src/tools/identity-whoami.js";
|
|
45
52
|
import { parseSessionKeyToDeliveryTarget, } from "./src/utils/derive-session-key.js";
|
|
53
|
+
import { createSessionPutHandler, createSessionGetHandler, } from "./src/gateway/identity-session-methods.js";
|
|
46
54
|
import { logDebug, logInfo, logWarn } from "./src/utils/logger.js";
|
|
47
55
|
import { initEncryptionKey } from "./src/store/encryption.js";
|
|
48
56
|
const PLUGIN_STORE_DIR = "~/.openclaw/plugins/identity";
|
|
@@ -69,6 +77,10 @@ export default function register(api) {
|
|
|
69
77
|
const storeDir = api.resolvePath(PLUGIN_STORE_DIR);
|
|
70
78
|
initEncryptionKey(storeDir);
|
|
71
79
|
const identityCfg = pluginConfig.identity;
|
|
80
|
+
setPersonalSessionMode(identityCfg?.personalSessionMode === true);
|
|
81
|
+
if (identityCfg?.personalSessionMode) {
|
|
82
|
+
logInfo(api.logger, "identity.personalSessionMode: non-subagent TIP/session/credentials use agent:main:main only");
|
|
83
|
+
}
|
|
72
84
|
const hasIdentity = hasAnyIdentityConfig(identityCfg);
|
|
73
85
|
const userpool = pluginConfig.userpool;
|
|
74
86
|
const identityClient = hasIdentity
|
|
@@ -95,6 +107,9 @@ export default function register(api) {
|
|
|
95
107
|
getResourceApiKey: async () => {
|
|
96
108
|
throw new Error("Identity not configured.");
|
|
97
109
|
},
|
|
110
|
+
getUserCredential: async () => {
|
|
111
|
+
throw new Error("Identity not configured.");
|
|
112
|
+
},
|
|
98
113
|
checkPermission: async () => {
|
|
99
114
|
throw new Error("Identity not configured.");
|
|
100
115
|
},
|
|
@@ -105,9 +120,24 @@ export default function register(api) {
|
|
|
105
120
|
PageNumber: 1,
|
|
106
121
|
PageSize: 20,
|
|
107
122
|
}),
|
|
123
|
+
listRoleCredentialProviders: async () => ({
|
|
124
|
+
RoleCredentialProviders: [],
|
|
125
|
+
TotalCount: 0,
|
|
126
|
+
PageNumber: 1,
|
|
127
|
+
PageSize: 20,
|
|
128
|
+
}),
|
|
129
|
+
getRoleCredentials: async () => {
|
|
130
|
+
throw new Error("Identity not configured.");
|
|
131
|
+
},
|
|
108
132
|
getUserPool: async () => {
|
|
109
133
|
throw new Error("Identity not configured.");
|
|
110
134
|
},
|
|
135
|
+
listIdentityProviders: async () => ({
|
|
136
|
+
pageNumber: 1,
|
|
137
|
+
pageSize: 10,
|
|
138
|
+
totalCount: 0,
|
|
139
|
+
data: [],
|
|
140
|
+
}),
|
|
111
141
|
listUserPools: async () => ({
|
|
112
142
|
pageNumber: 1,
|
|
113
143
|
pageSize: 10,
|
|
@@ -277,23 +307,29 @@ export default function register(api) {
|
|
|
277
307
|
getOidcConfigForRefresh: getOidcConfigForRefresh ?? undefined,
|
|
278
308
|
configWorkloadName: identityCfg?.workloadName,
|
|
279
309
|
identityClient: hasIdentity ? identityClient : undefined,
|
|
310
|
+
workloadPoolName: identityCfg?.workloadPoolName ?? "default",
|
|
311
|
+
userPoolName: userpool?.userPoolName,
|
|
280
312
|
logger: api.logger,
|
|
281
313
|
pluginConfig,
|
|
282
314
|
sendCredentialMessage: sendToSession,
|
|
283
315
|
};
|
|
284
316
|
api.registerCommand(createIdentityCommand(identityCommandsDeps));
|
|
285
317
|
api.registerCommand(createIdCommand(identityCommandsDeps));
|
|
286
|
-
logInfo(api.logger, "commands /identity, /id (login, status, logout, list-
|
|
318
|
+
logInfo(api.logger, "commands /identity, /id (login, status, logout, list, list-roles, list-tips, fetch, set, unset); HTTP callback /identity/oauth/callback (credential OAuth uses Identity callback)");
|
|
287
319
|
// Tools (share deps with commands). Optional = only included when agent allowlist explicitly adds them.
|
|
288
320
|
api.registerTool(createIdentityWhoamiTool(identityCommandsDeps), { optional: false });
|
|
289
321
|
api.registerTool(createIdentityLogoutTool(identityCommandsDeps), { optional: false });
|
|
290
322
|
api.registerTool(createIdentityStatusTool(identityCommandsDeps), { optional: false });
|
|
291
323
|
api.registerTool(createIdentityLoginTool(identityCommandsDeps), { optional: false });
|
|
292
324
|
api.registerTool(createIdentityListCredentialsTool(identityCommandsDeps), { optional: false });
|
|
325
|
+
api.registerTool(createIdentityListRolesTool(identityCommandsDeps), { optional: false });
|
|
293
326
|
api.registerTool(createIdentityListTipsTool(identityCommandsDeps), { optional: false });
|
|
294
327
|
api.registerTool(createIdentityConfigTool(identityCommandsDeps), { optional: false });
|
|
295
328
|
api.registerTool(createIdentityConfigSuggestTool(), { optional: false });
|
|
296
329
|
api.registerTool(createIdentityFetchTool(identityCommandsDeps), { optional: false });
|
|
330
|
+
api.registerTool(createIdentityGetRoleCredentialsTool(identityCommandsDeps), { optional: false });
|
|
331
|
+
api.registerTool(createIdentityGetTipTokenTool(identityCommandsDeps), { optional: false });
|
|
332
|
+
api.registerTool(createIdentityGetSessionTokenTool(identityCommandsDeps), { optional: false });
|
|
297
333
|
api.registerTool(createIdentitySetBindingTool(identityCommandsDeps), { optional: true });
|
|
298
334
|
api.registerTool(createIdentityUnsetBindingTool(identityCommandsDeps), { optional: true });
|
|
299
335
|
api.registerTool(createIdentityRiskCheckTool({ pluginConfig, logger: api.logger }), { optional: true });
|
|
@@ -390,12 +426,12 @@ export default function register(api) {
|
|
|
390
426
|
logger: api.logger,
|
|
391
427
|
}));
|
|
392
428
|
if (skillReadCheck) {
|
|
393
|
-
api.on("session_end", (
|
|
394
|
-
if (
|
|
395
|
-
skillPathStore.clearSessionById(
|
|
429
|
+
api.on("session_end", (event) => {
|
|
430
|
+
if (event.sessionId)
|
|
431
|
+
skillPathStore.clearSessionById(event.sessionId);
|
|
396
432
|
});
|
|
397
433
|
}
|
|
398
|
-
// before_tool_call: authz, credential injection, group sender context
|
|
434
|
+
// before_tool_call: authz, credential injection, group sender context, contract injection
|
|
399
435
|
api.on("before_tool_call", createBeforeToolCallHandler({
|
|
400
436
|
storeDir,
|
|
401
437
|
identityClient: hasIdentity ? identityClient : undefined,
|
|
@@ -407,7 +443,56 @@ export default function register(api) {
|
|
|
407
443
|
identityService: hasIdentity ? identityService : undefined,
|
|
408
444
|
getOidcConfigForRefresh: getOidcConfigForRefresh ?? undefined,
|
|
409
445
|
configWorkloadName: identityCfg?.workloadName,
|
|
446
|
+
workspaceDir: api.resolvePath?.(".") ?? undefined,
|
|
410
447
|
}));
|
|
411
448
|
// Companion after_tool_call: restore env snapshot set by credential injection
|
|
412
449
|
api.on("after_tool_call", createAfterToolCallHandler({ logger: api.logger }));
|
|
450
|
+
api.on("tool_result_persist", createToolResultPersistHandler({ logger: api.logger }));
|
|
451
|
+
// Gateway WS methods: webchat session exchange (inject / retrieve user token)
|
|
452
|
+
if (identityCfg?.webchatSessionExchange && hasIdentity) {
|
|
453
|
+
const sessionMethodDeps = {
|
|
454
|
+
storeDir,
|
|
455
|
+
identityService,
|
|
456
|
+
getOidcConfigForRefresh: getOidcConfigForRefresh ?? undefined,
|
|
457
|
+
configWorkloadName: identityCfg?.workloadName,
|
|
458
|
+
logger: api.logger,
|
|
459
|
+
};
|
|
460
|
+
api.registerGatewayMethod("identity.session.put", createSessionPutHandler(sessionMethodDeps));
|
|
461
|
+
api.registerGatewayMethod("identity.session.get", createSessionGetHandler(sessionMethodDeps));
|
|
462
|
+
logInfo(api.logger, "gateway methods: identity.session.put, identity.session.get (webchat session exchange)");
|
|
463
|
+
}
|
|
464
|
+
// Preflight: run async after register() returns so startup is never blocked.
|
|
465
|
+
// On any failure, set pluginState.degraded so hooks skip all interception.
|
|
466
|
+
const authzEnabled = !!(authz?.agentCheck || authz?.toolCheck || authz?.requireRiskApproval);
|
|
467
|
+
runPluginPreflight({
|
|
468
|
+
identityClient,
|
|
469
|
+
identityService,
|
|
470
|
+
hasIdentity,
|
|
471
|
+
credentialConfig: identityCfg
|
|
472
|
+
? {
|
|
473
|
+
accessKeyId: identityCfg.accessKeyId,
|
|
474
|
+
secretAccessKey: identityCfg.secretAccessKey,
|
|
475
|
+
sessionToken: identityCfg.sessionToken,
|
|
476
|
+
credentialsFile: identityCfg.credentialsFile,
|
|
477
|
+
credentialsMetadataUrl: identityCfg.credentialsMetadataUrl,
|
|
478
|
+
roleTrn: identityCfg.roleTrn,
|
|
479
|
+
}
|
|
480
|
+
: undefined,
|
|
481
|
+
userpool: dynamicOidcEnabled
|
|
482
|
+
? { mode: "dynamic", userPoolName: userpool?.userPoolName }
|
|
483
|
+
: explicitOidcEnabled
|
|
484
|
+
? { mode: "explicit", discoveryUrl: userpool?.discoveryUrl }
|
|
485
|
+
: undefined,
|
|
486
|
+
workloadPoolName: identityCfg?.workloadPoolName,
|
|
487
|
+
authzEnabled,
|
|
488
|
+
namespaceName: authz?.namespaceName ?? "default",
|
|
489
|
+
logger: api.logger,
|
|
490
|
+
}).then((result) => {
|
|
491
|
+
if (!result.ok) {
|
|
492
|
+
pluginState.degraded = true;
|
|
493
|
+
pluginState.failures = result.failures;
|
|
494
|
+
}
|
|
495
|
+
}).catch((err) => {
|
|
496
|
+
logWarn(api.logger, `[identity] preflight threw unexpectedly: ${String(err)}`);
|
|
497
|
+
});
|
|
413
498
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo: read local sessions.json (with field-level decryption), resolve one sessionKey, print userToken.
|
|
3
|
+
*
|
|
4
|
+
* Same path as the plugin: initEncryptionKey(storeDir) then getSession(storeDir, sessionKey).
|
|
5
|
+
*
|
|
6
|
+
* Usage (after `pnpm build`):
|
|
7
|
+
* node dist/scripts/demo-get-session.js <sessionKey>
|
|
8
|
+
* node dist/scripts/demo-get-session.js <storeDir> <sessionKey>
|
|
9
|
+
* pnpm demo:get-session -- <sessionKey>
|
|
10
|
+
*
|
|
11
|
+
* Flags:
|
|
12
|
+
* --print-token Print full userToken (default: only prefix + length)
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=demo-get-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo-get-session.d.ts","sourceRoot":"","sources":["../../scripts/demo-get-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo: read local sessions.json (with field-level decryption), resolve one sessionKey, print userToken.
|
|
3
|
+
*
|
|
4
|
+
* Same path as the plugin: initEncryptionKey(storeDir) then getSession(storeDir, sessionKey).
|
|
5
|
+
*
|
|
6
|
+
* Usage (after `pnpm build`):
|
|
7
|
+
* node dist/scripts/demo-get-session.js <sessionKey>
|
|
8
|
+
* node dist/scripts/demo-get-session.js <storeDir> <sessionKey>
|
|
9
|
+
* pnpm demo:get-session -- <sessionKey>
|
|
10
|
+
*
|
|
11
|
+
* Flags:
|
|
12
|
+
* --print-token Print full userToken (default: only prefix + length)
|
|
13
|
+
*/
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import os from "node:os";
|
|
16
|
+
import { initEncryptionKey } from "../src/store/encryption.js";
|
|
17
|
+
import { getSession } from "../src/store/session-store.js";
|
|
18
|
+
function usage() {
|
|
19
|
+
console.error(`Usage: demo-get-session [--print-token] <sessionKey>
|
|
20
|
+
demo-get-session [--print-token] <storeDir> <sessionKey>
|
|
21
|
+
|
|
22
|
+
storeDir defaults to ~/.openclaw/plugins/identity`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
async function main() {
|
|
26
|
+
const printToken = process.argv.includes("--print-token");
|
|
27
|
+
const args = process.argv.slice(2).filter((a) => a !== "--print-token");
|
|
28
|
+
if (args.length < 1 || args.length > 2)
|
|
29
|
+
usage();
|
|
30
|
+
const storeDir = args.length === 2
|
|
31
|
+
? path.resolve(args[0])
|
|
32
|
+
: path.join(os.homedir(), ".openclaw", "plugins", "identity");
|
|
33
|
+
const sessionKey = args.length === 2 ? args[1] : args[0];
|
|
34
|
+
initEncryptionKey(storeDir);
|
|
35
|
+
const session = await getSession(storeDir, sessionKey);
|
|
36
|
+
if (!session) {
|
|
37
|
+
console.log(JSON.stringify({ ok: false, reason: "no session or expired", storeDir, sessionKey }, null, 2));
|
|
38
|
+
process.exit(2);
|
|
39
|
+
}
|
|
40
|
+
const tokenPreview = printToken
|
|
41
|
+
? session.userToken
|
|
42
|
+
: `${session.userToken.slice(0, 12)}… (${session.userToken.length} chars)`;
|
|
43
|
+
console.log(JSON.stringify({
|
|
44
|
+
ok: true,
|
|
45
|
+
storeDir,
|
|
46
|
+
sessionKey,
|
|
47
|
+
sub: session.sub,
|
|
48
|
+
loginAt: session.loginAt,
|
|
49
|
+
expiresAt: session.expiresAt ?? null,
|
|
50
|
+
hasRefreshToken: Boolean(session.refreshToken),
|
|
51
|
+
claims: session.claims ?? null,
|
|
52
|
+
userToken: tokenPreview,
|
|
53
|
+
}, null, 2));
|
|
54
|
+
}
|
|
55
|
+
main().catch((err) => {
|
|
56
|
+
console.error(err);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
});
|
|
@@ -15,6 +15,10 @@ export type OIDCConfigForCommand = {
|
|
|
15
15
|
clientSecret?: string;
|
|
16
16
|
scope?: string;
|
|
17
17
|
callbackUrl: string;
|
|
18
|
+
/** UserPool UID (available when resolved dynamically via resolveOIDCConfig). */
|
|
19
|
+
poolUid?: string;
|
|
20
|
+
/** First identity provider cached at config resolve time. */
|
|
21
|
+
identityProvider?: string;
|
|
18
22
|
};
|
|
19
23
|
export type IdentityActionsLogger = {
|
|
20
24
|
info?: (msg: string) => void;
|
|
@@ -28,11 +32,13 @@ export type IdentityActionsDeps = {
|
|
|
28
32
|
getOidcConfigForRefresh?: () => Promise<OIDCConfigForRefresh>;
|
|
29
33
|
configWorkloadName?: string;
|
|
30
34
|
identityClient?: IdentityClientInterface;
|
|
35
|
+
workloadPoolName?: string;
|
|
36
|
+
userPoolName?: string;
|
|
31
37
|
logger?: IdentityActionsLogger;
|
|
32
38
|
pluginConfig?: PluginConfig;
|
|
33
39
|
sendCredentialMessage?: (targetOrSessionKey: SessionKeyDeliveryTarget | string, text: string) => Promise<void>;
|
|
34
40
|
};
|
|
35
|
-
export type FetchFlow = "oauth2-user" | "oauth2-m2m" | "apikey";
|
|
41
|
+
export type FetchFlow = "oauth2-user" | "oauth2-m2m" | "apikey" | "user";
|
|
36
42
|
export type StatusResult = {
|
|
37
43
|
loggedIn: boolean;
|
|
38
44
|
sub: string | null;
|
|
@@ -69,14 +75,15 @@ export type LogoutResult = {
|
|
|
69
75
|
ok: boolean;
|
|
70
76
|
};
|
|
71
77
|
export declare function runLogout(deps: IdentityActionsDeps, sessionKey: string): Promise<LogoutResult>;
|
|
78
|
+
export type ProviderRow = {
|
|
79
|
+
name: string;
|
|
80
|
+
type: string;
|
|
81
|
+
flow?: string;
|
|
82
|
+
status: string;
|
|
83
|
+
binding?: string;
|
|
84
|
+
};
|
|
72
85
|
export type ListCredentialsResult = {
|
|
73
|
-
providers:
|
|
74
|
-
name: string;
|
|
75
|
-
type: string;
|
|
76
|
-
flow?: string;
|
|
77
|
-
status: string;
|
|
78
|
-
binding?: string;
|
|
79
|
-
}>;
|
|
86
|
+
providers: ProviderRow[];
|
|
80
87
|
storedOnly: Array<{
|
|
81
88
|
name: string;
|
|
82
89
|
status: string;
|
|
@@ -89,8 +96,21 @@ export type ListCredentialsResult = {
|
|
|
89
96
|
export type ListCredentialsFilter = {
|
|
90
97
|
name?: string;
|
|
91
98
|
flow?: string;
|
|
99
|
+
type?: string;
|
|
92
100
|
};
|
|
93
101
|
export declare function runListCredentials(deps: IdentityActionsDeps, sessionKey: string, page?: number, filter?: ListCredentialsFilter): Promise<ListCredentialsResult>;
|
|
102
|
+
export type RoleProviderRow = {
|
|
103
|
+
name: string;
|
|
104
|
+
identitySource?: string;
|
|
105
|
+
};
|
|
106
|
+
export type ListRoleCredentialsResult = {
|
|
107
|
+
providers: RoleProviderRow[];
|
|
108
|
+
page: number;
|
|
109
|
+
hasMore: boolean;
|
|
110
|
+
};
|
|
111
|
+
export declare function runListRoleCredentials(deps: IdentityActionsDeps, sessionKey: string, filter?: {
|
|
112
|
+
name?: string;
|
|
113
|
+
}): Promise<ListRoleCredentialsResult>;
|
|
94
114
|
export type ListTipsResult = {
|
|
95
115
|
tips: Array<{
|
|
96
116
|
sessionKey: string;
|
|
@@ -148,4 +168,50 @@ export type UnsetBindingResult = {
|
|
|
148
168
|
export declare function runUnsetBinding(deps: IdentityActionsDeps, sessionKey: string, params: {
|
|
149
169
|
provider: string;
|
|
150
170
|
}): Promise<UnsetBindingResult>;
|
|
171
|
+
export type GetRoleCredentialsActionResult = {
|
|
172
|
+
kind: "success";
|
|
173
|
+
credentials: {
|
|
174
|
+
AccessKeyId: string;
|
|
175
|
+
SecretAccessKey: string;
|
|
176
|
+
SessionToken: string;
|
|
177
|
+
Expiration?: string;
|
|
178
|
+
};
|
|
179
|
+
} | {
|
|
180
|
+
kind: "error";
|
|
181
|
+
message: string;
|
|
182
|
+
};
|
|
183
|
+
export declare function runGetRoleCredentials(deps: IdentityActionsDeps, sessionKey: string, params: {
|
|
184
|
+
providerName: string;
|
|
185
|
+
useTip?: boolean;
|
|
186
|
+
config?: import("openclaw/plugin-sdk").OpenClawConfig;
|
|
187
|
+
}): Promise<GetRoleCredentialsActionResult>;
|
|
188
|
+
export type GetTipTokenResult = {
|
|
189
|
+
kind: "success";
|
|
190
|
+
tipToken: string;
|
|
191
|
+
sub: string;
|
|
192
|
+
issuedAt: number;
|
|
193
|
+
expiresAt: number;
|
|
194
|
+
} | {
|
|
195
|
+
kind: "error";
|
|
196
|
+
message: string;
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Return the current TIP JWT for the session (refresh/obtain via user token if needed).
|
|
200
|
+
*/
|
|
201
|
+
export declare function runGetTipToken(deps: IdentityActionsDeps, sessionKey: string, config?: OpenClawConfig): Promise<GetTipTokenResult>;
|
|
202
|
+
export type GetSessionTokenResult = {
|
|
203
|
+
kind: "success";
|
|
204
|
+
/** OIDC id_token stored for the session. */
|
|
205
|
+
sessionIdToken: string;
|
|
206
|
+
sub: string;
|
|
207
|
+
loginAt: number;
|
|
208
|
+
expiresAt?: number;
|
|
209
|
+
} | {
|
|
210
|
+
kind: "error";
|
|
211
|
+
message: string;
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Return the OIDC id_token (user / session identity token) for the session.
|
|
215
|
+
*/
|
|
216
|
+
export declare function runGetSessionToken(deps: IdentityActionsDeps, sessionKey: string): Promise<GetSessionTokenResult>;
|
|
151
217
|
//# sourceMappingURL=identity-actions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-actions.d.ts","sourceRoot":"","sources":["../../../src/actions/identity-actions.ts"],"names":[],"mappings":"AAgBA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"identity-actions.d.ts","sourceRoot":"","sources":["../../../src/actions/identity-actions.ts"],"names":[],"mappings":"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"}
|