@wiro-ai/wiro-mcp 1.4.0 → 1.5.0
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.md +50 -17
- package/dist/client.d.ts +25 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +129 -29
- package/dist/client.js.map +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +24 -17
- package/dist/instructions.js.map +1 -1
- package/dist/playbooks.d.ts.map +1 -1
- package/dist/playbooks.js +61 -48
- package/dist/playbooks.js.map +1 -1
- package/dist/prompts.d.ts.map +1 -1
- package/dist/prompts.js +4 -3
- package/dist/prompts.js.map +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +3 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/apply-agent-skills.d.ts.map +1 -1
- package/dist/tools/apply-agent-skills.js +400 -88
- package/dist/tools/apply-agent-skills.js.map +1 -1
- package/dist/tools/bind-agent-project.d.ts +4 -0
- package/dist/tools/bind-agent-project.d.ts.map +1 -0
- package/dist/tools/bind-agent-project.js +403 -0
- package/dist/tools/bind-agent-project.js.map +1 -0
- package/dist/tools/cancel-agent-message.d.ts.map +1 -1
- package/dist/tools/cancel-agent-message.js +6 -3
- package/dist/tools/cancel-agent-message.js.map +1 -1
- package/dist/tools/cancel-task.js +3 -3
- package/dist/tools/cancel-task.js.map +1 -1
- package/dist/tools/clone-workflow.d.ts.map +1 -1
- package/dist/tools/clone-workflow.js +5 -4
- package/dist/tools/clone-workflow.js.map +1 -1
- package/dist/tools/connect-agent-oauth.d.ts.map +1 -1
- package/dist/tools/connect-agent-oauth.js +144 -44
- package/dist/tools/connect-agent-oauth.js.map +1 -1
- package/dist/tools/control-agent.d.ts.map +1 -1
- package/dist/tools/control-agent.js +133 -45
- package/dist/tools/control-agent.js.map +1 -1
- package/dist/tools/create-workflow.d.ts +9 -6
- package/dist/tools/create-workflow.d.ts.map +1 -1
- package/dist/tools/create-workflow.js +13 -13
- package/dist/tools/create-workflow.js.map +1 -1
- package/dist/tools/delete-agent-session.d.ts.map +1 -1
- package/dist/tools/delete-agent-session.js +20 -14
- package/dist/tools/delete-agent-session.js.map +1 -1
- package/dist/tools/delete-agent.d.ts.map +1 -1
- package/dist/tools/delete-agent.js +14 -10
- package/dist/tools/delete-agent.js.map +1 -1
- package/dist/tools/delete-workflow.d.ts.map +1 -1
- package/dist/tools/delete-workflow.js +6 -5
- package/dist/tools/delete-workflow.js.map +1 -1
- package/dist/tools/deploy-agent.d.ts.map +1 -1
- package/dist/tools/deploy-agent.js +215 -47
- package/dist/tools/deploy-agent.js.map +1 -1
- package/dist/tools/disconnect-agent-oauth.d.ts.map +1 -1
- package/dist/tools/disconnect-agent-oauth.js +32 -12
- package/dist/tools/disconnect-agent-oauth.js.map +1 -1
- package/dist/tools/get-account.d.ts.map +1 -1
- package/dist/tools/get-account.js +157 -49
- package/dist/tools/get-account.js.map +1 -1
- package/dist/tools/get-agent-activity.d.ts.map +1 -1
- package/dist/tools/get-agent-activity.js +186 -36
- package/dist/tools/get-agent-activity.js.map +1 -1
- package/dist/tools/get-agent-conversation.d.ts.map +1 -1
- package/dist/tools/get-agent-conversation.js +65 -39
- package/dist/tools/get-agent-conversation.js.map +1 -1
- package/dist/tools/get-agent-message.d.ts.map +1 -1
- package/dist/tools/get-agent-message.js +6 -4
- package/dist/tools/get-agent-message.js.map +1 -1
- package/dist/tools/get-agent-template.d.ts.map +1 -1
- package/dist/tools/get-agent-template.js +33 -17
- package/dist/tools/get-agent-template.js.map +1 -1
- package/dist/tools/get-model-schema.d.ts.map +1 -1
- package/dist/tools/get-model-schema.js +7 -5
- package/dist/tools/get-model-schema.js.map +1 -1
- package/dist/tools/get-my-agent.d.ts.map +1 -1
- package/dist/tools/get-my-agent.js +54 -11
- package/dist/tools/get-my-agent.js.map +1 -1
- package/dist/tools/get-playbook.d.ts.map +1 -1
- package/dist/tools/get-playbook.js +3 -2
- package/dist/tools/get-playbook.js.map +1 -1
- package/dist/tools/get-task-price.d.ts +1 -1
- package/dist/tools/get-task-price.d.ts.map +1 -1
- package/dist/tools/get-task-price.js +29 -8
- package/dist/tools/get-task-price.js.map +1 -1
- package/dist/tools/get-task.d.ts.map +1 -1
- package/dist/tools/get-task.js +25 -9
- package/dist/tools/get-task.js.map +1 -1
- package/dist/tools/get-workflow.d.ts.map +1 -1
- package/dist/tools/get-workflow.js +46 -21
- package/dist/tools/get-workflow.js.map +1 -1
- package/dist/tools/index.d.ts +4 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +10 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/kill-task.js +3 -3
- package/dist/tools/kill-task.js.map +1 -1
- package/dist/tools/list-agent-skills.d.ts.map +1 -1
- package/dist/tools/list-agent-skills.js +5 -4
- package/dist/tools/list-agent-skills.js.map +1 -1
- package/dist/tools/list-agent-templates.js +4 -4
- package/dist/tools/list-agent-templates.js.map +1 -1
- package/dist/tools/list-my-agents.d.ts.map +1 -1
- package/dist/tools/list-my-agents.js +14 -8
- package/dist/tools/list-my-agents.js.map +1 -1
- package/dist/tools/list-projects.d.ts +4 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +141 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-studio-results.js +3 -3
- package/dist/tools/list-studio-results.js.map +1 -1
- package/dist/tools/list-tasks.js +3 -3
- package/dist/tools/list-tasks.js.map +1 -1
- package/dist/tools/list-workflow-runs.d.ts.map +1 -1
- package/dist/tools/list-workflow-runs.js +6 -4
- package/dist/tools/list-workflow-runs.js.map +1 -1
- package/dist/tools/list-workflows.d.ts.map +1 -1
- package/dist/tools/list-workflows.js +7 -6
- package/dist/tools/list-workflows.js.map +1 -1
- package/dist/tools/manage-agent-billing.d.ts.map +1 -1
- package/dist/tools/manage-agent-billing.js +259 -87
- package/dist/tools/manage-agent-billing.js.map +1 -1
- package/dist/tools/manage-agent-custom-skill.d.ts.map +1 -1
- package/dist/tools/manage-agent-custom-skill.js +91 -21
- package/dist/tools/manage-agent-custom-skill.js.map +1 -1
- package/dist/tools/recommend-model.js +3 -3
- package/dist/tools/recommend-model.js.map +1 -1
- package/dist/tools/resume-workflow-run.d.ts.map +1 -1
- package/dist/tools/resume-workflow-run.js +3 -2
- package/dist/tools/resume-workflow-run.js.map +1 -1
- package/dist/tools/run-model.js +5 -5
- package/dist/tools/run-model.js.map +1 -1
- package/dist/tools/run-workflow.d.ts.map +1 -1
- package/dist/tools/run-workflow.js +3 -2
- package/dist/tools/run-workflow.js.map +1 -1
- package/dist/tools/save-workflow-from-agent.d.ts.map +1 -1
- package/dist/tools/save-workflow-from-agent.js +22 -20
- package/dist/tools/save-workflow-from-agent.js.map +1 -1
- package/dist/tools/schemas.d.ts +150 -127
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +76 -3
- package/dist/tools/schemas.js.map +1 -1
- package/dist/tools/search-docs.js +3 -3
- package/dist/tools/search-docs.js.map +1 -1
- package/dist/tools/search-models.d.ts.map +1 -1
- package/dist/tools/search-models.js +7 -4
- package/dist/tools/search-models.js.map +1 -1
- package/dist/tools/send-agent-message.d.ts.map +1 -1
- package/dist/tools/send-agent-message.js +32 -11
- package/dist/tools/send-agent-message.js.map +1 -1
- package/dist/tools/set-agent-credentials.d.ts.map +1 -1
- package/dist/tools/set-agent-credentials.js +60 -59
- package/dist/tools/set-agent-credentials.js.map +1 -1
- package/dist/tools/update-agent.d.ts.map +1 -1
- package/dist/tools/update-agent.js +59 -21
- package/dist/tools/update-agent.js.map +1 -1
- package/dist/tools/update-workflow.d.ts +205 -6
- package/dist/tools/update-workflow.d.ts.map +1 -1
- package/dist/tools/update-workflow.js +20 -7
- package/dist/tools/update-workflow.js.map +1 -1
- package/dist/tools/upload-file.d.ts.map +1 -1
- package/dist/tools/upload-file.js +13 -9
- package/dist/tools/upload-file.js.map +1 -1
- package/dist/tools/wait-for-task.d.ts.map +1 -1
- package/dist/tools/wait-for-task.js +23 -5
- package/dist/tools/wait-for-task.js.map +1 -1
- package/dist/tools/wait-for-workflow-run.d.ts +18 -18
- package/dist/tools/wait-for-workflow-run.d.ts.map +1 -1
- package/dist/tools/wait-for-workflow-run.js +7 -6
- package/dist/tools/wait-for-workflow-run.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/agent-catalog.d.ts +168 -139
- package/dist/utils/agent-catalog.d.ts.map +1 -1
- package/dist/utils/agent-catalog.js +34 -14
- package/dist/utils/agent-catalog.js.map +1 -1
- package/dist/utils/agent-config.d.ts +111 -8
- package/dist/utils/agent-config.d.ts.map +1 -1
- package/dist/utils/agent-config.js +290 -40
- package/dist/utils/agent-config.js.map +1 -1
- package/dist/utils/agent-message.d.ts +41 -22
- package/dist/utils/agent-message.d.ts.map +1 -1
- package/dist/utils/agent-message.js +94 -31
- package/dist/utils/agent-message.js.map +1 -1
- package/dist/utils/agent-targets.d.ts +8 -4
- package/dist/utils/agent-targets.d.ts.map +1 -1
- package/dist/utils/agent-targets.js +51 -35
- package/dist/utils/agent-targets.js.map +1 -1
- package/dist/utils/agent-turns.d.ts +31 -24
- package/dist/utils/agent-turns.d.ts.map +1 -1
- package/dist/utils/agent-turns.js +154 -35
- package/dist/utils/agent-turns.js.map +1 -1
- package/dist/utils/api.d.ts +6 -0
- package/dist/utils/api.d.ts.map +1 -1
- package/dist/utils/api.js +22 -1
- package/dist/utils/api.js.map +1 -1
- package/dist/utils/format.d.ts +27 -1
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +429 -82
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/json-schema-dialect.d.ts +8 -1
- package/dist/utils/json-schema-dialect.d.ts.map +1 -1
- package/dist/utils/json-schema-dialect.js +27 -1
- package/dist/utils/json-schema-dialect.js.map +1 -1
- package/dist/utils/media.d.ts +8 -0
- package/dist/utils/media.d.ts.map +1 -1
- package/dist/utils/media.js +29 -0
- package/dist/utils/media.js.map +1 -1
- package/dist/utils/poll.d.ts +5 -2
- package/dist/utils/poll.d.ts.map +1 -1
- package/dist/utils/poll.js +10 -9
- package/dist/utils/poll.js.map +1 -1
- package/dist/utils/quoted-text.d.ts +28 -0
- package/dist/utils/quoted-text.d.ts.map +1 -0
- package/dist/utils/quoted-text.js +64 -0
- package/dist/utils/quoted-text.js.map +1 -0
- package/dist/utils/structured.d.ts +2 -0
- package/dist/utils/structured.d.ts.map +1 -1
- package/dist/utils/structured.js +15 -2
- package/dist/utils/structured.js.map +1 -1
- package/dist/utils/studio-runs.d.ts +4 -4
- package/dist/utils/studio-runs.d.ts.map +1 -1
- package/dist/utils/studio-runs.js +11 -8
- package/dist/utils/studio-runs.js.map +1 -1
- package/dist/utils/user-agent.d.ts +376 -241
- package/dist/utils/user-agent.d.ts.map +1 -1
- package/dist/utils/user-agent.js +302 -89
- package/dist/utils/user-agent.js.map +1 -1
- package/dist/utils/wiro-project.d.ts +45 -0
- package/dist/utils/wiro-project.d.ts.map +1 -0
- package/dist/utils/wiro-project.js +66 -0
- package/dist/utils/wiro-project.js.map +1 -0
- package/dist/utils/workflow-agent.d.ts +4 -4
- package/dist/utils/workflow-save.d.ts +23 -5
- package/dist/utils/workflow-save.d.ts.map +1 -1
- package/dist/utils/workflow-save.js +130 -38
- package/dist/utils/workflow-save.js.map +1 -1
- package/dist/utils/workflow.d.ts +79 -61
- package/dist/utils/workflow.d.ts.map +1 -1
- package/dist/utils/workflow.js +149 -19
- package/dist/utils/workflow.js.map +1 -1
- package/dist/utils/workspace.d.ts +64 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +173 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancel-agent-message.js","sourceRoot":"","sources":["../../src/tools/cancel-agent-message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GAEnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"cancel-agent-message.js","sourceRoot":"","sources":["../../src/tools/cancel-agent-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { taskActionOutputSchema } from './schemas.js';
|
|
2
|
+
import { strictInput, taskActionOutputSchema } from './schemas.js';
|
|
3
3
|
export function registerCancelTask(server, client) {
|
|
4
4
|
server.registerTool('cancel_task', {
|
|
5
5
|
title: 'Cancel a queued Wiro task',
|
|
6
6
|
description: 'Cancel a model task that is still queued. It is refused once '
|
|
7
7
|
+ 'the task has started; `kill_task` stops a task in either state. A '
|
|
8
8
|
+ 'task cancelled while queued is never charged.',
|
|
9
|
-
inputSchema: {
|
|
9
|
+
inputSchema: strictInput({
|
|
10
10
|
tasktoken: z.string().optional().describe('The task token returned from run_model.'),
|
|
11
11
|
taskid: z.string().optional().describe('The task ID (alternative to tasktoken).'),
|
|
12
|
-
},
|
|
12
|
+
}),
|
|
13
13
|
outputSchema: taskActionOutputSchema,
|
|
14
14
|
annotations: {
|
|
15
15
|
readOnlyHint: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancel-task.js","sourceRoot":"","sources":["../../src/tools/cancel-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cancel-task.js","sourceRoot":"","sources":["../../src/tools/cancel-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAkB;IACtE,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EAAE,+DAA+D;cACxE,oEAAoE;cACpE,+CAA+C;QACnD,WAAW,EAAE,WAAW,CAAC;YACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YACpF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;SAClF,CAAC;QACF,YAAY,EAAE,sBAAsB;QACpC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC1B,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,yDAAyD,EAAE,CAAC;oBACrG,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CACpC,EAAE,SAAS,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,MAAM,CACb,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAI,MAAM,CAAC,MAAqC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC;gBAC7G,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,GAAG,EAAE,EAAE,CAAC;oBAChE,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;gBAC1E,iBAAiB,EAAE;oBACjB,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACjC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC3C;oBACD,OAAO,EAAE,8BAA8B;iBACxC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,eAAe,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACnH,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/clone-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"clone-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/clone-workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU/C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAmFjF"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { ApiResultError, asString, errorResult, requireApiSuccess, toInteger } from '../utils/api.js';
|
|
3
|
+
import { quotedSpan } from '../utils/quoted-text.js';
|
|
3
4
|
import { fullSlugOf, parseWorkflowSlug, workflowUrl } from '../utils/workflow.js';
|
|
4
|
-
import { nextActionSchema } from './schemas.js';
|
|
5
|
+
import { nextActionSchema, strictInput } from './schemas.js';
|
|
5
6
|
export function registerCloneWorkflow(server, client) {
|
|
6
7
|
server.registerTool('clone_workflow', {
|
|
7
8
|
title: 'Clone a public Wiro workflow',
|
|
@@ -10,10 +11,10 @@ export function registerCloneWorkflow(server, client) {
|
|
|
10
11
|
+ 'just to run a public workflow; clone it to keep it or to edit it. A copy of a '
|
|
11
12
|
+ 'protected workflow keeps its steps hidden: you can run it and change its title, '
|
|
12
13
|
+ 'description and tags, but not its steps.',
|
|
13
|
-
inputSchema: {
|
|
14
|
+
inputSchema: strictInput({
|
|
14
15
|
slug: z.string().min(1)
|
|
15
16
|
.describe('The full slug or page URL of a published workflow from list_workflows scope "public".'),
|
|
16
|
-
},
|
|
17
|
+
}),
|
|
17
18
|
outputSchema: {
|
|
18
19
|
fullSlug: z.string(),
|
|
19
20
|
url: z.string(),
|
|
@@ -39,7 +40,7 @@ export function registerCloneWorkflow(server, client) {
|
|
|
39
40
|
return {
|
|
40
41
|
content: [{
|
|
41
42
|
type: 'text',
|
|
42
|
-
text: `## Workflow cloned\n\n**Title:** ${title}\n**Slug:** \`${fullSlug}\`\n**Page:** ${workflowUrl(fullSlug)}`
|
|
43
|
+
text: `## Workflow cloned\n\n**Title:** ${quotedSpan(title)}\n**Slug:** \`${fullSlug}\`\n**Page:** ${workflowUrl(fullSlug)}`
|
|
43
44
|
+ (isProtected ? '\n\nThe original is protected, so the copy\'s steps stay hidden. You can still run it.' : ''),
|
|
44
45
|
}],
|
|
45
46
|
structuredContent: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clone-workflow.js","sourceRoot":"","sources":["../../src/tools/clone-workflow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,SAAS,EAAoB,MAAM,iBAAiB,CAAC;AACxH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"clone-workflow.js","sourceRoot":"","sources":["../../src/tools/clone-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect-agent-oauth.d.ts","sourceRoot":"","sources":["../../src/tools/connect-agent-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"connect-agent-oauth.d.ts","sourceRoot":"","sources":["../../src/tools/connect-agent-oauth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAqoB/C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA0FrF"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { asString, errorResult, errorText, isPlainObject, requireApiSuccess, } from '../utils/api.js';
|
|
3
|
-
import { OAUTH_LINK_TTL_SECONDS, buildChainedSelections, buildPickerAccounts, chooseConnectionMode, connectionModeRequirements, connectionState, credentialGroup, dashboardAgentUrl, isAllowedRedirectUrl, loadCredentialMeta, ownAppRedirectUri, parseDiscoveredGroups, readOAuthStatus, readUserAgent, toAccountRefs, } from '../utils/agent-config.js';
|
|
2
|
+
import { apiErrorMessage, asString, errorResult, errorText, isPlainObject, requireApiSuccess, } from '../utils/api.js';
|
|
3
|
+
import { CONNECTION_NOT_CLEARED, OAUTH_LINK_TTL_SECONDS, accountLabel, agentStatusOf, buildChainedSelections, buildPickerAccounts, chooseConnectionMode, connectionModeRequirements, connectionRefusalText, connectionState, credentialGroup, customSkillEntries, dashboardAgentUrl, isAgentRunning, isAllowedRedirectUrl, isFilledValue, loadCredentialMeta, loadSkillRegistry, ownAppRedirectUri, parseDiscoveredGroups, readOAuthStatus, readUserAgent, toAccountRefs, turnOnSkillText, unusedCredential, unusedCredentialNote, writeOnlyModesNote, } from '../utils/agent-config.js';
|
|
4
4
|
import { DEFAULT_WAIT_SECONDS, MAX_WAIT_SECONDS, pollUntil, reportProgress, } from '../utils/poll.js';
|
|
5
|
-
import {
|
|
5
|
+
import { jsonSpan, quotedSpan } from '../utils/quoted-text.js';
|
|
6
|
+
import { readStatusAdvice, startNeedsPlan, toAgentDetail, WIRO_PROJECT_CREDENTIAL } from '../utils/user-agent.js';
|
|
7
|
+
import { nextActionSchema, strictInput } from './schemas.js';
|
|
6
8
|
const accountSchema = z.object({ id: z.string(), name: z.string() });
|
|
7
9
|
const outputSchema = {
|
|
8
10
|
action: z.enum(['connect', 'status', 'select_accounts']),
|
|
@@ -43,7 +45,7 @@ const outputSchema = {
|
|
|
43
45
|
mode: z.string(),
|
|
44
46
|
available: z.boolean(),
|
|
45
47
|
needsBrowser: z.boolean(),
|
|
46
|
-
fields: z.array(z.object({ field: z.string(), label: z.string(), isSet: z.boolean() })),
|
|
48
|
+
fields: z.array(z.object({ field: z.string(), label: z.string(), isSet: z.boolean(), writeOnly: z.boolean().optional() })),
|
|
47
49
|
note: z.string(),
|
|
48
50
|
})).optional(),
|
|
49
51
|
ownAppRedirectUri: z.string().optional(),
|
|
@@ -52,9 +54,6 @@ const outputSchema = {
|
|
|
52
54
|
};
|
|
53
55
|
const DONE_STATES = new Set(['connected', 'pick_accounts', 'pick_child_items']);
|
|
54
56
|
function oauthHint(message, meta) {
|
|
55
|
-
if (/not found or unauthorized/i.test(message)) {
|
|
56
|
-
return 'Integrations can only be connected with a project created by the person who deployed the agent: connect this server with such a project, by its API key or a browser sign-in.';
|
|
57
|
-
}
|
|
58
57
|
if (/credentials not configured/i.test(message)) {
|
|
59
58
|
return `Save your own ${meta.title} app keys with set_agent_credentials first (call it with credential "${meta.key}" to see the fields).`;
|
|
60
59
|
}
|
|
@@ -93,7 +92,7 @@ function childStepOf(picker, groups, configured) {
|
|
|
93
92
|
};
|
|
94
93
|
}
|
|
95
94
|
function accountsLine(accounts) {
|
|
96
|
-
return accounts.map(
|
|
95
|
+
return accounts.map(accountLabel).join(', ');
|
|
97
96
|
}
|
|
98
97
|
function result(action, context, state, message, extra = {}, textExtra = []) {
|
|
99
98
|
const lines = [
|
|
@@ -103,7 +102,7 @@ function result(action, context, state, message, extra = {}, textExtra = []) {
|
|
|
103
102
|
...textExtra,
|
|
104
103
|
];
|
|
105
104
|
if (isPlainObject(extra.nextAction)) {
|
|
106
|
-
lines.push('', `Next: call ${String(extra.nextAction.tool)} with ${
|
|
105
|
+
lines.push('', `Next: call ${String(extra.nextAction.tool)} with ${jsonSpan(extra.nextAction.arguments)}.`);
|
|
107
106
|
}
|
|
108
107
|
return {
|
|
109
108
|
content: [{ type: 'text', text: lines.join('\n') }],
|
|
@@ -121,13 +120,45 @@ function result(action, context, state, message, extra = {}, textExtra = []) {
|
|
|
121
120
|
function modeLines(modes) {
|
|
122
121
|
return [
|
|
123
122
|
'',
|
|
124
|
-
...modes.filter(mode => mode.available).map(mode => `- **${mode.mode}**: ${mode.note}${mode.fields.length > 0 ? ` Fields: ${mode.fields.map(field => `${field.field}${field.isSet ? ' (set)' : ' (missing)'}`).join(', ')}.` : ''}`),
|
|
123
|
+
...modes.filter(mode => mode.available).map(mode => `- **${mode.mode}**: ${mode.note}${mode.fields.length > 0 ? ` Fields: ${mode.fields.map(field => `${field.field}${field.isSet ? ' (set)' : field.writeOnly ? '' : ' (missing)'}`).join(', ')}.` : ''}`),
|
|
125
124
|
];
|
|
126
125
|
}
|
|
126
|
+
/** The answer to a connect that the rule on unused credentials refuses, or null when it may go ahead. */
|
|
127
|
+
function unusedCredentialRefusal(row, context, registry) {
|
|
128
|
+
const { credential, meta } = context;
|
|
129
|
+
const unused = unusedCredential(row, credential, registry);
|
|
130
|
+
if (!unused)
|
|
131
|
+
return null;
|
|
132
|
+
return [
|
|
133
|
+
`${meta.title} is not used by any of this agent's active skills, custom skills or scheduled tasks, so nothing was started.`,
|
|
134
|
+
unused.services.length > 0
|
|
135
|
+
? `Services its skills connect with this tool: ${unused.services.join(', ')}.`
|
|
136
|
+
: 'None of its skills connect a service with this tool.',
|
|
137
|
+
turnOnSkillText(meta.title, credential, unused.skills),
|
|
138
|
+
credentialGroup(row, credential)?._connected === true ? `${meta.title} is still connected from before; disconnect_agent_oauth removes that connection.` : '',
|
|
139
|
+
].filter(Boolean).join(' ');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* What a finished sign-in also turns on: Wiro keeps an entry that requires a
|
|
143
|
+
* credential off until the credential arrives. Saving keys or a token turns
|
|
144
|
+
* these on earlier and says so, so an entry that reads as on is left out.
|
|
145
|
+
*/
|
|
146
|
+
function turnsOnNote(row, { credential, meta }) {
|
|
147
|
+
const entries = customSkillEntries(row).filter(entry => !entry.enabled && entry.requiresCredentials.includes(credential));
|
|
148
|
+
if (entries.length === 0)
|
|
149
|
+
return '';
|
|
150
|
+
const sentence = ` ${entries.map(entry => quotedSpan(entry.key)).join(', ')} ${entries.length > 1 ? 'turn' : 'turns'} on once ${meta.title} is connected.`;
|
|
151
|
+
return entries.some(entry => entry.kind === 'scheduled_task')
|
|
152
|
+
? `${sentence} Every run of a scheduled task uses credits; turn off any you do not want with manage_agent_custom_skill.`
|
|
153
|
+
: sentence;
|
|
154
|
+
}
|
|
127
155
|
async function connect(context, input) {
|
|
128
156
|
const { client, agentGuid, credential, meta, signal } = context;
|
|
129
157
|
const oauth = meta.oauth;
|
|
130
158
|
const row = await readUserAgent(client, agentGuid, signal);
|
|
159
|
+
const refusal = unusedCredentialRefusal(row, context, await loadSkillRegistry(client, signal));
|
|
160
|
+
if (refusal)
|
|
161
|
+
return errorResult(new Error(refusal));
|
|
131
162
|
const group = credentialGroup(row, credential);
|
|
132
163
|
const modes = connectionModeRequirements(meta, group);
|
|
133
164
|
const redirectUri = meta.connectionModes.includes('own') ? ownAppRedirectUri(meta) : undefined;
|
|
@@ -143,7 +174,8 @@ async function connect(context, input) {
|
|
|
143
174
|
const mode = input.mode ?? chooseConnectionMode(meta, modes);
|
|
144
175
|
const requirement = modes.find(candidate => candidate.mode === mode);
|
|
145
176
|
if (!mode || !requirement) {
|
|
146
|
-
|
|
177
|
+
const savedKeysNote = writeOnlyModesNote(modes);
|
|
178
|
+
return result('connect', context, 'setup_needed', `Choose how to connect ${meta.title}: it needs your own app keys or a token saved first.${savedKeysNote ? ` ${savedKeysNote}` : ''}`, { ...setupExtra, nextAction: describeAction }, modeLines(modes));
|
|
147
179
|
}
|
|
148
180
|
if (!requirement.available) {
|
|
149
181
|
return result('connect', context, 'setup_needed', `${requirement.note}`, { ...setupExtra, mode, nextAction: describeAction }, modeLines(modes));
|
|
@@ -151,13 +183,27 @@ async function connect(context, input) {
|
|
|
151
183
|
if (mode === 'api_key' && !oauth.directProbe) {
|
|
152
184
|
return result('connect', context, 'setup_needed', requirement.note, { ...setupExtra, mode, nextAction: describeAction }, modeLines(modes));
|
|
153
185
|
}
|
|
154
|
-
|
|
186
|
+
// App keys read as empty even once saved, so for those the sign-in route below decides.
|
|
187
|
+
const missing = requirement.fields.filter(field => !field.isSet && !field.writeOnly);
|
|
155
188
|
if (missing.length > 0) {
|
|
156
189
|
return result('connect', context, 'setup_needed', `Mode ${mode} needs these saved first with set_agent_credentials: ${missing.map(field => `${field.label} (${field.field})`).join(', ')}. ${requirement.note}`, { ...setupExtra, mode, nextAction: describeAction });
|
|
157
190
|
}
|
|
158
191
|
const connectedBefore = group?._connected === true;
|
|
159
|
-
|
|
160
|
-
|
|
192
|
+
// A sign-in removes what is saved for the modes it leaves.
|
|
193
|
+
const removed = mode === oauth.directProbe?.mode
|
|
194
|
+
? []
|
|
195
|
+
: meta.fields.filter(field => !field.oauthManaged
|
|
196
|
+
&& field.onlyInModes?.length
|
|
197
|
+
&& !field.onlyInModes.includes(mode)
|
|
198
|
+
&& isFilledValue(group?.[field.key]));
|
|
199
|
+
const appKeys = requirement.fields.filter(field => field.writeOnly);
|
|
200
|
+
if ((connectedBefore || removed.length > 0) && !input.confirm) {
|
|
201
|
+
const saveKeysFirst = removed.length > 0 && appKeys.length > 0
|
|
202
|
+
? ' Save the app keys first if they are not saved yet, so the sign-in can start.'
|
|
203
|
+
: '';
|
|
204
|
+
return result('connect', context, 'confirm_needed', `${connectedBefore
|
|
205
|
+
? `${meta.title} is already connected. Connecting again replaces that connection and its selected accounts; if the new sign-in or check fails, the agent is left without it.`
|
|
206
|
+
: `Connecting ${meta.title} with mode ${mode} removes the saved ${removed.map(field => field.label).join(', ')}.`}${saveKeysFirst}`, {
|
|
161
207
|
mode,
|
|
162
208
|
nextAction: {
|
|
163
209
|
tool: 'connect_agent_oauth',
|
|
@@ -175,7 +221,8 @@ async function connect(context, input) {
|
|
|
175
221
|
}
|
|
176
222
|
if (oauth.directProbe && mode === oauth.directProbe.mode) {
|
|
177
223
|
// The check reads the mode from the saved credential, so it is saved first.
|
|
178
|
-
|
|
224
|
+
const modeSaved = asString(group?.authmethod) !== mode;
|
|
225
|
+
if (modeSaved) {
|
|
179
226
|
requireApiSuccess(await client.post('/UserAgent/CredentialUpsert', {
|
|
180
227
|
useragentguid: agentGuid,
|
|
181
228
|
fields: [{ credentialkey: credential, fieldname: 'authmethod', fieldvalue: mode }],
|
|
@@ -190,12 +237,20 @@ async function connect(context, input) {
|
|
|
190
237
|
const code = asString(body.errorcode);
|
|
191
238
|
const message = (body.errors ?? []).map(error => error?.message?.trim()).filter(Boolean).join(' ')
|
|
192
239
|
|| `${meta.title} could not be checked.`;
|
|
240
|
+
if (message === CONNECTION_NOT_CLEARED)
|
|
241
|
+
return errorResult(new Error(message));
|
|
193
242
|
const parts = [code ? `${message} (${code})` : message];
|
|
194
243
|
if (code === 'direct_token_missing') {
|
|
195
244
|
parts.push(`Save ${requirement.fields.map(field => field.field).join(', ')} with set_agent_credentials first.`);
|
|
196
245
|
}
|
|
197
246
|
else if (connectedBefore) {
|
|
198
|
-
parts.push('
|
|
247
|
+
parts.push('Connect again to restore the connection.');
|
|
248
|
+
}
|
|
249
|
+
// An error result reads as nothing done, so it says what the check still did.
|
|
250
|
+
if (modeSaved)
|
|
251
|
+
parts.push(`The mode is saved as ${mode}.`);
|
|
252
|
+
if ((modeSaved || code) && isAgentRunning(agentStatusOf(row))) {
|
|
253
|
+
parts.push('The running agent restarts, which takes about a minute.');
|
|
199
254
|
}
|
|
200
255
|
return errorResult(new Error(parts.join(' ')));
|
|
201
256
|
}
|
|
@@ -212,7 +267,7 @@ async function connect(context, input) {
|
|
|
212
267
|
? 'Save the only available account.'
|
|
213
268
|
: 'Ask the user which accounts to use, then save only those.',
|
|
214
269
|
},
|
|
215
|
-
}, ['', ...candidates.map(account => `- ${
|
|
270
|
+
}, ['', ...candidates.map(account => `- ${accountLabel(account)}`)]);
|
|
216
271
|
}
|
|
217
272
|
return result('connect', context, 'connected', `${meta.title} is connected. A running agent restarts to use it.`, { mode });
|
|
218
273
|
}
|
|
@@ -227,12 +282,23 @@ async function connect(context, input) {
|
|
|
227
282
|
catch {
|
|
228
283
|
since = '';
|
|
229
284
|
}
|
|
230
|
-
const
|
|
285
|
+
const answer = await client.post('/UserAgentOAuth/OAuthConnect', {
|
|
231
286
|
useragentguid: agentGuid,
|
|
232
287
|
credentialkey: credential,
|
|
233
288
|
authmethod: mode,
|
|
234
289
|
redirecturl: redirectUrl,
|
|
235
|
-
}, signal)
|
|
290
|
+
}, signal);
|
|
291
|
+
if (answer.result !== true && appKeys.length > 0 && /credentials not configured/i.test(apiErrorMessage(answer, ''))) {
|
|
292
|
+
// What the sign-in removes may be gone already, so this answer goes by a fresh read.
|
|
293
|
+
const fresh = removed.length > 0 ? await readUserAgent(client, agentGuid, signal).catch(() => null) : null;
|
|
294
|
+
const groupNow = fresh ? credentialGroup(fresh, credential) : group;
|
|
295
|
+
const gone = removed.filter(field => !isFilledValue(groupNow?.[field.key]));
|
|
296
|
+
const goneText = gone.length > 0
|
|
297
|
+
? ` The sign-in did not start, and this call removed the saved ${gone.map(field => field.label).join(', ')}${connectedBefore && groupNow?._connected !== true ? `, so ${meta.title} is no longer connected` : ''}. To go back to it, save it again with set_agent_credentials.`
|
|
298
|
+
: '';
|
|
299
|
+
return result('connect', context, 'setup_needed', `Mode ${mode} needs these saved first with set_agent_credentials: ${appKeys.map(field => `${field.label} (${field.field})`).join(', ')}. ${requirement.note}${goneText}`, { ...setupExtra, connectionModes: connectionModeRequirements(meta, groupNow), mode, nextAction: describeAction });
|
|
300
|
+
}
|
|
301
|
+
const body = requireApiSuccess(answer, `Could not start the ${meta.title} sign-in.`);
|
|
236
302
|
const authorizeUrl = asString(body.authorizeUrl);
|
|
237
303
|
if (!authorizeUrl)
|
|
238
304
|
throw new Error(`Wiro did not return a sign-in link for ${meta.title}.`);
|
|
@@ -240,7 +306,7 @@ async function connect(context, input) {
|
|
|
240
306
|
const after = usesDashboard
|
|
241
307
|
? `After approving, the browser returns to the agent's page in the Wiro dashboard${oauth.picker ? ', which asks which accounts the agent should use' : ''}. Use a browser where the user is signed in to wiro.ai as the agent's owner.`
|
|
242
308
|
: `After approving, the browser goes to ${redirectUrl}.`;
|
|
243
|
-
return result('connect', context, 'authorize_in_browser', `The user must open this link in their own browser and approve access. It works for ${OAUTH_LINK_TTL_SECONDS / 60} minutes. ${after} Give the link to the user and check the status once they say they are done.`, {
|
|
309
|
+
return result('connect', context, 'authorize_in_browser', `The user must open this link in their own browser and approve access. It works for ${OAUTH_LINK_TTL_SECONDS / 60} minutes. ${after}${turnsOnNote(row, context)} Give the link to the user and check the status once they say they are done.`, {
|
|
244
310
|
mode,
|
|
245
311
|
authorizeUrl,
|
|
246
312
|
expiresInSeconds: OAUTH_LINK_TTL_SECONDS,
|
|
@@ -258,7 +324,24 @@ async function connect(context, input) {
|
|
|
258
324
|
},
|
|
259
325
|
}, ['', authorizeUrl]);
|
|
260
326
|
}
|
|
261
|
-
|
|
327
|
+
/**
|
|
328
|
+
* What to do about access that reads as expired. A start is offered only when one can
|
|
329
|
+
* happen. Without the agent's row the offer stays: control_agent reads the agent again
|
|
330
|
+
* and says what comes first.
|
|
331
|
+
*/
|
|
332
|
+
function expiredAdvice(row) {
|
|
333
|
+
const startOrConnect = 'Start the agent with control_agent, or connect again.';
|
|
334
|
+
if (!row)
|
|
335
|
+
return startOrConnect;
|
|
336
|
+
const agent = toAgentDetail(row);
|
|
337
|
+
if ((agent.status === 0 || agent.status === 5) && !startNeedsPlan(agent))
|
|
338
|
+
return startOrConnect;
|
|
339
|
+
return agent.status === 3 || agent.status === 4
|
|
340
|
+
? 'If the agent cannot use it, connect again.'
|
|
341
|
+
: `Connect again if the agent needs it. ${readStatusAdvice(agent)}`;
|
|
342
|
+
}
|
|
343
|
+
function statusMessage(state, meta, snapshot, unusedNote, row) {
|
|
344
|
+
const saved = row !== null && credentialGroup(row, meta.key)?._connected === true;
|
|
262
345
|
const next = meta.oauth?.picker?.next;
|
|
263
346
|
switch (state) {
|
|
264
347
|
case 'connected': {
|
|
@@ -274,9 +357,11 @@ function statusMessage(state, meta, snapshot) {
|
|
|
274
357
|
case 'waiting_for_user':
|
|
275
358
|
return `The ${meta.title} sign-in has not finished yet. The link from connect works for ${OAUTH_LINK_TTL_SECONDS / 60} minutes; after that, connect again.`;
|
|
276
359
|
case 'token_expired':
|
|
277
|
-
return `The saved ${meta.title} access has expired
|
|
360
|
+
return `The saved ${meta.title} access has expired.${saved ? ` The connection is still saved, so get_my_agent lists ${meta.title} as connected.` : ''} ${unusedNote ?? expiredAdvice(row)}`;
|
|
278
361
|
default:
|
|
279
|
-
return
|
|
362
|
+
return saved
|
|
363
|
+
? `This check found no current ${meta.title} sign-in, but a ${meta.title} connection is saved on this agent, so get_my_agent lists it as connected. ${unusedNote ?? 'If the agent cannot use it, connect again: that replaces the saved connection and asks for confirm: true.'}`
|
|
364
|
+
: `${meta.title} is not connected. ${unusedNote ?? 'Start with action connect.'}`;
|
|
280
365
|
}
|
|
281
366
|
}
|
|
282
367
|
async function status(context, input, extra) {
|
|
@@ -296,6 +381,8 @@ async function status(context, input, extra) {
|
|
|
296
381
|
throw new Error(`Could not read the ${meta.title} connection status.`);
|
|
297
382
|
const state = stateOf(snapshot);
|
|
298
383
|
let nextAction;
|
|
384
|
+
let unusedNote = null;
|
|
385
|
+
let row = null;
|
|
299
386
|
if (state === 'waiting_for_user') {
|
|
300
387
|
nextAction = {
|
|
301
388
|
tool: 'connect_agent_oauth',
|
|
@@ -317,16 +404,22 @@ async function status(context, input, extra) {
|
|
|
317
404
|
};
|
|
318
405
|
}
|
|
319
406
|
else if (state === 'not_connected' || state === 'token_expired') {
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
407
|
+
// Only these states offer connect, so only they read the skills. A status is
|
|
408
|
+
// still answered when that read fails: connect goes by the rule anyway.
|
|
409
|
+
row = await readUserAgent(client, agentGuid, signal).catch(() => null);
|
|
410
|
+
unusedNote = row ? await unusedCredentialNote(client, row, credential, meta.title, signal) : null;
|
|
411
|
+
if (!unusedNote) {
|
|
412
|
+
nextAction = {
|
|
413
|
+
tool: 'connect_agent_oauth',
|
|
414
|
+
arguments: { action: 'connect', agent_guid: agentGuid, credential },
|
|
415
|
+
reason: `Connect ${meta.title}.`,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
325
418
|
}
|
|
326
419
|
const childStep = snapshot.childStep
|
|
327
420
|
? { ...snapshot.childStep, label: picker?.next?.label ?? snapshot.childStep.picker }
|
|
328
421
|
: undefined;
|
|
329
|
-
return result('status', context, state, statusMessage(state, meta, snapshot), {
|
|
422
|
+
return result('status', context, state, statusMessage(state, meta, snapshot, unusedNote, row), {
|
|
330
423
|
...(snapshot.connectedAt ? { connectedAt: snapshot.connectedAt } : {}),
|
|
331
424
|
...(snapshot.tokenExpiresAt ? { tokenExpiresAt: snapshot.tokenExpiresAt } : {}),
|
|
332
425
|
accounts: snapshot.accounts,
|
|
@@ -368,8 +461,8 @@ async function selectAccounts(context, input) {
|
|
|
368
461
|
reason: 'Ask the user which ones to keep; this preselects all of them.',
|
|
369
462
|
},
|
|
370
463
|
}, ['', ...groups.flatMap(group => [
|
|
371
|
-
`- ${
|
|
372
|
-
...group.items.map(item => ` - ${
|
|
464
|
+
`- ${accountLabel(group.parent)}${group.errorCode ? `: could not be read (${group.errorCode})` : ''}`,
|
|
465
|
+
...group.items.map(item => ` - ${accountLabel(item)}`),
|
|
373
466
|
])]);
|
|
374
467
|
}
|
|
375
468
|
const built = buildChainedSelections(next, groups, input.selections);
|
|
@@ -394,7 +487,7 @@ async function selectAccounts(context, input) {
|
|
|
394
487
|
const skipped = built.skippedParents.length > 0
|
|
395
488
|
? ` Nothing was chosen for ${accountsLine(built.skippedParents)}.`
|
|
396
489
|
: '';
|
|
397
|
-
return result('select_accounts', context, 'connected', `Saved ${
|
|
490
|
+
return result('select_accounts', context, 'connected', `Saved the ${next.label} selection (${mappings.length} selected).${skipped} A running agent restarts to use it.`, { childStep: { ...childStepOf(picker, savedGroups, mappings.length > 0) } });
|
|
398
491
|
}
|
|
399
492
|
if (!input.accounts || input.accounts.length === 0) {
|
|
400
493
|
return errorResult(new Error('Pass accounts (each {id, name}) to save, or picker to run the extra step.'));
|
|
@@ -410,7 +503,7 @@ async function selectAccounts(context, input) {
|
|
|
410
503
|
const accounts = toAccountRefs(saved.accounts, picker);
|
|
411
504
|
const next = picker.next;
|
|
412
505
|
if (next) {
|
|
413
|
-
return result('select_accounts', context, next.optional ? 'connected' : 'pick_child_items', `Saved ${accounts.length} account${accounts.length === 1 ? '' : 's'}: ${accountsLine(accounts)}. ${next.optional ? `Optionally, also choose ${next.label}.` : `Next, choose the ${next.label} for each account.`} A running agent restarts to use the accounts.`, {
|
|
506
|
+
return result('select_accounts', context, next.optional ? 'connected' : 'pick_child_items', `Saved ${accounts.length} account${accounts.length === 1 ? '' : 's'}: ${accountsLine(accounts)}. ${next.optional ? `Optionally, also choose ${next.label}.` : `Next, choose the ${next.label} for each account.`} A running agent restarts to use the account${accounts.length === 1 ? '' : 's'}.`, {
|
|
414
507
|
accounts,
|
|
415
508
|
nextAction: {
|
|
416
509
|
tool: 'connect_agent_oauth',
|
|
@@ -421,7 +514,7 @@ async function selectAccounts(context, input) {
|
|
|
421
514
|
},
|
|
422
515
|
});
|
|
423
516
|
}
|
|
424
|
-
return result('select_accounts', context, 'connected', `Saved ${accounts.length} account${accounts.length === 1 ? '' : 's'}: ${accountsLine(accounts)}. A running agent restarts to use
|
|
517
|
+
return result('select_accounts', context, 'connected', `Saved ${accounts.length} account${accounts.length === 1 ? '' : 's'}: ${accountsLine(accounts)}. A running agent restarts to use the account${accounts.length === 1 ? '' : 's'}.`, { accounts });
|
|
425
518
|
}
|
|
426
519
|
export function registerConnectAgentOauth(server, client) {
|
|
427
520
|
server.registerTool('connect_agent_oauth', {
|
|
@@ -438,13 +531,15 @@ export function registerConnectAgentOauth(server, client) {
|
|
|
438
531
|
+ 'save. action status: whether the sign-in finished (wait_seconds waits for '
|
|
439
532
|
+ 'the user). action select_accounts: saves which accounts the agent uses ({id, name} from '
|
|
440
533
|
+ 'connect), and with picker runs the extra step some providers have (Meta Ads pages, '
|
|
441
|
-
+ 'Google Business locations). Connecting again replaces an existing connection and
|
|
442
|
-
+ 'confirm: true. A running agent restarts when a connection or selection is saved. '
|
|
443
|
-
+ '
|
|
444
|
-
+ '
|
|
534
|
+
+ 'Google Business locations). Connecting again replaces an existing connection, and a sign-in removes a token saved for another mode; both need '
|
|
535
|
+
+ 'confirm: true. A running agent restarts when a connection or selection is saved. Connecting a service '
|
|
536
|
+
+ 'turns on the scheduled tasks that need it; turn off any you do not want. '
|
|
537
|
+
+ 'Remove a connection with disconnect_agent_oauth. A credential that none of the agent\'s active '
|
|
538
|
+
+ 'skills use, that no custom skill or scheduled task of the agent requires, and that its setup does not wait for, is refused before any link is made (get_my_agent '
|
|
539
|
+
+ 'lists the skills; apply_agent_skills turns one on). Only the person who deployed the agent can connect, so the '
|
|
445
540
|
+ 'connected project must be one that person created. The agents playbook (get_playbook) has the '
|
|
446
541
|
+ 'full setup walkthrough.',
|
|
447
|
-
inputSchema: {
|
|
542
|
+
inputSchema: strictInput({
|
|
448
543
|
action: z.enum(['connect', 'status', 'select_accounts']).default('connect')
|
|
449
544
|
.describe('connect (default) starts a connection, status checks it, select_accounts saves the accounts to use.'),
|
|
450
545
|
agent_guid: z.string().min(1).describe('The deployed agent\'s guid, from list_my_agents.'),
|
|
@@ -468,12 +563,12 @@ export function registerConnectAgentOauth(server, client) {
|
|
|
468
563
|
})).optional()
|
|
469
564
|
.describe('select_accounts with picker: what to use under each account. Accounts left out get nothing.'),
|
|
470
565
|
confirm: z.boolean().default(false)
|
|
471
|
-
.describe('connect: true to replace an existing connection after the user agreed.'),
|
|
472
|
-
},
|
|
566
|
+
.describe('connect: true to replace an existing connection or a token saved for another mode, after the user agreed.'),
|
|
567
|
+
}),
|
|
473
568
|
outputSchema,
|
|
474
569
|
annotations: {
|
|
475
570
|
readOnlyHint: false,
|
|
476
|
-
destructiveHint:
|
|
571
|
+
destructiveHint: true,
|
|
477
572
|
idempotentHint: false,
|
|
478
573
|
openWorldHint: true,
|
|
479
574
|
},
|
|
@@ -485,7 +580,9 @@ export function registerConnectAgentOauth(server, client) {
|
|
|
485
580
|
if (!meta)
|
|
486
581
|
return errorResult(new Error(`Unknown credential "${credential}".`));
|
|
487
582
|
if (!meta.oauth) {
|
|
488
|
-
return errorResult(new Error(
|
|
583
|
+
return errorResult(new Error(credential === WIRO_PROJECT_CREDENTIAL
|
|
584
|
+
? `${meta.title} is not a sign-in connection. Connect a Wiro project with bind_agent_project, with no key to paste.`
|
|
585
|
+
: `${meta.title} is not a sign-in connection. Save its fields with set_agent_credentials (call it with credential "${credential}" to see them).`));
|
|
489
586
|
}
|
|
490
587
|
const context = { client, agentGuid: args.agent_guid, credential, meta, signal: extra.signal };
|
|
491
588
|
if (args.action === 'status') {
|
|
@@ -501,7 +598,10 @@ export function registerConnectAgentOauth(server, client) {
|
|
|
501
598
|
return await connect(context, { mode: args.mode, redirectUrl: args.redirect_url, confirm: args.confirm });
|
|
502
599
|
}
|
|
503
600
|
catch (error) {
|
|
504
|
-
|
|
601
|
+
const message = errorText(error);
|
|
602
|
+
return errorResult(/not found or unauthorized/i.test(message)
|
|
603
|
+
? new Error(await connectionRefusalText(client, args.agent_guid, message, 'connected', extra.signal))
|
|
604
|
+
: withHint(error, meta ?? undefined));
|
|
505
605
|
}
|
|
506
606
|
});
|
|
507
607
|
}
|