nextclaw 0.49.1 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/cli/app/index.js +2 -2
- package/dist/cli/launcher/index.js +1 -1
- package/dist/{distribution-BAU3XUQJ.js → distribution-DzRLAMTC.js} +1 -1
- package/dist/{distribution-CND3AWXk.js → distribution-kH-YiPGh.js} +1 -1
- package/dist/{distribution-CND3AWXk.js.map → distribution-kH-YiPGh.js.map} +1 -1
- package/dist/feedback-maintenance-client.service-DIMfY_yr.js +85 -0
- package/dist/feedback-maintenance-client.service-DIMfY_yr.js.map +1 -0
- package/dist/index.d.ts +36 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -1
- package/dist/{nextclaw-cli-app-CjtgVEdo.js → nextclaw-cli-app-DAWWp2hy.js} +1095 -8
- package/dist/nextclaw-cli-app-DAWWp2hy.js.map +1 -0
- package/package.json +14 -14
- package/resources/USAGE.md +28 -0
- package/resources/skills/feedback-maintainer/SKILL.md +21 -0
- package/ui-dist/.vite/manifest.json +190 -190
- package/ui-dist/.vite/manifest.json.gz +0 -0
- package/ui-dist/assets/{account-panel-QhOMbAQP.js → account-panel-BXTCFv7d.js} +1 -1
- package/ui-dist/assets/account-panel-BXTCFv7d.js.gz +0 -0
- package/ui-dist/assets/{api-BWFOIoUm.js → api-DqzQ-_3w.js} +1 -1
- package/ui-dist/assets/api-DqzQ-_3w.js.gz +0 -0
- package/ui-dist/assets/{app-data-BnrEdmg2.js → app-data-C54N2p8b.js} +1 -1
- package/ui-dist/assets/app-data-C54N2p8b.js.gz +0 -0
- package/ui-dist/assets/app-presenter-provider-V0xnU_Wb.js +115 -0
- package/ui-dist/assets/app-presenter-provider-V0xnU_Wb.js.gz +0 -0
- package/ui-dist/assets/{appearance-settings-page-C5z5sOkC.js → appearance-settings-page-83T2AtVm.js} +1 -1
- package/ui-dist/assets/appearance-settings-page-83T2AtVm.js.gz +0 -0
- package/ui-dist/assets/{channels-list-page-CzXYZZtK.js → channels-list-page-Bv7CVSqV.js} +1 -1
- package/ui-dist/assets/channels-list-page-Bv7CVSqV.js.gz +0 -0
- package/ui-dist/assets/{config-split-page-CxLWGwdt.js → config-split-page-DqAXKLmG.js} +1 -1
- package/ui-dist/assets/config-split-page-DqAXKLmG.js.gz +0 -0
- package/ui-dist/assets/{confirm-dialog-BWS7gA_z.js → confirm-dialog-BTKCWMn6.js} +1 -1
- package/ui-dist/assets/confirm-dialog-BTKCWMn6.js.gz +0 -0
- package/ui-dist/assets/{desktop-capabilities-page-BJNGkq4q.js → desktop-capabilities-page-zLzCSB7A.js} +1 -1
- package/ui-dist/assets/desktop-capabilities-page-zLzCSB7A.js.gz +0 -0
- package/ui-dist/assets/{desktop-update-config-7tBum3MA.js → desktop-update-config-PmofcFf6.js} +1 -1
- package/ui-dist/assets/desktop-update-config-PmofcFf6.js.gz +0 -0
- package/ui-dist/assets/{doc-browser-BNiqa-zm.js → doc-browser-BJrre2S_.js} +1 -1
- package/ui-dist/assets/doc-browser-BJrre2S_.js.gz +0 -0
- package/ui-dist/assets/doc-browser-BPqA-zQx.js +1 -0
- package/ui-dist/assets/{doc-browser-context-Dp0dEMyT.js → doc-browser-context-TILuCY5c.js} +1 -1
- package/ui-dist/assets/doc-browser-context-TILuCY5c.js.gz +0 -0
- package/ui-dist/assets/{extensions-WWEYpaUh.js → extensions-CVUFK6Jj.js} +1 -1
- package/ui-dist/assets/extensions-CVUFK6Jj.js.gz +0 -0
- package/ui-dist/assets/{i18n-ClHx6jwj.js → i18n-20rSH40D.js} +2 -2
- package/ui-dist/assets/i18n-20rSH40D.js.gz +0 -0
- package/ui-dist/assets/{i18n-provider-C1NxogO4.js → i18n-provider-BPRq6S7O.js} +1 -1
- package/ui-dist/assets/{keyboard-shortcuts-settings-page-CS9BFOBW.js → keyboard-shortcuts-settings-page-CkQbSKwI.js} +1 -1
- package/ui-dist/assets/login-page-Dlyvp-81.js +1 -0
- package/ui-dist/assets/{login-page-CL0SrBCf.js → login-page-f8qQ4xKY.js} +1 -1
- package/ui-dist/assets/login-page-f8qQ4xKY.js.gz +0 -0
- package/ui-dist/assets/main-D2dWy8fM.css +1 -0
- package/ui-dist/assets/main-D2dWy8fM.css.gz +0 -0
- package/ui-dist/assets/main-i18n-catalog.config-DZ-5ollN.js +1 -0
- package/ui-dist/assets/main-i18n-catalog.config-DZ-5ollN.js.gz +0 -0
- package/ui-dist/assets/{main-CvVBCOlN.js → main-ky5Efhq1.js} +2 -2
- package/ui-dist/assets/main-ky5Efhq1.js.gz +0 -0
- package/ui-dist/assets/{mcp-marketplace-page-D75hPmzO.js → mcp-marketplace-page-FfIfEo6w.js} +1 -1
- package/ui-dist/assets/mcp-marketplace-page-FfIfEo6w.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-sH7VptN_.js +1 -0
- package/ui-dist/assets/{model-config-page-DFfcV9lu.js → model-config-page-Bcm6-pCX.js} +1 -1
- package/ui-dist/assets/model-config-page-Bcm6-pCX.js.gz +0 -0
- package/ui-dist/assets/panel-app-i18n-catalog.config-p3qAY_Eq.js +1 -0
- package/ui-dist/assets/{panelStandalone-D2CqTyi_.js → panelStandalone-By-6dDXS.js} +2 -2
- package/ui-dist/assets/panelStandalone-By-6dDXS.js.gz +0 -0
- package/ui-dist/assets/{privacy-settings-page-CE-xF9bo.js → privacy-settings-page-B1sHLAc1.js} +1 -1
- package/ui-dist/assets/privacy-settings-page-B1sHLAc1.js.gz +0 -0
- package/ui-dist/assets/{projects-BF0wpY4X.js → projects-O3GTERwP.js} +1 -1
- package/ui-dist/assets/projects-O3GTERwP.js.gz +0 -0
- package/ui-dist/assets/{provider-scoped-model-input-BvZitHkT.js → provider-scoped-model-input-BQsugx1v.js} +1 -1
- package/ui-dist/assets/provider-scoped-model-input-BQsugx1v.js.gz +0 -0
- package/ui-dist/assets/{providers-config-page-cDeyluVG.js → providers-config-page-BDEdHJbw.js} +1 -1
- package/ui-dist/assets/providers-config-page-BDEdHJbw.js.gz +0 -0
- package/ui-dist/assets/{pwa-dXn0s_lD.js → pwa-D_nZUwG0.js} +1 -1
- package/ui-dist/assets/pwa-D_nZUwG0.js.gz +0 -0
- package/ui-dist/assets/remote-CFWp4wyH.js +1 -0
- package/ui-dist/assets/{runtime-config-page-DNo4dzS1.js → runtime-config-page-BHTKwgDi.js} +1 -1
- package/ui-dist/assets/runtime-config-page-BHTKwgDi.js.gz +0 -0
- package/ui-dist/assets/{search-config-page-CA0HxVy0.js → search-config-page-DWKlMHgH.js} +1 -1
- package/ui-dist/assets/search-config-page-DWKlMHgH.js.gz +0 -0
- package/ui-dist/assets/{secrets-config-page-iT1wamQp.js → secrets-config-page-DiQL088Y.js} +1 -1
- package/ui-dist/assets/secrets-config-page-DiQL088Y.js.gz +0 -0
- package/ui-dist/assets/security-config-DmTDKKY4.js +1 -0
- package/ui-dist/assets/{service-apps-panel-CU0tFrqT.js → service-apps-panel-CEnyYsQp.js} +1 -1
- package/ui-dist/assets/service-apps-panel-CEnyYsQp.js.gz +0 -0
- package/ui-dist/assets/{tag-chip-CY0Hqk_l.js → tag-chip-B1AYPOKL.js} +1 -1
- package/ui-dist/assets/{theme-provider-BvpXGXWH.js → theme-provider-DzvAi3pe.js} +1 -1
- package/ui-dist/assets/theme-provider-DzvAi3pe.js.gz +0 -0
- package/ui-dist/assets/{use-config-C8ZkQiTc.js → use-config-BEdbtpD4.js} +1 -1
- package/ui-dist/assets/use-config-BEdbtpD4.js.gz +0 -0
- package/ui-dist/assets/{use-desktop-capabilities-DR9snbeo.js → use-desktop-capabilities-BkuRd2cY.js} +1 -1
- package/ui-dist/assets/use-desktop-capabilities-BkuRd2cY.js.gz +0 -0
- package/ui-dist/index.html +18 -18
- package/ui-dist/index.html.gz +0 -0
- package/ui-dist/panel-standalone.html +5 -5
- package/ui-dist/panel-standalone.html.gz +0 -0
- package/dist/nextclaw-cli-app-CjtgVEdo.js.map +0 -1
- package/ui-dist/assets/account-panel-QhOMbAQP.js.gz +0 -0
- package/ui-dist/assets/api-BWFOIoUm.js.gz +0 -0
- package/ui-dist/assets/app-data-BnrEdmg2.js.gz +0 -0
- package/ui-dist/assets/app-presenter-provider-CDRBc_lQ.js +0 -115
- package/ui-dist/assets/app-presenter-provider-CDRBc_lQ.js.gz +0 -0
- package/ui-dist/assets/appearance-settings-page-C5z5sOkC.js.gz +0 -0
- package/ui-dist/assets/channels-list-page-CzXYZZtK.js.gz +0 -0
- package/ui-dist/assets/config-split-page-CxLWGwdt.js.gz +0 -0
- package/ui-dist/assets/confirm-dialog-BWS7gA_z.js.gz +0 -0
- package/ui-dist/assets/desktop-capabilities-page-BJNGkq4q.js.gz +0 -0
- package/ui-dist/assets/desktop-update-config-7tBum3MA.js.gz +0 -0
- package/ui-dist/assets/doc-browser-BNiqa-zm.js.gz +0 -0
- package/ui-dist/assets/doc-browser-DZDqghNc.js +0 -1
- package/ui-dist/assets/doc-browser-context-Dp0dEMyT.js.gz +0 -0
- package/ui-dist/assets/extensions-WWEYpaUh.js.gz +0 -0
- package/ui-dist/assets/i18n-ClHx6jwj.js.gz +0 -0
- package/ui-dist/assets/login-page-CL0SrBCf.js.gz +0 -0
- package/ui-dist/assets/login-page-Dq5nPUCU.js +0 -1
- package/ui-dist/assets/main-CLwCjK9U.css +0 -1
- package/ui-dist/assets/main-CLwCjK9U.css.gz +0 -0
- package/ui-dist/assets/main-CvVBCOlN.js.gz +0 -0
- package/ui-dist/assets/main-i18n-catalog.config-D4qFo4OB.js +0 -1
- package/ui-dist/assets/main-i18n-catalog.config-D4qFo4OB.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-CATnpZ2Q.js +0 -1
- package/ui-dist/assets/mcp-marketplace-page-D75hPmzO.js.gz +0 -0
- package/ui-dist/assets/model-config-page-DFfcV9lu.js.gz +0 -0
- package/ui-dist/assets/panel-app-i18n-catalog.config-oUwmxoE7.js +0 -1
- package/ui-dist/assets/panelStandalone-D2CqTyi_.js.gz +0 -0
- package/ui-dist/assets/privacy-settings-page-CE-xF9bo.js.gz +0 -0
- package/ui-dist/assets/projects-BF0wpY4X.js.gz +0 -0
- package/ui-dist/assets/provider-scoped-model-input-BvZitHkT.js.gz +0 -0
- package/ui-dist/assets/providers-config-page-cDeyluVG.js.gz +0 -0
- package/ui-dist/assets/pwa-dXn0s_lD.js.gz +0 -0
- package/ui-dist/assets/remote-CV5wQVVj.js +0 -1
- package/ui-dist/assets/runtime-config-page-DNo4dzS1.js.gz +0 -0
- package/ui-dist/assets/search-config-page-CA0HxVy0.js.gz +0 -0
- package/ui-dist/assets/secrets-config-page-iT1wamQp.js.gz +0 -0
- package/ui-dist/assets/security-config-B38PLI3M.js +0 -1
- package/ui-dist/assets/service-apps-panel-CU0tFrqT.js.gz +0 -0
- package/ui-dist/assets/theme-provider-BvpXGXWH.js.gz +0 -0
- package/ui-dist/assets/use-config-C8ZkQiTc.js.gz +0 -0
- package/ui-dist/assets/use-desktop-capabilities-DR9snbeo.js.gz +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# nextclaw
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
NextClaw aims to be your proactive, continuously improving, long-term AI partner. Today, it brings conversations, agents, skills, CLI tools, automations, and messaging apps together to help you discuss questions and complete work.
|
|
4
|
+
|
|
5
|
+
The [1.0 roadmap](https://docs.nextclaw.io/en/project/roadmap) covers user understanding, proactive analysis and conversation, self-improvement, and reliable long-term use. These are planned outcomes; full acceptance testing is not complete, and no release date is set.
|
|
4
6
|
|
|
5
7
|
## Install
|
|
6
8
|
|
package/dist/cli/app/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { n as repairPackagedPortableRunnerPermissions, t as createNextclawDistribution } from "../../distribution-
|
|
2
|
+
import { n as repairPackagedPortableRunnerPermissions, t as createNextclawDistribution } from "../../distribution-kH-YiPGh.js";
|
|
3
3
|
import { NextclawDistributionService } from "@nextclaw/service";
|
|
4
4
|
//#region src/cli/app/index.ts
|
|
5
5
|
const distribution = createNextclawDistribution(import.meta.url);
|
|
6
6
|
repairPackagedPortableRunnerPermissions(distribution);
|
|
7
7
|
NextclawDistributionService.configureRuntime(distribution);
|
|
8
|
-
const { nextclawCliProgram } = await import("../../nextclaw-cli-app-
|
|
8
|
+
const { nextclawCliProgram } = await import("../../nextclaw-cli-app-DAWWp2hy.js");
|
|
9
9
|
await nextclawCliProgram.parseAsync(process.argv);
|
|
10
10
|
//#endregion
|
|
11
11
|
export {};
|
|
@@ -6,7 +6,7 @@ if (!(nodeMajor >= 24 || nodeMajor === 22 && nodeMinor >= 12 || nodeMajor === 20
|
|
|
6
6
|
`);
|
|
7
7
|
process.exitCode = 1;
|
|
8
8
|
} else {
|
|
9
|
-
const [{ NextclawDistributionService, runNextclawNpmRuntimeLauncher }, { createNextclawDistribution }] = await Promise.all([import("@nextclaw/service"), import("../../distribution-
|
|
9
|
+
const [{ NextclawDistributionService, runNextclawNpmRuntimeLauncher }, { createNextclawDistribution }] = await Promise.all([import("@nextclaw/service"), import("../../distribution-DzRLAMTC.js")]);
|
|
10
10
|
NextclawDistributionService.configure(createNextclawDistribution(import.meta.url));
|
|
11
11
|
await runNextclawNpmRuntimeLauncher(process.argv);
|
|
12
12
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as repairPackagedPortableRunnerPermissions, t as createNextclawDistribution } from "./distribution-
|
|
1
|
+
import { n as repairPackagedPortableRunnerPermissions, t as createNextclawDistribution } from "./distribution-kH-YiPGh.js";
|
|
2
2
|
export { createNextclawDistribution, repairPackagedPortableRunnerPermissions };
|
|
@@ -41,4 +41,4 @@ function repairPackagedPortableRunnerPermissions(distribution) {
|
|
|
41
41
|
//#endregion
|
|
42
42
|
export { repairPackagedPortableRunnerPermissions as n, createNextclawDistribution as t };
|
|
43
43
|
|
|
44
|
-
//# sourceMappingURL=distribution-
|
|
44
|
+
//# sourceMappingURL=distribution-kH-YiPGh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribution-
|
|
1
|
+
{"version":3,"file":"distribution-kH-YiPGh.js","names":[],"sources":["../src/cli/shared/lib/distribution/nextclaw-distribution.utils.ts"],"sourcesContent":["import { accessSync, chmodSync, constants, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { NextclawDistribution } from \"@nextclaw/service\";\n\nexport function createNextclawDistribution(importMetaUrl: string): NextclawDistribution {\n const entrypoint = fileURLToPath(importMetaUrl);\n const packageRoot = resolve(dirname(entrypoint), \"../../..\");\n const { version } = JSON.parse(readFileSync(resolve(packageRoot, \"package.json\"), \"utf-8\")) as { version?: string };\n const portableRunnerExecutable = process.platform === \"win32\"\n ? \"nextclaw-wasmtime-runner.exe\"\n : \"nextclaw-wasmtime-runner\";\n return {\n version: typeof version === \"string\" ? version : \"0.0.0\",\n productEnvironment: \"development\",\n releaseChannel: \"development\",\n appEntrypoint: resolve(packageRoot, \"dist/cli/app/index.js\"),\n launcherVersion: typeof version === \"string\" ? version : \"0.0.0\",\n launcherEntrypoint: resolve(dirname(entrypoint), \"../launcher\", basename(entrypoint)),\n launchedByLauncher: false,\n templatesDir: resolve(packageRoot, \"templates\"),\n uiDistDir: resolve(packageRoot, \"ui-dist\"),\n runtimeUpdatePublicKeyPath: resolve(packageRoot, \"resources/update-bundle-public.pem\"),\n builtInAppsDirectory: resolve(packageRoot, \"resources/apps\"),\n portableServiceRunnerPath: resolve(\n packageRoot,\n \"resources/native\",\n `${process.platform}-${process.arch}`,\n portableRunnerExecutable,\n )\n };\n}\n\nexport function repairPackagedPortableRunnerPermissions(distribution: NextclawDistribution): boolean {\n if (process.platform === \"win32\") return false;\n const runnerPath = distribution.portableServiceRunnerPath?.trim();\n if (!runnerPath || !existsSync(runnerPath)) return false;\n const runnerStat = statSync(runnerPath);\n if (!runnerStat.isFile()) return false;\n try {\n accessSync(runnerPath, constants.X_OK);\n return false;\n } catch {\n chmodSync(runnerPath, (runnerStat.mode & 0o777) | 0o111);\n accessSync(runnerPath, constants.X_OK);\n process.stderr.write(`[nextclaw] restored executable permission for bundled Portable Service App runner: ${runnerPath}\\n`);\n return true;\n }\n}\n"],"mappings":";;;;AAKA,SAAgB,2BAA2B,eAA6C;CACtF,MAAM,aAAa,cAAc,cAAc;CAC/C,MAAM,cAAc,QAAQ,QAAQ,WAAW,EAAE,WAAW;CAC5D,MAAM,EAAE,YAAY,KAAK,MAAM,aAAa,QAAQ,aAAa,eAAe,EAAE,QAAQ,CAAC;CAC3F,MAAM,2BAA2B,QAAQ,aAAa,UAClD,iCACA;AACJ,QAAO;EACL,SAAS,OAAO,YAAY,WAAW,UAAU;EACjD,oBAAoB;EACpB,gBAAgB;EAChB,eAAe,QAAQ,aAAa,wBAAwB;EAC5D,iBAAiB,OAAO,YAAY,WAAW,UAAU;EACzD,oBAAoB,QAAQ,QAAQ,WAAW,EAAE,eAAe,SAAS,WAAW,CAAC;EACrF,oBAAoB;EACpB,cAAc,QAAQ,aAAa,YAAY;EAC/C,WAAW,QAAQ,aAAa,UAAU;EAC1C,4BAA4B,QAAQ,aAAa,qCAAqC;EACtF,sBAAsB,QAAQ,aAAa,iBAAiB;EAC5D,2BAA2B,QACzB,aACA,oBACA,GAAG,QAAQ,SAAS,GAAG,QAAQ,QAC/B,yBACD;EACF;;AAGH,SAAgB,wCAAwC,cAA6C;AACnG,KAAI,QAAQ,aAAa,QAAS,QAAO;CACzC,MAAM,aAAa,aAAa,2BAA2B,MAAM;AACjE,KAAI,CAAC,cAAc,CAAC,WAAW,WAAW,CAAE,QAAO;CACnD,MAAM,aAAa,SAAS,WAAW;AACvC,KAAI,CAAC,WAAW,QAAQ,CAAE,QAAO;AACjC,KAAI;AACF,aAAW,YAAY,UAAU,KAAK;AACtC,SAAO;SACD;AACN,YAAU,YAAa,WAAW,OAAO,MAAS,GAAM;AACxD,aAAW,YAAY,UAAU,KAAK;AACtC,UAAQ,OAAO,MAAM,sFAAsF,WAAW,IAAI;AAC1H,SAAO"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
//#region src/cli/app/services/feedback/feedback-maintenance-client.service.ts
|
|
3
|
+
function selectFeedback(queue, now = Date.now(), limit = 10) {
|
|
4
|
+
const pending = queue.filter((r) => r.status === "received" && !r.runId);
|
|
5
|
+
const sorted = pending.slice().sort((a, b) => a.priority - b.priority || Number(b.kind !== "unknown") - Number(a.kind !== "unknown") || Number(b.identity === "verified") - Number(a.identity === "verified") || a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));
|
|
6
|
+
const aged = pending.filter((r) => r.priority > 0 && r.kind !== "unknown" && now - Date.parse(r.createdAt) >= 48 * 36e5).sort((a, b) => a.createdAt.localeCompare(b.createdAt))[0];
|
|
7
|
+
const selected = sorted.slice(0, limit);
|
|
8
|
+
if (aged && !selected.includes(aged) && selected.length && selected.at(-1).priority > 0) selected[selected.length - 1] = aged;
|
|
9
|
+
return selected;
|
|
10
|
+
}
|
|
11
|
+
var FeedbackMaintenanceClient = class {
|
|
12
|
+
endpoint;
|
|
13
|
+
token;
|
|
14
|
+
constructor({ endpoint, token }) {
|
|
15
|
+
const url = new URL(endpoint);
|
|
16
|
+
if (url.protocol !== "https:" && !(url.protocol === "http:" && ["localhost", "127.0.0.1"].includes(url.hostname)) || url.username || url.password || url.pathname !== "/" || url.search || url.hash) throw new Error("Invalid feedback origin.");
|
|
17
|
+
if (!token || token.length < 32) throw new Error("SUPPORT_MAINTAINER_TOKEN must be configured.");
|
|
18
|
+
this.endpoint = url.origin;
|
|
19
|
+
this.token = token;
|
|
20
|
+
}
|
|
21
|
+
request = async (path, body) => {
|
|
22
|
+
const response = await fetch(this.endpoint + "/api/support/maintenance" + path, {
|
|
23
|
+
method: body === void 0 ? "GET" : "POST",
|
|
24
|
+
redirect: "error",
|
|
25
|
+
signal: AbortSignal.timeout(15e3),
|
|
26
|
+
headers: {
|
|
27
|
+
Authorization: "Bearer " + this.token,
|
|
28
|
+
"Content-Type": "application/json"
|
|
29
|
+
},
|
|
30
|
+
body: body === void 0 ? void 0 : JSON.stringify(body)
|
|
31
|
+
});
|
|
32
|
+
const result = await response.json();
|
|
33
|
+
if (!response.ok || !result.ok) throw new Error(result.error?.message ?? "Maintenance request failed.");
|
|
34
|
+
return result.data;
|
|
35
|
+
};
|
|
36
|
+
list = async () => {
|
|
37
|
+
const reports = /* @__PURE__ */ new Map();
|
|
38
|
+
let cursor = "", paused = false, maxAuthority = "analyze";
|
|
39
|
+
do {
|
|
40
|
+
const page = await this.request("?cursor=" + encodeURIComponent(cursor));
|
|
41
|
+
paused ||= page.paused;
|
|
42
|
+
maxAuthority = page.maxAuthority;
|
|
43
|
+
for (const report of page.items) reports.set(report.id, report);
|
|
44
|
+
cursor = page.nextCursor ?? "";
|
|
45
|
+
} while (cursor);
|
|
46
|
+
return {
|
|
47
|
+
items: [...reports.values()],
|
|
48
|
+
paused,
|
|
49
|
+
maxAuthority,
|
|
50
|
+
nextCursor: null
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
get = async (id) => {
|
|
54
|
+
const report = (await this.list()).items.find((r) => r.id === id);
|
|
55
|
+
if (!report) throw new Error("Feedback not found.");
|
|
56
|
+
return report;
|
|
57
|
+
};
|
|
58
|
+
scan = async () => {
|
|
59
|
+
const page = await this.list();
|
|
60
|
+
return {
|
|
61
|
+
paused: page.paused,
|
|
62
|
+
maxAuthority: page.maxAuthority,
|
|
63
|
+
candidates: page.paused ? [] : selectFeedback(page.items.filter((r) => !r.approval)),
|
|
64
|
+
approved: page.paused ? [] : selectFeedback(page.items.filter((r) => r.approval?.inputVersion === r.inputVersion)),
|
|
65
|
+
unfinished: page.items.filter((r) => ["working", "ready"].includes(r.status))
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
act = async (report, action) => {
|
|
69
|
+
const operationId = action.operationId ?? randomUUID();
|
|
70
|
+
try {
|
|
71
|
+
return await this.request("/" + encodeURIComponent(report.id), {
|
|
72
|
+
...action,
|
|
73
|
+
operationId,
|
|
74
|
+
revision: report.revision,
|
|
75
|
+
runId: report.runId
|
|
76
|
+
});
|
|
77
|
+
} catch (error) {
|
|
78
|
+
throw new Error(`Operation ${operationId}: ${error instanceof Error ? error.message : "request failed"}`);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
//#endregion
|
|
83
|
+
export { selectFeedback as n, FeedbackMaintenanceClient as t };
|
|
84
|
+
|
|
85
|
+
//# sourceMappingURL=feedback-maintenance-client.service-DIMfY_yr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback-maintenance-client.service-DIMfY_yr.js","names":[],"sources":["../src/cli/app/services/feedback/feedback-maintenance-client.service.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { SupportAuthority, SupportMaintenance, SupportPage, SupportReport } from \"@nextclaw/shared\";\n\nexport function selectFeedback(queue: SupportReport[], now = Date.now(), limit = 10): SupportReport[] {\n const pending = queue.filter((r) => r.status === \"received\" && !r.runId);\n const sorted = pending.slice().sort((a, b) => a.priority - b.priority || Number(b.kind !== \"unknown\") - Number(a.kind !== \"unknown\") ||\n Number(b.identity === \"verified\") - Number(a.identity === \"verified\") || a.createdAt.localeCompare(b.createdAt) || a.id.localeCompare(b.id));\n const aged = pending.filter((r) => r.priority > 0 && r.kind !== \"unknown\" && now - Date.parse(r.createdAt) >= 48 * 3600000)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt))[0];\n const selected = sorted.slice(0, limit);\n if (aged && !selected.includes(aged) && selected.length && selected.at(-1)!.priority > 0) selected[selected.length - 1] = aged;\n return selected;\n}\ntype MaintenancePage = SupportPage & { paused: boolean; maxAuthority: SupportAuthority };\nexport class FeedbackMaintenanceClient {\n readonly endpoint: string;\n private readonly token: string;\n constructor({ endpoint, token }: { endpoint: string; token: string | undefined }) {\n const url = new URL(endpoint);\n if ((url.protocol !== \"https:\" && !(url.protocol === \"http:\" && [\"localhost\", \"127.0.0.1\"].includes(url.hostname))) || url.username || url.password || url.pathname !== \"/\" || url.search || url.hash) throw new Error(\"Invalid feedback origin.\");\n if (!token || token.length < 32) throw new Error(\"SUPPORT_MAINTAINER_TOKEN must be configured.\");\n this.endpoint = url.origin; this.token = token;\n }\n request = async <T = MaintenancePage>(path: string, body?: unknown): Promise<T> => {\n const response = await fetch(this.endpoint + \"/api/support/maintenance\" + path, {\n method: body === undefined ? \"GET\" : \"POST\", redirect: \"error\", signal: AbortSignal.timeout(15000),\n headers: { Authorization: \"Bearer \" + this.token, \"Content-Type\": \"application/json\" }, body: body === undefined ? undefined : JSON.stringify(body)\n });\n const result = await response.json() as { ok: boolean; data: T; error?: { message: string } };\n if (!response.ok || !result.ok) throw new Error(result.error?.message ?? \"Maintenance request failed.\");\n return result.data;\n };\n list = async (): Promise<MaintenancePage> => {\n const reports = new Map<string, SupportReport>(); let cursor = \"\", paused = false, maxAuthority: SupportAuthority = \"analyze\";\n do {\n const page = await this.request(\"?cursor=\" + encodeURIComponent(cursor));\n paused ||= page.paused; maxAuthority = page.maxAuthority;\n for (const report of page.items) reports.set(report.id, report);\n cursor = page.nextCursor ?? \"\";\n } while (cursor);\n return { items: [...reports.values()], paused, maxAuthority, nextCursor: null };\n };\n get = async (id: string): Promise<SupportReport> => {\n const report = (await this.list()).items.find((r) => r.id === id);\n if (!report) throw new Error(\"Feedback not found.\");\n return report;\n };\n scan = async () => {\n const page = await this.list();\n return { paused: page.paused, maxAuthority: page.maxAuthority,\n candidates: page.paused ? [] : selectFeedback(page.items.filter((r) => !r.approval)),\n approved: page.paused ? [] : selectFeedback(page.items.filter((r) => r.approval?.inputVersion === r.inputVersion)),\n unfinished: page.items.filter((r) => [\"working\", \"ready\"].includes(r.status)) };\n };\n act = async (report: Pick<SupportReport, \"id\" | \"revision\" | \"runId\">, action: Omit<SupportMaintenance, \"operationId\" | \"revision\" | \"runId\"> & { operationId?: string }): Promise<SupportReport> => {\n const operationId = action.operationId ?? randomUUID();\n try {\n return await this.request<SupportReport>(\"/\" + encodeURIComponent(report.id), { ...action, operationId, revision: report.revision, runId: report.runId });\n } catch (error) { throw new Error(`Operation ${operationId}: ${error instanceof Error ? error.message : \"request failed\"}`); }\n };\n}\n"],"mappings":";;AAGA,SAAgB,eAAe,OAAwB,MAAM,KAAK,KAAK,EAAE,QAAQ,IAAqB;CACpG,MAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,WAAW,cAAc,CAAC,EAAE,MAAM;CACxE,MAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,YAAY,OAAO,EAAE,SAAS,UAAU,GAAG,OAAO,EAAE,SAAS,UAAU,IAClI,OAAO,EAAE,aAAa,WAAW,GAAG,OAAO,EAAE,aAAa,WAAW,IAAI,EAAE,UAAU,cAAc,EAAE,UAAU,IAAI,EAAE,GAAG,cAAc,EAAE,GAAG,CAAC;CAC9I,MAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,WAAW,KAAK,EAAE,SAAS,aAAa,MAAM,KAAK,MAAM,EAAE,UAAU,IAAI,KAAK,KAAQ,CACxH,MAAM,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,UAAU,CAAC,CAAC;CAC1D,MAAM,WAAW,OAAO,MAAM,GAAG,MAAM;AACvC,KAAI,QAAQ,CAAC,SAAS,SAAS,KAAK,IAAI,SAAS,UAAU,SAAS,GAAG,GAAG,CAAE,WAAW,EAAG,UAAS,SAAS,SAAS,KAAK;AAC1H,QAAO;;AAGT,IAAa,4BAAb,MAAuC;CACrC;CACA;CACA,YAAY,EAAE,UAAU,SAA0D;EAChF,MAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,MAAK,IAAI,aAAa,YAAY,EAAE,IAAI,aAAa,WAAW,CAAC,aAAa,YAAY,CAAC,SAAS,IAAI,SAAS,KAAM,IAAI,YAAY,IAAI,YAAY,IAAI,aAAa,OAAO,IAAI,UAAU,IAAI,KAAM,OAAM,IAAI,MAAM,2BAA2B;AAClP,MAAI,CAAC,SAAS,MAAM,SAAS,GAAI,OAAM,IAAI,MAAM,+CAA+C;AAChG,OAAK,WAAW,IAAI;AAAQ,OAAK,QAAQ;;CAE3C,UAAU,OAA4B,MAAc,SAA+B;EACjF,MAAM,WAAW,MAAM,MAAM,KAAK,WAAW,6BAA6B,MAAM;GAC9E,QAAQ,SAAS,KAAA,IAAY,QAAQ;GAAQ,UAAU;GAAS,QAAQ,YAAY,QAAQ,KAAM;GAClG,SAAS;IAAE,eAAe,YAAY,KAAK;IAAO,gBAAgB;IAAoB;GAAE,MAAM,SAAS,KAAA,IAAY,KAAA,IAAY,KAAK,UAAU,KAAK;GACpJ,CAAC;EACF,MAAM,SAAS,MAAM,SAAS,MAAM;AACpC,MAAI,CAAC,SAAS,MAAM,CAAC,OAAO,GAAI,OAAM,IAAI,MAAM,OAAO,OAAO,WAAW,8BAA8B;AACvG,SAAO,OAAO;;CAEhB,OAAO,YAAsC;EAC3C,MAAM,0BAAU,IAAI,KAA4B;EAAE,IAAI,SAAS,IAAI,SAAS,OAAO,eAAiC;AACpH,KAAG;GACD,MAAM,OAAO,MAAM,KAAK,QAAQ,aAAa,mBAAmB,OAAO,CAAC;AACxE,cAAW,KAAK;AAAQ,kBAAe,KAAK;AAC5C,QAAK,MAAM,UAAU,KAAK,MAAO,SAAQ,IAAI,OAAO,IAAI,OAAO;AAC/D,YAAS,KAAK,cAAc;WACrB;AACT,SAAO;GAAE,OAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC;GAAE;GAAQ;GAAc,YAAY;GAAM;;CAEjF,MAAM,OAAO,OAAuC;EAClD,MAAM,UAAU,MAAM,KAAK,MAAM,EAAE,MAAM,MAAM,MAAM,EAAE,OAAO,GAAG;AACjE,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,sBAAsB;AACnD,SAAO;;CAET,OAAO,YAAY;EACjB,MAAM,OAAO,MAAM,KAAK,MAAM;AAC9B,SAAO;GAAE,QAAQ,KAAK;GAAQ,cAAc,KAAK;GAC/C,YAAY,KAAK,SAAS,EAAE,GAAG,eAAe,KAAK,MAAM,QAAQ,MAAM,CAAC,EAAE,SAAS,CAAC;GACpF,UAAU,KAAK,SAAS,EAAE,GAAG,eAAe,KAAK,MAAM,QAAQ,MAAM,EAAE,UAAU,iBAAiB,EAAE,aAAa,CAAC;GAClH,YAAY,KAAK,MAAM,QAAQ,MAAM,CAAC,WAAW,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;GAAE;;CAEnF,MAAM,OAAO,QAA0D,WAA8H;EACnM,MAAM,cAAc,OAAO,eAAe,YAAY;AACtD,MAAI;AACF,UAAO,MAAM,KAAK,QAAuB,MAAM,mBAAmB,OAAO,GAAG,EAAE;IAAE,GAAG;IAAQ;IAAa,UAAU,OAAO;IAAU,OAAO,OAAO;IAAO,CAAC;WAClJ,OAAO;AAAE,SAAM,IAAI,MAAM,aAAa,YAAY,IAAI,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,36 @@
|
|
|
1
|
-
|
|
1
|
+
import { SupportAuthority, SupportMaintenance, SupportPage, SupportReport } from "@nextclaw/shared";
|
|
2
|
+
export * from "@nextclaw/core";
|
|
3
|
+
|
|
4
|
+
//#region src/cli/app/services/feedback/feedback-maintenance-client.service.d.ts
|
|
5
|
+
declare function selectFeedback(queue: SupportReport[], now?: number, limit?: number): SupportReport[];
|
|
6
|
+
type MaintenancePage = SupportPage & {
|
|
7
|
+
paused: boolean;
|
|
8
|
+
maxAuthority: SupportAuthority;
|
|
9
|
+
};
|
|
10
|
+
declare class FeedbackMaintenanceClient {
|
|
11
|
+
readonly endpoint: string;
|
|
12
|
+
private readonly token;
|
|
13
|
+
constructor({
|
|
14
|
+
endpoint,
|
|
15
|
+
token
|
|
16
|
+
}: {
|
|
17
|
+
endpoint: string;
|
|
18
|
+
token: string | undefined;
|
|
19
|
+
});
|
|
20
|
+
request: <T = MaintenancePage>(path: string, body?: unknown) => Promise<T>;
|
|
21
|
+
list: () => Promise<MaintenancePage>;
|
|
22
|
+
get: (id: string) => Promise<SupportReport>;
|
|
23
|
+
scan: () => Promise<{
|
|
24
|
+
paused: boolean;
|
|
25
|
+
maxAuthority: SupportAuthority;
|
|
26
|
+
candidates: SupportReport[];
|
|
27
|
+
approved: SupportReport[];
|
|
28
|
+
unfinished: SupportReport[];
|
|
29
|
+
}>;
|
|
30
|
+
act: (report: Pick<SupportReport, "id" | "revision" | "runId">, action: Omit<SupportMaintenance, "operationId" | "revision" | "runId"> & {
|
|
31
|
+
operationId?: string;
|
|
32
|
+
}) => Promise<SupportReport>;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { FeedbackMaintenanceClient, selectFeedback };
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/cli/app/services/feedback/feedback-maintenance-client.service.ts"],"mappings":";;;;iBAGgB,cAAA,CAAe,KAAA,EAAO,aAAA,IAAiB,GAAA,WAAkB,KAAA,YAAa,aAAA;AAAA,KAUjF,eAAA,GAAkB,WAAA;EAAgB,MAAA;EAAiB,YAAA,EAAc,gBAAA;AAAA;AAAA,cACzD,yBAAA;EAAA,SACF,QAAA;EAAA,iBACQ,KAAA;;IACH,QAAA;IAAU;EAAA;IAAW,QAAA;IAAkB,KAAA;EAAA;EAMrD,OAAA,OAAqB,eAAA,EAAiB,IAAA,UAAc,IAAA,eAAiB,OAAA,CAAQ,CAAA;EAS7E,IAAA,QAAiB,OAAA,CAAQ,eAAA;EAUzB,GAAA,GAAa,EAAA,aAAa,OAAA,CAAQ,aAAA;EAKlC,IAAA,QAAI,OAAA;;;;;;;EAOJ,GAAA,GAAa,MAAA,EAAQ,IAAA,CAAK,aAAA,gCAA6C,MAAA,EAAQ,IAAA,CAAK,kBAAA;IAA8D,WAAA;EAAA,MAAyB,OAAA,CAAQ,aAAA;AAAA"}
|
package/dist/index.js
CHANGED