@yuandc/aica 0.1.95 → 0.1.97
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/dist/acp/client/acp-client.js +1 -1
- package/dist/acp/client/acp-events.js +1 -1
- package/dist/acp/client/acp-runtime-pool.js +1 -1
- package/dist/acp/client/json-rpc.js +3 -3
- package/dist/acp/providers/codex/provider.js +1 -1
- package/dist/acp/providers/codex-acp/adapter.js +3 -3
- package/dist/acp/providers/codex-acp/provider.js +1 -1
- package/dist/acp/providers/mimo/provider.js +2 -2
- package/dist/acp/providers/opencode/provider.js +3 -3
- package/dist/acp/providers/standard-acp-events.js +1 -1
- package/dist/acp/providers/workbuddy/auth-manager.js +1 -1
- package/dist/acp/providers/workbuddy/auth-transport.js +3 -3
- package/dist/acp/providers/workbuddy/interactions.js +1 -1
- package/dist/acp/providers/workbuddy/provider.js +1 -1
- package/dist/acp/tool-lifecycle-trace.js +2 -2
- package/dist/commands/daemon.js +2 -2
- package/dist/commands/start.js +1 -1
- package/dist/core/job-worker.js +1 -1
- package/dist/core/logger.js +3 -3
- package/dist/core/logging/rotating-log.js +3 -0
- package/dist/interactions/connection-interactions.js +1 -0
- package/dist/interactions/elicitation-tracker.js +1 -0
- package/dist/interactions/form-schema.js +1 -0
- package/dist/interactions/job-interactions.js +1 -1
- package/dist/interactions/provider-input.js +1 -1
- package/dist/interactions/types.js +1 -1
- package/dist/version.js +1 -1
- package/dist/worker-cli.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID as
|
|
1
|
+
import{schemaFields as O}from"./form-schema.js";import{randomUUID as x}from"node:crypto";import{INTERACTION_TIMEOUT_MS as E,validateInteractionAnswers as b,validateInteractionUrl as U}from"./types.js";const h="item/tool/requestUserInput",w="mcpServer/elicitation/request";function A(t){return t===h||t===w}function p(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function _(t,c,r,n){const u=p(r),e=Object.keys(p(u.request)).length?p(u.request):u,o=typeof e.method=="string"?e.method:c;if(!(o==="elicitation/create"||(t==="native-codex"||t==="codex-acp")&&A(o)))throw new Error(`Unsupported user input method: ${o}`);if(o==="elicitation/create"&&!["form","url"].includes(String(e.mode)))throw new Error("Unsupported elicitation mode: explicit form or url required");const s=String(n??e.requestId??e.id??x()),f=String(e.prompt??e.message??e.question??""),q=typeof e.sessionId=="string"?{sessionId:e.sessionId,...typeof e.toolCallId=="string"?{toolCallId:e.toolCallId}:{}}:typeof e.requestId=="string"||typeof e.requestId=="number"?{requestId:e.requestId}:void 0;if(e.mode==="url"){if(!U(e.url)||typeof e.elicitationId!="string"||!e.elicitationId||e.elicitationId.length>256)throw new Error("Unsupported elicitation URL or ID");return{requestId:s,prompt:f,params:r,interaction:{version:2,kind:"url",provider:t,method:o,requestId:s,runtimeId:"",expiresAtMs:Date.now()+E,prompt:f,scope:q,url:e.url,elicitationId:e.elicitationId}}}let l,I="questions";if(o!==h&&e.requestedSchema){if(e.mode&&!["form","openai/form","openaiForm"].includes(String(e.mode)))throw new Error("Unsupported elicitation mode");I="form",l=O(e.requestedSchema)}else if(o===h&&Array.isArray(e.questions))l=e.questions.map(a=>{const i=p(a),g=Array.isArray(i.options)?i.options.map(S=>{const m=p(S),y=String(m.label??m.value??"");return{value:String(m.value??m.label??""),label:y,description:typeof m.description=="string"?m.description:void 0,recommended:m.recommended===!0||/\(Recommended\)|(推荐)|\(推荐\)/i.test(y)}}):void 0;if(i.multiple===!0||i.multiSelect===!0)throw new Error("Unsupported multi-select question protocol");return{id:String(i.id??""),label:String(i.question??i.title??""),description:typeof i.header=="string"?i.header:void 0,type:"string",required:!0,secret:i.isSecret===!0,allowOther:i.isOther===!0||!g?.length,options:g?.length?g:void 0}});else throw new Error("Unsupported user input payload: missing questions or form schema");if(l.length>100||l.some(a=>!a.id||!a.label||["__proto__","constructor","prototype"].includes(a.id))||new Set(l.map(a=>a.id)).size!==l.length)throw new Error("Unsupported user input fields: missing/duplicate IDs or too many fields");return{requestId:s,prompt:f,params:r,interaction:{version:I==="questions"?1:2,kind:I,provider:t,method:o,requestId:s,runtimeId:"",expiresAtMs:Date.now()+E,prompt:f,fields:l,scope:q}}}async function C(t,c,r,n,u){const e=p(r);if(t==="codex-acp"&&e.acaInteractionBridge===1){const s=p(e.request);return n?n(s):{outcome:{outcome:"cancelled"}}}let o;try{o=_(t,c,r,u)}catch(s){throw Object.assign(s instanceof Error?s:new Error(String(s)),{rpcCode:-32602})}const d=n?await n(o):{outcome:{outcome:"cancelled"}};return v(o,d)}function v(t,c){const r=t.interaction;if(!r)throw new Error("Missing structured interaction contract");const n=c.outcome.outcome==="submitted",u=c.outcome.outcome==="submitted"?c.outcome.answers:void 0;if(n&&r.kind!=="url"&&Object.keys(b(r,u)).length)throw new Error("Invalid structured answers");const e=n?"accept":c.outcome.outcome==="declined"?"decline":"cancel";if(r.kind==="url")return{action:e,...r.method===w?{content:null,_meta:null}:{}};if(r.kind==="form")return{action:e,content:n?Object.fromEntries(Object.entries(u).map(([o,d])=>[o,d.value])):null,...r.method===w?{_meta:null}:{}};if(r.method===h)return{answers:n?Object.fromEntries(Object.entries(u).map(([o,d])=>[o,{answers:Array.isArray(d.value)?d.value:[String(d.value)]}])):{}};throw new Error(`Unsupported interaction response method: ${r.method}`)}export{w as CODEX_FORM_METHOD,h as CODEX_QUESTIONS_METHOD,C as handleProviderInput,A as isCodexInputMethod,_ as normalizeProviderInput,p as object,v as providerInputResponse};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const u=6e5;function y(s,r){const i=Object.create(null);if(!r||typeof r!="object"||Array.isArray(r))return{_form:"请填写回答后提交。"};const f=r,d=s.fields??[];for(const e of Object.keys(f))d.some(n=>n.id===e)||(i[e]="回答包含未知字段。");for(const e of d){const n=Object.hasOwn(f,e.id)?f[e.id]:void 0;if(n===void 0){e.required&&(i[e.id]="此项为必填。");continue}if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(o=>o!=="type"&&o!=="value")){i[e.id]="回答格式不正确。";continue}const t=n.value,a=e.type==="string[]"?Array.isArray(t)&&t.every(o=>typeof o=="string"):e.type==="integer"?typeof t=="number"&&Number.isSafeInteger(t):typeof t===e.type&&(typeof t!="number"||Number.isFinite(t));if(n.type!==e.type||!a){i[e.id]="回答类型不正确。";continue}if(typeof t=="string"){if(e.required&&s.kind!=="form"&&!t.trim()&&(i[e.id]="此项为必填。"),[...t].length<(e.minLength??0)&&(i[e.id]=`至少填写 ${e.minLength} 个字符。`),[...t].length>Math.min(e.maxLength??16e3,16e3)&&(i[e.id]="填写内容过长。"),e.pattern)try{new RegExp(e.pattern,"u").test(t)||(i[e.id]="填写内容不符合要求的格式。")}catch{i[e.id]="此字段的格式规则无效,请取消后联系 Agent。"}if(e.format==="date-time"&&(!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/i.test(t)||!Number.isFinite(Date.parse(t))||new Date(t.slice(0,10)).toISOString().slice(0,10)!==t.slice(0,10))&&(i[e.id]="请输入包含时区的有效日期时间。"),e.format==="email"&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)&&(i[e.id]="请输入有效的邮箱地址。"),e.format==="uri")try{new URL(t)}catch{i[e.id]="请输入完整的网址。"}e.format==="date"&&(!/^\d{4}-\d{2}-\d{2}$/.test(t)||!Number.isFinite(Date.parse(t))||new Date(t).toISOString().slice(0,10)!==t)&&(i[e.id]="请输入有效的日期。")}typeof t=="number"&&(t<(e.minimum??-1/0)||t>(e.maximum??1/0))&&(i[e.id]="数值超出允许范围。"),Array.isArray(t)&&(([...t].length<(e.minItems??(e.required&&s.kind!=="form"?1:0))||t.length>(e.maxItems??100))&&(i[e.id]="选择数量不符合要求。"),new Set(t).size!==t.length&&(i[e.id]="不能重复选择同一项。")),e.options&&!e.allowOther&&(Array.isArray(t)?t:[t]).some(c=>!e.options.some(m=>m.value===c))&&(i[e.id]="请选择提供的选项。")}return i}function p(s){if(typeof s!="string"||s.length>8192||/[\u0000-\u0020\u007f\\]/u.test(s))return!1;try{const r=new URL(s);return["https:","http:"].includes(r.protocol)&&!!r.hostname&&!r.username&&!r.password}catch{return!1}}export{u as INTERACTION_TIMEOUT_MS,y as validateInteractionAnswers,p as validateInteractionUrl};
|
package/dist/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const o="0.1.
|
|
1
|
+
const o="0.1.97";export{o as AICA_VERSION};
|
package/dist/worker-cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as m}from"commander";import a from"node:path";import{createStartCommand as n}from"./commands/start.js";import{createDaemonCommand as t}from"./commands/daemon.js";import{createWorkerAuthCommand as
|
|
2
|
+
import{Command as m}from"commander";import a from"node:path";import{createStartCommand as n}from"./commands/start.js";import{createDaemonCommand as t}from"./commands/daemon.js";import{createWorkerAuthCommand as i}from"./commands/worker-auth.js";import{createWorkerCodexCommand as c}from"./commands/worker-codex.js";import{createWorkerProjectCommand as s}from"./commands/worker-project.js";import{DEFAULT_ACA_SERVER_URL as d}from"./core/aca-config.js";import{AICA_VERSION as p}from"./version.js";import{applyToolEnvironment as C}from"./core/tool-environment.js";import{checkDesktopWorker as f}from"./core/desktop-check.js";import{handleLogCollector as A}from"./core/logging/rotating-log.js";process.env.ACA_DEFAULT_SERVER_URL||=d;async function k(r=process.argv){if(await A(r))return;C();const o=new m;o.name("aica").description("AICA remote Agent worker").version(p).enablePositionalOptions(),o.addCommand(n()),o.addCommand(t()),o.addCommand(i()),o.addCommand(s()),o.addCommand(c()),o.addCommand(new m("desktop-check").description("检查桌面运行环境,不连接 Server").action(f)),await o.parseAsync(r)}const l=process.argv[1]||"",e=a.basename(l).replace(/\.(?:js|ts|cjs|mjs)$/i,"");(e==="worker-cli"||e==="aica"||e==="aca")&&k().catch(r=>{const o=r instanceof Error?r.message:String(r);console.error(o),process.exitCode=1});export{k as runWorkerCli};
|