@open-mercato/ai-assistant 0.6.1-develop.3291.1.6fad645fd0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/AGENTS.md +30 -4
- package/dist/frontend/components/AiChatButton.js +3 -2
- package/dist/frontend/components/AiChatButton.js.map +2 -2
- package/dist/modules/ai_assistant/__integration__/TC-AI-AGENT-LOOP-001-006.spec.js +364 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-AGENT-LOOP-001-006.spec.js.map +7 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-RUNTIME-OVERRIDES-006-model-picker.spec.js +7 -7
- package/dist/modules/ai_assistant/__integration__/TC-AI-RUNTIME-OVERRIDES-006-model-picker.spec.js.map +2 -2
- package/dist/modules/ai_assistant/__integration__/TC-AI-TOKEN-USAGE-001-005.spec.js +182 -0
- package/dist/modules/ai_assistant/__integration__/TC-AI-TOKEN-USAGE-001-005.spec.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/loop-override/route.js +316 -0
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/loop-override/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/models/route.js +8 -7
- package/dist/modules/ai_assistant/api/ai/agents/[agentId]/models/route.js.map +2 -2
- package/dist/modules/ai_assistant/api/ai/chat/route.js +43 -20
- package/dist/modules/ai_assistant/api/ai/chat/route.js.map +2 -2
- package/dist/modules/ai_assistant/api/settings/route.js +4 -3
- package/dist/modules/ai_assistant/api/settings/route.js.map +2 -2
- package/dist/modules/ai_assistant/api/usage/daily/route.js +111 -0
- package/dist/modules/ai_assistant/api/usage/daily/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/usage/sessions/[sessionId]/route.js +108 -0
- package/dist/modules/ai_assistant/api/usage/sessions/[sessionId]/route.js.map +7 -0
- package/dist/modules/ai_assistant/api/usage/sessions/route.js +153 -0
- package/dist/modules/ai_assistant/api/usage/sessions/route.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js +335 -38
- package/dist/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/allowlist/AiTenantAllowlistPageClient.js +2 -7
- package/dist/modules/ai_assistant/backend/config/ai-assistant/allowlist/AiTenantAllowlistPageClient.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js +44 -35
- package/dist/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.js.map +2 -2
- package/dist/modules/ai_assistant/backend/config/ai-assistant/usage/AiUsageStatsPageClient.js +282 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/usage/AiUsageStatsPageClient.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/usage/page.js +10 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/usage/page.js.map +7 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/usage/page.meta.js +25 -0
- package/dist/modules/ai_assistant/backend/config/ai-assistant/usage/page.meta.js.map +7 -0
- package/dist/modules/ai_assistant/cli.js +12 -0
- package/dist/modules/ai_assistant/cli.js.map +2 -2
- package/dist/modules/ai_assistant/components/AiAssistantSettingsPageClient.js.map +1 -1
- package/dist/modules/ai_assistant/data/entities.js +177 -1
- package/dist/modules/ai_assistant/data/entities.js.map +2 -2
- package/dist/modules/ai_assistant/data/repositories/AiAgentRuntimeOverrideRepository.js +104 -2
- package/dist/modules/ai_assistant/data/repositories/AiAgentRuntimeOverrideRepository.js.map +2 -2
- package/dist/modules/ai_assistant/data/repositories/AiTokenUsageRepository.js +168 -0
- package/dist/modules/ai_assistant/data/repositories/AiTokenUsageRepository.js.map +7 -0
- package/dist/modules/ai_assistant/events.js +8 -0
- package/dist/modules/ai_assistant/events.js.map +2 -2
- package/dist/modules/ai_assistant/i18n/de.json +74 -1
- package/dist/modules/ai_assistant/i18n/en.json +74 -1
- package/dist/modules/ai_assistant/i18n/es.json +75 -2
- package/dist/modules/ai_assistant/i18n/pl.json +74 -1
- package/dist/modules/ai_assistant/lib/agent-policy.js.map +2 -2
- package/dist/modules/ai_assistant/lib/agent-runtime.js +588 -23
- package/dist/modules/ai_assistant/lib/agent-runtime.js.map +3 -3
- package/dist/modules/ai_assistant/lib/agent-tools.js +6 -1
- package/dist/modules/ai_assistant/lib/agent-tools.js.map +2 -2
- package/dist/modules/ai_assistant/lib/ai-agent-definition.js.map +2 -2
- package/dist/modules/ai_assistant/lib/model-factory.js +63 -22
- package/dist/modules/ai_assistant/lib/model-factory.js.map +2 -2
- package/dist/modules/ai_assistant/lib/token-usage-recorder.js +78 -0
- package/dist/modules/ai_assistant/lib/token-usage-recorder.js.map +7 -0
- package/dist/modules/ai_assistant/lib/usage-serialization.js +33 -0
- package/dist/modules/ai_assistant/lib/usage-serialization.js.map +7 -0
- package/dist/modules/ai_assistant/migrations/Migration20260508160000_ai_agent_loop_overrides.js +25 -0
- package/dist/modules/ai_assistant/migrations/Migration20260508160000_ai_agent_loop_overrides.js.map +7 -0
- package/dist/modules/ai_assistant/migrations/Migration20260508170000_ai_token_usage.js +88 -0
- package/dist/modules/ai_assistant/migrations/Migration20260508170000_ai_token_usage.js.map +7 -0
- package/dist/modules/ai_assistant/setup.js +34 -0
- package/dist/modules/ai_assistant/setup.js.map +2 -2
- package/dist/modules/ai_assistant/workers/ai-token-usage-prune.js +114 -0
- package/dist/modules/ai_assistant/workers/ai-token-usage-prune.js.map +7 -0
- package/generated/entities/ai_agent_runtime_override/index.ts +7 -0
- package/generated/entities/ai_token_usage_daily/index.ts +16 -0
- package/generated/entities/ai_token_usage_event/index.ts +19 -0
- package/generated/entities.ids.generated.ts +2 -0
- package/generated/entity-fields-registry.ts +47 -1
- package/package.json +15 -7
- package/src/frontend/components/AiChatButton.tsx +3 -2
- package/src/modules/ai_assistant/__integration__/TC-AI-AGENT-LOOP-001-006.spec.ts +521 -0
- package/src/modules/ai_assistant/__integration__/TC-AI-RUNTIME-OVERRIDES-006-model-picker.spec.ts +8 -8
- package/src/modules/ai_assistant/__integration__/TC-AI-TOKEN-USAGE-001-005.spec.ts +231 -0
- package/src/modules/ai_assistant/__tests__/events.test.ts +4 -3
- package/src/modules/ai_assistant/__tests__/settings-page-logic.test.ts +5 -5
- package/src/modules/ai_assistant/__tests__/token-usage-recorder.test.ts +109 -0
- package/src/modules/ai_assistant/api/ai/agents/[agentId]/loop-override/route.ts +388 -0
- package/src/modules/ai_assistant/api/ai/agents/[agentId]/models/__tests__/route.test.ts +5 -0
- package/src/modules/ai_assistant/api/ai/agents/[agentId]/models/route.ts +8 -7
- package/src/modules/ai_assistant/api/ai/chat/__tests__/route.test.ts +102 -5
- package/src/modules/ai_assistant/api/ai/chat/route.ts +55 -18
- package/src/modules/ai_assistant/api/settings/route.ts +5 -3
- package/src/modules/ai_assistant/api/usage/daily/__tests__/route.test.ts +159 -0
- package/src/modules/ai_assistant/api/usage/daily/route.ts +126 -0
- package/src/modules/ai_assistant/api/usage/sessions/[sessionId]/__tests__/route.test.ts +143 -0
- package/src/modules/ai_assistant/api/usage/sessions/[sessionId]/route.ts +130 -0
- package/src/modules/ai_assistant/api/usage/sessions/__tests__/route.test.ts +123 -0
- package/src/modules/ai_assistant/api/usage/sessions/route.ts +184 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/agents/AiAgentSettingsPageClient.tsx +372 -16
- package/src/modules/ai_assistant/backend/config/ai-assistant/allowlist/AiTenantAllowlistPageClient.tsx +1 -4
- package/src/modules/ai_assistant/backend/config/ai-assistant/playground/AiPlaygroundPageClient.tsx +26 -9
- package/src/modules/ai_assistant/backend/config/ai-assistant/usage/AiUsageStatsPageClient.tsx +469 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/usage/page.meta.ts +23 -0
- package/src/modules/ai_assistant/backend/config/ai-assistant/usage/page.tsx +12 -0
- package/src/modules/ai_assistant/cli.ts +18 -0
- package/src/modules/ai_assistant/components/AiAssistantSettingsPageClient.tsx +1 -1
- package/src/modules/ai_assistant/data/entities.ts +237 -0
- package/src/modules/ai_assistant/data/repositories/AiAgentRuntimeOverrideRepository.ts +135 -3
- package/src/modules/ai_assistant/data/repositories/AiTokenUsageRepository.ts +213 -0
- package/src/modules/ai_assistant/data/repositories/__tests__/AiAgentRuntimeOverrideRepository.test.ts +223 -0
- package/src/modules/ai_assistant/data/repositories/__tests__/AiTokenUsageRepository.test.ts +58 -0
- package/src/modules/ai_assistant/events.ts +8 -0
- package/src/modules/ai_assistant/i18n/de.json +74 -1
- package/src/modules/ai_assistant/i18n/en.json +74 -1
- package/src/modules/ai_assistant/i18n/es.json +75 -2
- package/src/modules/ai_assistant/i18n/pl.json +74 -1
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime-loop-phase0.test.ts +439 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime-loop-phase1.test.ts +243 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime-loop-phase2.test.ts +388 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime-loop-phase3.test.ts +359 -0
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime-phase4a.test.ts +2 -2
- package/src/modules/ai_assistant/lib/__tests__/agent-runtime.test.ts +2 -1
- package/src/modules/ai_assistant/lib/__tests__/max-steps-budget.integration.test.ts +12 -13
- package/src/modules/ai_assistant/lib/__tests__/model-factory.test.ts +77 -14
- package/src/modules/ai_assistant/lib/agent-policy.ts +9 -0
- package/src/modules/ai_assistant/lib/agent-runtime.ts +1148 -43
- package/src/modules/ai_assistant/lib/agent-tools.ts +5 -1
- package/src/modules/ai_assistant/lib/ai-agent-definition.ts +289 -2
- package/src/modules/ai_assistant/lib/model-factory.ts +128 -43
- package/src/modules/ai_assistant/lib/token-usage-recorder.ts +122 -0
- package/src/modules/ai_assistant/lib/usage-serialization.ts +29 -0
- package/src/modules/ai_assistant/migrations/.snapshot-open-mercato.json +791 -0
- package/src/modules/ai_assistant/migrations/Migration20260508160000_ai_agent_loop_overrides.ts +25 -0
- package/src/modules/ai_assistant/migrations/Migration20260508170000_ai_token_usage.ts +89 -0
- package/src/modules/ai_assistant/setup.ts +49 -0
- package/src/modules/ai_assistant/workers/__tests__/ai-token-usage-prune.test.ts +144 -0
- package/src/modules/ai_assistant/workers/ai-token-usage-prune.ts +188 -0
|
@@ -8,6 +8,24 @@
|
|
|
8
8
|
"ai_assistant.agents.empty.title": "No AI agents are registered for your role yet.",
|
|
9
9
|
"ai_assistant.agents.loadErrorTitle": "Failed to load AI agents",
|
|
10
10
|
"ai_assistant.agents.loadingAgents": "Loading AI agents...",
|
|
11
|
+
"ai_assistant.agents.loop_policy.clear": "Clear override",
|
|
12
|
+
"ai_assistant.agents.loop_policy.clearedMessage": "Loop policy override cleared; agent is using its declared defaults.",
|
|
13
|
+
"ai_assistant.agents.loop_policy.disabledBadge": "Loop disabled",
|
|
14
|
+
"ai_assistant.agents.loop_policy.errorTitle": "Failed to update loop policy",
|
|
15
|
+
"ai_assistant.agents.loop_policy.killSwitchDescription": "When enabled, the agent runs as a single model call with no tool loop.",
|
|
16
|
+
"ai_assistant.agents.loop_policy.killSwitchLabel": "Kill switch",
|
|
17
|
+
"ai_assistant.agents.loop_policy.loadErrorTitle": "Failed to load loop policy",
|
|
18
|
+
"ai_assistant.agents.loop_policy.loading": "Loading loop policy...",
|
|
19
|
+
"ai_assistant.agents.loop_policy.maxStepsLabel": "Max steps",
|
|
20
|
+
"ai_assistant.agents.loop_policy.maxTokensLabel": "Max tokens",
|
|
21
|
+
"ai_assistant.agents.loop_policy.maxToolCallsLabel": "Max tool calls",
|
|
22
|
+
"ai_assistant.agents.loop_policy.maxWallClockMsLabel": "Max wall-clock (ms)",
|
|
23
|
+
"ai_assistant.agents.loop_policy.noOverridePlaceholder": "No override",
|
|
24
|
+
"ai_assistant.agents.loop_policy.save": "Save override",
|
|
25
|
+
"ai_assistant.agents.loop_policy.savedMessage": "Loop policy override saved.",
|
|
26
|
+
"ai_assistant.agents.loop_policy.savedTitle": "Loop policy updated",
|
|
27
|
+
"ai_assistant.agents.loop_policy.subtitle": "Set per-tenant budget limits or disable the agentic loop for this agent.",
|
|
28
|
+
"ai_assistant.agents.loop_policy.title": "Loop policy",
|
|
11
29
|
"ai_assistant.agents.meta.executionMode": "Execution mode",
|
|
12
30
|
"ai_assistant.agents.meta.id": "Agent id",
|
|
13
31
|
"ai_assistant.agents.meta.maxSteps": "Max steps",
|
|
@@ -17,6 +35,22 @@
|
|
|
17
35
|
"ai_assistant.agents.meta.readOnlyNo": "No",
|
|
18
36
|
"ai_assistant.agents.meta.readOnlyYes": "Yes",
|
|
19
37
|
"ai_assistant.agents.meta.unlimited": "Unlimited",
|
|
38
|
+
"ai_assistant.agents.model_override.allowlistCustom": "custom",
|
|
39
|
+
"ai_assistant.agents.model_override.allowlistInherited": "inherited",
|
|
40
|
+
"ai_assistant.agents.model_override.allowlistReset": "Inherit",
|
|
41
|
+
"ai_assistant.agents.model_override.allowlistSave": "Save choices",
|
|
42
|
+
"ai_assistant.agents.model_override.anyProvider": "first configured",
|
|
43
|
+
"ai_assistant.agents.model_override.clear": "Clear override",
|
|
44
|
+
"ai_assistant.agents.model_override.codeDefault": "Code-declared default",
|
|
45
|
+
"ai_assistant.agents.model_override.defaultBadge": "default",
|
|
46
|
+
"ai_assistant.agents.model_override.model": "Model",
|
|
47
|
+
"ai_assistant.agents.model_override.noOverride": "No per-agent override",
|
|
48
|
+
"ai_assistant.agents.model_override.provider": "Provider",
|
|
49
|
+
"ai_assistant.agents.model_override.providerDefault": "provider default",
|
|
50
|
+
"ai_assistant.agents.model_override.save": "Save override",
|
|
51
|
+
"ai_assistant.agents.model_override.saved": "Model override saved.",
|
|
52
|
+
"ai_assistant.agents.model_override.tenantOverride": "Tenant override",
|
|
53
|
+
"ai_assistant.agents.model_override.title": "Provider and model",
|
|
20
54
|
"ai_assistant.agents.mutation_policy.clear": "Clear override",
|
|
21
55
|
"ai_assistant.agents.mutation_policy.clearedMessage": "Mutation policy override cleared; agent is using its code-declared policy.",
|
|
22
56
|
"ai_assistant.agents.mutation_policy.codeDeclared": "Code-declared",
|
|
@@ -112,6 +146,7 @@
|
|
|
112
146
|
"ai_assistant.allowlist.save.success": "Allowlist saved.",
|
|
113
147
|
"ai_assistant.allowlist.subtitle": "Limit which providers and models the runtime, settings, and chat picker may use for this tenant. The env allowlist is the outer constraint — tenant picks narrow it further.",
|
|
114
148
|
"ai_assistant.allowlist.title": "AI provider & model allowlist",
|
|
149
|
+
"ai_assistant.chat.agentTasksTitle": "Agent tasks",
|
|
115
150
|
"ai_assistant.chat.assistantRoleLabel": "Assistant",
|
|
116
151
|
"ai_assistant.chat.attachFile": "Attach file",
|
|
117
152
|
"ai_assistant.chat.betaChip": "beta",
|
|
@@ -257,6 +292,8 @@
|
|
|
257
292
|
"ai_assistant.launcher.welcome.suggestion3": "Suggest things to try",
|
|
258
293
|
"ai_assistant.launcher.welcome.suggestion4": "How do I use this assistant?",
|
|
259
294
|
"ai_assistant.launcher.writesBadge": "Can write",
|
|
295
|
+
"ai_assistant.loop.disabledBanner.description": "The agentic loop has been disabled for this agent by a tenant administrator. Each turn runs as a single model call. To re-enable the loop, update the Loop policy in AI assistant settings.",
|
|
296
|
+
"ai_assistant.loop.disabledBanner.title": "Agent loop disabled by tenant policy",
|
|
260
297
|
"ai_assistant.mcp.apiKeyLabel": "API Key:",
|
|
261
298
|
"ai_assistant.mcp.close": "Close",
|
|
262
299
|
"ai_assistant.mcp.copied": "Copied!",
|
|
@@ -272,9 +309,11 @@
|
|
|
272
309
|
"ai_assistant.modelPicker.activeBadge": "active",
|
|
273
310
|
"ai_assistant.modelPicker.defaultBadge": "default",
|
|
274
311
|
"ai_assistant.modelPicker.defaultLabel": "Model: Default",
|
|
312
|
+
"ai_assistant.modelPicker.defaultWithModelLabel": "Default: {{model}}",
|
|
275
313
|
"ai_assistant.modelPicker.listAriaLabel": "Available models",
|
|
276
314
|
"ai_assistant.modelPicker.triggerAriaLabel": "Select AI model",
|
|
277
315
|
"ai_assistant.modelPicker.useDefault": "Use agent default",
|
|
316
|
+
"ai_assistant.modelPicker.useDefaultWithModel": "Use agent default: {{model}}",
|
|
278
317
|
"ai_assistant.playground.agentPickerLabel": "Agent",
|
|
279
318
|
"ai_assistant.playground.chat.notSupportedBody": "Pick an agent whose execution mode is \"chat\", or switch to the object-mode tab.",
|
|
280
319
|
"ai_assistant.playground.chat.notSupportedTitle": "Chat mode is not available for this agent.",
|
|
@@ -346,6 +385,7 @@
|
|
|
346
385
|
"ai_assistant.settings.envKeyMissing": "{{key}} not set",
|
|
347
386
|
"ai_assistant.settings.generateMcpConfig": "Generate MCP Config",
|
|
348
387
|
"ai_assistant.settings.generateSessionKey": "Generate Session Key",
|
|
388
|
+
"ai_assistant.settings.launchDescription": "Open the AI assistant from this page.",
|
|
349
389
|
"ai_assistant.settings.llmProviderLabel": "LLM Provider:",
|
|
350
390
|
"ai_assistant.settings.loading": "Loading settings...",
|
|
351
391
|
"ai_assistant.settings.mcpAuthLabel": "MCP Authentication:",
|
|
@@ -362,6 +402,7 @@
|
|
|
362
402
|
"ai_assistant.settings.notAvailable": "Not available",
|
|
363
403
|
"ai_assistant.settings.notConfigured": "Not configured",
|
|
364
404
|
"ai_assistant.settings.openButton": "Open AI Assistant",
|
|
405
|
+
"ai_assistant.settings.openSelectorButton": "Open AI assistants",
|
|
365
406
|
"ai_assistant.settings.pageDescription": "Configure and monitor the AI assistant",
|
|
366
407
|
"ai_assistant.settings.pageTitle": "AI Assistant Settings",
|
|
367
408
|
"ai_assistant.settings.providerColumn": "Provider",
|
|
@@ -382,5 +423,37 @@
|
|
|
382
423
|
"ai_assistant.status.executing": "Executing tools...",
|
|
383
424
|
"ai_assistant.status.responding": "Responding...",
|
|
384
425
|
"ai_assistant.status.thinking": "Thinking...",
|
|
385
|
-
"ai_assistant.status.working": "Working..."
|
|
426
|
+
"ai_assistant.status.working": "Working...",
|
|
427
|
+
"ai_assistant.usage.apply": "Apply",
|
|
428
|
+
"ai_assistant.usage.col.agent": "Agent",
|
|
429
|
+
"ai_assistant.usage.col.day": "Day",
|
|
430
|
+
"ai_assistant.usage.col.finishReason": "Finish",
|
|
431
|
+
"ai_assistant.usage.col.inputTokens": "Input",
|
|
432
|
+
"ai_assistant.usage.col.model": "Model",
|
|
433
|
+
"ai_assistant.usage.col.outputTokens": "Output",
|
|
434
|
+
"ai_assistant.usage.col.session": "Session",
|
|
435
|
+
"ai_assistant.usage.col.sessions": "Sessions",
|
|
436
|
+
"ai_assistant.usage.col.startedAt": "Started",
|
|
437
|
+
"ai_assistant.usage.col.step": "Step",
|
|
438
|
+
"ai_assistant.usage.col.steps": "Steps",
|
|
439
|
+
"ai_assistant.usage.dailyBreakdown": "Daily breakdown",
|
|
440
|
+
"ai_assistant.usage.error": "Failed to load usage data.",
|
|
441
|
+
"ai_assistant.usage.errorDetail": "Failed to load session events.",
|
|
442
|
+
"ai_assistant.usage.errorSessions": "Failed to load sessions.",
|
|
443
|
+
"ai_assistant.usage.from": "From",
|
|
444
|
+
"ai_assistant.usage.inputTokens": "Input tokens",
|
|
445
|
+
"ai_assistant.usage.loading": "Loading usage data...",
|
|
446
|
+
"ai_assistant.usage.loadingDetail": "Loading session events...",
|
|
447
|
+
"ai_assistant.usage.loadingSessions": "Loading sessions...",
|
|
448
|
+
"ai_assistant.usage.navTitle": "AI Usage",
|
|
449
|
+
"ai_assistant.usage.next": "Next",
|
|
450
|
+
"ai_assistant.usage.noSessions": "No sessions found for the selected period.",
|
|
451
|
+
"ai_assistant.usage.outputTokens": "Output tokens",
|
|
452
|
+
"ai_assistant.usage.prev": "Previous",
|
|
453
|
+
"ai_assistant.usage.sessionDetail": "Session detail",
|
|
454
|
+
"ai_assistant.usage.sessions": "Sessions",
|
|
455
|
+
"ai_assistant.usage.sessionsList": "Sessions",
|
|
456
|
+
"ai_assistant.usage.steps": "Steps",
|
|
457
|
+
"ai_assistant.usage.title": "Token Usage Statistics",
|
|
458
|
+
"ai_assistant.usage.to": "To"
|
|
386
459
|
}
|
|
@@ -8,6 +8,24 @@
|
|
|
8
8
|
"ai_assistant.agents.empty.title": "Todavía no hay agentes de IA registrados para su rol.",
|
|
9
9
|
"ai_assistant.agents.loadErrorTitle": "No se pudieron cargar los agentes de IA",
|
|
10
10
|
"ai_assistant.agents.loadingAgents": "Cargando agentes de IA...",
|
|
11
|
+
"ai_assistant.agents.loop_policy.clear": "Limpiar anulación",
|
|
12
|
+
"ai_assistant.agents.loop_policy.clearedMessage": "Anulación de política de bucle eliminada; el agente usa sus valores predeterminados declarados.",
|
|
13
|
+
"ai_assistant.agents.loop_policy.disabledBadge": "Bucle desactivado",
|
|
14
|
+
"ai_assistant.agents.loop_policy.errorTitle": "Error al actualizar la política de bucle",
|
|
15
|
+
"ai_assistant.agents.loop_policy.killSwitchDescription": "Cuando está activado, el agente se ejecuta como una sola llamada al modelo sin bucle de herramientas.",
|
|
16
|
+
"ai_assistant.agents.loop_policy.killSwitchLabel": "Interruptor de emergencia",
|
|
17
|
+
"ai_assistant.agents.loop_policy.loadErrorTitle": "Error al cargar la política de bucle",
|
|
18
|
+
"ai_assistant.agents.loop_policy.loading": "Cargando política de bucle...",
|
|
19
|
+
"ai_assistant.agents.loop_policy.maxStepsLabel": "Máx. pasos",
|
|
20
|
+
"ai_assistant.agents.loop_policy.maxTokensLabel": "Máx. tokens",
|
|
21
|
+
"ai_assistant.agents.loop_policy.maxToolCallsLabel": "Máx. llamadas a herramientas",
|
|
22
|
+
"ai_assistant.agents.loop_policy.maxWallClockMsLabel": "Máx. tiempo real (ms)",
|
|
23
|
+
"ai_assistant.agents.loop_policy.noOverridePlaceholder": "Sin anulación",
|
|
24
|
+
"ai_assistant.agents.loop_policy.save": "Guardar anulación",
|
|
25
|
+
"ai_assistant.agents.loop_policy.savedMessage": "Anulación de política de bucle guardada.",
|
|
26
|
+
"ai_assistant.agents.loop_policy.savedTitle": "Política de bucle actualizada",
|
|
27
|
+
"ai_assistant.agents.loop_policy.subtitle": "Establezca límites de presupuesto por inquilino o desactive el bucle agentivo para este agente.",
|
|
28
|
+
"ai_assistant.agents.loop_policy.title": "Política de bucle",
|
|
11
29
|
"ai_assistant.agents.meta.executionMode": "Modo de ejecución",
|
|
12
30
|
"ai_assistant.agents.meta.id": "ID del agente",
|
|
13
31
|
"ai_assistant.agents.meta.maxSteps": "Pasos máx.",
|
|
@@ -17,6 +35,22 @@
|
|
|
17
35
|
"ai_assistant.agents.meta.readOnlyNo": "No",
|
|
18
36
|
"ai_assistant.agents.meta.readOnlyYes": "Sí",
|
|
19
37
|
"ai_assistant.agents.meta.unlimited": "Sin límite",
|
|
38
|
+
"ai_assistant.agents.model_override.allowlistCustom": "personalizado",
|
|
39
|
+
"ai_assistant.agents.model_override.allowlistInherited": "heredado",
|
|
40
|
+
"ai_assistant.agents.model_override.allowlistReset": "Heredar",
|
|
41
|
+
"ai_assistant.agents.model_override.allowlistSave": "Guardar opciones",
|
|
42
|
+
"ai_assistant.agents.model_override.anyProvider": "primer configurado",
|
|
43
|
+
"ai_assistant.agents.model_override.clear": "Eliminar sobrescritura",
|
|
44
|
+
"ai_assistant.agents.model_override.codeDefault": "Predeterminado declarado en código",
|
|
45
|
+
"ai_assistant.agents.model_override.defaultBadge": "predeterminado",
|
|
46
|
+
"ai_assistant.agents.model_override.model": "Modelo",
|
|
47
|
+
"ai_assistant.agents.model_override.noOverride": "Sin sobrescritura por agente",
|
|
48
|
+
"ai_assistant.agents.model_override.provider": "Proveedor",
|
|
49
|
+
"ai_assistant.agents.model_override.providerDefault": "predeterminado del proveedor",
|
|
50
|
+
"ai_assistant.agents.model_override.save": "Guardar sobrescritura",
|
|
51
|
+
"ai_assistant.agents.model_override.saved": "Sobrescritura de modelo guardada.",
|
|
52
|
+
"ai_assistant.agents.model_override.tenantOverride": "Sobrescritura del tenant",
|
|
53
|
+
"ai_assistant.agents.model_override.title": "Proveedor y modelo",
|
|
20
54
|
"ai_assistant.agents.mutation_policy.clear": "Eliminar sobrescritura",
|
|
21
55
|
"ai_assistant.agents.mutation_policy.clearedMessage": "Sobrescritura de política de mutación eliminada; el agente usa la política declarada en el código.",
|
|
22
56
|
"ai_assistant.agents.mutation_policy.codeDeclared": "Declarada en el código",
|
|
@@ -112,6 +146,7 @@
|
|
|
112
146
|
"ai_assistant.allowlist.save.success": "Lista guardada.",
|
|
113
147
|
"ai_assistant.allowlist.subtitle": "Limita los proveedores y modelos que el runtime, los ajustes y el selector de chat pueden usar para este inquilino. La lista ENV es la restricción externa — las elecciones del inquilino la reducen.",
|
|
114
148
|
"ai_assistant.allowlist.title": "Lista de proveedores y modelos AI",
|
|
149
|
+
"ai_assistant.chat.agentTasksTitle": "Tareas del agente",
|
|
115
150
|
"ai_assistant.chat.assistantRoleLabel": "Asistente",
|
|
116
151
|
"ai_assistant.chat.attachFile": "Attach file",
|
|
117
152
|
"ai_assistant.chat.betaChip": "beta",
|
|
@@ -257,6 +292,8 @@
|
|
|
257
292
|
"ai_assistant.launcher.welcome.suggestion3": "Suggest things to try",
|
|
258
293
|
"ai_assistant.launcher.welcome.suggestion4": "How do I use this assistant?",
|
|
259
294
|
"ai_assistant.launcher.writesBadge": "Can write",
|
|
295
|
+
"ai_assistant.loop.disabledBanner.description": "El bucle agentivo ha sido desactivado para este agente por un administrador del inquilino. Cada turno se ejecuta como una sola llamada al modelo. Para volver a habilitar el bucle, actualice la Política de bucle en la configuración del asistente de IA.",
|
|
296
|
+
"ai_assistant.loop.disabledBanner.title": "Bucle de agente desactivado por política del inquilino",
|
|
260
297
|
"ai_assistant.mcp.apiKeyLabel": "API Key:",
|
|
261
298
|
"ai_assistant.mcp.close": "Cerrar",
|
|
262
299
|
"ai_assistant.mcp.copied": "Copiado",
|
|
@@ -271,10 +308,12 @@
|
|
|
271
308
|
"ai_assistant.mcp.title": "Configuración MCP",
|
|
272
309
|
"ai_assistant.modelPicker.activeBadge": "activo",
|
|
273
310
|
"ai_assistant.modelPicker.defaultBadge": "predeterminado",
|
|
274
|
-
"ai_assistant.modelPicker.defaultLabel": "Predeterminado
|
|
311
|
+
"ai_assistant.modelPicker.defaultLabel": "Modelo: Predeterminado",
|
|
312
|
+
"ai_assistant.modelPicker.defaultWithModelLabel": "Predeterminado: {{model}}",
|
|
275
313
|
"ai_assistant.modelPicker.listAriaLabel": "Seleccionar proveedor y modelo",
|
|
276
314
|
"ai_assistant.modelPicker.triggerAriaLabel": "Selector de modelo de IA",
|
|
277
315
|
"ai_assistant.modelPicker.useDefault": "Usar predeterminado",
|
|
316
|
+
"ai_assistant.modelPicker.useDefaultWithModel": "Usar predeterminado del agente: {{model}}",
|
|
278
317
|
"ai_assistant.playground.agentPickerLabel": "Agente",
|
|
279
318
|
"ai_assistant.playground.chat.notSupportedBody": "Elija un agente cuyo modo de ejecución sea \"chat\" o cambie a la pestaña de modo objeto.",
|
|
280
319
|
"ai_assistant.playground.chat.notSupportedTitle": "El modo chat no está disponible para este agente.",
|
|
@@ -346,6 +385,7 @@
|
|
|
346
385
|
"ai_assistant.settings.envKeyMissing": "Variable de entorno no configurada",
|
|
347
386
|
"ai_assistant.settings.generateMcpConfig": "Generar configuración MCP",
|
|
348
387
|
"ai_assistant.settings.generateSessionKey": "Generar clave de sesión",
|
|
388
|
+
"ai_assistant.settings.launchDescription": "Abra el asistente de IA desde esta página.",
|
|
349
389
|
"ai_assistant.settings.llmProviderLabel": "Proveedor LLM",
|
|
350
390
|
"ai_assistant.settings.loading": "Cargando ajustes...",
|
|
351
391
|
"ai_assistant.settings.mcpAuthLabel": "Autenticación MCP",
|
|
@@ -362,6 +402,7 @@
|
|
|
362
402
|
"ai_assistant.settings.notAvailable": "N/D",
|
|
363
403
|
"ai_assistant.settings.notConfigured": "No configurado",
|
|
364
404
|
"ai_assistant.settings.openButton": "Abrir",
|
|
405
|
+
"ai_assistant.settings.openSelectorButton": "Abrir asistentes de IA",
|
|
365
406
|
"ai_assistant.settings.pageDescription": "Configure los proveedores de IA, las sobrescrituras de modelo y las herramientas de desarrollador.",
|
|
366
407
|
"ai_assistant.settings.pageTitle": "Configuración del asistente de IA",
|
|
367
408
|
"ai_assistant.settings.providerColumn": "Proveedor",
|
|
@@ -382,5 +423,37 @@
|
|
|
382
423
|
"ai_assistant.status.executing": "Ejecutando herramientas...",
|
|
383
424
|
"ai_assistant.status.responding": "Respondiendo...",
|
|
384
425
|
"ai_assistant.status.thinking": "Pensando...",
|
|
385
|
-
"ai_assistant.status.working": "Procesando..."
|
|
426
|
+
"ai_assistant.status.working": "Procesando...",
|
|
427
|
+
"ai_assistant.usage.apply": "Aplicar",
|
|
428
|
+
"ai_assistant.usage.col.agent": "Agente",
|
|
429
|
+
"ai_assistant.usage.col.day": "Día",
|
|
430
|
+
"ai_assistant.usage.col.finishReason": "Final",
|
|
431
|
+
"ai_assistant.usage.col.inputTokens": "Entrada",
|
|
432
|
+
"ai_assistant.usage.col.model": "Modelo",
|
|
433
|
+
"ai_assistant.usage.col.outputTokens": "Salida",
|
|
434
|
+
"ai_assistant.usage.col.session": "Sesión",
|
|
435
|
+
"ai_assistant.usage.col.sessions": "Sesiones",
|
|
436
|
+
"ai_assistant.usage.col.startedAt": "Inicio",
|
|
437
|
+
"ai_assistant.usage.col.step": "Paso",
|
|
438
|
+
"ai_assistant.usage.col.steps": "Pasos",
|
|
439
|
+
"ai_assistant.usage.dailyBreakdown": "Desglose diario",
|
|
440
|
+
"ai_assistant.usage.error": "No se pudieron cargar los datos de uso.",
|
|
441
|
+
"ai_assistant.usage.errorDetail": "No se pudieron cargar los eventos de sesión.",
|
|
442
|
+
"ai_assistant.usage.errorSessions": "No se pudieron cargar las sesiones.",
|
|
443
|
+
"ai_assistant.usage.from": "Desde",
|
|
444
|
+
"ai_assistant.usage.inputTokens": "Tokens de entrada",
|
|
445
|
+
"ai_assistant.usage.loading": "Cargando datos de uso...",
|
|
446
|
+
"ai_assistant.usage.loadingDetail": "Cargando eventos de sesión...",
|
|
447
|
+
"ai_assistant.usage.loadingSessions": "Cargando sesiones...",
|
|
448
|
+
"ai_assistant.usage.navTitle": "Uso de IA",
|
|
449
|
+
"ai_assistant.usage.next": "Siguiente",
|
|
450
|
+
"ai_assistant.usage.noSessions": "No se encontraron sesiones para el período seleccionado.",
|
|
451
|
+
"ai_assistant.usage.outputTokens": "Tokens de salida",
|
|
452
|
+
"ai_assistant.usage.prev": "Anterior",
|
|
453
|
+
"ai_assistant.usage.sessionDetail": "Detalle de sesión",
|
|
454
|
+
"ai_assistant.usage.sessions": "Sesiones",
|
|
455
|
+
"ai_assistant.usage.sessionsList": "Sesiones",
|
|
456
|
+
"ai_assistant.usage.steps": "Pasos",
|
|
457
|
+
"ai_assistant.usage.title": "Estadísticas de uso de tokens",
|
|
458
|
+
"ai_assistant.usage.to": "Hasta"
|
|
386
459
|
}
|
|
@@ -8,6 +8,24 @@
|
|
|
8
8
|
"ai_assistant.agents.empty.title": "Brak zarejestrowanych agentów AI dla Twojej roli.",
|
|
9
9
|
"ai_assistant.agents.loadErrorTitle": "Nie udało się wczytać agentów AI",
|
|
10
10
|
"ai_assistant.agents.loadingAgents": "Wczytywanie agentów AI...",
|
|
11
|
+
"ai_assistant.agents.loop_policy.clear": "Wyczyść nadpisanie",
|
|
12
|
+
"ai_assistant.agents.loop_policy.clearedMessage": "Nadpisanie polityki pętli wyczyszczone; agent używa swoich domyślnych ustawień.",
|
|
13
|
+
"ai_assistant.agents.loop_policy.disabledBadge": "Pętla wyłączona",
|
|
14
|
+
"ai_assistant.agents.loop_policy.errorTitle": "Nie udało się zaktualizować polityki pętli",
|
|
15
|
+
"ai_assistant.agents.loop_policy.killSwitchDescription": "Po włączeniu agent działa jako pojedyncze wywołanie modelu bez pętli narzędziowej.",
|
|
16
|
+
"ai_assistant.agents.loop_policy.killSwitchLabel": "Wyłącznik awaryjny",
|
|
17
|
+
"ai_assistant.agents.loop_policy.loadErrorTitle": "Nie udało się załadować polityki pętli",
|
|
18
|
+
"ai_assistant.agents.loop_policy.loading": "Ładowanie polityki pętli...",
|
|
19
|
+
"ai_assistant.agents.loop_policy.maxStepsLabel": "Maks. kroków",
|
|
20
|
+
"ai_assistant.agents.loop_policy.maxTokensLabel": "Maks. tokenów",
|
|
21
|
+
"ai_assistant.agents.loop_policy.maxToolCallsLabel": "Maks. wywołań narzędzi",
|
|
22
|
+
"ai_assistant.agents.loop_policy.maxWallClockMsLabel": "Maks. czas rzeczywisty (ms)",
|
|
23
|
+
"ai_assistant.agents.loop_policy.noOverridePlaceholder": "Brak nadpisania",
|
|
24
|
+
"ai_assistant.agents.loop_policy.save": "Zapisz nadpisanie",
|
|
25
|
+
"ai_assistant.agents.loop_policy.savedMessage": "Nadpisanie polityki pętli zapisane.",
|
|
26
|
+
"ai_assistant.agents.loop_policy.savedTitle": "Polityka pętli zaktualizowana",
|
|
27
|
+
"ai_assistant.agents.loop_policy.subtitle": "Ustaw limity budżetu na poziomie dzierżawcy lub wyłącz agentyczną pętlę dla tego agenta.",
|
|
28
|
+
"ai_assistant.agents.loop_policy.title": "Polityka pętli",
|
|
11
29
|
"ai_assistant.agents.meta.executionMode": "Tryb wykonywania",
|
|
12
30
|
"ai_assistant.agents.meta.id": "Identyfikator agenta",
|
|
13
31
|
"ai_assistant.agents.meta.maxSteps": "Maks. kroków",
|
|
@@ -17,6 +35,22 @@
|
|
|
17
35
|
"ai_assistant.agents.meta.readOnlyNo": "Nie",
|
|
18
36
|
"ai_assistant.agents.meta.readOnlyYes": "Tak",
|
|
19
37
|
"ai_assistant.agents.meta.unlimited": "Bez limitu",
|
|
38
|
+
"ai_assistant.agents.model_override.allowlistCustom": "niestandardowe",
|
|
39
|
+
"ai_assistant.agents.model_override.allowlistInherited": "dziedziczone",
|
|
40
|
+
"ai_assistant.agents.model_override.allowlistReset": "Dziedzicz",
|
|
41
|
+
"ai_assistant.agents.model_override.allowlistSave": "Zapisz wybór",
|
|
42
|
+
"ai_assistant.agents.model_override.anyProvider": "pierwszy skonfigurowany",
|
|
43
|
+
"ai_assistant.agents.model_override.clear": "Wyczyść nadpisanie",
|
|
44
|
+
"ai_assistant.agents.model_override.codeDefault": "Domyślne z kodu",
|
|
45
|
+
"ai_assistant.agents.model_override.defaultBadge": "domyślne",
|
|
46
|
+
"ai_assistant.agents.model_override.model": "Model",
|
|
47
|
+
"ai_assistant.agents.model_override.noOverride": "Brak nadpisania dla agenta",
|
|
48
|
+
"ai_assistant.agents.model_override.provider": "Dostawca",
|
|
49
|
+
"ai_assistant.agents.model_override.providerDefault": "domyślne dostawcy",
|
|
50
|
+
"ai_assistant.agents.model_override.save": "Zapisz nadpisanie",
|
|
51
|
+
"ai_assistant.agents.model_override.saved": "Nadpisanie modelu zapisane.",
|
|
52
|
+
"ai_assistant.agents.model_override.tenantOverride": "Nadpisanie tenant",
|
|
53
|
+
"ai_assistant.agents.model_override.title": "Dostawca i model",
|
|
20
54
|
"ai_assistant.agents.mutation_policy.clear": "Wyczyść nadpisanie",
|
|
21
55
|
"ai_assistant.agents.mutation_policy.clearedMessage": "Nadpisanie polityki mutacji usunięte; agent korzysta z polityki zadeklarowanej w kodzie.",
|
|
22
56
|
"ai_assistant.agents.mutation_policy.codeDeclared": "Zadeklarowane w kodzie",
|
|
@@ -112,6 +146,7 @@
|
|
|
112
146
|
"ai_assistant.allowlist.save.success": "Lista zapisana.",
|
|
113
147
|
"ai_assistant.allowlist.subtitle": "Ogranicz dostawców i modele dostępne dla tego najemcy. Lista ENV jest zewnętrznym ograniczeniem — wybory najemcy je zawężają.",
|
|
114
148
|
"ai_assistant.allowlist.title": "Lista dozwolonych dostawców i modeli AI",
|
|
149
|
+
"ai_assistant.chat.agentTasksTitle": "Zadania agenta",
|
|
115
150
|
"ai_assistant.chat.assistantRoleLabel": "Asystent",
|
|
116
151
|
"ai_assistant.chat.attachFile": "Attach file",
|
|
117
152
|
"ai_assistant.chat.betaChip": "beta",
|
|
@@ -257,6 +292,8 @@
|
|
|
257
292
|
"ai_assistant.launcher.welcome.suggestion3": "Suggest things to try",
|
|
258
293
|
"ai_assistant.launcher.welcome.suggestion4": "How do I use this assistant?",
|
|
259
294
|
"ai_assistant.launcher.writesBadge": "Can write",
|
|
295
|
+
"ai_assistant.loop.disabledBanner.description": "Agentyczna pętla została wyłączona dla tego agenta przez administratora dzierżawcy. Każda tura wykonywana jest jako pojedyncze wywołanie modelu. Aby ponownie włączyć pętlę, zaktualizuj politykę pętli w ustawieniach asystenta AI.",
|
|
296
|
+
"ai_assistant.loop.disabledBanner.title": "Pętla agenta wyłączona przez politykę dzierżawcy",
|
|
260
297
|
"ai_assistant.mcp.apiKeyLabel": "Klucz API:",
|
|
261
298
|
"ai_assistant.mcp.close": "Zamknij",
|
|
262
299
|
"ai_assistant.mcp.copied": "Skopiowano!",
|
|
@@ -272,9 +309,11 @@
|
|
|
272
309
|
"ai_assistant.modelPicker.activeBadge": "aktywny",
|
|
273
310
|
"ai_assistant.modelPicker.defaultBadge": "domyślny",
|
|
274
311
|
"ai_assistant.modelPicker.defaultLabel": "Model: Domyślny",
|
|
312
|
+
"ai_assistant.modelPicker.defaultWithModelLabel": "Domyślnie: {{model}}",
|
|
275
313
|
"ai_assistant.modelPicker.listAriaLabel": "Dostępne modele",
|
|
276
314
|
"ai_assistant.modelPicker.triggerAriaLabel": "Wybierz model AI",
|
|
277
315
|
"ai_assistant.modelPicker.useDefault": "Użyj domyślnego agenta",
|
|
316
|
+
"ai_assistant.modelPicker.useDefaultWithModel": "Użyj domyślnego agenta: {{model}}",
|
|
278
317
|
"ai_assistant.playground.agentPickerLabel": "Agent",
|
|
279
318
|
"ai_assistant.playground.chat.notSupportedBody": "Wybierz agenta, którego tryb wykonywania to \"chat\", lub przełącz się na zakładkę trybu obiektowego.",
|
|
280
319
|
"ai_assistant.playground.chat.notSupportedTitle": "Tryb czatu nie jest dostępny dla tego agenta.",
|
|
@@ -346,6 +385,7 @@
|
|
|
346
385
|
"ai_assistant.settings.envKeyMissing": "{{key}} nie ustawiony",
|
|
347
386
|
"ai_assistant.settings.generateMcpConfig": "Generuj konfigurację MCP",
|
|
348
387
|
"ai_assistant.settings.generateSessionKey": "Generuj klucz sesji",
|
|
388
|
+
"ai_assistant.settings.launchDescription": "Otwórz asystenta AI z tej strony.",
|
|
349
389
|
"ai_assistant.settings.llmProviderLabel": "Dostawca LLM:",
|
|
350
390
|
"ai_assistant.settings.loading": "Wczytywanie ustawień...",
|
|
351
391
|
"ai_assistant.settings.mcpAuthLabel": "Uwierzytelnianie MCP:",
|
|
@@ -362,6 +402,7 @@
|
|
|
362
402
|
"ai_assistant.settings.notAvailable": "Niedostępny",
|
|
363
403
|
"ai_assistant.settings.notConfigured": "Nieskonfigurowany",
|
|
364
404
|
"ai_assistant.settings.openButton": "Otwórz asystenta AI",
|
|
405
|
+
"ai_assistant.settings.openSelectorButton": "Otwórz asystentów AI",
|
|
365
406
|
"ai_assistant.settings.pageDescription": "Konfiguruj i monitoruj asystenta AI",
|
|
366
407
|
"ai_assistant.settings.pageTitle": "Ustawienia asystenta AI",
|
|
367
408
|
"ai_assistant.settings.providerColumn": "Dostawca",
|
|
@@ -382,5 +423,37 @@
|
|
|
382
423
|
"ai_assistant.status.executing": "Wykonywanie narzędzi...",
|
|
383
424
|
"ai_assistant.status.responding": "Odpowiadanie...",
|
|
384
425
|
"ai_assistant.status.thinking": "Myślenie...",
|
|
385
|
-
"ai_assistant.status.working": "Przetwarzanie..."
|
|
426
|
+
"ai_assistant.status.working": "Przetwarzanie...",
|
|
427
|
+
"ai_assistant.usage.apply": "Zastosuj",
|
|
428
|
+
"ai_assistant.usage.col.agent": "Agent",
|
|
429
|
+
"ai_assistant.usage.col.day": "Dzień",
|
|
430
|
+
"ai_assistant.usage.col.finishReason": "Zakończenie",
|
|
431
|
+
"ai_assistant.usage.col.inputTokens": "Wejście",
|
|
432
|
+
"ai_assistant.usage.col.model": "Model",
|
|
433
|
+
"ai_assistant.usage.col.outputTokens": "Wyjście",
|
|
434
|
+
"ai_assistant.usage.col.session": "Sesja",
|
|
435
|
+
"ai_assistant.usage.col.sessions": "Sesje",
|
|
436
|
+
"ai_assistant.usage.col.startedAt": "Start",
|
|
437
|
+
"ai_assistant.usage.col.step": "Krok",
|
|
438
|
+
"ai_assistant.usage.col.steps": "Kroki",
|
|
439
|
+
"ai_assistant.usage.dailyBreakdown": "Podział dzienny",
|
|
440
|
+
"ai_assistant.usage.error": "Nie udało się wczytać danych użycia.",
|
|
441
|
+
"ai_assistant.usage.errorDetail": "Nie udało się wczytać zdarzeń sesji.",
|
|
442
|
+
"ai_assistant.usage.errorSessions": "Nie udało się wczytać sesji.",
|
|
443
|
+
"ai_assistant.usage.from": "Od",
|
|
444
|
+
"ai_assistant.usage.inputTokens": "Tokeny wejściowe",
|
|
445
|
+
"ai_assistant.usage.loading": "Wczytywanie danych użycia...",
|
|
446
|
+
"ai_assistant.usage.loadingDetail": "Wczytywanie zdarzeń sesji...",
|
|
447
|
+
"ai_assistant.usage.loadingSessions": "Wczytywanie sesji...",
|
|
448
|
+
"ai_assistant.usage.navTitle": "Użycie AI",
|
|
449
|
+
"ai_assistant.usage.next": "Następna",
|
|
450
|
+
"ai_assistant.usage.noSessions": "Nie znaleziono sesji dla wybranego okresu.",
|
|
451
|
+
"ai_assistant.usage.outputTokens": "Tokeny wyjściowe",
|
|
452
|
+
"ai_assistant.usage.prev": "Poprzednia",
|
|
453
|
+
"ai_assistant.usage.sessionDetail": "Szczegóły sesji",
|
|
454
|
+
"ai_assistant.usage.sessions": "Sesje",
|
|
455
|
+
"ai_assistant.usage.sessionsList": "Sesje",
|
|
456
|
+
"ai_assistant.usage.steps": "Kroki",
|
|
457
|
+
"ai_assistant.usage.title": "Statystyki użycia tokenów",
|
|
458
|
+
"ai_assistant.usage.to": "Do"
|
|
386
459
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/modules/ai_assistant/lib/agent-policy.ts"],
|
|
4
|
-
"sourcesContent": ["import { getAgent } from './agent-registry'\nimport { hasRequiredFeatures } from './auth'\nimport { toolRegistry } from './tool-registry'\nimport type {\n AiAgentAcceptedMediaType,\n AiAgentDefinition,\n AiAgentMutationPolicy,\n} from './ai-agent-definition'\nimport type { AiToolDefinition } from './types'\n\nexport type AgentPolicyDenyCode =\n | 'agent_unknown'\n | 'agent_features_denied'\n | 'tool_not_whitelisted'\n | 'tool_unknown'\n | 'tool_features_denied'\n | 'mutation_blocked_by_readonly'\n | 'mutation_blocked_by_policy'\n | 'execution_mode_not_supported'\n | 'attachment_type_not_accepted'\n\nexport type AgentPolicyDecision =\n | { ok: true; agent: AiAgentDefinition; tool?: AiToolDefinition }\n | { ok: false; code: AgentPolicyDenyCode; message: string }\n\nexport interface AgentPolicyAuthContext {\n userFeatures: string[]\n isSuperAdmin: boolean\n}\n\nexport interface AgentPolicyCheckInput {\n agentId: string\n authContext: AgentPolicyAuthContext\n toolName?: string\n attachmentMediaTypes?: string[]\n requestedExecutionMode?: 'chat' | 'object'\n /**\n * Optional tenant-scoped downgrade for the agent's code-declared\n * `mutationPolicy`. When supplied, the effective policy is the MOST\n * RESTRICTIVE of `{ code-declared, override }` \u2014 escalation is never\n * allowed through this channel (that is enforced at the route layer).\n * Callers that omit this field get the exact pre-Step-5.4 behavior.\n */\n mutationPolicyOverride?: AiAgentMutationPolicy | null\n}\n\n/**\n * Restrictiveness ranking of `AiAgentMutationPolicy` (most restrictive first).\n * `read-only` blocks all mutation tools. `destructive-confirm-required` forces\n * confirmation for every write (including non-destructive ones). `confirm-required`\n * is the least restrictive policy \u2014 writes go through a single confirmation.\n *\n * This ordering is load-bearing for both the runtime's effective-policy\n * computation AND the route-layer escalation guard. Changing the order is a\n * security-sensitive change.\n */\nconst POLICY_RESTRICTIVENESS: Record<AiAgentMutationPolicy, number> = {\n 'read-only': 0,\n 'destructive-confirm-required': 1,\n 'confirm-required': 2,\n}\n\nexport function isKnownMutationPolicy(value: unknown): value is AiAgentMutationPolicy {\n return (\n value === 'read-only' ||\n value === 'confirm-required' ||\n value === 'destructive-confirm-required'\n )\n}\n\n/**\n * Returns the effective mutation policy \u2014 the MOST RESTRICTIVE of\n * `{ codeDeclared, override }`. Missing override \u2192 `codeDeclared`. A corrupt\n * override value (unknown string from DB) is logged and falls back to\n * `codeDeclared` so the system fails SAFE when a schema drift leaks through.\n */\nexport function resolveEffectiveMutationPolicy(\n codeDeclared: AiAgentMutationPolicy | undefined,\n override: AiAgentMutationPolicy | null | undefined,\n agentId?: string,\n): AiAgentMutationPolicy {\n const base: AiAgentMutationPolicy =\n codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : 'read-only'\n if (override === undefined || override === null) return base\n if (!isKnownMutationPolicy(override)) {\n console.warn(\n `[AI Agents] Ignoring corrupt mutationPolicy override for agent \"${agentId ?? '<unknown>'}\": ${String(\n override,\n )}. Falling back to code-declared policy \"${base}\".`,\n )\n return base\n }\n const baseRank = POLICY_RESTRICTIVENESS[base]\n const overrideRank = POLICY_RESTRICTIVENESS[override]\n return overrideRank < baseRank ? override : base\n}\n\n/**\n * Returns `true` when `candidate` would WIDEN `codeDeclared` \u2014 i.e. would\n * grant the agent more mutation surface than its code declares. Used by the\n * mutation-policy override route to reject escalation attempts with 400.\n */\nexport function isMutationPolicyEscalation(\n codeDeclared: AiAgentMutationPolicy | undefined,\n candidate: AiAgentMutationPolicy,\n): boolean {\n const base: AiAgentMutationPolicy =\n codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : 'read-only'\n return POLICY_RESTRICTIVENESS[candidate] > POLICY_RESTRICTIVENESS[base]\n}\n\nfunction classifyMediaType(value: string): AiAgentAcceptedMediaType {\n const normalized = value.trim().toLowerCase()\n if (normalized.startsWith('image/')) return 'image'\n if (normalized === 'application/pdf') return 'pdf'\n return 'file'\n}\n\nfunction isAgentReadOnly(agent: AiAgentDefinition): boolean {\n if (typeof agent.readOnly === 'boolean') return agent.readOnly\n return true\n}\n\n/**\n * Returns the effective mutation policy for a policy-check invocation \u2014 the\n * most restrictive of `{ agent.mutationPolicy, input.mutationPolicyOverride }`.\n * Pure-lookup helper; no I/O. Callers that need to know the same value outside\n * of a policy check should use {@link resolveEffectiveMutationPolicy} directly.\n */\nfunction resolvePolicyCheckMutationPolicy(\n agent: AiAgentDefinition,\n override: AiAgentMutationPolicy | null | undefined,\n): AiAgentMutationPolicy {\n return resolveEffectiveMutationPolicy(agent.mutationPolicy, override, agent.id)\n}\n\nfunction hasAgentStructuredOutput(agent: AiAgentDefinition): boolean {\n return Boolean(agent.output)\n}\n\nfunction agentExecutionMode(agent: AiAgentDefinition): 'chat' | 'object' {\n return agent.executionMode ?? 'chat'\n}\n\nexport function checkAgentPolicy(input: AgentPolicyCheckInput): AgentPolicyDecision {\n const {\n agentId,\n authContext,\n toolName,\n attachmentMediaTypes,\n requestedExecutionMode,\n mutationPolicyOverride,\n } = input\n\n const agent = getAgent(agentId)\n if (!agent) {\n return {\n ok: false,\n code: 'agent_unknown',\n message: `Agent \"${agentId}\" is not registered.`,\n }\n }\n\n const agentFeatures = agent.requiredFeatures ?? []\n if (\n !hasRequiredFeatures(agentFeatures, authContext.userFeatures, authContext.isSuperAdmin)\n ) {\n return {\n ok: false,\n code: 'agent_features_denied',\n message: `Access to agent \"${agentId}\" requires features: ${agentFeatures.join(', ')}`,\n }\n }\n\n let resolvedTool: AiToolDefinition | undefined\n if (typeof toolName === 'string') {\n if (!agent.allowedTools.includes(toolName)) {\n return {\n ok: false,\n code: 'tool_not_whitelisted',\n message: `Tool \"${toolName}\" is not whitelisted for agent \"${agentId}\".`,\n }\n }\n\n const toolRecord = toolRegistry.getTool(toolName) as AiToolDefinition | undefined\n if (!toolRecord) {\n return {\n ok: false,\n code: 'tool_unknown',\n message: `Tool \"${toolName}\" is not registered in the tool registry.`,\n }\n }\n\n const toolFeatures = toolRecord.requiredFeatures ?? []\n if (\n !hasRequiredFeatures(toolFeatures, authContext.userFeatures, authContext.isSuperAdmin)\n ) {\n return {\n ok: false,\n code: 'tool_features_denied',\n message: `Access to tool \"${toolName}\" requires features: ${toolFeatures.join(', ')}`,\n }\n }\n\n if (toolRecord.isMutation === true) {\n if (isAgentReadOnly(agent)) {\n return {\n ok: false,\n code: 'mutation_blocked_by_readonly',\n message: `Mutation tool \"${toolName}\" cannot be executed by read-only agent \"${agentId}\".`,\n }\n }\n const effectivePolicy = resolvePolicyCheckMutationPolicy(agent, mutationPolicyOverride)\n if (effectivePolicy === 'read-only') {\n return {\n ok: false,\n code: 'mutation_blocked_by_policy',\n message: `Mutation tool \"${toolName}\" is blocked by agent \"${agentId}\" mutationPolicy=read-only.`,\n }\n }\n }\n\n resolvedTool = toolRecord\n }\n\n if (requestedExecutionMode) {\n const declaredMode = agentExecutionMode(agent)\n if (requestedExecutionMode === 'object') {\n if (declaredMode !== 'object' && !hasAgentStructuredOutput(agent)) {\n return {\n ok: false,\n code: 'execution_mode_not_supported',\n message: `Agent \"${agentId}\" does not support execution mode \"object\" (no output schema declared).`,\n }\n }\n } else if (requestedExecutionMode === 'chat') {\n if (declaredMode === 'object' && hasAgentStructuredOutput(agent)) {\n return {\n ok: false,\n code: 'execution_mode_not_supported',\n message: `Agent \"${agentId}\" is declared as object-mode and cannot run via chat transport.`,\n }\n }\n }\n }\n\n if (Array.isArray(attachmentMediaTypes) && attachmentMediaTypes.length > 0) {\n const accepted = agent.acceptedMediaTypes\n if (!accepted || accepted.length === 0) {\n return {\n ok: false,\n code: 'attachment_type_not_accepted',\n message: `Agent \"${agentId}\" does not accept attachments.`,\n }\n }\n const acceptedSet = new Set<AiAgentAcceptedMediaType>(accepted)\n for (const raw of attachmentMediaTypes) {\n const kind = classifyMediaType(raw)\n if (!acceptedSet.has(kind)) {\n return {\n ok: false,\n code: 'attachment_type_not_accepted',\n message: `Agent \"${agentId}\" does not accept media type \"${raw}\" (classified as \"${kind}\").`,\n }\n }\n }\n }\n\n return { ok: true, agent, tool: resolvedTool }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;
|
|
4
|
+
"sourcesContent": ["import { getAgent } from './agent-registry'\nimport { hasRequiredFeatures } from './auth'\nimport { toolRegistry } from './tool-registry'\nimport type {\n AiAgentAcceptedMediaType,\n AiAgentDefinition,\n AiAgentMutationPolicy,\n} from './ai-agent-definition'\nimport type { AiToolDefinition } from './types'\n\nexport type AgentPolicyDenyCode =\n | 'agent_unknown'\n | 'agent_features_denied'\n | 'tool_not_whitelisted'\n | 'tool_unknown'\n | 'tool_features_denied'\n | 'mutation_blocked_by_readonly'\n | 'mutation_blocked_by_policy'\n | 'execution_mode_not_supported'\n | 'attachment_type_not_accepted'\n // Loop policy codes \u2014 Phase 0 of spec 2026-04-28-ai-agents-agentic-loop-controls\n /** Object-mode rejects loop primitives that the SDK ignores for generateObject. */\n | 'loop_unsupported_in_object_mode'\n /** User prepareStep returned a tools map with a raw (unwrapped) mutation handler. */\n | 'loop_violates_mutation_policy'\n /** loop.activeTools contained names outside agent.allowedTools (thrown for caller-supplied overrides; warning-only for agent-declared). */\n | 'loop_active_tools_outside_allowlist'\n /** agent.loop.allowRuntimeOverride is false and a per-call loop override was supplied. */\n | 'loop_runtime_override_disabled'\n\nexport type AgentPolicyDecision =\n | { ok: true; agent: AiAgentDefinition; tool?: AiToolDefinition }\n | { ok: false; code: AgentPolicyDenyCode; message: string }\n\nexport interface AgentPolicyAuthContext {\n userFeatures: string[]\n isSuperAdmin: boolean\n}\n\nexport interface AgentPolicyCheckInput {\n agentId: string\n authContext: AgentPolicyAuthContext\n toolName?: string\n attachmentMediaTypes?: string[]\n requestedExecutionMode?: 'chat' | 'object'\n /**\n * Optional tenant-scoped downgrade for the agent's code-declared\n * `mutationPolicy`. When supplied, the effective policy is the MOST\n * RESTRICTIVE of `{ code-declared, override }` \u2014 escalation is never\n * allowed through this channel (that is enforced at the route layer).\n * Callers that omit this field get the exact pre-Step-5.4 behavior.\n */\n mutationPolicyOverride?: AiAgentMutationPolicy | null\n}\n\n/**\n * Restrictiveness ranking of `AiAgentMutationPolicy` (most restrictive first).\n * `read-only` blocks all mutation tools. `destructive-confirm-required` forces\n * confirmation for every write (including non-destructive ones). `confirm-required`\n * is the least restrictive policy \u2014 writes go through a single confirmation.\n *\n * This ordering is load-bearing for both the runtime's effective-policy\n * computation AND the route-layer escalation guard. Changing the order is a\n * security-sensitive change.\n */\nconst POLICY_RESTRICTIVENESS: Record<AiAgentMutationPolicy, number> = {\n 'read-only': 0,\n 'destructive-confirm-required': 1,\n 'confirm-required': 2,\n}\n\nexport function isKnownMutationPolicy(value: unknown): value is AiAgentMutationPolicy {\n return (\n value === 'read-only' ||\n value === 'confirm-required' ||\n value === 'destructive-confirm-required'\n )\n}\n\n/**\n * Returns the effective mutation policy \u2014 the MOST RESTRICTIVE of\n * `{ codeDeclared, override }`. Missing override \u2192 `codeDeclared`. A corrupt\n * override value (unknown string from DB) is logged and falls back to\n * `codeDeclared` so the system fails SAFE when a schema drift leaks through.\n */\nexport function resolveEffectiveMutationPolicy(\n codeDeclared: AiAgentMutationPolicy | undefined,\n override: AiAgentMutationPolicy | null | undefined,\n agentId?: string,\n): AiAgentMutationPolicy {\n const base: AiAgentMutationPolicy =\n codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : 'read-only'\n if (override === undefined || override === null) return base\n if (!isKnownMutationPolicy(override)) {\n console.warn(\n `[AI Agents] Ignoring corrupt mutationPolicy override for agent \"${agentId ?? '<unknown>'}\": ${String(\n override,\n )}. Falling back to code-declared policy \"${base}\".`,\n )\n return base\n }\n const baseRank = POLICY_RESTRICTIVENESS[base]\n const overrideRank = POLICY_RESTRICTIVENESS[override]\n return overrideRank < baseRank ? override : base\n}\n\n/**\n * Returns `true` when `candidate` would WIDEN `codeDeclared` \u2014 i.e. would\n * grant the agent more mutation surface than its code declares. Used by the\n * mutation-policy override route to reject escalation attempts with 400.\n */\nexport function isMutationPolicyEscalation(\n codeDeclared: AiAgentMutationPolicy | undefined,\n candidate: AiAgentMutationPolicy,\n): boolean {\n const base: AiAgentMutationPolicy =\n codeDeclared && isKnownMutationPolicy(codeDeclared) ? codeDeclared : 'read-only'\n return POLICY_RESTRICTIVENESS[candidate] > POLICY_RESTRICTIVENESS[base]\n}\n\nfunction classifyMediaType(value: string): AiAgentAcceptedMediaType {\n const normalized = value.trim().toLowerCase()\n if (normalized.startsWith('image/')) return 'image'\n if (normalized === 'application/pdf') return 'pdf'\n return 'file'\n}\n\nfunction isAgentReadOnly(agent: AiAgentDefinition): boolean {\n if (typeof agent.readOnly === 'boolean') return agent.readOnly\n return true\n}\n\n/**\n * Returns the effective mutation policy for a policy-check invocation \u2014 the\n * most restrictive of `{ agent.mutationPolicy, input.mutationPolicyOverride }`.\n * Pure-lookup helper; no I/O. Callers that need to know the same value outside\n * of a policy check should use {@link resolveEffectiveMutationPolicy} directly.\n */\nfunction resolvePolicyCheckMutationPolicy(\n agent: AiAgentDefinition,\n override: AiAgentMutationPolicy | null | undefined,\n): AiAgentMutationPolicy {\n return resolveEffectiveMutationPolicy(agent.mutationPolicy, override, agent.id)\n}\n\nfunction hasAgentStructuredOutput(agent: AiAgentDefinition): boolean {\n return Boolean(agent.output)\n}\n\nfunction agentExecutionMode(agent: AiAgentDefinition): 'chat' | 'object' {\n return agent.executionMode ?? 'chat'\n}\n\nexport function checkAgentPolicy(input: AgentPolicyCheckInput): AgentPolicyDecision {\n const {\n agentId,\n authContext,\n toolName,\n attachmentMediaTypes,\n requestedExecutionMode,\n mutationPolicyOverride,\n } = input\n\n const agent = getAgent(agentId)\n if (!agent) {\n return {\n ok: false,\n code: 'agent_unknown',\n message: `Agent \"${agentId}\" is not registered.`,\n }\n }\n\n const agentFeatures = agent.requiredFeatures ?? []\n if (\n !hasRequiredFeatures(agentFeatures, authContext.userFeatures, authContext.isSuperAdmin)\n ) {\n return {\n ok: false,\n code: 'agent_features_denied',\n message: `Access to agent \"${agentId}\" requires features: ${agentFeatures.join(', ')}`,\n }\n }\n\n let resolvedTool: AiToolDefinition | undefined\n if (typeof toolName === 'string') {\n if (!agent.allowedTools.includes(toolName)) {\n return {\n ok: false,\n code: 'tool_not_whitelisted',\n message: `Tool \"${toolName}\" is not whitelisted for agent \"${agentId}\".`,\n }\n }\n\n const toolRecord = toolRegistry.getTool(toolName) as AiToolDefinition | undefined\n if (!toolRecord) {\n return {\n ok: false,\n code: 'tool_unknown',\n message: `Tool \"${toolName}\" is not registered in the tool registry.`,\n }\n }\n\n const toolFeatures = toolRecord.requiredFeatures ?? []\n if (\n !hasRequiredFeatures(toolFeatures, authContext.userFeatures, authContext.isSuperAdmin)\n ) {\n return {\n ok: false,\n code: 'tool_features_denied',\n message: `Access to tool \"${toolName}\" requires features: ${toolFeatures.join(', ')}`,\n }\n }\n\n if (toolRecord.isMutation === true) {\n if (isAgentReadOnly(agent)) {\n return {\n ok: false,\n code: 'mutation_blocked_by_readonly',\n message: `Mutation tool \"${toolName}\" cannot be executed by read-only agent \"${agentId}\".`,\n }\n }\n const effectivePolicy = resolvePolicyCheckMutationPolicy(agent, mutationPolicyOverride)\n if (effectivePolicy === 'read-only') {\n return {\n ok: false,\n code: 'mutation_blocked_by_policy',\n message: `Mutation tool \"${toolName}\" is blocked by agent \"${agentId}\" mutationPolicy=read-only.`,\n }\n }\n }\n\n resolvedTool = toolRecord\n }\n\n if (requestedExecutionMode) {\n const declaredMode = agentExecutionMode(agent)\n if (requestedExecutionMode === 'object') {\n if (declaredMode !== 'object' && !hasAgentStructuredOutput(agent)) {\n return {\n ok: false,\n code: 'execution_mode_not_supported',\n message: `Agent \"${agentId}\" does not support execution mode \"object\" (no output schema declared).`,\n }\n }\n } else if (requestedExecutionMode === 'chat') {\n if (declaredMode === 'object' && hasAgentStructuredOutput(agent)) {\n return {\n ok: false,\n code: 'execution_mode_not_supported',\n message: `Agent \"${agentId}\" is declared as object-mode and cannot run via chat transport.`,\n }\n }\n }\n }\n\n if (Array.isArray(attachmentMediaTypes) && attachmentMediaTypes.length > 0) {\n const accepted = agent.acceptedMediaTypes\n if (!accepted || accepted.length === 0) {\n return {\n ok: false,\n code: 'attachment_type_not_accepted',\n message: `Agent \"${agentId}\" does not accept attachments.`,\n }\n }\n const acceptedSet = new Set<AiAgentAcceptedMediaType>(accepted)\n for (const raw of attachmentMediaTypes) {\n const kind = classifyMediaType(raw)\n if (!acceptedSet.has(kind)) {\n return {\n ok: false,\n code: 'attachment_type_not_accepted',\n message: `Agent \"${agentId}\" does not accept media type \"${raw}\" (classified as \"${kind}\").`,\n }\n }\n }\n }\n\n return { ok: true, agent, tool: resolvedTool }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|