@clawos-dev/clawd 0.2.531 → 0.2.533
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/app-builder-plugin/mcp-server.cjs +52 -53
- package/dist/cli.cjs +115 -63
- package/package.json +1 -1
|
@@ -24625,6 +24625,39 @@ var SCAN_FILE = import_node_path3.default.join(".clawd", "deploy-scan.json");
|
|
|
24625
24625
|
// src/deploy/templates.ts
|
|
24626
24626
|
var CLAWOS_REPO = "ottin4ttc/clawos";
|
|
24627
24627
|
var CLAWOS_REF = "release";
|
|
24628
|
+
var PLAN_STEP = [
|
|
24629
|
+
" - name: \u8BFB\u90E8\u7F72\u6587\u4EF6",
|
|
24630
|
+
" id: plan",
|
|
24631
|
+
" run: |",
|
|
24632
|
+
" node clawos/cloud-host/pipeline/deploy-file.mjs \\",
|
|
24633
|
+
" --persona-dir persona \\",
|
|
24634
|
+
" --repo-name '${{ github.event.repository.name }}' \\",
|
|
24635
|
+
" --sha '${{ github.sha }}' \\",
|
|
24636
|
+
' --image-repo "$VPC_REGISTRY/$IMAGE_NAME" \\',
|
|
24637
|
+
' --assets clawos/cloud-host/provision/manifests/assets.json >> "$GITHUB_OUTPUT"',
|
|
24638
|
+
""
|
|
24639
|
+
];
|
|
24640
|
+
var CONTRACT_STEPS = [
|
|
24641
|
+
" - name: Checkout persona\uFF08\u53EA\u8981 .clawd/ \u91CC\u7684\u90E8\u7F72\u6587\u4EF6\u4E0E persona.json\uFF09",
|
|
24642
|
+
" uses: actions/checkout@v4",
|
|
24643
|
+
" with:",
|
|
24644
|
+
" path: persona",
|
|
24645
|
+
" sparse-checkout: .clawd",
|
|
24646
|
+
"",
|
|
24647
|
+
" - name: Checkout clawos\uFF08\u6D41\u6C34\u7EBF\u811A\u672C + \u5B83\u5F15\u7684 k8s \u540D\u5B57\u6E05\u6D17 / \u8D44\u4EA7\u6E05\u5355\uFF09",
|
|
24648
|
+
" uses: actions/checkout@v4",
|
|
24649
|
+
" with:",
|
|
24650
|
+
" repository: ${{ env.CLAWOS_REPO }}",
|
|
24651
|
+
" ref: ${{ env.CLAWOS_REF }}",
|
|
24652
|
+
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
24653
|
+
" path: clawos",
|
|
24654
|
+
" sparse-checkout: |",
|
|
24655
|
+
" cloud-host/pipeline",
|
|
24656
|
+
" cloud-host/k8s",
|
|
24657
|
+
" cloud-host/provision/manifests",
|
|
24658
|
+
"",
|
|
24659
|
+
...PLAN_STEP
|
|
24660
|
+
];
|
|
24628
24661
|
var L = [
|
|
24629
24662
|
"name: clawd deploy",
|
|
24630
24663
|
"",
|
|
@@ -24662,19 +24695,7 @@ var L = [
|
|
|
24662
24695
|
" name: build",
|
|
24663
24696
|
" runs-on: ubuntu-latest",
|
|
24664
24697
|
" timeout-minutes: 30",
|
|
24665
|
-
|
|
24666
|
-
" tag: ${{ steps.plan.outputs.tag }}",
|
|
24667
|
-
" image: ${{ steps.plan.outputs.image }}",
|
|
24668
|
-
" persona_id: ${{ steps.plan.outputs.persona_id }}",
|
|
24669
|
-
" env_names: ${{ steps.plan.outputs.env_names }}",
|
|
24670
|
-
// 云上跑哪个模型 = 发布这一刻 persona 配的(build 段从仓库里的 .clawd/persona.json 读)。
|
|
24671
|
-
// smoke 与 deploy 都要:smoke 得用正式那份模型探活,否则验的不是将要上线的东西。
|
|
24672
|
-
" model: ${{ steps.plan.outputs.model }}",
|
|
24673
|
-
" effort: ${{ steps.plan.outputs.effort }}",
|
|
24674
|
-
// 装了哪些连接器(JSON 数组)。gateway 按它决定要不要为任务签工牌、把授权链接拼进 prompt
|
|
24675
|
-
//(design 2026-09-09-cloud-connector-credentials)。名字形状在 deploy-file.mjs 卡死成 [a-z0-9-],
|
|
24676
|
-
// 所以下面单引号包住直接拼进命令行是安全的。
|
|
24677
|
-
" connectors: ${{ steps.plan.outputs.connectors }}",
|
|
24698
|
+
// 没有 outputs:——smoke / deploy 段自己读契约(文件头)。build 段整仓 checkout:构建器要拷整个 persona 目录。
|
|
24678
24699
|
" steps:",
|
|
24679
24700
|
" - name: Checkout persona",
|
|
24680
24701
|
" uses: actions/checkout@v4",
|
|
@@ -24689,16 +24710,7 @@ var L = [
|
|
|
24689
24710
|
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
24690
24711
|
" path: clawos",
|
|
24691
24712
|
"",
|
|
24692
|
-
|
|
24693
|
-
" id: plan",
|
|
24694
|
-
" run: |",
|
|
24695
|
-
" node clawos/cloud-host/pipeline/deploy-file.mjs \\",
|
|
24696
|
-
" --persona-dir persona \\",
|
|
24697
|
-
" --repo-name '${{ github.event.repository.name }}' \\",
|
|
24698
|
-
" --sha '${{ github.sha }}' \\",
|
|
24699
|
-
' --image-repo "$VPC_REGISTRY/$IMAGE_NAME" \\',
|
|
24700
|
-
' --assets clawos/cloud-host/provision/manifests/assets.json >> "$GITHUB_OUTPUT"',
|
|
24701
|
-
"",
|
|
24713
|
+
...PLAN_STEP,
|
|
24702
24714
|
" - name: \u51ED\u636E\u9F50\u4E0D\u9F50\uFF08\u7F3A\u54EA\u51E0\u4E2A\u540D\u5B57\u4E00\u6B21\u5217\u5168\uFF09",
|
|
24703
24715
|
" env:",
|
|
24704
24716
|
" CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
|
|
@@ -24776,30 +24788,25 @@ var L = [
|
|
|
24776
24788
|
" runs-on: ubuntu-latest",
|
|
24777
24789
|
" timeout-minutes: 20",
|
|
24778
24790
|
" steps:",
|
|
24779
|
-
|
|
24780
|
-
" uses: actions/checkout@v4",
|
|
24781
|
-
" with:",
|
|
24782
|
-
" repository: ${{ env.CLAWOS_REPO }}",
|
|
24783
|
-
" ref: ${{ env.CLAWOS_REF }}",
|
|
24784
|
-
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
24785
|
-
" path: clawos",
|
|
24786
|
-
" sparse-checkout: cloud-host/pipeline",
|
|
24787
|
-
"",
|
|
24791
|
+
...CONTRACT_STEPS,
|
|
24788
24792
|
" - name: \u4E34\u65F6\u767B\u8BB0 \u2192 \u8D77\u4E00\u6B21 Pod \u2192 \u64A4\u9500",
|
|
24789
24793
|
" # \u767B\u8BB0\u6B63\u5F0F\u53EA\u662F\u5F80 gateway \u5199\u4E00\u884C\uFF0Cgateway \u4E0D\u78B0\u955C\u50CF\uFF1B\u96C6\u7FA4\u62C9\u955C\u50CF\u53D1\u751F\u5728\u7B2C\u4E00\u4E2A\u4EFB\u52A1\u5230\u6765\u65F6\u3002",
|
|
24790
24794
|
" # \u6CA1\u6709\u8FD9\u4E00\u6B65\uFF0C\u6D41\u6C34\u7EBF\u7EFF\u4E86\u53EA\u4EE3\u8868\u300C\u767B\u8BB0\u4E86\u300D\u3002",
|
|
24795
|
+
// 模型 / 档位 / 连接器 smoke 也要:试跑那次要跟正式那次拿到同一份,否则验的不是将要上线的东西。
|
|
24796
|
+
// 名字形状 deploy-file.mjs 已卡死(persona_id [a-z0-9-]、model / effort [A-Za-z0-9._-]、connectors 无单引号
|
|
24797
|
+
// 无换行),所以单引号包住直接拼进命令行是安全的。
|
|
24791
24798
|
" env:",
|
|
24792
24799
|
" CLAWD_GATEWAY_URL: ${{ vars.CLAWD_GATEWAY_URL }}",
|
|
24793
24800
|
" CLAWD_GATEWAY_ADMIN_KEY: ${{ secrets.CLAWD_GATEWAY_ADMIN_KEY }}",
|
|
24794
24801
|
" CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
|
|
24795
|
-
" CLAWD_ENV_NAMES: ${{
|
|
24802
|
+
" CLAWD_ENV_NAMES: ${{ steps.plan.outputs.env_names }}",
|
|
24796
24803
|
" run: |",
|
|
24797
24804
|
" node clawos/cloud-host/pipeline/smoke.mjs \\",
|
|
24798
|
-
" --image '${{
|
|
24799
|
-
" --persona-id '${{
|
|
24800
|
-
" --model '${{
|
|
24801
|
-
" --effort '${{
|
|
24802
|
-
" --connectors '${{
|
|
24805
|
+
" --image '${{ steps.plan.outputs.image }}' \\",
|
|
24806
|
+
" --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
|
|
24807
|
+
" --model '${{ steps.plan.outputs.model }}' \\",
|
|
24808
|
+
" --effort '${{ steps.plan.outputs.effort }}' \\",
|
|
24809
|
+
" --connectors '${{ steps.plan.outputs.connectors }}' \\",
|
|
24803
24810
|
" --run-number '${{ github.run_number }}'",
|
|
24804
24811
|
"",
|
|
24805
24812
|
" deploy:",
|
|
@@ -24809,28 +24816,20 @@ var L = [
|
|
|
24809
24816
|
" # \u4ED3\u5E93\u914D\u4E86 production \u73AF\u5883\u7684\u300C\u987B\u5BA1\u6838\u4EBA\u6279\u51C6\u300D\uFF0Cjob \u5C31\u505C\u5728\u8FD9\u91CC\u7B49\u4EBA\u70B9\uFF1B\u6CA1\u914D\u5C31\u76F4\u63A5\u8FC7\u3002",
|
|
24810
24817
|
" environment: production",
|
|
24811
24818
|
" steps:",
|
|
24812
|
-
|
|
24813
|
-
" uses: actions/checkout@v4",
|
|
24814
|
-
" with:",
|
|
24815
|
-
" repository: ${{ env.CLAWOS_REPO }}",
|
|
24816
|
-
" ref: ${{ env.CLAWOS_REF }}",
|
|
24817
|
-
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
24818
|
-
" path: clawos",
|
|
24819
|
-
" sparse-checkout: cloud-host/pipeline",
|
|
24820
|
-
"",
|
|
24819
|
+
...CONTRACT_STEPS,
|
|
24821
24820
|
" - name: \u767B\u8BB0\u6B63\u5F0F",
|
|
24822
24821
|
" env:",
|
|
24823
24822
|
" CLAWD_GATEWAY_URL: ${{ vars.CLAWD_GATEWAY_URL }}",
|
|
24824
24823
|
" CLAWD_GATEWAY_ADMIN_KEY: ${{ secrets.CLAWD_GATEWAY_ADMIN_KEY }}",
|
|
24825
24824
|
" CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
|
|
24826
|
-
" CLAWD_ENV_NAMES: ${{
|
|
24825
|
+
" CLAWD_ENV_NAMES: ${{ steps.plan.outputs.env_names }}",
|
|
24827
24826
|
" run: |",
|
|
24828
24827
|
" node clawos/cloud-host/pipeline/register.mjs \\",
|
|
24829
|
-
" --image '${{
|
|
24830
|
-
" --persona-id '${{
|
|
24831
|
-
" --model '${{
|
|
24832
|
-
" --effort '${{
|
|
24833
|
-
" --connectors '${{
|
|
24828
|
+
" --image '${{ steps.plan.outputs.image }}' \\",
|
|
24829
|
+
" --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
|
|
24830
|
+
" --model '${{ steps.plan.outputs.model }}' \\",
|
|
24831
|
+
" --effort '${{ steps.plan.outputs.effort }}' \\",
|
|
24832
|
+
" --connectors '${{ steps.plan.outputs.connectors }}'",
|
|
24834
24833
|
""
|
|
24835
24834
|
];
|
|
24836
24835
|
var WORKFLOW_TEMPLATE = L.join("\n");
|
package/dist/cli.cjs
CHANGED
|
@@ -59043,6 +59043,39 @@ function mergeGitignore(existing) {
|
|
|
59043
59043
|
return `${base}${missing.join("\n")}
|
|
59044
59044
|
`;
|
|
59045
59045
|
}
|
|
59046
|
+
var PLAN_STEP = [
|
|
59047
|
+
" - name: \u8BFB\u90E8\u7F72\u6587\u4EF6",
|
|
59048
|
+
" id: plan",
|
|
59049
|
+
" run: |",
|
|
59050
|
+
" node clawos/cloud-host/pipeline/deploy-file.mjs \\",
|
|
59051
|
+
" --persona-dir persona \\",
|
|
59052
|
+
" --repo-name '${{ github.event.repository.name }}' \\",
|
|
59053
|
+
" --sha '${{ github.sha }}' \\",
|
|
59054
|
+
' --image-repo "$VPC_REGISTRY/$IMAGE_NAME" \\',
|
|
59055
|
+
' --assets clawos/cloud-host/provision/manifests/assets.json >> "$GITHUB_OUTPUT"',
|
|
59056
|
+
""
|
|
59057
|
+
];
|
|
59058
|
+
var CONTRACT_STEPS = [
|
|
59059
|
+
" - name: Checkout persona\uFF08\u53EA\u8981 .clawd/ \u91CC\u7684\u90E8\u7F72\u6587\u4EF6\u4E0E persona.json\uFF09",
|
|
59060
|
+
" uses: actions/checkout@v4",
|
|
59061
|
+
" with:",
|
|
59062
|
+
" path: persona",
|
|
59063
|
+
" sparse-checkout: .clawd",
|
|
59064
|
+
"",
|
|
59065
|
+
" - name: Checkout clawos\uFF08\u6D41\u6C34\u7EBF\u811A\u672C + \u5B83\u5F15\u7684 k8s \u540D\u5B57\u6E05\u6D17 / \u8D44\u4EA7\u6E05\u5355\uFF09",
|
|
59066
|
+
" uses: actions/checkout@v4",
|
|
59067
|
+
" with:",
|
|
59068
|
+
" repository: ${{ env.CLAWOS_REPO }}",
|
|
59069
|
+
" ref: ${{ env.CLAWOS_REF }}",
|
|
59070
|
+
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
59071
|
+
" path: clawos",
|
|
59072
|
+
" sparse-checkout: |",
|
|
59073
|
+
" cloud-host/pipeline",
|
|
59074
|
+
" cloud-host/k8s",
|
|
59075
|
+
" cloud-host/provision/manifests",
|
|
59076
|
+
"",
|
|
59077
|
+
...PLAN_STEP
|
|
59078
|
+
];
|
|
59046
59079
|
var L2 = [
|
|
59047
59080
|
"name: clawd deploy",
|
|
59048
59081
|
"",
|
|
@@ -59080,19 +59113,7 @@ var L2 = [
|
|
|
59080
59113
|
" name: build",
|
|
59081
59114
|
" runs-on: ubuntu-latest",
|
|
59082
59115
|
" timeout-minutes: 30",
|
|
59083
|
-
|
|
59084
|
-
" tag: ${{ steps.plan.outputs.tag }}",
|
|
59085
|
-
" image: ${{ steps.plan.outputs.image }}",
|
|
59086
|
-
" persona_id: ${{ steps.plan.outputs.persona_id }}",
|
|
59087
|
-
" env_names: ${{ steps.plan.outputs.env_names }}",
|
|
59088
|
-
// 云上跑哪个模型 = 发布这一刻 persona 配的(build 段从仓库里的 .clawd/persona.json 读)。
|
|
59089
|
-
// smoke 与 deploy 都要:smoke 得用正式那份模型探活,否则验的不是将要上线的东西。
|
|
59090
|
-
" model: ${{ steps.plan.outputs.model }}",
|
|
59091
|
-
" effort: ${{ steps.plan.outputs.effort }}",
|
|
59092
|
-
// 装了哪些连接器(JSON 数组)。gateway 按它决定要不要为任务签工牌、把授权链接拼进 prompt
|
|
59093
|
-
//(design 2026-09-09-cloud-connector-credentials)。名字形状在 deploy-file.mjs 卡死成 [a-z0-9-],
|
|
59094
|
-
// 所以下面单引号包住直接拼进命令行是安全的。
|
|
59095
|
-
" connectors: ${{ steps.plan.outputs.connectors }}",
|
|
59116
|
+
// 没有 outputs:——smoke / deploy 段自己读契约(文件头)。build 段整仓 checkout:构建器要拷整个 persona 目录。
|
|
59096
59117
|
" steps:",
|
|
59097
59118
|
" - name: Checkout persona",
|
|
59098
59119
|
" uses: actions/checkout@v4",
|
|
@@ -59107,16 +59128,7 @@ var L2 = [
|
|
|
59107
59128
|
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
59108
59129
|
" path: clawos",
|
|
59109
59130
|
"",
|
|
59110
|
-
|
|
59111
|
-
" id: plan",
|
|
59112
|
-
" run: |",
|
|
59113
|
-
" node clawos/cloud-host/pipeline/deploy-file.mjs \\",
|
|
59114
|
-
" --persona-dir persona \\",
|
|
59115
|
-
" --repo-name '${{ github.event.repository.name }}' \\",
|
|
59116
|
-
" --sha '${{ github.sha }}' \\",
|
|
59117
|
-
' --image-repo "$VPC_REGISTRY/$IMAGE_NAME" \\',
|
|
59118
|
-
' --assets clawos/cloud-host/provision/manifests/assets.json >> "$GITHUB_OUTPUT"',
|
|
59119
|
-
"",
|
|
59131
|
+
...PLAN_STEP,
|
|
59120
59132
|
" - name: \u51ED\u636E\u9F50\u4E0D\u9F50\uFF08\u7F3A\u54EA\u51E0\u4E2A\u540D\u5B57\u4E00\u6B21\u5217\u5168\uFF09",
|
|
59121
59133
|
" env:",
|
|
59122
59134
|
" CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
|
|
@@ -59194,30 +59206,25 @@ var L2 = [
|
|
|
59194
59206
|
" runs-on: ubuntu-latest",
|
|
59195
59207
|
" timeout-minutes: 20",
|
|
59196
59208
|
" steps:",
|
|
59197
|
-
|
|
59198
|
-
" uses: actions/checkout@v4",
|
|
59199
|
-
" with:",
|
|
59200
|
-
" repository: ${{ env.CLAWOS_REPO }}",
|
|
59201
|
-
" ref: ${{ env.CLAWOS_REF }}",
|
|
59202
|
-
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
59203
|
-
" path: clawos",
|
|
59204
|
-
" sparse-checkout: cloud-host/pipeline",
|
|
59205
|
-
"",
|
|
59209
|
+
...CONTRACT_STEPS,
|
|
59206
59210
|
" - name: \u4E34\u65F6\u767B\u8BB0 \u2192 \u8D77\u4E00\u6B21 Pod \u2192 \u64A4\u9500",
|
|
59207
59211
|
" # \u767B\u8BB0\u6B63\u5F0F\u53EA\u662F\u5F80 gateway \u5199\u4E00\u884C\uFF0Cgateway \u4E0D\u78B0\u955C\u50CF\uFF1B\u96C6\u7FA4\u62C9\u955C\u50CF\u53D1\u751F\u5728\u7B2C\u4E00\u4E2A\u4EFB\u52A1\u5230\u6765\u65F6\u3002",
|
|
59208
59212
|
" # \u6CA1\u6709\u8FD9\u4E00\u6B65\uFF0C\u6D41\u6C34\u7EBF\u7EFF\u4E86\u53EA\u4EE3\u8868\u300C\u767B\u8BB0\u4E86\u300D\u3002",
|
|
59213
|
+
// 模型 / 档位 / 连接器 smoke 也要:试跑那次要跟正式那次拿到同一份,否则验的不是将要上线的东西。
|
|
59214
|
+
// 名字形状 deploy-file.mjs 已卡死(persona_id [a-z0-9-]、model / effort [A-Za-z0-9._-]、connectors 无单引号
|
|
59215
|
+
// 无换行),所以单引号包住直接拼进命令行是安全的。
|
|
59209
59216
|
" env:",
|
|
59210
59217
|
" CLAWD_GATEWAY_URL: ${{ vars.CLAWD_GATEWAY_URL }}",
|
|
59211
59218
|
" CLAWD_GATEWAY_ADMIN_KEY: ${{ secrets.CLAWD_GATEWAY_ADMIN_KEY }}",
|
|
59212
59219
|
" CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
|
|
59213
|
-
" CLAWD_ENV_NAMES: ${{
|
|
59220
|
+
" CLAWD_ENV_NAMES: ${{ steps.plan.outputs.env_names }}",
|
|
59214
59221
|
" run: |",
|
|
59215
59222
|
" node clawos/cloud-host/pipeline/smoke.mjs \\",
|
|
59216
|
-
" --image '${{
|
|
59217
|
-
" --persona-id '${{
|
|
59218
|
-
" --model '${{
|
|
59219
|
-
" --effort '${{
|
|
59220
|
-
" --connectors '${{
|
|
59223
|
+
" --image '${{ steps.plan.outputs.image }}' \\",
|
|
59224
|
+
" --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
|
|
59225
|
+
" --model '${{ steps.plan.outputs.model }}' \\",
|
|
59226
|
+
" --effort '${{ steps.plan.outputs.effort }}' \\",
|
|
59227
|
+
" --connectors '${{ steps.plan.outputs.connectors }}' \\",
|
|
59221
59228
|
" --run-number '${{ github.run_number }}'",
|
|
59222
59229
|
"",
|
|
59223
59230
|
" deploy:",
|
|
@@ -59227,28 +59234,20 @@ var L2 = [
|
|
|
59227
59234
|
" # \u4ED3\u5E93\u914D\u4E86 production \u73AF\u5883\u7684\u300C\u987B\u5BA1\u6838\u4EBA\u6279\u51C6\u300D\uFF0Cjob \u5C31\u505C\u5728\u8FD9\u91CC\u7B49\u4EBA\u70B9\uFF1B\u6CA1\u914D\u5C31\u76F4\u63A5\u8FC7\u3002",
|
|
59228
59235
|
" environment: production",
|
|
59229
59236
|
" steps:",
|
|
59230
|
-
|
|
59231
|
-
" uses: actions/checkout@v4",
|
|
59232
|
-
" with:",
|
|
59233
|
-
" repository: ${{ env.CLAWOS_REPO }}",
|
|
59234
|
-
" ref: ${{ env.CLAWOS_REF }}",
|
|
59235
|
-
" token: ${{ secrets.CLAWOS_READ_TOKEN }}",
|
|
59236
|
-
" path: clawos",
|
|
59237
|
-
" sparse-checkout: cloud-host/pipeline",
|
|
59238
|
-
"",
|
|
59237
|
+
...CONTRACT_STEPS,
|
|
59239
59238
|
" - name: \u767B\u8BB0\u6B63\u5F0F",
|
|
59240
59239
|
" env:",
|
|
59241
59240
|
" CLAWD_GATEWAY_URL: ${{ vars.CLAWD_GATEWAY_URL }}",
|
|
59242
59241
|
" CLAWD_GATEWAY_ADMIN_KEY: ${{ secrets.CLAWD_GATEWAY_ADMIN_KEY }}",
|
|
59243
59242
|
" CLAWD_SECRETS_JSON: ${{ toJSON(secrets) }}",
|
|
59244
|
-
" CLAWD_ENV_NAMES: ${{
|
|
59243
|
+
" CLAWD_ENV_NAMES: ${{ steps.plan.outputs.env_names }}",
|
|
59245
59244
|
" run: |",
|
|
59246
59245
|
" node clawos/cloud-host/pipeline/register.mjs \\",
|
|
59247
|
-
" --image '${{
|
|
59248
|
-
" --persona-id '${{
|
|
59249
|
-
" --model '${{
|
|
59250
|
-
" --effort '${{
|
|
59251
|
-
" --connectors '${{
|
|
59246
|
+
" --image '${{ steps.plan.outputs.image }}' \\",
|
|
59247
|
+
" --persona-id '${{ steps.plan.outputs.persona_id }}' \\",
|
|
59248
|
+
" --model '${{ steps.plan.outputs.model }}' \\",
|
|
59249
|
+
" --effort '${{ steps.plan.outputs.effort }}' \\",
|
|
59250
|
+
" --connectors '${{ steps.plan.outputs.connectors }}'",
|
|
59252
59251
|
""
|
|
59253
59252
|
];
|
|
59254
59253
|
var WORKFLOW_TEMPLATE = L2.join("\n");
|
|
@@ -67443,7 +67442,8 @@ function loadOrCreateAuthFile(opts) {
|
|
|
67443
67442
|
token: existing.token,
|
|
67444
67443
|
ownerPrincipalId: existing.ownerPrincipalId,
|
|
67445
67444
|
deviceId: existing.deviceId,
|
|
67446
|
-
createdAt: existing.createdAt ?? (/* @__PURE__ */ new Date(0)).toISOString()
|
|
67445
|
+
createdAt: existing.createdAt ?? (/* @__PURE__ */ new Date(0)).toISOString(),
|
|
67446
|
+
...existing.tunnelDeviceKey ? { tunnelDeviceKey: existing.tunnelDeviceKey } : {}
|
|
67447
67447
|
};
|
|
67448
67448
|
}
|
|
67449
67449
|
const token = existing?.token || generate();
|
|
@@ -67451,9 +67451,17 @@ function loadOrCreateAuthFile(opts) {
|
|
|
67451
67451
|
const deviceId = ownerPrincipalId;
|
|
67452
67452
|
const createdAt = existing?.createdAt || now().toISOString();
|
|
67453
67453
|
const next = { token, ownerPrincipalId, deviceId, createdAt };
|
|
67454
|
+
if (existing?.tunnelDeviceKey) next.tunnelDeviceKey = existing.tunnelDeviceKey;
|
|
67454
67455
|
writeAuthFile(file, next);
|
|
67455
67456
|
return next;
|
|
67456
67457
|
}
|
|
67458
|
+
function loadOrCreateTunnelDeviceKey(opts) {
|
|
67459
|
+
const current = loadOrCreateAuthFile(opts);
|
|
67460
|
+
if (current.tunnelDeviceKey) return current.tunnelDeviceKey;
|
|
67461
|
+
const tunnelDeviceKey = opts.derive();
|
|
67462
|
+
writeAuthFile(authFilePath(opts.dataDir), { ...current, tunnelDeviceKey });
|
|
67463
|
+
return tunnelDeviceKey;
|
|
67464
|
+
}
|
|
67457
67465
|
function defaultGenerateToken() {
|
|
67458
67466
|
return import_node_crypto15.default.randomBytes(32).toString("base64url");
|
|
67459
67467
|
}
|
|
@@ -67472,6 +67480,7 @@ function readAuthFile(file) {
|
|
|
67472
67480
|
ownerPrincipalId: typeof parsed.ownerPrincipalId === "string" && parsed.ownerPrincipalId.length > 0 ? parsed.ownerPrincipalId : void 0,
|
|
67473
67481
|
deviceId: typeof parsed.deviceId === "string" && parsed.deviceId.length > 0 ? parsed.deviceId : void 0,
|
|
67474
67482
|
createdAt: typeof parsed.createdAt === "string" ? parsed.createdAt : void 0,
|
|
67483
|
+
tunnelDeviceKey: typeof parsed.tunnelDeviceKey === "string" && parsed.tunnelDeviceKey.length > 0 ? parsed.tunnelDeviceKey : void 0,
|
|
67475
67484
|
// 单 secret 合并前的旧字段:出现即触发清理写回(值无所谓,硬切不再使用)
|
|
67476
67485
|
hasLegacySecrets: "signSecret" in parsed || "visitorTokenSecret" in parsed
|
|
67477
67486
|
};
|
|
@@ -67806,22 +67815,51 @@ var lastPeers = [];
|
|
|
67806
67815
|
function getCachedOrgPeers() {
|
|
67807
67816
|
return lastPeers;
|
|
67808
67817
|
}
|
|
67818
|
+
function sameOrigin(a2, b3) {
|
|
67819
|
+
const oa2 = toOrigin(a2);
|
|
67820
|
+
const ob = toOrigin(b3);
|
|
67821
|
+
return oa2 != null && ob != null ? oa2 === ob : a2 === b3;
|
|
67822
|
+
}
|
|
67823
|
+
function toOrigin(raw) {
|
|
67824
|
+
const http2 = raw.replace(/^wss:\/\//i, "https://").replace(/^ws:\/\//i, "http://");
|
|
67825
|
+
try {
|
|
67826
|
+
const origin = new URL(http2).origin;
|
|
67827
|
+
return origin === "null" ? null : origin;
|
|
67828
|
+
} catch {
|
|
67829
|
+
return null;
|
|
67830
|
+
}
|
|
67831
|
+
}
|
|
67809
67832
|
async function syncOrgMesh(deps) {
|
|
67810
67833
|
const peers = await deps.fetchPeers();
|
|
67811
67834
|
lastPeers = peers;
|
|
67812
67835
|
if (peers.length === 0) {
|
|
67813
67836
|
deps.log("org-mesh: \u4E0D\u5728\u4EFB\u4F55\u7EC4\u7EC7\uFF08\u6216\u7EC4\u91CC\u53EA\u6709\u81EA\u5DF1\uFF09\uFF0C\u8DF3\u8FC7");
|
|
67814
67837
|
deps.onProgress?.({ total: 0, done: 0, connected: 0, failed: 0, active: false });
|
|
67815
|
-
return { peers: 0, attempted: 0, connected: 0, failed: 0 };
|
|
67838
|
+
return { peers: 0, attempted: 0, connected: 0, failed: 0, refreshed: 0 };
|
|
67816
67839
|
}
|
|
67817
67840
|
const targets = [];
|
|
67841
|
+
let refreshed = 0;
|
|
67818
67842
|
for (const p3 of peers) {
|
|
67819
67843
|
for (const d2 of p3.devices) {
|
|
67820
|
-
|
|
67821
|
-
|
|
67844
|
+
const existing = deps.store.get(d2.deviceId);
|
|
67845
|
+
if (!existing) {
|
|
67846
|
+
targets.push({ deviceId: d2.deviceId, displayName: p3.displayName });
|
|
67847
|
+
continue;
|
|
67848
|
+
}
|
|
67849
|
+
if (d2.url == null || sameOrigin(existing.remoteUrl, d2.url)) continue;
|
|
67850
|
+
const updated = { ...existing, remoteUrl: d2.url };
|
|
67851
|
+
deps.store.upsert(updated);
|
|
67852
|
+
refreshed += 1;
|
|
67853
|
+
deps.log("org-mesh: \u8054\u7CFB\u4EBA\u5730\u5740\u5DF2\u5237\u65B0", {
|
|
67854
|
+
deviceId: d2.deviceId,
|
|
67855
|
+
name: p3.displayName,
|
|
67856
|
+
from: existing.remoteUrl,
|
|
67857
|
+
to: d2.url
|
|
67858
|
+
});
|
|
67859
|
+
deps.onContactUpdated?.(updated);
|
|
67822
67860
|
}
|
|
67823
67861
|
}
|
|
67824
|
-
deps.log("org-mesh: \u5F00\u59CB\u540C\u6B65", { peers: peers.length, targets: targets.length });
|
|
67862
|
+
deps.log("org-mesh: \u5F00\u59CB\u540C\u6B65", { peers: peers.length, targets: targets.length, refreshed });
|
|
67825
67863
|
let connected = 0;
|
|
67826
67864
|
let failed = 0;
|
|
67827
67865
|
deps.onProgress?.({
|
|
@@ -67852,8 +67890,14 @@ async function syncOrgMesh(deps) {
|
|
|
67852
67890
|
active: connected + failed < targets.length
|
|
67853
67891
|
});
|
|
67854
67892
|
}
|
|
67855
|
-
deps.log("org-mesh: \u540C\u6B65\u5B8C\u6210", {
|
|
67856
|
-
|
|
67893
|
+
deps.log("org-mesh: \u540C\u6B65\u5B8C\u6210", {
|
|
67894
|
+
peers: peers.length,
|
|
67895
|
+
attempted: targets.length,
|
|
67896
|
+
connected,
|
|
67897
|
+
failed,
|
|
67898
|
+
refreshed
|
|
67899
|
+
});
|
|
67900
|
+
return { peers: peers.length, attempted: targets.length, connected, failed, refreshed };
|
|
67857
67901
|
}
|
|
67858
67902
|
|
|
67859
67903
|
// src/handlers/device.ts
|
|
@@ -70370,7 +70414,7 @@ function computeMethodAccess(args) {
|
|
|
70370
70414
|
}
|
|
70371
70415
|
|
|
70372
70416
|
// src/version.ts
|
|
70373
|
-
var version = "0.2.
|
|
70417
|
+
var version = "0.2.533".length > 0 ? "0.2.533" : "dev";
|
|
70374
70418
|
|
|
70375
70419
|
// src/cli-probe/probe.ts
|
|
70376
70420
|
var fs77 = __toESM(require("fs"), 1);
|
|
@@ -73728,7 +73772,10 @@ async function startDaemon(config) {
|
|
|
73728
73772
|
connectToDevice: createConnectToDevice(feishuDeviceDeps),
|
|
73729
73773
|
log: (msg, meta) => logger.info(msg, meta),
|
|
73730
73774
|
// 进度上报:串行建联 20+ 台要几十秒,UI 靠这个帧渲染进度条
|
|
73731
|
-
onProgress: (progress) => wsServer?.broadcastToOwners({ type: "org-mesh:progress", ...progress })
|
|
73775
|
+
onProgress: (progress) => wsServer?.broadcastToOwners({ type: "org-mesh:progress", ...progress }),
|
|
73776
|
+
// 已有联系人的地址被中心最新 url 刷新 → 复用 contact:added(UI reducer 按 deviceId upsert,
|
|
73777
|
+
// auto-reverse 重握手也发这一帧),不新增帧
|
|
73778
|
+
onContactUpdated: (contact) => wsServer?.broadcastToOwners({ type: "contact:added", contact })
|
|
73732
73779
|
});
|
|
73733
73780
|
} catch (err) {
|
|
73734
73781
|
logger.warn("org-mesh sync failed (best-effort)", { err: err.message });
|
|
@@ -74479,7 +74526,12 @@ async function startDaemon(config) {
|
|
|
74479
74526
|
tunnelMgr = new TunnelManager({
|
|
74480
74527
|
dataDir: config.dataDir,
|
|
74481
74528
|
clawosApi: config.clawosApi,
|
|
74482
|
-
|
|
74529
|
+
// 子域指纹落盘于 auth.json,首次缺失才由 hostname+uid 算初值——改电脑名不再换对外地址
|
|
74530
|
+
// (design 2026-09-16-tunnel-address-stability §3.1)
|
|
74531
|
+
deviceKey: loadOrCreateTunnelDeviceKey({
|
|
74532
|
+
dataDir: config.dataDir,
|
|
74533
|
+
derive: () => deriveStableDeviceKey({ dataDir: config.dataDir })
|
|
74534
|
+
}),
|
|
74483
74535
|
frpcBinaryOverride: config.frpcBinary,
|
|
74484
74536
|
noPersist: config.noTunnelPersist,
|
|
74485
74537
|
logger,
|