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.
Files changed (140) hide show
  1. package/README.md +3 -1
  2. package/dist/cli/app/index.js +2 -2
  3. package/dist/cli/launcher/index.js +1 -1
  4. package/dist/{distribution-BAU3XUQJ.js → distribution-DzRLAMTC.js} +1 -1
  5. package/dist/{distribution-CND3AWXk.js → distribution-kH-YiPGh.js} +1 -1
  6. package/dist/{distribution-CND3AWXk.js.map → distribution-kH-YiPGh.js.map} +1 -1
  7. package/dist/feedback-maintenance-client.service-DIMfY_yr.js +85 -0
  8. package/dist/feedback-maintenance-client.service-DIMfY_yr.js.map +1 -0
  9. package/dist/index.d.ts +36 -1
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +2 -1
  12. package/dist/{nextclaw-cli-app-CjtgVEdo.js → nextclaw-cli-app-DAWWp2hy.js} +1095 -8
  13. package/dist/nextclaw-cli-app-DAWWp2hy.js.map +1 -0
  14. package/package.json +14 -14
  15. package/resources/USAGE.md +28 -0
  16. package/resources/skills/feedback-maintainer/SKILL.md +21 -0
  17. package/ui-dist/.vite/manifest.json +190 -190
  18. package/ui-dist/.vite/manifest.json.gz +0 -0
  19. package/ui-dist/assets/{account-panel-QhOMbAQP.js → account-panel-BXTCFv7d.js} +1 -1
  20. package/ui-dist/assets/account-panel-BXTCFv7d.js.gz +0 -0
  21. package/ui-dist/assets/{api-BWFOIoUm.js → api-DqzQ-_3w.js} +1 -1
  22. package/ui-dist/assets/api-DqzQ-_3w.js.gz +0 -0
  23. package/ui-dist/assets/{app-data-BnrEdmg2.js → app-data-C54N2p8b.js} +1 -1
  24. package/ui-dist/assets/app-data-C54N2p8b.js.gz +0 -0
  25. package/ui-dist/assets/app-presenter-provider-V0xnU_Wb.js +115 -0
  26. package/ui-dist/assets/app-presenter-provider-V0xnU_Wb.js.gz +0 -0
  27. package/ui-dist/assets/{appearance-settings-page-C5z5sOkC.js → appearance-settings-page-83T2AtVm.js} +1 -1
  28. package/ui-dist/assets/appearance-settings-page-83T2AtVm.js.gz +0 -0
  29. package/ui-dist/assets/{channels-list-page-CzXYZZtK.js → channels-list-page-Bv7CVSqV.js} +1 -1
  30. package/ui-dist/assets/channels-list-page-Bv7CVSqV.js.gz +0 -0
  31. package/ui-dist/assets/{config-split-page-CxLWGwdt.js → config-split-page-DqAXKLmG.js} +1 -1
  32. package/ui-dist/assets/config-split-page-DqAXKLmG.js.gz +0 -0
  33. package/ui-dist/assets/{confirm-dialog-BWS7gA_z.js → confirm-dialog-BTKCWMn6.js} +1 -1
  34. package/ui-dist/assets/confirm-dialog-BTKCWMn6.js.gz +0 -0
  35. package/ui-dist/assets/{desktop-capabilities-page-BJNGkq4q.js → desktop-capabilities-page-zLzCSB7A.js} +1 -1
  36. package/ui-dist/assets/desktop-capabilities-page-zLzCSB7A.js.gz +0 -0
  37. package/ui-dist/assets/{desktop-update-config-7tBum3MA.js → desktop-update-config-PmofcFf6.js} +1 -1
  38. package/ui-dist/assets/desktop-update-config-PmofcFf6.js.gz +0 -0
  39. package/ui-dist/assets/{doc-browser-BNiqa-zm.js → doc-browser-BJrre2S_.js} +1 -1
  40. package/ui-dist/assets/doc-browser-BJrre2S_.js.gz +0 -0
  41. package/ui-dist/assets/doc-browser-BPqA-zQx.js +1 -0
  42. package/ui-dist/assets/{doc-browser-context-Dp0dEMyT.js → doc-browser-context-TILuCY5c.js} +1 -1
  43. package/ui-dist/assets/doc-browser-context-TILuCY5c.js.gz +0 -0
  44. package/ui-dist/assets/{extensions-WWEYpaUh.js → extensions-CVUFK6Jj.js} +1 -1
  45. package/ui-dist/assets/extensions-CVUFK6Jj.js.gz +0 -0
  46. package/ui-dist/assets/{i18n-ClHx6jwj.js → i18n-20rSH40D.js} +2 -2
  47. package/ui-dist/assets/i18n-20rSH40D.js.gz +0 -0
  48. package/ui-dist/assets/{i18n-provider-C1NxogO4.js → i18n-provider-BPRq6S7O.js} +1 -1
  49. package/ui-dist/assets/{keyboard-shortcuts-settings-page-CS9BFOBW.js → keyboard-shortcuts-settings-page-CkQbSKwI.js} +1 -1
  50. package/ui-dist/assets/login-page-Dlyvp-81.js +1 -0
  51. package/ui-dist/assets/{login-page-CL0SrBCf.js → login-page-f8qQ4xKY.js} +1 -1
  52. package/ui-dist/assets/login-page-f8qQ4xKY.js.gz +0 -0
  53. package/ui-dist/assets/main-D2dWy8fM.css +1 -0
  54. package/ui-dist/assets/main-D2dWy8fM.css.gz +0 -0
  55. package/ui-dist/assets/main-i18n-catalog.config-DZ-5ollN.js +1 -0
  56. package/ui-dist/assets/main-i18n-catalog.config-DZ-5ollN.js.gz +0 -0
  57. package/ui-dist/assets/{main-CvVBCOlN.js → main-ky5Efhq1.js} +2 -2
  58. package/ui-dist/assets/main-ky5Efhq1.js.gz +0 -0
  59. package/ui-dist/assets/{mcp-marketplace-page-D75hPmzO.js → mcp-marketplace-page-FfIfEo6w.js} +1 -1
  60. package/ui-dist/assets/mcp-marketplace-page-FfIfEo6w.js.gz +0 -0
  61. package/ui-dist/assets/mcp-marketplace-page-sH7VptN_.js +1 -0
  62. package/ui-dist/assets/{model-config-page-DFfcV9lu.js → model-config-page-Bcm6-pCX.js} +1 -1
  63. package/ui-dist/assets/model-config-page-Bcm6-pCX.js.gz +0 -0
  64. package/ui-dist/assets/panel-app-i18n-catalog.config-p3qAY_Eq.js +1 -0
  65. package/ui-dist/assets/{panelStandalone-D2CqTyi_.js → panelStandalone-By-6dDXS.js} +2 -2
  66. package/ui-dist/assets/panelStandalone-By-6dDXS.js.gz +0 -0
  67. package/ui-dist/assets/{privacy-settings-page-CE-xF9bo.js → privacy-settings-page-B1sHLAc1.js} +1 -1
  68. package/ui-dist/assets/privacy-settings-page-B1sHLAc1.js.gz +0 -0
  69. package/ui-dist/assets/{projects-BF0wpY4X.js → projects-O3GTERwP.js} +1 -1
  70. package/ui-dist/assets/projects-O3GTERwP.js.gz +0 -0
  71. package/ui-dist/assets/{provider-scoped-model-input-BvZitHkT.js → provider-scoped-model-input-BQsugx1v.js} +1 -1
  72. package/ui-dist/assets/provider-scoped-model-input-BQsugx1v.js.gz +0 -0
  73. package/ui-dist/assets/{providers-config-page-cDeyluVG.js → providers-config-page-BDEdHJbw.js} +1 -1
  74. package/ui-dist/assets/providers-config-page-BDEdHJbw.js.gz +0 -0
  75. package/ui-dist/assets/{pwa-dXn0s_lD.js → pwa-D_nZUwG0.js} +1 -1
  76. package/ui-dist/assets/pwa-D_nZUwG0.js.gz +0 -0
  77. package/ui-dist/assets/remote-CFWp4wyH.js +1 -0
  78. package/ui-dist/assets/{runtime-config-page-DNo4dzS1.js → runtime-config-page-BHTKwgDi.js} +1 -1
  79. package/ui-dist/assets/runtime-config-page-BHTKwgDi.js.gz +0 -0
  80. package/ui-dist/assets/{search-config-page-CA0HxVy0.js → search-config-page-DWKlMHgH.js} +1 -1
  81. package/ui-dist/assets/search-config-page-DWKlMHgH.js.gz +0 -0
  82. package/ui-dist/assets/{secrets-config-page-iT1wamQp.js → secrets-config-page-DiQL088Y.js} +1 -1
  83. package/ui-dist/assets/secrets-config-page-DiQL088Y.js.gz +0 -0
  84. package/ui-dist/assets/security-config-DmTDKKY4.js +1 -0
  85. package/ui-dist/assets/{service-apps-panel-CU0tFrqT.js → service-apps-panel-CEnyYsQp.js} +1 -1
  86. package/ui-dist/assets/service-apps-panel-CEnyYsQp.js.gz +0 -0
  87. package/ui-dist/assets/{tag-chip-CY0Hqk_l.js → tag-chip-B1AYPOKL.js} +1 -1
  88. package/ui-dist/assets/{theme-provider-BvpXGXWH.js → theme-provider-DzvAi3pe.js} +1 -1
  89. package/ui-dist/assets/theme-provider-DzvAi3pe.js.gz +0 -0
  90. package/ui-dist/assets/{use-config-C8ZkQiTc.js → use-config-BEdbtpD4.js} +1 -1
  91. package/ui-dist/assets/use-config-BEdbtpD4.js.gz +0 -0
  92. package/ui-dist/assets/{use-desktop-capabilities-DR9snbeo.js → use-desktop-capabilities-BkuRd2cY.js} +1 -1
  93. package/ui-dist/assets/use-desktop-capabilities-BkuRd2cY.js.gz +0 -0
  94. package/ui-dist/index.html +18 -18
  95. package/ui-dist/index.html.gz +0 -0
  96. package/ui-dist/panel-standalone.html +5 -5
  97. package/ui-dist/panel-standalone.html.gz +0 -0
  98. package/dist/nextclaw-cli-app-CjtgVEdo.js.map +0 -1
  99. package/ui-dist/assets/account-panel-QhOMbAQP.js.gz +0 -0
  100. package/ui-dist/assets/api-BWFOIoUm.js.gz +0 -0
  101. package/ui-dist/assets/app-data-BnrEdmg2.js.gz +0 -0
  102. package/ui-dist/assets/app-presenter-provider-CDRBc_lQ.js +0 -115
  103. package/ui-dist/assets/app-presenter-provider-CDRBc_lQ.js.gz +0 -0
  104. package/ui-dist/assets/appearance-settings-page-C5z5sOkC.js.gz +0 -0
  105. package/ui-dist/assets/channels-list-page-CzXYZZtK.js.gz +0 -0
  106. package/ui-dist/assets/config-split-page-CxLWGwdt.js.gz +0 -0
  107. package/ui-dist/assets/confirm-dialog-BWS7gA_z.js.gz +0 -0
  108. package/ui-dist/assets/desktop-capabilities-page-BJNGkq4q.js.gz +0 -0
  109. package/ui-dist/assets/desktop-update-config-7tBum3MA.js.gz +0 -0
  110. package/ui-dist/assets/doc-browser-BNiqa-zm.js.gz +0 -0
  111. package/ui-dist/assets/doc-browser-DZDqghNc.js +0 -1
  112. package/ui-dist/assets/doc-browser-context-Dp0dEMyT.js.gz +0 -0
  113. package/ui-dist/assets/extensions-WWEYpaUh.js.gz +0 -0
  114. package/ui-dist/assets/i18n-ClHx6jwj.js.gz +0 -0
  115. package/ui-dist/assets/login-page-CL0SrBCf.js.gz +0 -0
  116. package/ui-dist/assets/login-page-Dq5nPUCU.js +0 -1
  117. package/ui-dist/assets/main-CLwCjK9U.css +0 -1
  118. package/ui-dist/assets/main-CLwCjK9U.css.gz +0 -0
  119. package/ui-dist/assets/main-CvVBCOlN.js.gz +0 -0
  120. package/ui-dist/assets/main-i18n-catalog.config-D4qFo4OB.js +0 -1
  121. package/ui-dist/assets/main-i18n-catalog.config-D4qFo4OB.js.gz +0 -0
  122. package/ui-dist/assets/mcp-marketplace-page-CATnpZ2Q.js +0 -1
  123. package/ui-dist/assets/mcp-marketplace-page-D75hPmzO.js.gz +0 -0
  124. package/ui-dist/assets/model-config-page-DFfcV9lu.js.gz +0 -0
  125. package/ui-dist/assets/panel-app-i18n-catalog.config-oUwmxoE7.js +0 -1
  126. package/ui-dist/assets/panelStandalone-D2CqTyi_.js.gz +0 -0
  127. package/ui-dist/assets/privacy-settings-page-CE-xF9bo.js.gz +0 -0
  128. package/ui-dist/assets/projects-BF0wpY4X.js.gz +0 -0
  129. package/ui-dist/assets/provider-scoped-model-input-BvZitHkT.js.gz +0 -0
  130. package/ui-dist/assets/providers-config-page-cDeyluVG.js.gz +0 -0
  131. package/ui-dist/assets/pwa-dXn0s_lD.js.gz +0 -0
  132. package/ui-dist/assets/remote-CV5wQVVj.js +0 -1
  133. package/ui-dist/assets/runtime-config-page-DNo4dzS1.js.gz +0 -0
  134. package/ui-dist/assets/search-config-page-CA0HxVy0.js.gz +0 -0
  135. package/ui-dist/assets/secrets-config-page-iT1wamQp.js.gz +0 -0
  136. package/ui-dist/assets/security-config-B38PLI3M.js +0 -1
  137. package/ui-dist/assets/service-apps-panel-CU0tFrqT.js.gz +0 -0
  138. package/ui-dist/assets/theme-provider-BvpXGXWH.js.gz +0 -0
  139. package/ui-dist/assets/use-config-C8ZkQiTc.js.gz +0 -0
  140. 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
- Turn your computer into a powerful AI assistant that coordinates agents, skills, CLI tools, automations, and messaging apps.
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
 
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import { n as repairPackagedPortableRunnerPermissions, t as createNextclawDistribution } from "../../distribution-CND3AWXk.js";
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-CjtgVEdo.js");
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-BAU3XUQJ.js")]);
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-CND3AWXk.js";
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-CND3AWXk.js.map
44
+ //# sourceMappingURL=distribution-kH-YiPGh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"distribution-CND3AWXk.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"}
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":"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"}
package/dist/index.d.ts CHANGED
@@ -1 +1,36 @@
1
- export * from "@nextclaw/core";
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
@@ -1,2 +1,3 @@
1
+ import { n as selectFeedback, t as FeedbackMaintenanceClient } from "./feedback-maintenance-client.service-DIMfY_yr.js";
1
2
  export * from "@nextclaw/core";
2
- export {};
3
+ export { FeedbackMaintenanceClient, selectFeedback };