@schlenkr/ragents 0.1.8 → 0.1.9
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/apps/server/src/config-definition.ts +24 -2
- package/apps/server/src/config.ts +0 -6
- package/apps/server/src/host-api.json +3 -10
- package/apps/server/src/host-api.ts +6 -7
- package/apps/server/src/plugin-build/build.ts +28 -5
- package/apps/server/src/plugin-build/plugin-description.ts +1 -1
- package/apps/server/src/plugin-build/typecheck.ts +2 -2
- package/apps/server/src/plugin-support/language-server/plugin.ts +8 -7
- package/apps/server/src/plugin-support/language-server/tools.ts +7 -6
- package/apps/server/src/plugin-support/model-aliases.ts +55 -25
- package/apps/server/src/plugin-support/product-relay.ts +10 -2
- package/apps/server/src/plugin-support/workspace-sandbox-host.ts +18 -9
- package/apps/server/src/profile/bundle-manifest.ts +7 -3
- package/apps/server/src/profile/compose.ts +6 -0
- package/apps/server/src/profile/plugin-discovery.ts +6 -1
- package/apps/server/src/profile/provisioning.ts +6 -5
- package/apps/server/src/ragents/engine.ts +0 -1
- package/apps/server/src/ragents/host-services.ts +4 -0
- package/apps/server/src/ragents/session.ts +1 -1
- package/apps/server/src/server.ts +1 -0
- package/apps/server/tsconfig.json +2 -0
- package/apps/web/dist/help/guide-clients.html +14 -6
- package/apps/web/dist/help/guide-clients.md +14 -6
- package/apps/web/dist/help/guide-distributed.html +12 -4
- package/apps/web/dist/help/guide-distributed.md +12 -4
- package/apps/web/dist/help/guide-getting-started.html +12 -8
- package/apps/web/dist/help/guide-getting-started.md +12 -8
- package/apps/web/dist/help/guide-plugins.html +6 -2
- package/apps/web/dist/help/guide-plugins.md +6 -2
- package/apps/web/dist/help/guide-runtime.html +2 -1
- package/apps/web/dist/help/guide-runtime.md +2 -1
- package/apps/web/dist/help/index.html +3328 -1135
- package/apps/web/dist/host-web.json +3 -3
- package/bundles/ragents.activity/ragents-bundle.json +3 -3
- package/bundles/ragents.actor-programs/ragents-bundle.json +3 -3
- package/bundles/ragents.ask/ragents-bundle.json +4 -4
- package/bundles/ragents.ask/server/index.js +42 -11
- package/bundles/ragents.ask/server/index.js.map +3 -3
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js +2 -0
- package/bundles/ragents.ask/web/chunks/chunk-WFN4374U.js.map +7 -0
- package/bundles/ragents.ask/web/classes.json +1 -1
- package/bundles/ragents.ask/web/exports/ask-payload.js +1 -1
- package/bundles/ragents.ask/web/index.js +1 -1
- package/bundles/ragents.ask/web/index.js.map +3 -3
- package/bundles/ragents.browser/executor/index.mjs +357 -0
- package/bundles/ragents.browser/executor/index.mjs.map +7 -0
- package/bundles/ragents.browser/ragents-bundle.json +5 -8
- package/bundles/ragents.browser/server/chunks/{chunk-2GKLLCBE.js → chunk-CWLX4VA5.js} +1 -1
- package/bundles/ragents.browser/server/chunks/chunk-CWLX4VA5.js.map +7 -0
- package/bundles/ragents.browser/server/exports/server/contract.js +1 -1
- package/bundles/ragents.browser/server/index.js +20 -9
- package/bundles/ragents.browser/server/index.js.map +4 -4
- package/bundles/ragents.documents/ragents-bundle.json +3 -3
- package/bundles/ragents.lsp-fsharp/executor/index.mjs +68 -0
- package/bundles/ragents.lsp-fsharp/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-fsharp/ragents-bundle.json +5 -9
- package/bundles/ragents.lsp-fsharp/server/index.js +21 -6
- package/bundles/ragents.lsp-fsharp/server/index.js.map +4 -4
- package/bundles/ragents.lsp-roslyn/executor/index.mjs +68 -0
- package/bundles/ragents.lsp-roslyn/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-roslyn/ragents-bundle.json +6 -8
- package/bundles/ragents.lsp-roslyn/server/index.js +54 -15
- package/bundles/ragents.lsp-roslyn/server/index.js.map +4 -4
- package/bundles/ragents.lsp-typescript/executor/index.mjs +49 -0
- package/bundles/ragents.lsp-typescript/executor/index.mjs.map +7 -0
- package/bundles/ragents.lsp-typescript/ragents-bundle.json +5 -7
- package/bundles/ragents.lsp-typescript/server/index.js +22 -2
- package/bundles/ragents.lsp-typescript/server/index.js.map +3 -3
- package/bundles/ragents.model-relay/ragents-bundle.json +4 -4
- package/bundles/ragents.model-relay/server/index.js +3 -2
- package/bundles/ragents.model-relay/server/index.js.map +2 -2
- package/bundles/ragents.orchestration/ragents-bundle.json +3 -3
- package/bundles/ragents.overseer/ragents-bundle.json +3 -3
- package/bundles/ragents.processes/ragents-bundle.json +3 -3
- package/bundles/ragents.product/ragents-bundle.json +3 -3
- package/bundles/ragents.profile-distribution/ragents-bundle.json +4 -4
- package/bundles/ragents.profile-distribution/server/index.js +1 -1
- package/bundles/ragents.profile-distribution/server/index.js.map +2 -2
- package/bundles/ragents.reference/ragents-bundle.json +3 -3
- package/bundles/ragents.todo/ragents-bundle.json +3 -3
- package/bundles/ragents.transcript/ragents-bundle.json +3 -3
- package/bundles/ragents.watch/ragents-bundle.json +3 -3
- package/bundles/ragents.workspace/ragents-bundle.json +11 -5
- package/bundles/ragents.workspace/server/index.js +101 -28
- package/bundles/ragents.workspace/server/index.js.map +3 -3
- package/bundles/ragents.workspace/web/classes.json +1 -1
- package/bundles/ragents.workspace/web/index.js +1 -1
- package/bundles/ragents.workspace/web/index.js.map +3 -3
- package/package.json +2 -2
- package/packages/agent/dist/core/agent-settings.d.ts +1 -7
- package/packages/agent/dist/core/compaction/compaction.d.ts +17 -13
- package/packages/agent/dist/core/model-runtime.d.ts +5 -4
- package/packages/agent/dist/core/provider-composer.d.ts +2 -1
- package/packages/agent/dist/core/tools/bash.d.ts +9 -3
- package/packages/agent/dist/index.d.ts +1 -1
- package/packages/agent/src/core/agent-settings.ts +1 -4
- package/packages/agent/src/core/compaction/compaction.ts +68 -30
- package/packages/agent/src/core/model-runtime.ts +12 -5
- package/packages/agent/src/core/provider-composer.ts +5 -0
- package/packages/agent/src/core/tools/bash.ts +36 -30
- package/packages/agent/src/index.ts +3 -0
- package/packages/ai/dist/types.d.ts +11 -0
- package/packages/ai/src/types.ts +12 -0
- package/packages/ragents/src/domain/event-semantics.ts +3 -0
- package/packages/ragents/src/domain/event-validation.ts +15 -2
- package/packages/ragents/src/domain/events.ts +3 -0
- package/packages/ragents/src/domain/model.ts +2 -0
- package/packages/ragents/src/domain/projection.ts +1 -0
- package/packages/ragents/src/drivers/agent-runtime.ts +1 -1
- package/packages/ragents/src/drivers/agent-turn.ts +8 -6
- package/packages/ragents/src/runtime/decisions/inputs.ts +6 -2
- package/packages/ragents/src/runtime/journal-storage.ts +5 -4
- package/packages/workspace-executor/package.json +0 -1
- package/packages/workspace-executor/src/bash-launch.ts +56 -10
- package/packages/workspace-executor/src/context.ts +4 -0
- package/packages/workspace-executor/src/contributions.ts +150 -0
- package/packages/workspace-executor/src/executor.ts +1 -1
- package/packages/workspace-executor/src/index.ts +16 -19
- package/packages/workspace-executor/src/language-server/host.ts +3 -0
- package/packages/workspace-executor/src/language-server/module.ts +12 -2
- package/packages/workspace-executor/src/language-server/roots.ts +0 -5
- package/packages/workspace-executor/src/modules.ts +7 -6
- package/packages/workspace-executor/src/sandbox-tools.ts +3 -9
- package/packages/workspace-executor/src/shell-platform.ts +14 -3
- package/packages/workspace-executor/src/tools.ts +0 -3
- package/plugins/ragents.ask/ask-payload.ts +9 -0
- package/plugins/ragents.ask/server/ask-service.ts +53 -13
- package/plugins/ragents.ask/web/AskActionView.tsx +3 -2
- package/plugins/ragents.browser/executor/index.ts +5 -0
- package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/module.ts +25 -31
- package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/playwright.ts +9 -23
- package/plugins/ragents.browser/provision.ts +1 -1
- package/plugins/ragents.browser/server/browser.ts +3 -3
- package/plugins/ragents.browser/server/contract.ts +2 -2
- package/plugins/ragents.browser/server/index.ts +1 -1
- package/plugins/ragents.lsp-fsharp/executor.ts +80 -0
- package/plugins/ragents.lsp-fsharp/provision.ts +1 -1
- package/plugins/ragents.lsp-fsharp/server/index.ts +2 -2
- package/plugins/ragents.lsp-roslyn/executor.ts +64 -0
- package/plugins/ragents.lsp-roslyn/provision.ts +1 -1
- package/plugins/ragents.lsp-roslyn/server/index.ts +28 -5
- package/plugins/ragents.lsp-roslyn/server/solution-on-start.ts +18 -6
- package/plugins/ragents.lsp-typescript/executor.ts +50 -0
- package/plugins/ragents.lsp-typescript/server/index.ts +2 -2
- package/plugins/ragents.model-relay/server/config.ts +1 -1
- package/plugins/ragents.model-relay/server/relay.ts +4 -2
- package/plugins/ragents.profile-distribution/server/archive.ts +2 -1
- package/plugins/ragents.workspace/client/workspace-client.ts +111 -28
- package/plugins/ragents.workspace/contract.ts +33 -2
- package/plugins/ragents.workspace/server/binding.ts +10 -4
- package/plugins/ragents.workspace/server/clients.ts +56 -9
- package/plugins/ragents.workspace/server/config.ts +9 -0
- package/plugins/ragents.workspace/server/index.ts +13 -4
- package/plugins/ragents.workspace/server/runtime.ts +10 -0
- package/plugins/ragents.workspace/server/shell-platform.ts +6 -5
- package/plugins/ragents.workspace/web/WorkspaceBinding.tsx +1 -1
- package/ragents.config.core.ts +4 -1
- package/ragents.config.showcase.ts +4 -1
- package/scripts/agent/journal.ts +3 -1
- package/scripts/package/build-package.ts +3 -1
- package/scripts/provision/run-provision.ts +2 -2
- package/scripts/workspace-client/run-workspace-client.ts +7 -4
- package/apps/web/dist/help/screenshots/release-checklist-vscode.png +0 -0
- package/apps/web/dist/help/screenshots/release-checklist-web.png +0 -0
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js +0 -2
- package/bundles/ragents.ask/web/chunks/chunk-HGFDGTNC.js.map +0 -7
- package/bundles/ragents.browser/server/chunks/chunk-2GKLLCBE.js.map +0 -7
- package/packages/workspace-executor/src/language-server/adapters/fsharp.ts +0 -60
- package/packages/workspace-executor/src/language-server/adapters/index.ts +0 -7
- package/packages/workspace-executor/src/language-server/adapters/roslyn.ts +0 -56
- package/packages/workspace-executor/src/language-server/adapters/typescript.ts +0 -74
- package/packages/workspace-executor/src/language-server/solution.ts +0 -13
- /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/contract.ts +0 -0
- /package/{packages/workspace-executor/src/browser → plugins/ragents.browser/executor}/pages.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"inputs": {
|
|
3
3
|
"apps/server/src/api/contracts.ts": "2703c1bfc108886e3564761d70466985cd03df64024da704b8d87cb25b8deea4",
|
|
4
|
-
"apps/server/src/host-api.ts": "
|
|
4
|
+
"apps/server/src/host-api.ts": "3f1044f2b7b1031996b48268a1c7243140b978b5fd5eee2023eda537e0c3363d",
|
|
5
5
|
"apps/server/src/plugin-support/actor-programs/contract.ts": "c334fd984af72a23b328da72d6154d50c68a47d6dfcca5eea10b0ed8c856389d",
|
|
6
6
|
"apps/server/src/plugin-support/chat-display-contract.ts": "2fb8aab13b5a60b4fe28f87f93cc82afb34b7d8ef1463e376bc3cbc0bcdc797b",
|
|
7
7
|
"apps/server/src/plugin-support/language-server/contract.ts": "b8bdf743d1801e4948d759552ff5e85812381403e42119e453dd8d8a1910eee3",
|
|
@@ -132,12 +132,12 @@
|
|
|
132
132
|
"apps/web/vite.config.ts": "08ad5bbe43fc990ba2763e1e170970d88b3ce9c78e54c14d197d8157ad6730fa",
|
|
133
133
|
"packages/ragents/src/access.ts": "59845358f669c00d42ccc78bbb21bf7a348158228ae1b4a58a76f5de5158d398",
|
|
134
134
|
"packages/ragents/src/domain/actor-reference.ts": "657f18122b55dfa9ceda91f4457a8cb95b51ff301c9e79387e1fd304a22d2da2",
|
|
135
|
-
"packages/ragents/src/domain/events.ts": "
|
|
135
|
+
"packages/ragents/src/domain/events.ts": "4e3d629f5e33f23db6e2de655e74517189974a26cb09f462ef349546f72166aa",
|
|
136
136
|
"packages/ragents/src/http/contracts.ts": "0f85568de2d470dc2815497abd2ae5eef88e5f282cdeaad40dd67990e0fb0cdf",
|
|
137
137
|
"packages/ragents/src/rpc/contract.ts": "83edcfb3492dc78239a9344cbaa822dee1d9c13b5f83fe8303c27790c83594e7",
|
|
138
138
|
"packages/ragents/src/rpc/peer.ts": "9c4ace7084f93194e12bacc2865ec3430c10a9236630d84d723d3bab58672c84",
|
|
139
139
|
"packages/ragents/src/rpc/protocol.ts": "02e58cac59a66067550f384cf33bbdf6a10bf67055d8e2d33ed0fd07e247f09e",
|
|
140
140
|
"packages/ragents/src/runtime/domain-error.ts": "d6bf8fa09769c4137e616c83a84cb9c05a58bfa6c2e32c9404a1c202815837a4",
|
|
141
|
-
"pnpm-lock.yaml": "
|
|
141
|
+
"pnpm-lock.yaml": "1329ffcce5282562231dd465ec937200ba3b621a26e95963dfa7aa377989fc34"
|
|
142
142
|
}
|
|
143
143
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.activity",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {},
|
|
7
7
|
"web": {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"stand": "76950227a2595ee5aa386c266cfe5a251b86943efffeda64a971b986ae33faec",
|
|
26
|
-
"sourceStand": "
|
|
26
|
+
"sourceStand": "343faff41933681d18ac632eff6e1971ae0e034130635b66466edc8e7c6b2031",
|
|
27
27
|
"server": "server/index.js",
|
|
28
28
|
"web": {
|
|
29
29
|
"entry": "web/index.js",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.actor-programs",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/engine": [
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
}
|
|
194
194
|
},
|
|
195
195
|
"stand": "7519e19c958a5f4821bff72f212fc3c8d5b7f7e8ac00195d57c5525beb4bab04",
|
|
196
|
-
"sourceStand": "
|
|
196
|
+
"sourceStand": "32bb8100fc46a1d1f317833efb2f6f396bc6553081f01cdf6bf102eb7c3e9f7e",
|
|
197
197
|
"server": "server/index.js",
|
|
198
198
|
"web": {
|
|
199
199
|
"entry": "web/index.js",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"format":
|
|
2
|
+
"format": 4,
|
|
3
3
|
"id": "ragents.ask",
|
|
4
|
-
"api":
|
|
4
|
+
"api": 7,
|
|
5
5
|
"hostNames": {
|
|
6
6
|
"server": {
|
|
7
7
|
"@ragents/engine": [
|
|
@@ -73,8 +73,8 @@
|
|
|
73
73
|
]
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
|
-
"stand": "
|
|
77
|
-
"sourceStand": "
|
|
76
|
+
"stand": "0c13aeadc67e74c8e07ec3f547f2a5e56c9cd807d2259d874382b6309c0f902a",
|
|
77
|
+
"sourceStand": "ffa758a97707149a471be3345b2ab0cf5ef17cef8dd8149978f62b8ce9485802",
|
|
78
78
|
"server": "server/index.js",
|
|
79
79
|
"web": {
|
|
80
80
|
"entry": "web/index.js",
|
|
@@ -50,6 +50,7 @@ import {
|
|
|
50
50
|
|
|
51
51
|
// ask-payload.ts
|
|
52
52
|
var ASK_PLUGIN_ID = "ragents.ask";
|
|
53
|
+
var SUPERSEDED_ANSWER = "Not answered: the user sent a new message instead.";
|
|
53
54
|
var stringArrayOf = (value) => Array.isArray(value) && value.every((entry) => typeof entry === "string") ? [...value] : void 0;
|
|
54
55
|
var askPayloadOf = (payload) => {
|
|
55
56
|
if (typeof payload !== "object" || payload === null) return void 0;
|
|
@@ -63,10 +64,16 @@ var askPayloadOf = (payload) => {
|
|
|
63
64
|
...typeof candidate.recipient === "string" ? { recipient: candidate.recipient } : {}
|
|
64
65
|
};
|
|
65
66
|
};
|
|
67
|
+
var supersedingInputOf = (result) => {
|
|
68
|
+
if (typeof result !== "object" || result === null) return void 0;
|
|
69
|
+
const { supersededBy } = result;
|
|
70
|
+
return typeof supersededBy === "string" ? supersededBy : void 0;
|
|
71
|
+
};
|
|
66
72
|
|
|
67
73
|
// server/ask-service.ts
|
|
68
|
-
var answerOf = (decision, result) => decision !== "approved" ? DISMISSED_ANSWER : typeof result === "string" ? result : result === null || result === void 0 ? "" : JSON.stringify(result);
|
|
74
|
+
var answerOf = (decision, result) => decision !== "approved" ? supersedingInputOf(result) === void 0 ? DISMISSED_ANSWER : SUPERSEDED_ANSWER : typeof result === "string" ? result : result === null || result === void 0 ? "" : JSON.stringify(result);
|
|
69
75
|
var resolvedAnswerOf = (action) => action.status === "pending" ? null : answerOf(action.status, action.result);
|
|
76
|
+
var humanInputPendingFor = (runtime, runId, actorId) => [...runtime.state(runId).inputs.values()].some((input) => input.actorId === actorId && input.origin === "human" && input.lifecycle.kind === "pending");
|
|
70
77
|
var RuntimeAskService = class {
|
|
71
78
|
#runtime;
|
|
72
79
|
#waiters = /* @__PURE__ */ new Map();
|
|
@@ -78,6 +85,7 @@ var RuntimeAskService = class {
|
|
|
78
85
|
}
|
|
79
86
|
ask(call, request, signal) {
|
|
80
87
|
const runtime = this.#requireRuntime();
|
|
88
|
+
if (call.turnId && humanInputPendingFor(runtime, call.runId, call.agentId)) return Promise.resolve(SUPERSEDED_ANSWER);
|
|
81
89
|
const context = {
|
|
82
90
|
actorId: call.agentId,
|
|
83
91
|
commandId: call.commandId,
|
|
@@ -100,7 +108,7 @@ var RuntimeAskService = class {
|
|
|
100
108
|
if (proposed?.type !== "action.proposed") {
|
|
101
109
|
throw new Error(`Die Frage von ${call.agentId} wurde nicht im Journal von ${call.runId} angelegt`);
|
|
102
110
|
}
|
|
103
|
-
return this.#awaitAnswer(call.runId, proposed.payload.actionId, signal);
|
|
111
|
+
return this.#awaitAnswer(call.runId, proposed.payload.actionId, call.turnId ? call.agentId : null, signal);
|
|
104
112
|
}
|
|
105
113
|
answer(runId, actionId, input) {
|
|
106
114
|
const runtime = this.#requireRuntime();
|
|
@@ -117,6 +125,16 @@ var RuntimeAskService = class {
|
|
|
117
125
|
);
|
|
118
126
|
}
|
|
119
127
|
withdraw(runId, actionId) {
|
|
128
|
+
this.#dismiss(runId, actionId, "ask-withdraw", null, DISMISSED_ANSWER);
|
|
129
|
+
}
|
|
130
|
+
#supersede(runId, actionId, inputId) {
|
|
131
|
+
try {
|
|
132
|
+
this.#dismiss(runId, actionId, "ask-supersede", { supersededBy: inputId }, SUPERSEDED_ANSWER);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
console.error(`Question ${actionId} could not be closed for message ${inputId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
#dismiss(runId, actionId, commandPrefix, result, answer) {
|
|
120
138
|
const runtime = this.#requireRuntime();
|
|
121
139
|
const state = runtime.state(runId);
|
|
122
140
|
const action = state.actions.get(actionId);
|
|
@@ -124,17 +142,17 @@ var RuntimeAskService = class {
|
|
|
124
142
|
this.#aborting.add(actionId);
|
|
125
143
|
try {
|
|
126
144
|
runtime.resolveAction(
|
|
127
|
-
{ actorId: state.ownerId, commandId:
|
|
145
|
+
{ actorId: state.ownerId, commandId: `${commandPrefix}:${actionId}:${randomUUID()}` },
|
|
128
146
|
runId,
|
|
129
147
|
actionId,
|
|
130
|
-
{ decision: "dismissed", result
|
|
148
|
+
{ decision: "dismissed", result }
|
|
131
149
|
);
|
|
132
150
|
} finally {
|
|
133
151
|
this.#aborting.delete(actionId);
|
|
134
152
|
}
|
|
135
|
-
this.#waiters.get(actionId)?.(
|
|
153
|
+
this.#waiters.get(actionId)?.settle(answer);
|
|
136
154
|
}
|
|
137
|
-
#awaitAnswer(runId, actionId, signal) {
|
|
155
|
+
#awaitAnswer(runId, actionId, blockedActorId, signal) {
|
|
138
156
|
const runtime = this.#requireRuntime();
|
|
139
157
|
const action = runtime.state(runId).actions.get(actionId);
|
|
140
158
|
if (!action) throw new Error(`Frage ${actionId} existiert nicht in Run ${runId}`);
|
|
@@ -167,15 +185,28 @@ var RuntimeAskService = class {
|
|
|
167
185
|
return;
|
|
168
186
|
}
|
|
169
187
|
signal?.addEventListener("abort", abort, { once: true });
|
|
170
|
-
this.#waiters.set(actionId,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
188
|
+
this.#waiters.set(actionId, {
|
|
189
|
+
runId,
|
|
190
|
+
blockedActorId,
|
|
191
|
+
settle: (answer) => {
|
|
192
|
+
signal?.removeEventListener("abort", abort);
|
|
193
|
+
this.#waiters.delete(actionId);
|
|
194
|
+
resolve(answer);
|
|
195
|
+
}
|
|
174
196
|
});
|
|
175
197
|
});
|
|
176
198
|
}
|
|
177
199
|
#onJournal(events) {
|
|
178
200
|
for (const event of events) {
|
|
201
|
+
if (event.type === "actor.input.enqueued") {
|
|
202
|
+
if (event.payload.origin !== "human") continue;
|
|
203
|
+
const { actorId, inputId } = event.payload;
|
|
204
|
+
for (const [actionId, waiter2] of this.#waiters) {
|
|
205
|
+
if (waiter2.runId !== event.runId || waiter2.blockedActorId !== actorId) continue;
|
|
206
|
+
queueMicrotask(() => this.#supersede(event.runId, actionId, inputId));
|
|
207
|
+
}
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
179
210
|
if (event.type !== "action.resolved") continue;
|
|
180
211
|
if (this.#aborting.has(event.payload.actionId)) continue;
|
|
181
212
|
const resolved = this.#requireRuntime().state(event.runId).actions.get(event.payload.actionId);
|
|
@@ -183,7 +214,7 @@ var RuntimeAskService = class {
|
|
|
183
214
|
const answer = answerOf(event.payload.decision, event.payload.result);
|
|
184
215
|
const waiter = this.#waiters.get(event.payload.actionId);
|
|
185
216
|
if (waiter) {
|
|
186
|
-
waiter(answer);
|
|
217
|
+
waiter.settle(answer);
|
|
187
218
|
continue;
|
|
188
219
|
}
|
|
189
220
|
queueMicrotask(() => this.#enqueueAnswer(event.runId, event.payload.actionId, answer));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../plugins/ragents.ask/server/index.ts", "../../../plugins/ragents.ask/server/answer-method.ts", "../../../plugins/ragents.ask/contract.ts", "../../../plugins/ragents.ask/server/ask-service.ts", "../../../plugins/ragents.ask/ask-payload.ts", "../../../plugins/ragents.ask/server/tool-contributor.ts", "../../../plugins/ragents.ask/server/ask-tool.ts"],
|
|
4
|
-
"sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport { pluginAsset } from \"@ragents/host/plugin-support/plugin-folder.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { handlebarsPrompt } from \"@ragents/host/plugin-support/prompt.js\";\nimport { runGuardToken } from \"@ragents/host/ragents/host-services.js\";\nimport { runtimeBridgeToken } from \"@ragents/host/ragents/runtime-bridge.js\";\nimport { createAnswerMethod } from \"./answer-method.js\";\nimport { RuntimeAskService } from \"./ask-service.js\";\nimport { askServiceToken } from \"./contract.js\";\nimport { createAskToolContributor } from \"./tool-contributor.js\";\n\nconst askPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.ask\" },\n register: (host) => {\n const service = new RuntimeAskService();\n host.provide(askServiceToken, service);\n host.provide(runtimeBridgeToken, { bind: (runtime) => service.bind(runtime) });\n host.prompts(handlebarsPrompt(\"ragents.ask.prompt\", 480, pluginAsset(\"ragents.ask\", \"ask.hbs\")));\n host.functions(createAskToolContributor(service));\n host.methods(createAnswerMethod(service, host.service(runGuardToken)));\n },\n};\n\nexport const plugin: PluginModule = { create: () => askPlugin };\n", "import { DomainError, implement, type MethodContribution } from \"@ragents/engine\";\nimport { askContracts } from \"../contract.js\";\nimport type { RuntimeAskService } from \"./ask-service.js\";\n\nexport const createAnswerMethod = (\n service: RuntimeAskService,\n ensureSession: (runId: string) => void,\n): MethodContribution => implement(askContracts.answer, ({ runId, actionId, answer, dismiss }) => {\n if (dismiss !== true && (typeof answer !== \"string\" || answer.trim() === \"\")) {\n throw new DomainError(\"answer-missing\", \"answer ist erforderlich, wenn nicht verworfen wird\", 400);\n }\n ensureSession(runId);\n service.answer(runId, actionId, { ...(answer !== undefined ? { answer } : {}), ...(dismiss !== undefined ? { dismiss } : {}) });\n return null;\n});\n", "import { Type } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nexport const askContracts = {\n answer: defineOperation({\n id: \"ragents.ask.answer\",\n description: \"Eine R\u00FCckfrage des Runs beantworten oder verwerfen. Rechte: runs.read und runs.write.\",\n rights: [\"runs.read\", \"runs.write\"],\n input: Type.Object({\n runId: Type.String({ minLength: 1, maxLength: 64, description: \"Kennung des Runs\" }),\n actionId: Type.String({ minLength: 1, maxLength: 80, description: \"Kennung der Frage\" }),\n answer: Type.Optional(Type.String({ description: \"Die Antwort des Benutzers\" })),\n dismiss: Type.Optional(Type.Boolean({ description: \"true verwirft die Frage ohne Antwort\" })),\n }, { additionalProperties: false }),\n result: Type.Null(),\n }),\n};\n", "import { randomUUID } from \"node:crypto\";\nimport {\n DomainError,\n type Action,\n type CommandContext,\n type JournalEvent,\n type Orchestration,\n} from \"@ragents/engine\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload.js\";\nimport { DISMISSED_ANSWER, type AskCall, type AskRequest, type AskService } from \"./contract.js\";\n\nconst answerOf = (decision: \"approved\" | \"dismissed\", result: unknown): string =>\n decision !== \"approved\" ? DISMISSED_ANSWER : typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nconst resolvedAnswerOf = (action: Action): string | null =>\n action.status === \"pending\" ? null : answerOf(action.status, action.result);\n\nexport class RuntimeAskService implements AskService {\n #runtime: Orchestration | undefined;\n readonly #waiters = new Map<string, (answer: string) => void>();\n readonly #aborting = new Set<string>();\n\n bind(runtime: Orchestration): void {\n if (this.#runtime) throw new Error(\"Der Ask-Service wurde bereits an eine Runtime gebunden\");\n this.#runtime = runtime;\n runtime.subscribe((events) => this.#onJournal(events));\n }\n\n ask(call: AskCall, request: AskRequest, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n const context: CommandContext = {\n actorId: call.agentId,\n commandId: call.commandId,\n ...(call.turnId ? { turnId: call.turnId, correlationId: call.turnId, causationId: call.turnId } : {}),\n };\n runtime.proposeAction(context, call.runId, {\n owner: ASK_PLUGIN_ID,\n title: request.question,\n description: request.description,\n parameters: request.parameters,\n input: { label: \"Antwort\", placeholder: null, required: true },\n payload: {\n question: request.question,\n options: [...request.options],\n multi: request.multi === true,\n ...(request.recipient ? { recipient: request.recipient } : {}),\n },\n });\n const proposed = runtime.events(call.runId).find((event) =>\n event.type === \"action.proposed\" && event.commandId === call.commandId);\n if (proposed?.type !== \"action.proposed\") {\n throw new Error(`Die Frage von ${call.agentId} wurde nicht im Journal von ${call.runId} angelegt`);\n }\n return this.#awaitAnswer(call.runId, proposed.payload.actionId, signal);\n }\n\n answer(runId: string, actionId: string, input: { answer?: string; dismiss?: boolean }): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action || action.owner !== ASK_PLUGIN_ID) {\n throw new DomainError(\"question-not-found\", `Frage ${actionId} existiert nicht in Run ${runId}.`, 404);\n }\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-answer:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n input.dismiss === true\n ? { decision: \"dismissed\", result: null }\n : { decision: \"approved\", result: input.answer ?? null },\n );\n }\n\n withdraw(runId: string, actionId: string): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (action?.owner !== ASK_PLUGIN_ID || action.status !== \"pending\") return;\n this.#aborting.add(actionId);\n try {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-withdraw:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result: null },\n );\n } finally {\n this.#aborting.delete(actionId);\n }\n this.#waiters.get(actionId)?.(DISMISSED_ANSWER);\n }\n\n #awaitAnswer(runId: string, actionId: string, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n const action = runtime.state(runId).actions.get(actionId);\n if (!action) throw new Error(`Frage ${actionId} existiert nicht in Run ${runId}`);\n const settled = resolvedAnswerOf(action);\n if (settled !== null) return Promise.resolve(settled);\n return new Promise<string>((resolve, reject) => {\n const abort = () => {\n this.#waiters.delete(actionId);\n this.#aborting.add(actionId);\n try {\n const state = runtime.state(runId);\n const pending = state.actions.get(actionId);\n if (pending?.status === \"pending\") {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-abort:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result: null },\n );\n }\n reject(new Error(\"Das Warten auf die Antwort wurde abgebrochen.\"));\n } catch (error) {\n reject(error);\n } finally {\n this.#aborting.delete(actionId);\n }\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n signal?.addEventListener(\"abort\", abort, { once: true });\n this.#waiters.set(actionId, (answer) => {\n signal?.removeEventListener(\"abort\", abort);\n this.#waiters.delete(actionId);\n resolve(answer);\n });\n });\n }\n\n #onJournal(events: JournalEvent[]): void {\n for (const event of events) {\n if (event.type !== \"action.resolved\") continue;\n if (this.#aborting.has(event.payload.actionId)) continue;\n const resolved = this.#requireRuntime().state(event.runId).actions.get(event.payload.actionId);\n if (resolved?.owner !== ASK_PLUGIN_ID) continue;\n const answer = answerOf(event.payload.decision, event.payload.result);\n const waiter = this.#waiters.get(event.payload.actionId);\n if (waiter) {\n waiter(answer);\n continue;\n }\n queueMicrotask(() => this.#enqueueAnswer(event.runId, event.payload.actionId, answer));\n }\n }\n\n #enqueueAnswer(runId: string, actionId: string, answer: string): void {\n try {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action) return;\n const recipientId = askPayloadOf(action.payload)?.recipient ?? action.askedBy;\n const recipient = state.actors.get(recipientId);\n if (!recipient || recipient.kind === \"human\" || recipient.lifecycle.kind === \"stopped\") return;\n runtime.enqueueInput(\n { actorId: state.ownerId, commandId: `ask-input:${actionId}` },\n runId,\n {\n actorId: recipientId,\n content: `Antwort auf ${recipientId === action.askedBy ? \"deine Frage\" : \"die Frage\"}: ${action.title}\\nAntwort: ${answer}`,\n },\n );\n } catch (error) {\n console.error(`Antwort auf Frage ${actionId} konnte nicht als Input eingereiht werden: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n #requireRuntime(): Orchestration {\n if (!this.#runtime) throw new Error(\"Der Ask-Service ist noch nicht an die Runtime gebunden\");\n return this.#runtime;\n }\n}\n", "export const ASK_PLUGIN_ID = \"ragents.ask\";\n\nexport interface AskPayload {\n question: string;\n options: string[];\n multi: boolean;\n /** Der Actor, f\u00FCr den die Frage steht, wenn der Eigent\u00FCmer des Runs sie au\u00DFerhalb eines Turns stellt. */\n recipient?: string;\n}\n\nconst stringArrayOf = (value: unknown): string[] | undefined =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\") ? [...value] : undefined;\n\nexport const askPayloadOf = (payload: unknown): AskPayload | undefined => {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const candidate = payload as Partial<AskPayload>;\n const options = stringArrayOf(candidate.options);\n if (typeof candidate.question !== \"string\" || !options) return undefined;\n return {\n question: candidate.question,\n options,\n multi: candidate.multi === true,\n ...(typeof candidate.recipient === \"string\" ? { recipient: candidate.recipient } : {}),\n };\n};\n", "import type { ToolContributor } from \"@ragents/engine\";\nimport { toolDescriptorFrom } from \"@ragents/host/plugin-support/agent-tool.js\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport { askToolMetadata, createAskTool } from \"./ask-tool.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const createAskToolContributor = (service: AskService): ToolContributor => ({\n name: \"ragents.ask\",\n descriptors: [toolDescriptorFrom(askToolMetadata, facesOperator)],\n tools: () => [createAskTool(service)],\n});\n", "import { Type } from \"typebox\";\nimport { defineRunFunction, type RunFunction } from \"@ragents/engine\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const askToolMetadata = {\n name: \"ask_user\",\n label: \"R\u00FCckfrage\",\n description: \"Holt eine n\u00F6tige Benutzerentscheidung mit Antwortoptionen ein und wartet auf die Antwort.\",\n longDescription: \"Nutze dieses Werkzeug immer, wenn du eine Entscheidung des Benutzers brauchst \"\n + \"(z.B. Auswahl eines Branches oder eines Zeitraums), statt die Frage nur als Text zu stellen. \"\n + \"Mit multi=true darf der Benutzer mehrere Optionen w\u00E4hlen; die Antwort ist dann mit '; ' verbunden. \"\n + \"Der Benutzer kann statt einer Option auch immer frei antworten - rechne also damit, \"\n + \"dass die Antwort beliebiger Text sein kann.\",\n} as const;\n\nexport const createAskTool = (service: AskService): RunFunction =>\n defineRunFunction({\n ...askToolMetadata,\n schema: Type.Object({\n question: Type.String({ description: \"Die Frage an den Benutzer, kurz und konkret\" }),\n options: Type.Array(Type.String(), { description: \"Antwortoptionen (2 bis 6 St\u00FCck)\" }),\n multi: Type.Optional(Type.Boolean({ description: \"true = Mehrfachauswahl erlaubt\" })),\n }),\n resultSchema: Type.String(),\n available: facesOperator,\n executionMode: \"sequential\",\n run: (scope, toolCallId, input) =>\n service.ask(\n {\n runId: scope.caller.runId,\n agentId: scope.caller.actorId,\n turnId: scope.caller.turnId,\n commandId: scope.context(toolCallId).commandId,\n },\n { question: input.question, options: input.options, multi: input.multi === true },\n scope.signal,\n ),\n });\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AACA,SAAS,mBAAmB;AAE5B,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,0BAA0B;;;ACLnC,SAAS,aAAa,iBAA0C;;;ACAhE,SAAS,YAAY;AACrB,SAAS,uBAAuB;AAEzB,IAAM,eAAe;AAAA,EAC1B,QAAQ,gBAAgB;AAAA,IACtB,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ,CAAC,aAAa,YAAY;AAAA,IAClC,OAAO,KAAK,OAAO;AAAA,MACjB,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG,WAAW,IAAI,aAAa,mBAAmB,CAAC;AAAA,MACnF,UAAU,KAAK,OAAO,EAAE,WAAW,GAAG,WAAW,IAAI,aAAa,oBAAoB,CAAC;AAAA,MACvF,QAAQ,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,4BAA4B,CAAC,CAAC;AAAA,MAC/E,SAAS,KAAK,SAAS,KAAK,QAAQ,EAAE,aAAa,uCAAuC,CAAC,CAAC;AAAA,IAC9F,GAAG,EAAE,sBAAsB,MAAM,CAAC;AAAA,IAClC,QAAQ,KAAK,KAAK;AAAA,EACpB,CAAC;AACH;;;ADZO,IAAM,qBAAqB,CAChC,SACA,kBACuB,UAAU,aAAa,QAAQ,CAAC,EAAE,OAAO,UAAU,QAAQ,QAAQ,MAAM;AAChG,MAAI,YAAY,SAAS,OAAO,WAAW,YAAY,OAAO,KAAK,MAAM,KAAK;AAC5E,UAAM,IAAI,YAAY,kBAAkB,sDAAsD,GAAG;AAAA,EACnG;AACA,gBAAc,KAAK;AACnB,UAAQ,OAAO,OAAO,UAAU,EAAE,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC,GAAI,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC,EAAG,CAAC;AAC9H,SAAO;AACT,CAAC;;;AEdD,SAAS,kBAAkB;AAC3B;AAAA,EACE,eAAAA;AAAA,
|
|
6
|
-
"names": ["DomainError", "DomainError", "facesOperator", "Type", "facesOperator"]
|
|
4
|
+
"sourcesContent": ["import type { RAgentsPlugin } from \"@ragents/engine\";\nimport { pluginAsset } from \"@ragents/host/plugin-support/plugin-folder.js\";\nimport type { PluginModule } from \"@ragents/host/plugin-support/plugin-module.js\";\nimport { handlebarsPrompt } from \"@ragents/host/plugin-support/prompt.js\";\nimport { runGuardToken } from \"@ragents/host/ragents/host-services.js\";\nimport { runtimeBridgeToken } from \"@ragents/host/ragents/runtime-bridge.js\";\nimport { createAnswerMethod } from \"./answer-method.js\";\nimport { RuntimeAskService } from \"./ask-service.js\";\nimport { askServiceToken } from \"./contract.js\";\nimport { createAskToolContributor } from \"./tool-contributor.js\";\n\nconst askPlugin: RAgentsPlugin = {\n manifest: { id: \"ragents.ask\" },\n register: (host) => {\n const service = new RuntimeAskService();\n host.provide(askServiceToken, service);\n host.provide(runtimeBridgeToken, { bind: (runtime) => service.bind(runtime) });\n host.prompts(handlebarsPrompt(\"ragents.ask.prompt\", 480, pluginAsset(\"ragents.ask\", \"ask.hbs\")));\n host.functions(createAskToolContributor(service));\n host.methods(createAnswerMethod(service, host.service(runGuardToken)));\n },\n};\n\nexport const plugin: PluginModule = { create: () => askPlugin };\n", "import { DomainError, implement, type MethodContribution } from \"@ragents/engine\";\nimport { askContracts } from \"../contract.js\";\nimport type { RuntimeAskService } from \"./ask-service.js\";\n\nexport const createAnswerMethod = (\n service: RuntimeAskService,\n ensureSession: (runId: string) => void,\n): MethodContribution => implement(askContracts.answer, ({ runId, actionId, answer, dismiss }) => {\n if (dismiss !== true && (typeof answer !== \"string\" || answer.trim() === \"\")) {\n throw new DomainError(\"answer-missing\", \"answer ist erforderlich, wenn nicht verworfen wird\", 400);\n }\n ensureSession(runId);\n service.answer(runId, actionId, { ...(answer !== undefined ? { answer } : {}), ...(dismiss !== undefined ? { dismiss } : {}) });\n return null;\n});\n", "import { Type } from \"typebox\";\nimport { defineOperation } from \"@ragents/engine/src/rpc/contract\";\n\nexport const askContracts = {\n answer: defineOperation({\n id: \"ragents.ask.answer\",\n description: \"Eine R\u00FCckfrage des Runs beantworten oder verwerfen. Rechte: runs.read und runs.write.\",\n rights: [\"runs.read\", \"runs.write\"],\n input: Type.Object({\n runId: Type.String({ minLength: 1, maxLength: 64, description: \"Kennung des Runs\" }),\n actionId: Type.String({ minLength: 1, maxLength: 80, description: \"Kennung der Frage\" }),\n answer: Type.Optional(Type.String({ description: \"Die Antwort des Benutzers\" })),\n dismiss: Type.Optional(Type.Boolean({ description: \"true verwirft die Frage ohne Antwort\" })),\n }, { additionalProperties: false }),\n result: Type.Null(),\n }),\n};\n", "import { randomUUID } from \"node:crypto\";\nimport {\n DomainError,\n type Action,\n type CommandContext,\n type JournalEvent,\n type JsonValue,\n type Orchestration,\n} from \"@ragents/engine\";\nimport { askPayloadOf, ASK_PLUGIN_ID, SUPERSEDED_ANSWER, supersedingInputOf } from \"../ask-payload.js\";\nimport { DISMISSED_ANSWER, type AskCall, type AskRequest, type AskService } from \"./contract.js\";\n\nconst answerOf = (decision: \"approved\" | \"dismissed\", result: unknown): string =>\n decision !== \"approved\"\n ? supersedingInputOf(result) === undefined ? DISMISSED_ANSWER : SUPERSEDED_ANSWER\n : typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nconst resolvedAnswerOf = (action: Action): string | null =>\n action.status === \"pending\" ? null : answerOf(action.status, action.result);\n\nconst humanInputPendingFor = (runtime: Orchestration, runId: string, actorId: string): boolean =>\n [...runtime.state(runId).inputs.values()].some((input) =>\n input.actorId === actorId && input.origin === \"human\" && input.lifecycle.kind === \"pending\");\n\ninterface Waiter {\n runId: string;\n /** The actor whose running turn waits for the answer; null for a question asked outside a turn. */\n blockedActorId: string | null;\n settle: (answer: string) => void;\n}\n\nexport class RuntimeAskService implements AskService {\n #runtime: Orchestration | undefined;\n readonly #waiters = new Map<string, Waiter>();\n readonly #aborting = new Set<string>();\n\n bind(runtime: Orchestration): void {\n if (this.#runtime) throw new Error(\"Der Ask-Service wurde bereits an eine Runtime gebunden\");\n this.#runtime = runtime;\n runtime.subscribe((events) => this.#onJournal(events));\n }\n\n ask(call: AskCall, request: AskRequest, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n if (call.turnId && humanInputPendingFor(runtime, call.runId, call.agentId)) return Promise.resolve(SUPERSEDED_ANSWER);\n const context: CommandContext = {\n actorId: call.agentId,\n commandId: call.commandId,\n ...(call.turnId ? { turnId: call.turnId, correlationId: call.turnId, causationId: call.turnId } : {}),\n };\n runtime.proposeAction(context, call.runId, {\n owner: ASK_PLUGIN_ID,\n title: request.question,\n description: request.description,\n parameters: request.parameters,\n input: { label: \"Antwort\", placeholder: null, required: true },\n payload: {\n question: request.question,\n options: [...request.options],\n multi: request.multi === true,\n ...(request.recipient ? { recipient: request.recipient } : {}),\n },\n });\n const proposed = runtime.events(call.runId).find((event) =>\n event.type === \"action.proposed\" && event.commandId === call.commandId);\n if (proposed?.type !== \"action.proposed\") {\n throw new Error(`Die Frage von ${call.agentId} wurde nicht im Journal von ${call.runId} angelegt`);\n }\n return this.#awaitAnswer(call.runId, proposed.payload.actionId, call.turnId ? call.agentId : null, signal);\n }\n\n answer(runId: string, actionId: string, input: { answer?: string; dismiss?: boolean }): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action || action.owner !== ASK_PLUGIN_ID) {\n throw new DomainError(\"question-not-found\", `Frage ${actionId} existiert nicht in Run ${runId}.`, 404);\n }\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-answer:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n input.dismiss === true\n ? { decision: \"dismissed\", result: null }\n : { decision: \"approved\", result: input.answer ?? null },\n );\n }\n\n withdraw(runId: string, actionId: string): void {\n this.#dismiss(runId, actionId, \"ask-withdraw\", null, DISMISSED_ANSWER);\n }\n\n #supersede(runId: string, actionId: string, inputId: string): void {\n try {\n this.#dismiss(runId, actionId, \"ask-supersede\", { supersededBy: inputId }, SUPERSEDED_ANSWER);\n } catch (error) {\n console.error(`Question ${actionId} could not be closed for message ${inputId}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n #dismiss(runId: string, actionId: string, commandPrefix: string, result: JsonValue, answer: string): void {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (action?.owner !== ASK_PLUGIN_ID || action.status !== \"pending\") return;\n this.#aborting.add(actionId);\n try {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `${commandPrefix}:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result },\n );\n } finally {\n this.#aborting.delete(actionId);\n }\n this.#waiters.get(actionId)?.settle(answer);\n }\n\n #awaitAnswer(runId: string, actionId: string, blockedActorId: string | null, signal: AbortSignal | undefined): Promise<string> {\n const runtime = this.#requireRuntime();\n const action = runtime.state(runId).actions.get(actionId);\n if (!action) throw new Error(`Frage ${actionId} existiert nicht in Run ${runId}`);\n const settled = resolvedAnswerOf(action);\n if (settled !== null) return Promise.resolve(settled);\n return new Promise<string>((resolve, reject) => {\n const abort = () => {\n this.#waiters.delete(actionId);\n this.#aborting.add(actionId);\n try {\n const state = runtime.state(runId);\n const pending = state.actions.get(actionId);\n if (pending?.status === \"pending\") {\n runtime.resolveAction(\n { actorId: state.ownerId, commandId: `ask-abort:${actionId}:${randomUUID()}` },\n runId,\n actionId,\n { decision: \"dismissed\", result: null },\n );\n }\n reject(new Error(\"Das Warten auf die Antwort wurde abgebrochen.\"));\n } catch (error) {\n reject(error);\n } finally {\n this.#aborting.delete(actionId);\n }\n };\n if (signal?.aborted) {\n abort();\n return;\n }\n signal?.addEventListener(\"abort\", abort, { once: true });\n this.#waiters.set(actionId, {\n runId,\n blockedActorId,\n settle: (answer) => {\n signal?.removeEventListener(\"abort\", abort);\n this.#waiters.delete(actionId);\n resolve(answer);\n },\n });\n });\n }\n\n #onJournal(events: JournalEvent[]): void {\n for (const event of events) {\n if (event.type === \"actor.input.enqueued\") {\n if (event.payload.origin !== \"human\") continue;\n const { actorId, inputId } = event.payload;\n for (const [actionId, waiter] of this.#waiters) {\n if (waiter.runId !== event.runId || waiter.blockedActorId !== actorId) continue;\n queueMicrotask(() => this.#supersede(event.runId, actionId, inputId));\n }\n continue;\n }\n if (event.type !== \"action.resolved\") continue;\n if (this.#aborting.has(event.payload.actionId)) continue;\n const resolved = this.#requireRuntime().state(event.runId).actions.get(event.payload.actionId);\n if (resolved?.owner !== ASK_PLUGIN_ID) continue;\n const answer = answerOf(event.payload.decision, event.payload.result);\n const waiter = this.#waiters.get(event.payload.actionId);\n if (waiter) {\n waiter.settle(answer);\n continue;\n }\n queueMicrotask(() => this.#enqueueAnswer(event.runId, event.payload.actionId, answer));\n }\n }\n\n #enqueueAnswer(runId: string, actionId: string, answer: string): void {\n try {\n const runtime = this.#requireRuntime();\n const state = runtime.state(runId);\n const action = state.actions.get(actionId);\n if (!action) return;\n const recipientId = askPayloadOf(action.payload)?.recipient ?? action.askedBy;\n const recipient = state.actors.get(recipientId);\n if (!recipient || recipient.kind === \"human\" || recipient.lifecycle.kind === \"stopped\") return;\n runtime.enqueueInput(\n { actorId: state.ownerId, commandId: `ask-input:${actionId}` },\n runId,\n {\n actorId: recipientId,\n content: `Antwort auf ${recipientId === action.askedBy ? \"deine Frage\" : \"die Frage\"}: ${action.title}\\nAntwort: ${answer}`,\n },\n );\n } catch (error) {\n console.error(`Antwort auf Frage ${actionId} konnte nicht als Input eingereiht werden: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n #requireRuntime(): Orchestration {\n if (!this.#runtime) throw new Error(\"Der Ask-Service ist noch nicht an die Runtime gebunden\");\n return this.#runtime;\n }\n}\n", "export const ASK_PLUGIN_ID = \"ragents.ask\";\n\n/** What the asking tool call gets when a person's message to the asker closes its question. */\nexport const SUPERSEDED_ANSWER = \"Not answered: the user sent a new message instead.\";\n\nexport interface AskPayload {\n question: string;\n options: string[];\n multi: boolean;\n /** Der Actor, f\u00FCr den die Frage steht, wenn der Eigent\u00FCmer des Runs sie au\u00DFerhalb eines Turns stellt. */\n recipient?: string;\n}\n\nconst stringArrayOf = (value: unknown): string[] | undefined =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\") ? [...value] : undefined;\n\nexport const askPayloadOf = (payload: unknown): AskPayload | undefined => {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const candidate = payload as Partial<AskPayload>;\n const options = stringArrayOf(candidate.options);\n if (typeof candidate.question !== \"string\" || !options) return undefined;\n return {\n question: candidate.question,\n options,\n multi: candidate.multi === true,\n ...(typeof candidate.recipient === \"string\" ? { recipient: candidate.recipient } : {}),\n };\n};\n\nexport const supersedingInputOf = (result: unknown): string | undefined => {\n if (typeof result !== \"object\" || result === null) return undefined;\n const { supersededBy } = result as { supersededBy?: unknown };\n return typeof supersededBy === \"string\" ? supersededBy : undefined;\n};\n", "import type { ToolContributor } from \"@ragents/engine\";\nimport { toolDescriptorFrom } from \"@ragents/host/plugin-support/agent-tool.js\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport { askToolMetadata, createAskTool } from \"./ask-tool.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const createAskToolContributor = (service: AskService): ToolContributor => ({\n name: \"ragents.ask\",\n descriptors: [toolDescriptorFrom(askToolMetadata, facesOperator)],\n tools: () => [createAskTool(service)],\n});\n", "import { Type } from \"typebox\";\nimport { defineRunFunction, type RunFunction } from \"@ragents/engine\";\nimport { facesOperator } from \"@ragents/host/plugin-support/tool-availability.js\";\nimport type { AskService } from \"./contract.js\";\n\nexport const askToolMetadata = {\n name: \"ask_user\",\n label: \"R\u00FCckfrage\",\n description: \"Holt eine n\u00F6tige Benutzerentscheidung mit Antwortoptionen ein und wartet auf die Antwort.\",\n longDescription: \"Nutze dieses Werkzeug immer, wenn du eine Entscheidung des Benutzers brauchst \"\n + \"(z.B. Auswahl eines Branches oder eines Zeitraums), statt die Frage nur als Text zu stellen. \"\n + \"Mit multi=true darf der Benutzer mehrere Optionen w\u00E4hlen; die Antwort ist dann mit '; ' verbunden. \"\n + \"Der Benutzer kann statt einer Option auch immer frei antworten - rechne also damit, \"\n + \"dass die Antwort beliebiger Text sein kann.\",\n} as const;\n\nexport const createAskTool = (service: AskService): RunFunction =>\n defineRunFunction({\n ...askToolMetadata,\n schema: Type.Object({\n question: Type.String({ description: \"Die Frage an den Benutzer, kurz und konkret\" }),\n options: Type.Array(Type.String(), { description: \"Antwortoptionen (2 bis 6 St\u00FCck)\" }),\n multi: Type.Optional(Type.Boolean({ description: \"true = Mehrfachauswahl erlaubt\" })),\n }),\n resultSchema: Type.String(),\n available: facesOperator,\n executionMode: \"sequential\",\n run: (scope, toolCallId, input) =>\n service.ask(\n {\n runId: scope.caller.runId,\n agentId: scope.caller.actorId,\n turnId: scope.caller.turnId,\n commandId: scope.context(toolCallId).commandId,\n },\n { question: input.question, options: input.options, multi: input.multi === true },\n scope.signal,\n ),\n });\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AACA,SAAS,mBAAmB;AAE5B,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,0BAA0B;;;ACLnC,SAAS,aAAa,iBAA0C;;;ACAhE,SAAS,YAAY;AACrB,SAAS,uBAAuB;AAEzB,IAAM,eAAe;AAAA,EAC1B,QAAQ,gBAAgB;AAAA,IACtB,IAAI;AAAA,IACJ,aAAa;AAAA,IACb,QAAQ,CAAC,aAAa,YAAY;AAAA,IAClC,OAAO,KAAK,OAAO;AAAA,MACjB,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG,WAAW,IAAI,aAAa,mBAAmB,CAAC;AAAA,MACnF,UAAU,KAAK,OAAO,EAAE,WAAW,GAAG,WAAW,IAAI,aAAa,oBAAoB,CAAC;AAAA,MACvF,QAAQ,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,4BAA4B,CAAC,CAAC;AAAA,MAC/E,SAAS,KAAK,SAAS,KAAK,QAAQ,EAAE,aAAa,uCAAuC,CAAC,CAAC;AAAA,IAC9F,GAAG,EAAE,sBAAsB,MAAM,CAAC;AAAA,IAClC,QAAQ,KAAK,KAAK;AAAA,EACpB,CAAC;AACH;;;ADZO,IAAM,qBAAqB,CAChC,SACA,kBACuB,UAAU,aAAa,QAAQ,CAAC,EAAE,OAAO,UAAU,QAAQ,QAAQ,MAAM;AAChG,MAAI,YAAY,SAAS,OAAO,WAAW,YAAY,OAAO,KAAK,MAAM,KAAK;AAC5E,UAAM,IAAI,YAAY,kBAAkB,sDAAsD,GAAG;AAAA,EACnG;AACA,gBAAc,KAAK;AACnB,UAAQ,OAAO,OAAO,UAAU,EAAE,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC,GAAI,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC,EAAG,CAAC;AAC9H,SAAO;AACT,CAAC;;;AEdD,SAAS,kBAAkB;AAC3B;AAAA,EACE,eAAAA;AAAA,OAMK;;;ACRA,IAAM,gBAAgB;AAGtB,IAAM,oBAAoB;AAUjC,IAAM,gBAAgB,CAAC,UACrB,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,IAAI,CAAC,GAAG,KAAK,IAAI;AAEpF,IAAM,eAAe,CAAC,YAA6C;AACxE,MAAI,OAAO,YAAY,YAAY,YAAY,KAAM,QAAO;AAC5D,QAAM,YAAY;AAClB,QAAM,UAAU,cAAc,UAAU,OAAO;AAC/C,MAAI,OAAO,UAAU,aAAa,YAAY,CAAC,QAAS,QAAO;AAC/D,SAAO;AAAA,IACL,UAAU,UAAU;AAAA,IACpB;AAAA,IACA,OAAO,UAAU,UAAU;AAAA,IAC3B,GAAI,OAAO,UAAU,cAAc,WAAW,EAAE,WAAW,UAAU,UAAU,IAAI,CAAC;AAAA,EACtF;AACF;AAEO,IAAM,qBAAqB,CAAC,WAAwC;AACzE,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,EAAE,aAAa,IAAI;AACzB,SAAO,OAAO,iBAAiB,WAAW,eAAe;AAC3D;;;ADrBA,IAAM,WAAW,CAAC,UAAoC,WACpD,aAAa,aACT,mBAAmB,MAAM,MAAM,SAAY,mBAAmB,oBAC9D,OAAO,WAAW,WAAW,SAAS,WAAW,QAAQ,WAAW,SAAY,KAAK,KAAK,UAAU,MAAM;AAEhH,IAAM,mBAAmB,CAAC,WACxB,OAAO,WAAW,YAAY,OAAO,SAAS,OAAO,QAAQ,OAAO,MAAM;AAE5E,IAAM,uBAAuB,CAAC,SAAwB,OAAe,YACnE,CAAC,GAAG,QAAQ,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,UAC9C,MAAM,YAAY,WAAW,MAAM,WAAW,WAAW,MAAM,UAAU,SAAS,SAAS;AASxF,IAAM,oBAAN,MAA8C;AAAA,EACnD;AAAA,EACS,WAAW,oBAAI,IAAoB;AAAA,EACnC,YAAY,oBAAI,IAAY;AAAA,EAErC,KAAK,SAA8B;AACjC,QAAI,KAAK,SAAU,OAAM,IAAI,MAAM,wDAAwD;AAC3F,SAAK,WAAW;AAChB,YAAQ,UAAU,CAAC,WAAW,KAAK,WAAW,MAAM,CAAC;AAAA,EACvD;AAAA,EAEA,IAAI,MAAe,SAAqB,QAAkD;AACxF,UAAM,UAAU,KAAK,gBAAgB;AACrC,QAAI,KAAK,UAAU,qBAAqB,SAAS,KAAK,OAAO,KAAK,OAAO,EAAG,QAAO,QAAQ,QAAQ,iBAAiB;AACpH,UAAM,UAA0B;AAAA,MAC9B,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,QAAQ,eAAe,KAAK,QAAQ,aAAa,KAAK,OAAO,IAAI,CAAC;AAAA,IACrG;AACA,YAAQ,cAAc,SAAS,KAAK,OAAO;AAAA,MACzC,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ;AAAA,MACpB,OAAO,EAAE,OAAO,WAAW,aAAa,MAAM,UAAU,KAAK;AAAA,MAC7D,SAAS;AAAA,QACP,UAAU,QAAQ;AAAA,QAClB,SAAS,CAAC,GAAG,QAAQ,OAAO;AAAA,QAC5B,OAAO,QAAQ,UAAU;AAAA,QACzB,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,MAC9D;AAAA,IACF,CAAC;AACD,UAAM,WAAW,QAAQ,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC,UAChD,MAAM,SAAS,qBAAqB,MAAM,cAAc,KAAK,SAAS;AACxE,QAAI,UAAU,SAAS,mBAAmB;AACxC,YAAM,IAAI,MAAM,iBAAiB,KAAK,OAAO,+BAA+B,KAAK,KAAK,WAAW;AAAA,IACnG;AACA,WAAO,KAAK,aAAa,KAAK,OAAO,SAAS,QAAQ,UAAU,KAAK,SAAS,KAAK,UAAU,MAAM,MAAM;AAAA,EAC3G;AAAA,EAEA,OAAO,OAAe,UAAkB,OAAqD;AAC3F,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,UAAM,SAAS,MAAM,QAAQ,IAAI,QAAQ;AACzC,QAAI,CAAC,UAAU,OAAO,UAAU,eAAe;AAC7C,YAAM,IAAIC,aAAY,sBAAsB,SAAS,QAAQ,2BAA2B,KAAK,KAAK,GAAG;AAAA,IACvG;AACA,YAAQ;AAAA,MACN,EAAE,SAAS,MAAM,SAAS,WAAW,cAAc,QAAQ,IAAI,WAAW,CAAC,GAAG;AAAA,MAC9E;AAAA,MACA;AAAA,MACA,MAAM,YAAY,OACd,EAAE,UAAU,aAAa,QAAQ,KAAK,IACtC,EAAE,UAAU,YAAY,QAAQ,MAAM,UAAU,KAAK;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,SAAS,OAAe,UAAwB;AAC9C,SAAK,SAAS,OAAO,UAAU,gBAAgB,MAAM,gBAAgB;AAAA,EACvE;AAAA,EAEA,WAAW,OAAe,UAAkB,SAAuB;AACjE,QAAI;AACF,WAAK,SAAS,OAAO,UAAU,iBAAiB,EAAE,cAAc,QAAQ,GAAG,iBAAiB;AAAA,IAC9F,SAAS,OAAO;AACd,cAAQ,MAAM,YAAY,QAAQ,oCAAoC,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IAC5I;AAAA,EACF;AAAA,EAEA,SAAS,OAAe,UAAkB,eAAuB,QAAmB,QAAsB;AACxG,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,UAAM,SAAS,MAAM,QAAQ,IAAI,QAAQ;AACzC,QAAI,QAAQ,UAAU,iBAAiB,OAAO,WAAW,UAAW;AACpE,SAAK,UAAU,IAAI,QAAQ;AAC3B,QAAI;AACF,cAAQ;AAAA,QACN,EAAE,SAAS,MAAM,SAAS,WAAW,GAAG,aAAa,IAAI,QAAQ,IAAI,WAAW,CAAC,GAAG;AAAA,QACpF;AAAA,QACA;AAAA,QACA,EAAE,UAAU,aAAa,OAAO;AAAA,MAClC;AAAA,IACF,UAAE;AACA,WAAK,UAAU,OAAO,QAAQ;AAAA,IAChC;AACA,SAAK,SAAS,IAAI,QAAQ,GAAG,OAAO,MAAM;AAAA,EAC5C;AAAA,EAEA,aAAa,OAAe,UAAkB,gBAA+B,QAAkD;AAC7H,UAAM,UAAU,KAAK,gBAAgB;AACrC,UAAM,SAAS,QAAQ,MAAM,KAAK,EAAE,QAAQ,IAAI,QAAQ;AACxD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,SAAS,QAAQ,2BAA2B,KAAK,EAAE;AAChF,UAAM,UAAU,iBAAiB,MAAM;AACvC,QAAI,YAAY,KAAM,QAAO,QAAQ,QAAQ,OAAO;AACpD,WAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,YAAM,QAAQ,MAAM;AAClB,aAAK,SAAS,OAAO,QAAQ;AAC7B,aAAK,UAAU,IAAI,QAAQ;AAC3B,YAAI;AACF,gBAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,gBAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ;AAC1C,cAAI,SAAS,WAAW,WAAW;AACjC,oBAAQ;AAAA,cACN,EAAE,SAAS,MAAM,SAAS,WAAW,aAAa,QAAQ,IAAI,WAAW,CAAC,GAAG;AAAA,cAC7E;AAAA,cACA;AAAA,cACA,EAAE,UAAU,aAAa,QAAQ,KAAK;AAAA,YACxC;AAAA,UACF;AACA,iBAAO,IAAI,MAAM,+CAA+C,CAAC;AAAA,QACnE,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd,UAAE;AACA,eAAK,UAAU,OAAO,QAAQ;AAAA,QAChC;AAAA,MACF;AACA,UAAI,QAAQ,SAAS;AACnB,cAAM;AACN;AAAA,MACF;AACA,cAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AACvD,WAAK,SAAS,IAAI,UAAU;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,QAAQ,CAAC,WAAW;AAClB,kBAAQ,oBAAoB,SAAS,KAAK;AAC1C,eAAK,SAAS,OAAO,QAAQ;AAC7B,kBAAQ,MAAM;AAAA,QAChB;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,QAA8B;AACvC,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,SAAS,wBAAwB;AACzC,YAAI,MAAM,QAAQ,WAAW,QAAS;AACtC,cAAM,EAAE,SAAS,QAAQ,IAAI,MAAM;AACnC,mBAAW,CAAC,UAAUC,OAAM,KAAK,KAAK,UAAU;AAC9C,cAAIA,QAAO,UAAU,MAAM,SAASA,QAAO,mBAAmB,QAAS;AACvE,yBAAe,MAAM,KAAK,WAAW,MAAM,OAAO,UAAU,OAAO,CAAC;AAAA,QACtE;AACA;AAAA,MACF;AACA,UAAI,MAAM,SAAS,kBAAmB;AACtC,UAAI,KAAK,UAAU,IAAI,MAAM,QAAQ,QAAQ,EAAG;AAChD,YAAM,WAAW,KAAK,gBAAgB,EAAE,MAAM,MAAM,KAAK,EAAE,QAAQ,IAAI,MAAM,QAAQ,QAAQ;AAC7F,UAAI,UAAU,UAAU,cAAe;AACvC,YAAM,SAAS,SAAS,MAAM,QAAQ,UAAU,MAAM,QAAQ,MAAM;AACpE,YAAM,SAAS,KAAK,SAAS,IAAI,MAAM,QAAQ,QAAQ;AACvD,UAAI,QAAQ;AACV,eAAO,OAAO,MAAM;AACpB;AAAA,MACF;AACA,qBAAe,MAAM,KAAK,eAAe,MAAM,OAAO,MAAM,QAAQ,UAAU,MAAM,CAAC;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,eAAe,OAAe,UAAkB,QAAsB;AACpE,QAAI;AACF,YAAM,UAAU,KAAK,gBAAgB;AACrC,YAAM,QAAQ,QAAQ,MAAM,KAAK;AACjC,YAAM,SAAS,MAAM,QAAQ,IAAI,QAAQ;AACzC,UAAI,CAAC,OAAQ;AACb,YAAM,cAAc,aAAa,OAAO,OAAO,GAAG,aAAa,OAAO;AACtE,YAAM,YAAY,MAAM,OAAO,IAAI,WAAW;AAC9C,UAAI,CAAC,aAAa,UAAU,SAAS,WAAW,UAAU,UAAU,SAAS,UAAW;AACxF,cAAQ;AAAA,QACN,EAAE,SAAS,MAAM,SAAS,WAAW,aAAa,QAAQ,GAAG;AAAA,QAC7D;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,SAAS,eAAe,gBAAgB,OAAO,UAAU,gBAAgB,WAAW,KAAK,OAAO,KAAK;AAAA,WAAc,MAAM;AAAA,QAC3H;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,qBAAqB,QAAQ,8CAA8C,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACnJ;AAAA,EACF;AAAA,EAEA,kBAAiC;AAC/B,QAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,wDAAwD;AAC5F,WAAO,KAAK;AAAA,EACd;AACF;;;AEtNA,SAAS,0BAA0B;AACnC,SAAS,iBAAAC,sBAAqB;;;ACF9B,SAAS,QAAAC,aAAY;AACrB,SAAS,yBAA2C;AACpD,SAAS,qBAAqB;AAGvB,IAAM,kBAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,iBAAiB;AAKnB;AAEO,IAAM,gBAAgB,CAAC,YAC5B,kBAAkB;AAAA,EAChB,GAAG;AAAA,EACH,QAAQA,MAAK,OAAO;AAAA,IAClB,UAAUA,MAAK,OAAO,EAAE,aAAa,8CAA8C,CAAC;AAAA,IACpF,SAASA,MAAK,MAAMA,MAAK,OAAO,GAAG,EAAE,aAAa,qCAAkC,CAAC;AAAA,IACrF,OAAOA,MAAK,SAASA,MAAK,QAAQ,EAAE,aAAa,iCAAiC,CAAC,CAAC;AAAA,EACtF,CAAC;AAAA,EACD,cAAcA,MAAK,OAAO;AAAA,EAC1B,WAAW;AAAA,EACX,eAAe;AAAA,EACf,KAAK,CAAC,OAAO,YAAY,UACvB,QAAQ;AAAA,IACN;AAAA,MACE,OAAO,MAAM,OAAO;AAAA,MACpB,SAAS,MAAM,OAAO;AAAA,MACtB,QAAQ,MAAM,OAAO;AAAA,MACrB,WAAW,MAAM,QAAQ,UAAU,EAAE;AAAA,IACvC;AAAA,IACA,EAAE,UAAU,MAAM,UAAU,SAAS,MAAM,SAAS,OAAO,MAAM,UAAU,KAAK;AAAA,IAChF,MAAM;AAAA,EACR;AACJ,CAAC;;;ADhCI,IAAM,2BAA2B,CAAC,aAA0C;AAAA,EACjF,MAAM;AAAA,EACN,aAAa,CAAC,mBAAmB,iBAAiBC,cAAa,CAAC;AAAA,EAChE,OAAO,MAAM,CAAC,cAAc,OAAO,CAAC;AACtC;;;ALCA,IAAM,YAA2B;AAAA,EAC/B,UAAU,EAAE,IAAI,cAAc;AAAA,EAC9B,UAAU,CAAC,SAAS;AAClB,UAAM,UAAU,IAAI,kBAAkB;AACtC,SAAK,QAAQ,iBAAiB,OAAO;AACrC,SAAK,QAAQ,oBAAoB,EAAE,MAAM,CAAC,YAAY,QAAQ,KAAK,OAAO,EAAE,CAAC;AAC7E,SAAK,QAAQ,iBAAiB,sBAAsB,KAAK,YAAY,eAAe,SAAS,CAAC,CAAC;AAC/F,SAAK,UAAU,yBAAyB,OAAO,CAAC;AAChD,SAAK,QAAQ,mBAAmB,SAAS,KAAK,QAAQ,aAAa,CAAC,CAAC;AAAA,EACvE;AACF;AAEO,IAAM,SAAuB,EAAE,QAAQ,MAAM,UAAU;",
|
|
6
|
+
"names": ["DomainError", "DomainError", "waiter", "facesOperator", "Type", "facesOperator"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var s="ragents.ask",r="Not answered: the user sent a new message instead.",i=n=>Array.isArray(n)&&n.every(e=>typeof e=="string")?[...n]:void 0,o=n=>{if(typeof n!="object"||n===null)return;let e=n,t=i(e.options);if(!(typeof e.question!="string"||!t))return{question:e.question,options:t,multi:e.multi===!0,...typeof e.recipient=="string"?{recipient:e.recipient}:{}}},u=n=>{if(typeof n!="object"||n===null)return;let{supersededBy:e}=n;return typeof e=="string"?e:void 0};export{s as a,r as b,o as c,u as d};
|
|
2
|
+
//# sourceMappingURL=/plugins/ragents.ask/web/chunks/chunk-WFN4374U.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../plugins/ragents.ask/ask-payload.ts"],
|
|
4
|
+
"sourcesContent": ["export const ASK_PLUGIN_ID = \"ragents.ask\";\n\n/** What the asking tool call gets when a person's message to the asker closes its question. */\nexport const SUPERSEDED_ANSWER = \"Not answered: the user sent a new message instead.\";\n\nexport interface AskPayload {\n question: string;\n options: string[];\n multi: boolean;\n /** Der Actor, f\u00FCr den die Frage steht, wenn der Eigent\u00FCmer des Runs sie au\u00DFerhalb eines Turns stellt. */\n recipient?: string;\n}\n\nconst stringArrayOf = (value: unknown): string[] | undefined =>\n Array.isArray(value) && value.every((entry) => typeof entry === \"string\") ? [...value] : undefined;\n\nexport const askPayloadOf = (payload: unknown): AskPayload | undefined => {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const candidate = payload as Partial<AskPayload>;\n const options = stringArrayOf(candidate.options);\n if (typeof candidate.question !== \"string\" || !options) return undefined;\n return {\n question: candidate.question,\n options,\n multi: candidate.multi === true,\n ...(typeof candidate.recipient === \"string\" ? { recipient: candidate.recipient } : {}),\n };\n};\n\nexport const supersedingInputOf = (result: unknown): string | undefined => {\n if (typeof result !== \"object\" || result === null) return undefined;\n const { supersededBy } = result as { supersededBy?: unknown };\n return typeof supersededBy === \"string\" ? supersededBy : undefined;\n};\n"],
|
|
5
|
+
"mappings": "AAAO,IAAMA,EAAgB,cAGhBC,EAAoB,qDAU3BC,EAAiBC,GACrB,MAAM,QAAQA,CAAK,GAAKA,EAAM,MAAOC,GAAU,OAAOA,GAAU,QAAQ,EAAI,CAAC,GAAGD,CAAK,EAAI,OAE9EE,EAAgBC,GAA6C,CACxE,GAAI,OAAOA,GAAY,UAAYA,IAAY,KAAM,OACrD,IAAMC,EAAYD,EACZE,EAAUN,EAAcK,EAAU,OAAO,EAC/C,GAAI,SAAOA,EAAU,UAAa,UAAY,CAACC,GAC/C,MAAO,CACL,SAAUD,EAAU,SACpB,QAAAC,EACA,MAAOD,EAAU,QAAU,GAC3B,GAAI,OAAOA,EAAU,WAAc,SAAW,CAAE,UAAWA,EAAU,SAAU,EAAI,CAAC,CACtF,CACF,EAEaE,EAAsBC,GAAwC,CACzE,GAAI,OAAOA,GAAW,UAAYA,IAAW,KAAM,OACnD,GAAM,CAAE,aAAAC,CAAa,EAAID,EACzB,OAAO,OAAOC,GAAiB,SAAWA,EAAe,MAC3D",
|
|
6
|
+
"names": ["ASK_PLUGIN_ID", "SUPERSEDED_ANSWER", "stringArrayOf", "value", "entry", "askPayloadOf", "payload", "candidate", "options", "supersedingInputOf", "result", "supersededBy"]
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
["access","actionId","actionViews","activate","active","actorId","additionalProperties","alert","animate-ring-pulse","answer","answerQuestion","answerTextOf","answered","antworten","approved","aria-pressed","aria-pressed:bg-accent","aria-pressed:border-primary","as","ask","askContracts","askPayloadOf","askedBy","askerHandle","assess","async","attention","attentionFor","await","beantworten","bg-background","border","border-border","candidate","cardClasses","cardSections","caught","className","configuredPlugin","const","data-question","dazu","defineOperation","den","der","des","description","descriptor","die","disabled","dismiss","eine","eines","entry","export","false","flex","flex-1","flex-col","flex-none","font-normal","fragt","frei","freiSenden","freie","from","function","gap-1.5","gap-2","gap-2.5","grid","group-aria-pressed/button:border-primary","h-auto","handle","hat","id","if","immer","import","inline-flex","input","instanceof","interface","items-center","items-stretch","justify-center","justify-start","key","label","leading-[1.35]","leading-normal","length","list-disc","lucide-react","maxLength","mb-1.5","message","minLength","motion-reduce:animate-none","multi","needsRunView","noch","null","nur","o","object","oder","offen","ohne","onAnswer","onChange","onClick","onKeyDown","option","optionClasses","options","order","outline","owner","payload","pending","pending-questions","pendingQuestions","pl-6","placeholder","px-3","px-3.5","py-1.5","question","questions","react","read","recipient","rest","result","return","rights","role","rounded-lg","rounded-sm","rpc","runId","runViewFrom","self-start","session","setError","setFrei","setGewaehlt","sie","size","size-3.5","sm","status","string","stringArrayOf","text","text-[0.7rem]","text-destructive","text-left","text-muted-foreground","text-primary","text-sm","text-success","true","type","typebox","typeof","umschalten","und","undefined","useAccess","useState","value","variant","verwirft","view","w-full","wahlweise","webPlugin","wenn","wert","whitespace-normal","write"]
|
|
1
|
+
["a","access","actionId","actionViews","activate","active","actorId","additionalProperties","alert","animate-ring-pulse","answer","answerQuestion","answerTextOf","answered","antworten","approved","aria-pressed","aria-pressed:bg-accent","aria-pressed:border-primary","as","ask","askContracts","askPayloadOf","askedBy","asker","askerHandle","asking","assess","async","attention","attentionFor","await","beantworten","bg-background","border","border-border","call","candidate","cardClasses","cardSections","caught","className","closes","configuredPlugin","const","data-question","dazu","defineOperation","den","der","des","description","descriptor","die","disabled","dismiss","eine","eines","entry","export","false","flex","flex-1","flex-col","flex-none","font-normal","fragt","frei","freiSenden","freie","from","function","gap-1.5","gap-2","gap-2.5","gets","grid","group-aria-pressed/button:border-primary","h-auto","handle","hat","id","if","immer","import","inline-flex","input","instanceof","interface","items-center","items-stretch","its","justify-center","justify-start","key","label","leading-[1.35]","leading-normal","length","list-disc","lucide-react","maxLength","mb-1.5","message","minLength","motion-reduce:animate-none","multi","needsRunView","new","noch","null","nur","o","object","oder","offen","ohne","onAnswer","onChange","onClick","onKeyDown","option","optionClasses","options","order","outline","owner","payload","pending","pending-questions","pendingQuestions","person","pl-6","placeholder","px-3","px-3.5","py-1.5","question","questions","react","read","recipient","rest","result","return","rights","role","rounded-lg","rounded-sm","rpc","runId","runViewFrom","s","self-start","sent","session","setError","setFrei","setGewaehlt","sie","size","size-3.5","sm","status","string","stringArrayOf","supersededBy","supersedingInputOf","text","text-[0.7rem]","text-destructive","text-left","text-muted-foreground","text-primary","text-sm","text-success","the","to","tool","true","type","typebox","typeof","umschalten","und","undefined","unknown","useAccess","useState","user","value","variant","verwirft","view","w-full","wahlweise","webPlugin","wenn","wert","when","whitespace-normal","write"]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b}from"/plugins/ragents.ask/web/chunks/chunk-
|
|
1
|
+
import{a,b,c,d}from"/plugins/ragents.ask/web/chunks/chunk-WFN4374U.js";export{a as ASK_PLUGIN_ID,b as SUPERSEDED_ANSWER,c as askPayloadOf,d as supersedingInputOf};
|
|
2
2
|
//# sourceMappingURL=/plugins/ragents.ask/web/exports/ask-payload.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u,b as i}from"/plugins/ragents.ask/web/chunks/chunk-
|
|
1
|
+
import{a as u,b as V,c as i,d as k}from"/plugins/ragents.ask/web/chunks/chunk-WFN4374U.js";import{a as A,b as v,c as C,d as o,e as d,f as y}from"/plugins/ragents.ask/web/chunks/chunk-V7W3QDVS.js";import{a as S}from"/plugins/ragents.ask/web/chunks/chunk-4VXWWEG7.js";import{a}from"/plugins/ragents.ask/web/chunks/chunk-VUBJDIKQ.js";var b=a("@ragents/web/run-view","runActorFrom");var l=a("@ragents/web/run-view","runViewFrom");var g=a("@ragents/web/AccessContext","useAccess");var N=e=>typeof e=="string"?e:e==null?"":JSON.stringify(e);function R({action:e,session:r,text:n}){let s=g(),[f,m]=A(),w=i(e.payload);if(!w)return null;let p=P=>{m(void 0),S(r.session.id,e.actionId,P).catch(t=>m(t instanceof Error?t.message:String(t)))};return d(C,{children:[o(y,{answer:e.status===void 0?void 0:e.status==="approved"?N(e.result):k(e.result)!==void 0?V:"Der Benutzer hat die Frage verworfen.",onAnswer:s.can("runs.write")?p:void 0,question:w,text:n}),f&&o("p",{className:"text-[0.7rem] text-destructive",role:"alert",children:f})]})}function F({actor:e,session:r}){let n=g(),[s,f]=A(),m=l(r.runView);if(!m)return null;let w=b(e).id,p=m.actions.filter(t=>t.owner===u&&(i(t.payload)?.recipient??t.askedBy)===w&&t.status==="pending");if(p.length===0)return null;let P=(t,x)=>{f(void 0),S(r.session.id,t,x).catch(c=>f(c instanceof Error?c.message:String(c)))};return d("section",{className:"grid gap-1.5",children:[d(v,{children:[o("span",{children:"R\xFCckfrage"}),o("small",{children:p.length})]}),p.map(t=>{let x=i(t.payload);return x&&d("div",{className:"rounded-lg animate-ring-pulse motion-reduce:animate-none",children:[t.description&&o("p",{className:"mb-1.5 text-[0.7rem] leading-[1.35] text-muted-foreground",children:t.description}),o(y,{onAnswer:n.can("runs.write")?c=>P(t.id,c):void 0,question:x,text:t.title})]},t.id)}),s&&o("p",{className:"text-[0.7rem] text-destructive",role:"alert",children:s})]})}var D=e=>e.actions.filter(r=>r.owner===u&&r.status==="pending"),E=(e,r)=>e.actors.find(n=>n.id===r)?.handle??r,Q=e=>{let r=l(e.runView);if(!r)return;let[n,...s]=D(r);if(n)return{active:!0,label:s.length===0?`@${E(r,i(n.payload)?.recipient??n.askedBy)} fragt`:`${s.length+1} R\xFCckfragen offen`}},W=e=>({...e,needsRunView:!0,actionViews:[{owner:u,View:R}],cardSections:[{id:"ragents.ask.questions",order:100,Section:F}],attention:[{id:"ragents.ask.pending-questions",assess:Q}]}),I={id:u},pe={...I,activate:()=>W(I)};export{pe as webPlugin};
|
|
2
2
|
//# sourceMappingURL=/plugins/ragents.ask/web/index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["ragents-host-value:@ragents/web/run-view#runActorFrom", "ragents-host-value:@ragents/web/run-view#runViewFrom", "ragents-host-value:@ragents/web/AccessContext#useAccess", "../../../plugins/ragents.ask/web/AskActionView.tsx", "../../../plugins/ragents.ask/web/QuestionSection.tsx", "../../../plugins/ragents.ask/web/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runActorFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runViewFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/AccessContext\", \"useAccess\");\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport type { ActionViewContext } from \"@ragents/web/PluginRegistry\";\nimport { askPayloadOf } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nconst answerTextOf = (result: unknown): string =>\n typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nexport function AskActionView({ action, session, text }: ActionViewContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const question = askPayloadOf(action.payload);\n if (!question) return null;\n\n const answer = (value: string) => {\n setError(undefined);\n answerQuestion(session.session.id, action.actionId, value)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <>\n <QuestionCard\n answer={action.status === undefined\n ? undefined\n : action.status === \"approved\" ? answerTextOf(action.result) : \"Der Benutzer hat die Frage verworfen.\"}\n onAnswer={access.can(\"runs.write\") ? answer : undefined}\n question={question}\n text={text}\n />\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </>\n );\n}\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport { runActorFrom, runViewFrom } from \"@ragents/web/run-view\";\nimport type { CardSectionContext } from \"@ragents/web/PluginRegistry\";\nimport { SectionLabel } from \"@ragents/web/ui\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nexport function QuestionSection({ actor, session }: CardSectionContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const view = runViewFrom(session.runView);\n if (!view) return null;\n const actorId = runActorFrom(actor).id;\n const pending = view.actions.filter((action) =>\n action.owner === ASK_PLUGIN_ID && (askPayloadOf(action.payload)?.recipient ?? action.askedBy) === actorId && action.status === \"pending\");\n if (pending.length === 0) return null;\n\n const answer = (actionId: string, text: string) => {\n setError(undefined);\n answerQuestion(session.session.id, actionId, text)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <section className=\"grid gap-1.5\">\n <SectionLabel>\n <span>R\u00FCckfrage</span>\n <small>{pending.length}</small>\n </SectionLabel>\n {pending.map((action) => {\n const question = askPayloadOf(action.payload);\n return question && (\n <div className=\"rounded-lg animate-ring-pulse motion-reduce:animate-none\" key={action.id}>\n {action.description && <p className=\"mb-1.5 text-[0.7rem] leading-[1.35] text-muted-foreground\">{action.description}</p>}\n <QuestionCard\n onAnswer={access.can(\"runs.write\") ? (text) => answer(action.id, text) : undefined}\n question={question}\n text={action.title}\n />\n </div>\n );\n })}\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </section>\n );\n}\n", "import {\n type SessionContext,\n type WebPlugin,\n type WebPluginDescriptor,\n} from \"@ragents/web/PluginRegistry\";\nimport { runViewFrom, type RunView } from \"@ragents/web/run-view\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { AskActionView } from \"./AskActionView\";\nimport { QuestionSection } from \"./QuestionSection\";\n\nconst pendingQuestions = (view: RunView) =>\n view.actions.filter((action) => action.owner === ASK_PLUGIN_ID && action.status === \"pending\");\n\nconst askerHandle = (view: RunView, askedBy: string): string =>\n view.actors.find((actor) => actor.id === askedBy)?.handle ?? askedBy;\n\nconst attentionFor = (session: SessionContext) => {\n const view = runViewFrom(session.runView);\n if (!view) return undefined;\n const [first, ...rest] = pendingQuestions(view);\n if (!first) return undefined;\n return {\n active: true as const,\n label: rest.length === 0\n ? `@${askerHandle(view, askPayloadOf(first.payload)?.recipient ?? first.askedBy)} fragt`\n : `${rest.length + 1} R\u00FCckfragen offen`,\n };\n};\n\nconst configuredPlugin = (descriptor: WebPluginDescriptor): WebPlugin => ({\n ...descriptor,\n needsRunView: true,\n actionViews: [{\n owner: ASK_PLUGIN_ID,\n View: AskActionView,\n }],\n cardSections: [{\n id: \"ragents.ask.questions\",\n order: 100,\n Section: QuestionSection,\n }],\n attention: [{\n id: \"ragents.ask.pending-questions\",\n assess: attentionFor,\n }],\n});\n\nconst descriptor: WebPluginDescriptor = { id: ASK_PLUGIN_ID };\n\nexport const webPlugin: WebPlugin = {\n ...descriptor,\n activate: () => configuredPlugin(descriptor),\n};\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["run_view_runActorFrom_default", "read", "run_view_runViewFrom_default", "read", "AccessContext_useAccess_default", "read", "answerTextOf", "result", "AskActionView", "action", "session", "text", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "question", "askPayloadOf", "answer", "value", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "jsx_runtime_Fragment_default", "jsx_runtime_jsx_default", "QuestionCard", "QuestionSection", "actor", "session", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "view", "run_view_runViewFrom_default", "actorId", "run_view_runActorFrom_default", "pending", "action", "ASK_PLUGIN_ID", "askPayloadOf", "answer", "actionId", "text", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "ui_SectionLabel_default", "jsx_runtime_jsx_default", "question", "QuestionCard", "pendingQuestions", "view", "action", "ASK_PLUGIN_ID", "askerHandle", "askedBy", "actor", "attentionFor", "session", "run_view_runViewFrom_default", "first", "rest", "askPayloadOf", "configuredPlugin", "descriptor", "AskActionView", "QuestionSection", "webPlugin"]
|
|
4
|
+
"sourcesContent": ["import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runActorFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/run-view\", \"runViewFrom\");\n", "import { read } from \"ragents-host-read:read\";\nexport default read(\"@ragents/web/AccessContext\", \"useAccess\");\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport type { ActionViewContext } from \"@ragents/web/PluginRegistry\";\nimport { askPayloadOf, SUPERSEDED_ANSWER, supersedingInputOf } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nconst answerTextOf = (result: unknown): string =>\n typeof result === \"string\" ? result : result === null || result === undefined ? \"\" : JSON.stringify(result);\n\nexport function AskActionView({ action, session, text }: ActionViewContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const question = askPayloadOf(action.payload);\n if (!question) return null;\n\n const answer = (value: string) => {\n setError(undefined);\n answerQuestion(session.session.id, action.actionId, value)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <>\n <QuestionCard\n answer={action.status === undefined\n ? undefined\n : action.status === \"approved\" ? answerTextOf(action.result)\n : supersedingInputOf(action.result) !== undefined ? SUPERSEDED_ANSWER : \"Der Benutzer hat die Frage verworfen.\"}\n onAnswer={access.can(\"runs.write\") ? answer : undefined}\n question={question}\n text={text}\n />\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </>\n );\n}\n", "import { useAccess } from \"@ragents/web/AccessContext\";\nimport { useState } from \"react\";\nimport { runActorFrom, runViewFrom } from \"@ragents/web/run-view\";\nimport type { CardSectionContext } from \"@ragents/web/PluginRegistry\";\nimport { SectionLabel } from \"@ragents/web/ui\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { answerQuestion } from \"./api\";\nimport { QuestionCard } from \"./QuestionCard\";\n\nexport function QuestionSection({ actor, session }: CardSectionContext) {\n const access = useAccess();\n const [error, setError] = useState<string>();\n const view = runViewFrom(session.runView);\n if (!view) return null;\n const actorId = runActorFrom(actor).id;\n const pending = view.actions.filter((action) =>\n action.owner === ASK_PLUGIN_ID && (askPayloadOf(action.payload)?.recipient ?? action.askedBy) === actorId && action.status === \"pending\");\n if (pending.length === 0) return null;\n\n const answer = (actionId: string, text: string) => {\n setError(undefined);\n answerQuestion(session.session.id, actionId, text)\n .catch((caught: unknown) => setError(caught instanceof Error ? caught.message : String(caught)));\n };\n\n return (\n <section className=\"grid gap-1.5\">\n <SectionLabel>\n <span>R\u00FCckfrage</span>\n <small>{pending.length}</small>\n </SectionLabel>\n {pending.map((action) => {\n const question = askPayloadOf(action.payload);\n return question && (\n <div className=\"rounded-lg animate-ring-pulse motion-reduce:animate-none\" key={action.id}>\n {action.description && <p className=\"mb-1.5 text-[0.7rem] leading-[1.35] text-muted-foreground\">{action.description}</p>}\n <QuestionCard\n onAnswer={access.can(\"runs.write\") ? (text) => answer(action.id, text) : undefined}\n question={question}\n text={action.title}\n />\n </div>\n );\n })}\n {error && <p className=\"text-[0.7rem] text-destructive\" role=\"alert\">{error}</p>}\n </section>\n );\n}\n", "import {\n type SessionContext,\n type WebPlugin,\n type WebPluginDescriptor,\n} from \"@ragents/web/PluginRegistry\";\nimport { runViewFrom, type RunView } from \"@ragents/web/run-view\";\nimport { askPayloadOf, ASK_PLUGIN_ID } from \"../ask-payload\";\nimport { AskActionView } from \"./AskActionView\";\nimport { QuestionSection } from \"./QuestionSection\";\n\nconst pendingQuestions = (view: RunView) =>\n view.actions.filter((action) => action.owner === ASK_PLUGIN_ID && action.status === \"pending\");\n\nconst askerHandle = (view: RunView, askedBy: string): string =>\n view.actors.find((actor) => actor.id === askedBy)?.handle ?? askedBy;\n\nconst attentionFor = (session: SessionContext) => {\n const view = runViewFrom(session.runView);\n if (!view) return undefined;\n const [first, ...rest] = pendingQuestions(view);\n if (!first) return undefined;\n return {\n active: true as const,\n label: rest.length === 0\n ? `@${askerHandle(view, askPayloadOf(first.payload)?.recipient ?? first.askedBy)} fragt`\n : `${rest.length + 1} R\u00FCckfragen offen`,\n };\n};\n\nconst configuredPlugin = (descriptor: WebPluginDescriptor): WebPlugin => ({\n ...descriptor,\n needsRunView: true,\n actionViews: [{\n owner: ASK_PLUGIN_ID,\n View: AskActionView,\n }],\n cardSections: [{\n id: \"ragents.ask.questions\",\n order: 100,\n Section: QuestionSection,\n }],\n attention: [{\n id: \"ragents.ask.pending-questions\",\n assess: attentionFor,\n }],\n});\n\nconst descriptor: WebPluginDescriptor = { id: ASK_PLUGIN_ID };\n\nexport const webPlugin: WebPlugin = {\n ...descriptor,\n activate: () => configuredPlugin(descriptor),\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["run_view_runActorFrom_default", "read", "run_view_runViewFrom_default", "read", "AccessContext_useAccess_default", "read", "answerTextOf", "result", "AskActionView", "action", "session", "text", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "question", "askPayloadOf", "answer", "value", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "jsx_runtime_Fragment_default", "jsx_runtime_jsx_default", "QuestionCard", "supersedingInputOf", "SUPERSEDED_ANSWER", "QuestionSection", "actor", "session", "access", "AccessContext_useAccess_default", "error", "setError", "react_useState_default", "view", "run_view_runViewFrom_default", "actorId", "run_view_runActorFrom_default", "pending", "action", "ASK_PLUGIN_ID", "askPayloadOf", "answer", "actionId", "text", "answerQuestion", "caught", "jsx_runtime_jsxs_default", "ui_SectionLabel_default", "jsx_runtime_jsx_default", "question", "QuestionCard", "pendingQuestions", "view", "action", "ASK_PLUGIN_ID", "askerHandle", "askedBy", "actor", "attentionFor", "session", "run_view_runViewFrom_default", "first", "rest", "askPayloadOf", "configuredPlugin", "descriptor", "AskActionView", "QuestionSection", "webPlugin"]
|
|
7
7
|
}
|