@whyshu/argent-engine 0.7.5 → 0.7.7
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/MANIFEST.json +39 -35
- package/engine/VERSION +1 -1
- package/engine/core/contracts/argent.contracts.json +12 -4
- package/engine/scripts/appointment-create.mjs +37 -2
- package/engine/scripts/appointment-worker.mjs +72 -15
- package/engine/scripts/appointment_grab.py +141 -20
- package/engine/scripts/argent-machine-setup.mjs +118 -0
- package/engine/scripts/argent-runner.mjs +63 -10
- package/engine/scripts/capability-packs.lock.json +54 -51
- package/engine/scripts/ci-run.sh +14 -2
- package/engine/scripts/collect-evidence.mjs +1 -1
- package/engine/scripts/customer-preflight.py +33 -0
- package/engine/scripts/flow-auto-retry.py +3 -0
- package/engine/scripts/flow-requirements.json +23 -13
- package/engine/scripts/flow-session-retention.mjs +88 -0
- package/engine/scripts/flow-trigger-wake.mjs +13 -1
- package/engine/scripts/flow-trigger.sh +2 -1
- package/engine/scripts/flow_config.py +4 -0
- package/engine/scripts/flow_failure.py +9 -4
- package/engine/scripts/flow_preflight.py +30 -0
- package/engine/scripts/flow_retry.py +22 -7
- package/engine/scripts/gen-agent-bundles.mjs +1 -1
- package/engine/scripts/gen-preset-rows.mjs +2 -2
- package/engine/scripts/invoice_lip_runner.py +30 -2
- package/engine/scripts/invoice_stageb.py +101 -0
- package/engine/scripts/login-readiness.py +220 -0
- package/engine/scripts/ml-oauth-setup.mjs +1 -1
- package/engine/scripts/orchestrator.py +416 -30
- package/engine/scripts/probe_ml_site.py +103 -0
- package/engine/scripts/release-argent.sh +26 -2
- package/engine/skills/argent-machine-onboarding/SKILL.md +143 -0
- package/engine/skills/internal.json +4 -0
- package/engine/skills/ml-full-appointment/SKILL.md +32 -13
- package/engine/skills/ml-invoice/SKILL.md +1 -1
- package/engine/skills/ml-invoice-xzh/SKILL.md +2 -2
- package/engine/version.mjs +1 -1
- package/engine/verticals/_engine-words.baseline.txt +42 -23
- package/engine/verticals/mercadolibre/flows.json +9 -5
- package/engine/verticals/mercadolibre/manifest.json +5 -4
- package/engine/verticals/mercadolibre/prompts/daily-report.failure.md +1 -1
- package/engine/verticals/mercadolibre/prompts/daily-report.md +7 -10
- package/package.json +1 -1
- package/engine/scripts/ml-ads.mjs +0 -181
package/MANIFEST.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schema": 1,
|
|
3
3
|
"package": "@whyshu/argent-engine",
|
|
4
4
|
"files": {
|
|
5
|
-
"VERSION": "
|
|
5
|
+
"VERSION": "3946b2809eaf359486b42c6014dfd3994f3a2bbad5849eb6061fdf24e9fb5547",
|
|
6
6
|
"agents/catalog.json": "5356a812f2554dfd3115370363d4c3f787a82c9e5928a85d05b2a07c9e4b324d",
|
|
7
7
|
"configs/_aliases.proposed.json": "3a59edf80563bcc20d410d488decad6fd787bd3de9489321367b0783904cd3e5",
|
|
8
8
|
"configs/_migration-plan.proposed.json": "dd9f90b0b9b2f217dd23367a618402e57997d44f7fddcfa88a7cadf52e056c0d",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"configs/hr.json": "59c0ea732139e7f54f04dce7595825b778b36f450e5ae5049d1326562388f7b8",
|
|
13
13
|
"configs/notify.json": "cb9ef11c1c498fcf99af99ec50271b8a2598061b77ed73a6099032e837474ef0",
|
|
14
14
|
"core/cli/argent.mjs": "9a8977324c238ca4e20435f9817eb7ec76157da32b1d510977dc03e0feb416a9",
|
|
15
|
-
"core/contracts/argent.contracts.json": "
|
|
15
|
+
"core/contracts/argent.contracts.json": "548473012de7b40fc9d4fb9a445c0d757178889d80b63f34e0dc34f553f17e69",
|
|
16
16
|
"core/contracts/verbs.schema.json": "4cc63e9709caf1bb71f3ac0dbfc374a258b24cec00b4294016b75a32a3471e8f",
|
|
17
17
|
"core/lib/argent-datadir.mjs": "7102aedf538c1e935f45475b536b84f878b69ad1f4638a13b4d1a99a19cc175b",
|
|
18
18
|
"core/lib/audit.mjs": "b57c233b1926e4ce4686604bbd2fdda33fdd432083828e589c5652606c63ba75",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"core/mcp/server.mjs": "cb4d4a1150ee96cc950ff598be76b0dc695fdc0c739c9f78a7da9f4293a6369a",
|
|
45
45
|
"scripts/_engine_rules_probe.py": "ad8f45dc0f37852259461a25fb648b11df818089ba40f980dfa72b7e201a03d9",
|
|
46
46
|
"scripts/analyze-full-day.py": "2ee87f3f27929cd9407109121e670b56c296f39b0a3e18b075524b54a7d4471c",
|
|
47
|
-
"scripts/appointment-create.mjs": "
|
|
47
|
+
"scripts/appointment-create.mjs": "d30d815183b8cffe3bf344c52ad875e1ca495b2c550247f00580f9c57646301d",
|
|
48
48
|
"scripts/appointment-stop.mjs": "2e0a965346d33ef8683da5473c48df7f4e66ee8a3167526ee6b568e1adf5c91d",
|
|
49
|
-
"scripts/appointment-worker.mjs": "
|
|
50
|
-
"scripts/appointment_grab.py": "
|
|
49
|
+
"scripts/appointment-worker.mjs": "e79486eab2b902d351a75885258f2a74b871b29c0e83fccedd9eccc6029b2bdd",
|
|
50
|
+
"scripts/appointment_grab.py": "9ca4a7acd1a8376a5611e88e779e985c1d2aeaab012119f10c51522c4f779b9d",
|
|
51
51
|
"scripts/archive/feishu-bridge.js": "e6714c72022892d0c527d1fc9ae0f8ff99f9ab3bd0363329979b423246684885",
|
|
52
52
|
"scripts/argent-agents.mjs": "73f4a058df2cd6d62b285ea48a5e32881db678b63007d1ac2f218005cb28c18d",
|
|
53
53
|
"scripts/argent-capabilities.mjs": "7186d7c19f733d987a7afe2355dd7d788333a15c0f80811c4cde4e7a32584c4e",
|
|
@@ -55,7 +55,8 @@
|
|
|
55
55
|
"scripts/argent-datadir.py": "03704861a0f77d229e179a8b1f685cbe900cc94a48907bb8fc73c798a7aec89d",
|
|
56
56
|
"scripts/argent-doctor.mjs": "3882cd8e0dab49263f48625ab029fd926e3275a13842c8d348c06c71f81f3525",
|
|
57
57
|
"scripts/argent-env-write.mjs": "cb9ad01881f2b9236fff5af9238b1bf7c3db54465558550ac914c856be2ad66d",
|
|
58
|
-
"scripts/argent-
|
|
58
|
+
"scripts/argent-machine-setup.mjs": "9d4507a752cd0893b5cb59f02d93d188275584fc6846c2fa24a93207763e4e07",
|
|
59
|
+
"scripts/argent-runner.mjs": "10ffdf63102c5c309a86cdd7f5f660cb179a6fecf0b695491cae2bb615dfe7d5",
|
|
59
60
|
"scripts/argent-schedule.mjs": "d8235a4961fca28bcff3b5f28f8a9c3323f3e2707b6d017742d123d6c8c940d9",
|
|
60
61
|
"scripts/argent-setup-check.mjs": "44d3558ae6eebd5cc2dd25752019d3386190e63006b544e1ceee3f4f1c526aff",
|
|
61
62
|
"scripts/argent-upgrade.mjs": "ba75148cb3c27b4aab2b184d1320d4b57a203adf8b90214fa3d62880685a0d81",
|
|
@@ -63,7 +64,7 @@
|
|
|
63
64
|
"scripts/base-bootstrap.sh": "d44361618f808533fc11e8acdbccf5dfa53822a745e7c7a84bbd09885f6d6c2e",
|
|
64
65
|
"scripts/billing-mode-daily.sh": "830e2dca9f362d1098239111479794a68d4a34071242daaeb04c36cf858cd175",
|
|
65
66
|
"scripts/build-engine-package.mjs": "d2771385dfebfaaaae9c4dd9cc36a0bf1dd1536d1d95463fea9d5656fb9a1a98",
|
|
66
|
-
"scripts/capability-packs.lock.json": "
|
|
67
|
+
"scripts/capability-packs.lock.json": "a7065c9d5353c8fbae7065eb6c3f9c395c0707bda3d8dcf01d80c810ceb7d18a",
|
|
67
68
|
"scripts/capability_pack.py": "d21bca70deadab6bb818a3f2e12721c7eeb1c690bb382daae752620db8db5cb3",
|
|
68
69
|
"scripts/check-1.0-criteria.mjs": "8fe145a83c4060c51a678eb2586b87a78b66d1456cebc95c52f7789aeb181c66",
|
|
69
70
|
"scripts/check-agent-catalog.mjs": "340be84cfad2f3cd7049545e6c953c9ce54523bdf6ad60dff1ad7925293821bc",
|
|
@@ -85,13 +86,13 @@
|
|
|
85
86
|
"scripts/check-sop-consistency.mjs": "81b85e31b3436895cfdbea54fd06345f8e53354d3b3b6426d337e4268fe47220",
|
|
86
87
|
"scripts/check-test-env-safety.mjs": "7050d08972277a4d8b5c01e2ae16b96c6f45ad289e12d039948e3b6b3a2d95cc",
|
|
87
88
|
"scripts/check-version-consistency.mjs": "621b4f58c0f7e3689fa663173f13830fa82fe5690b63fb64b3891553ae9b22e9",
|
|
88
|
-
"scripts/ci-run.sh": "
|
|
89
|
-
"scripts/collect-evidence.mjs": "
|
|
89
|
+
"scripts/ci-run.sh": "a33ec7075fc9c8cf1afce5411f8723acebab3aaf48add80197b9ec1b19afd954",
|
|
90
|
+
"scripts/collect-evidence.mjs": "92cfcd5a940f77c00bd710884012b79503dd6887d3ed5e0c0dff2d4f90f8c9d7",
|
|
90
91
|
"scripts/config-explain.mjs": "7d17980ab2fb17cad0deacc529650554e09b50d37af0aa43b7b29af3ffa8fffc",
|
|
91
92
|
"scripts/configure-provider.rb": "cc84e2a714885a1f3ccaef9c4042cf72072d49a5b4538f1681fe7df2ab037315",
|
|
92
93
|
"scripts/criteria-table.mjs": "c178e8a9263d3218cacd03aaf16473420ae89fa200f1f4e38c5f4a495dfed137",
|
|
93
94
|
"scripts/customer-config-migrate.mjs": "1f8b3502ef77d5b15348466b7d97ee0c76e7787a532eb8acd7cf8c29e1b268e4",
|
|
94
|
-
"scripts/customer-preflight.py": "
|
|
95
|
+
"scripts/customer-preflight.py": "e2f2448b4284f854df6119d15e5e5bf61eb9e6694199703c80d016b4bfc99ea0",
|
|
95
96
|
"scripts/customer-readiness.sh": "9e24d0041ccc3f82672b038e82452b8453c108a9b9403a6faf25f252cd67de0f",
|
|
96
97
|
"scripts/daily-report-inbox.py": "e4c31328b142088657eed70ba5088db37c79de0a3dd882da8d7bb7503c21cf22",
|
|
97
98
|
"scripts/daily-report-reconcile.mjs": "45645f0a1188f9eacfef5d30c74eccc521af40aa600a657a067bcfa196426143",
|
|
@@ -128,25 +129,26 @@
|
|
|
128
129
|
"scripts/feishu-card.mjs": "1041cc0d32ad49a5d2ef5c5dc5f954f4e6b5d628395768847e9d5ed246706e8f",
|
|
129
130
|
"scripts/final-check.mjs": "45e2004e778c83fe08b35921a555b2ca57ddb375672cc965544ef1bb6ff10aa8",
|
|
130
131
|
"scripts/fix-skill-frontmatter.py": "c77cb8d389bd96bc40655bbdd712435bfb06f74453a2f54dad58013f615ea748",
|
|
131
|
-
"scripts/flow-auto-retry.py": "
|
|
132
|
-
"scripts/flow-requirements.json": "
|
|
132
|
+
"scripts/flow-auto-retry.py": "2474e649e2e7c2803c3140b5c0780648059d3aadae299ea77a706a552b1fab63",
|
|
133
|
+
"scripts/flow-requirements.json": "75b172a2196c9d8bca67d65c9246c2a5bd288f79f05a3fad32109c02171a887c",
|
|
133
134
|
"scripts/flow-scaffold.py": "d886e4e5d5cf0e80991d1d1a40e54a7281d87fec7c781c89101277795e401ae1",
|
|
135
|
+
"scripts/flow-session-retention.mjs": "7a498527082c836a682820dff06d6553504bf70dd28ad39a5c6090fe16c67731",
|
|
134
136
|
"scripts/flow-timers-plist.sh": "a7b1007526fe21923566a002ef4e50fade5cbcdef38799f1a52e50c7b9c21131",
|
|
135
137
|
"scripts/flow-timers.sh": "d8eed8c3391e67e2601cc66ea45f3f7ffa3bbf617d8a2d4a27ad178c6cc738ff",
|
|
136
|
-
"scripts/flow-trigger-wake.mjs": "
|
|
137
|
-
"scripts/flow-trigger.sh": "
|
|
138
|
+
"scripts/flow-trigger-wake.mjs": "2f04aa3406f5d42130027cfef99d4fd2fe7fb3a4a54610f19e723391d4836431",
|
|
139
|
+
"scripts/flow-trigger.sh": "0568cbbbfc7b4c23c4e083cccc3cf387c2a8aa7edd1aec137c731af2c79fcf5f",
|
|
138
140
|
"scripts/flow_billing.py": "70a1129ac75860a120fbf9c961cda9d33c9dfe4ae178a697d6a4ef1479387e3c",
|
|
139
141
|
"scripts/flow_capability_stats.py": "68babceb21ff47eaec6cd5119539dea6726c1e058341ae4a2533f01b13ec3baf",
|
|
140
142
|
"scripts/flow_case.py": "03870f8f4f3161302c7d43777c3c914205e088c6ebe4f9f4664caf9e76ccf266",
|
|
141
143
|
"scripts/flow_claim.py": "5ebe13d0d95f6f282b9ede172fe60948b892c8871f041dc65fa5e3c9cb1b43e0",
|
|
142
|
-
"scripts/flow_config.py": "
|
|
143
|
-
"scripts/flow_failure.py": "
|
|
144
|
+
"scripts/flow_config.py": "52e07d48ef7d949d9438d7e38578b6dea49f45df9845a6173d8de987ecc375f8",
|
|
145
|
+
"scripts/flow_failure.py": "b92be1397a44ab0a8f51522f671f4eb13e9ca638526cd7355fcd04fe41bd3f7e",
|
|
144
146
|
"scripts/flow_learn.py": "b2e3e99ee5d2e758871b0cbaab73257a928b3c854f819c7be49d4c1d92f6bba9",
|
|
145
147
|
"scripts/flow_ledger.py": "c4e3012ad9e573aa3f26374f2dcc7089f03253fb60a564e2700f5268b18f7df5",
|
|
146
148
|
"scripts/flow_policy.py": "acfc348b29b1282b2b09774742cef63302487d20251c2d37ca0489949f7dbcd7",
|
|
147
|
-
"scripts/flow_preflight.py": "
|
|
149
|
+
"scripts/flow_preflight.py": "4afc572456febcd79d3a78d81fe9d35a27f8ca4e11f3f9148a36e409fbe0d39e",
|
|
148
150
|
"scripts/flow_registry.py": "53928b3fb76351561bfbb4cbe2e86de94b0a9f31d3f28ee0673e9f43c2b12d21",
|
|
149
|
-
"scripts/flow_retry.py": "
|
|
151
|
+
"scripts/flow_retry.py": "6516a65a04da7db3b1a55f03afb61129cb4a55c09cbf6806cbd945864fc0e1bc",
|
|
150
152
|
"scripts/flow_return_to_ops.py": "1eb105447aee62066271d715155e99a9d4e5c71123bca57fcd0da2464ea2c895",
|
|
151
153
|
"scripts/flow_source.py": "d4ec5d23e807dfa38868310e7f1aeba494e8c10e49ec5f524a1e5b304898da65",
|
|
152
154
|
"scripts/flow_sources/__init__.py": "854ec0ac85915ef731c747dee8b1094b7032bfc4502c675e014c5d1491abb9f5",
|
|
@@ -158,8 +160,8 @@
|
|
|
158
160
|
"scripts/flow_triage.py": "12e57412e03f2cfdcec14f57f8135f66082b72bc06d8e5e7758b84ec247b3281",
|
|
159
161
|
"scripts/flow_write_verify.py": "a9123838b00cb60b43fbc761f6dae740dfa3692906c2985e9b98a7c4538c2491",
|
|
160
162
|
"scripts/fulfillment.js": "8de1ea386ebfe628caf4eaf2df5f1941938c07d4b8b2dcf79a78d45ac231669f",
|
|
161
|
-
"scripts/gen-agent-bundles.mjs": "
|
|
162
|
-
"scripts/gen-preset-rows.mjs": "
|
|
163
|
+
"scripts/gen-agent-bundles.mjs": "e56f2c503ba6253d07fa44605e1df696ac2900331a503bbb182e16e614975021",
|
|
164
|
+
"scripts/gen-preset-rows.mjs": "86f291eef79174c9946df758e6a4f546b9dd1b8f96e8a8e1fb502a219b5981e1",
|
|
163
165
|
"scripts/handover-sheet.mjs": "4e27095ccdd79586391abf7a7d5eb7aabbc3f0d7d9a1dd5161e9af8e8a9338de",
|
|
164
166
|
"scripts/init-ml.sh": "c5a04fc723a4b254d7d92990ca31adb1100de666821e3a236285aaf3516453f7",
|
|
165
167
|
"scripts/install-license.mjs": "6bac5b31647f1e84300fb54711e6852f978ce056d5b0c9ad706a25003ff2d4f9",
|
|
@@ -170,11 +172,11 @@
|
|
|
170
172
|
"scripts/invoice-table.sh": "a5963137ce711c974b8b6ac17c14ac5d34a8a5e0a6b21b8f85dba8c8df615bad",
|
|
171
173
|
"scripts/invoice_carrier_notice.py": "8b24766ac67934895a214244ad7495388ad508bf5020cd8784cbd68b0cf2fa65",
|
|
172
174
|
"scripts/invoice_fail_closeout.py": "6dbed32a633b9e3ea676792e11e8e1f12d9e51a654d2aeda1e9d4de263ad5a91",
|
|
173
|
-
"scripts/invoice_lip_runner.py": "
|
|
175
|
+
"scripts/invoice_lip_runner.py": "99cb80e61e0ffa1f8a742bb196bb8b493ea25aa6f6cd6b2b03afcb5fc4b74e42",
|
|
174
176
|
"scripts/invoice_lip_runner.py.bak-20260922-1710-freready": "95d95e7d3aa9f46cca93e1a70d86f6ffe8f6bca07a9c1ebba1bbf993abdd09e6",
|
|
175
177
|
"scripts/invoice_ready_audit.py": "f598801d1603d8ea5ca7d433bb4e3eee230eeceb1b99448be6ef75397cb6e8a0",
|
|
176
178
|
"scripts/invoice_runner.py": "6b8744ad50173be9d4c8a8875400399594c7ba43e485cfbccd1c911191d8fdd1",
|
|
177
|
-
"scripts/invoice_stageb.py": "
|
|
179
|
+
"scripts/invoice_stageb.py": "c4192160d3e1fa63641a4d7c4dc755fd32c68f4792dfb0950a9adff86910df2e",
|
|
178
180
|
"scripts/launchd/com.whyshu.argent-bridge.plist.example": "7b19f77545a9e622bddf5ad443a5fd5c7ddf49540ae8a71bd065e18c8a2b5613",
|
|
179
181
|
"scripts/launchd/com.whyshu.fulfillment-poll.plist.example": "01c6c1bbd9ad4ab17fcb3029b7f783691ed8f6536b1c020ec64c3f62812f0b9a",
|
|
180
182
|
"scripts/lease.py": "01356c24658c86e3a19e2e8d46bf29044f75cb3dc39a5a6016ecbf1d44badd77",
|
|
@@ -221,10 +223,10 @@
|
|
|
221
223
|
"scripts/lip_backlog.py": "26aa4e93b2942421fadc6ec6674c5ba84e5af53bb0549d3e346027a20477767b",
|
|
222
224
|
"scripts/lip_table.py": "5d84ecbd170e4dbb5614132ea17999318754bfb9d1d17e9ae73353787436fe30",
|
|
223
225
|
"scripts/local-usage.mjs": "a5148d43b303d7fba960a5448c9537cc80db96da0323708c27f99217510ff74f",
|
|
226
|
+
"scripts/login-readiness.py": "5e920dddc669bb2d93540283c0ead7e8d7f9a260c765600f656d108d1e934875",
|
|
224
227
|
"scripts/migrate-providers.mjs": "1effa539f8d23054f18c0de5219b111a4fe2da55f2ee873ca8dac6d4418578cb",
|
|
225
228
|
"scripts/migrate-skills.sh": "2ff1f12b80135d27d275d9809e8f1721b6f0f725b1a951c62f3d8a03b3bec5fa",
|
|
226
|
-
"scripts/ml-
|
|
227
|
-
"scripts/ml-oauth-setup.mjs": "bbeed80575f075e292953970831e25d634e662ab374cf00e0a8c88ee65acfc13",
|
|
229
|
+
"scripts/ml-oauth-setup.mjs": "5d14a34c38df8dc4bcc1a10ca8582a4c1e2708bcfa7bb93946289294f9315eb0",
|
|
228
230
|
"scripts/ml-store-ids.json": "0c5d8672ff451bc84eb833f644ef67fc46ec45a5e057cb57a6934202add60964",
|
|
229
231
|
"scripts/ml_artifact_attribution.py": "e7aa6c87b24c8532f34151cc95bb7e937fcebebd00ad414c95549e0a0cc6cb22",
|
|
230
232
|
"scripts/ml_capacity_probe.py": "1000b23070ede4a21d918f60023be13a3df934d2c99ef03ee99ece49d0998b35",
|
|
@@ -233,7 +235,7 @@
|
|
|
233
235
|
"scripts/ml_store_ids.py": "133e520e0019fae03a3daa5766352a390cf104ddbaaf228a51264a6a5fdd2493",
|
|
234
236
|
"scripts/npm-publish-argent.mjs": "f3068945bcd6e659414bcd396d08940ed4b80f7ed296dd0cebf9138325526d26",
|
|
235
237
|
"scripts/npm-publish-argent.sh": "9e54b17b011bbaaffdc9dfdded18196d83fc00363c405179e5ec45beb712c555",
|
|
236
|
-
"scripts/orchestrator.py": "
|
|
238
|
+
"scripts/orchestrator.py": "43a27ad6bc8482ced8dcae3080ba9ed7092eeaf4e873ed6ece9e452c7b74a787",
|
|
237
239
|
"scripts/p2-report-run.mjs": "86bd6b3005f1a5fca3f808f4ea77dcce43a11a4a9be7ee814a029daaae201fb5",
|
|
238
240
|
"scripts/pack-plugins.mjs": "b1b42fb30ebd27f320af72bc28b5b8e2b76e54031b4ac1ba5c3909374990b38b",
|
|
239
241
|
"scripts/patches/dsh-session--append-message-shape.patch": "e4cd6447d4fdd03ff5fa94fd5ff62234168740b901804f687d91006fdedf66a1",
|
|
@@ -251,13 +253,14 @@
|
|
|
251
253
|
"scripts/poc-mcp-host.mjs": "5c4befdc95f98bf9c84f94bb525b245248c751e08e3fc09bb987781e9e4859cb",
|
|
252
254
|
"scripts/poll-fulfillment.sh": "3e9fabd1818e0dc69b0af9f05d8e97333c63c42f81adceba178f2e4abedee1da",
|
|
253
255
|
"scripts/poll-invoice.sh": "0946842aaf1b1944d4a6dc46d133390b110c61d99b023eae3f7b3e75985993fd",
|
|
256
|
+
"scripts/probe_ml_site.py": "1a55cf5818bf83f32632a7ee8f6e5201306504b9e962aca69b0bd86b513b2323",
|
|
254
257
|
"scripts/profile-doctor.mjs": "f3ffaede099a5867bf92f7a1ba3435e597fa8ceaa97167671f14f853ad91afbc",
|
|
255
258
|
"scripts/provider-select.sh": "329067c03cd30ba5f05a72e0319087f4e803dd18d9acf2dc790a5ab7410c209b",
|
|
256
259
|
"scripts/provider-switch.sh": "42b369100d8a190741efab34c68e4d8488ce70f142251d994b4a8db560905a0a",
|
|
257
260
|
"scripts/provider-sync-target.check.mjs": "f4a1fcb2724724f895053d2401b6f3701a76594f8dbec3f3045db66901f3f135",
|
|
258
261
|
"scripts/python-runtime.sh": "7831db3ec43e8f9a5cdf519aa50960918c2f7126992494626b7886e219db4967",
|
|
259
262
|
"scripts/query_runner.py": "9dca3900c30a2404d2942af5627743d1322da25cf31bf3918e72af1024270687",
|
|
260
|
-
"scripts/release-argent.sh": "
|
|
263
|
+
"scripts/release-argent.sh": "f6cec78ce4c5c4ecd18dc66771148a3780c90ac427c9fac3742e84cabf3a2b3c",
|
|
261
264
|
"scripts/repair-unresolved-tools.mjs": "bcdeb4a1fe9544a304248880804e29a0dccf251d93eeea1a7608e2aa4e03f10a",
|
|
262
265
|
"scripts/retire-inventory.mjs": "c9dda33d9ac741a45459bbf8088e3a50f8eb2bed83cc819ef850e780d7bf8c09",
|
|
263
266
|
"scripts/run-tests.sh": "4297f8d5309a6c2ee15e9db1a894c43051c1a5bbe0e1a9fcfef36f2773ff2bcd",
|
|
@@ -304,7 +307,8 @@
|
|
|
304
307
|
"scripts/ziniao-windows.sh": "6bbc218e216ec23b7ecc90f318f09535a76bb4c330475168da5d2512da8bd5ad",
|
|
305
308
|
"skills/README.md": "b57949eb59cad23026d6f2ce848eaf79bb3dcb78f7b522566bd45df7adcf7b4f",
|
|
306
309
|
"skills/argent-dev/SKILL.md": "0d1a7757d87299909b0a9dc8ff6ccd91a535b2db6b14faf18683df7b880d2e2c",
|
|
307
|
-
"skills/
|
|
310
|
+
"skills/argent-machine-onboarding/SKILL.md": "6c82fc4b1dd3608115feecd75181a8e8cb36a1180b48e440823a9f50102c94dd",
|
|
311
|
+
"skills/internal.json": "0bedfd7c9ffca8b2f91928197a65fbbb8e20e991900992492ee84c49f50ee816",
|
|
308
312
|
"skills/lktop-pm/SKILL.md": "4f9e2315359ec5d7bca27fea500522ef4513b7c2d540cc405b202b7e49bc68d3",
|
|
309
313
|
"skills/lktopapp-dev/SKILL.md": "48c07d7cacfbda2887fe05b95ca4ecf68b14c5433bfee74de3fa0a2932b06ed3",
|
|
310
314
|
"skills/ml-config-guide/SKILL.md": "25fe4acf8fe0b54ed142579c51f28fd1509e8174a0896a281e4008325c18dfd0",
|
|
@@ -318,10 +322,10 @@
|
|
|
318
322
|
"skills/ml-fulfillment-sop/scripts/fulfillment.js": "8de1ea386ebfe628caf4eaf2df5f1941938c07d4b8b2dcf79a78d45ac231669f",
|
|
319
323
|
"skills/ml-fulfillment-sop/scripts/poll-and-execute.sh": "ab52c3e643dc434e1c72e716f60514fab91b7b48a2b3e4d611e818720b31831a",
|
|
320
324
|
"skills/ml-fulfillment-sop/templates/report.md": "928298680c9336659905bdf12f0518a781c9f4b9045db26077ea1cd8d3f087b9",
|
|
321
|
-
"skills/ml-full-appointment/SKILL.md": "
|
|
322
|
-
"skills/ml-invoice-xzh/SKILL.md": "
|
|
325
|
+
"skills/ml-full-appointment/SKILL.md": "850d2347c1b9ec2d47e263f05f21cf887382f99ab76f795a453e0aced620c406",
|
|
326
|
+
"skills/ml-invoice-xzh/SKILL.md": "0978f3b29bf14e8ccc095dd0a42dfa00f3594aaf60f41861f8b9786139753579",
|
|
323
327
|
"skills/ml-invoice-xzh/references/pitfalls.md": "e77e5ac70ddc018ad484ee6a03ec32aa38290d76920a13c27bb42a4f78f415e5",
|
|
324
|
-
"skills/ml-invoice/SKILL.md": "
|
|
328
|
+
"skills/ml-invoice/SKILL.md": "1c58a499da5b06b68729cde3bbd6f836a21b77b63d02767d2a9ca5f39a031aee",
|
|
325
329
|
"skills/ml-invoice/references/pitfalls.md": "b1f64593ee3bb2adae6ebc1e758a6faf6332189cb3be93792e61261ee4515a25",
|
|
326
330
|
"skills/ml-invoice/references/portal-flow.md": "f2e12383f813acba387fe3ec94bb640c5e43aaa75f44556fdf755d27442dac9e",
|
|
327
331
|
"skills/ml-invoice/references/template-fill-contract.md": "aad3633c9035fe89146746e9f6920f7392ae642eebe02ad97df75dbd5addf603",
|
|
@@ -333,16 +337,16 @@
|
|
|
333
337
|
"skills/whyshu-pm/SKILL.md": "04294e57508e32bd5f8dcad8b4c0da3052c1ad567434273c5d975d882096c50b",
|
|
334
338
|
"skills/whyshu-web-dev/SKILL.md": "f07d4365be9c723ccf08373860c5d66b2e30acdcffbe725ae569e9a208e9bb1e",
|
|
335
339
|
"verticals/README.md": "5618cb80cd8db5cda216ebbed913e03bf640b8460650fb2f99e86c58c773604e",
|
|
336
|
-
"verticals/_engine-words.baseline.txt": "
|
|
340
|
+
"verticals/_engine-words.baseline.txt": "9260be008c01c444f600c0b4ec4a5bfeb5ad8176626bfce559d17a6ae689f574",
|
|
337
341
|
"verticals/_engine-words.json": "656f2b306a83d65da58f0fe28cd4032e55fffc1cf93398aa36c126aa5686f06b",
|
|
338
342
|
"verticals/mercadolibre/README.md": "b25b243ee925cb1ce8331ce550d3b41a706e0b62d42343025160ad5d68a80d24",
|
|
339
343
|
"verticals/mercadolibre/config.json": "85e592d700383b9b191ed6a809dc47fffba8e6850842c3699058a679ef6546a7",
|
|
340
|
-
"verticals/mercadolibre/flows.json": "
|
|
341
|
-
"verticals/mercadolibre/manifest.json": "
|
|
344
|
+
"verticals/mercadolibre/flows.json": "b944d846b37565e37286dbb65241195534b51394e499d6f15fee0c3fb031f407",
|
|
345
|
+
"verticals/mercadolibre/manifest.json": "50908dce13f67aa06ab249ddeca925bb07932def3fbf0694eb8ace5954835d3c",
|
|
342
346
|
"verticals/mercadolibre/migrate-machine-state.mjs": "a5a55f3c6b5057365621b4d976f5f16792532bd392d9379bf06b596a3e178f77",
|
|
343
347
|
"verticals/mercadolibre/preflight.py": "24a490c19bad174f3eddb86d651ff767e55979270b780b6e43b8f0f8cb01acc2",
|
|
344
|
-
"verticals/mercadolibre/prompts/daily-report.failure.md": "
|
|
345
|
-
"verticals/mercadolibre/prompts/daily-report.md": "
|
|
348
|
+
"verticals/mercadolibre/prompts/daily-report.failure.md": "528b322931ed459516e6909c5eeff1dbbc89f3a38bd5ec68628ada85160cf0a8",
|
|
349
|
+
"verticals/mercadolibre/prompts/daily-report.md": "3b5ebc7fdf081bdea4b0e0d88dcd7dffdf29656b41973fb548dee9e3e05e9048",
|
|
346
350
|
"verticals/mercadolibre/prompts/daily-report.scheduled.md": "f35feafc34f8983c008d6dafb833cc417a0cc9449856cf53d62d6726522d1d58",
|
|
347
351
|
"verticals/mercadolibre/prompts/full.failure.md": "92059ed67f6ffd09e640bb5c371140179fc3dc9f3f2755e1d70470d37dc933ee",
|
|
348
352
|
"verticals/mercadolibre/prompts/full.md": "b7c5e96f7fe2c3be7849b4baef5fc4ba6ccbf051f7375687f18096377b0f011b",
|
package/engine/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.7.
|
|
1
|
+
0.7.7
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"argentVersion": "0.7.
|
|
2
|
+
"argentVersion": "0.7.7",
|
|
3
|
+
"_syncNote": "argentVersion 必须与仓库根 VERSION 同批更新:发布前置校验 scripts/release-argent.sh(1a2)+ CI 判据 `contracts`/`version-consistency`;2026-10-21 已按当前 VERSION 校正(修复前曾停在旧版本)。",
|
|
3
4
|
"principle": "宿主无关:宿主只依赖 `argent <verb>`;确定性逻辑在 CLI/MCP,不在提示词里。",
|
|
4
5
|
"verbs": {
|
|
5
6
|
"version": {
|
|
@@ -639,6 +640,10 @@
|
|
|
639
640
|
"at": "scripts/wenyao-invoice-writeback.mjs:201",
|
|
640
641
|
"anchor": "const AUDIT = join("
|
|
641
642
|
},
|
|
643
|
+
{
|
|
644
|
+
"at": "scripts/flow-session-retention.mjs:30",
|
|
645
|
+
"anchor": "const AUDIT = join("
|
|
646
|
+
},
|
|
642
647
|
{
|
|
643
648
|
"at": "scripts/wenyao-invoice-writeback.mjs:251",
|
|
644
649
|
"anchor": "function backup(recordId, fieldIds, tag)"
|
|
@@ -676,7 +681,7 @@
|
|
|
676
681
|
"anchor": "if (o['dry-run'])"
|
|
677
682
|
},
|
|
678
683
|
{
|
|
679
|
-
"at": "scripts/daily-report.mjs:
|
|
684
|
+
"at": "scripts/daily-report.mjs:884",
|
|
680
685
|
"anchor": "const markerFile = "
|
|
681
686
|
},
|
|
682
687
|
{
|
|
@@ -1045,13 +1050,16 @@
|
|
|
1045
1050
|
],
|
|
1046
1051
|
"mcpShadow": {
|
|
1047
1052
|
"purpose": "写类能力的入场券:先在隔离沙箱跑真实 CLI 路径,真台账零改动,逐字段比对一致后才允许真写",
|
|
1053
|
+
"toolSurface": "以 core/mcp/server.mjs 的 annotations 为准(2026-10-21 实测 14 tools:9 read-only / 5 写类);本块只登记写类语义与影子门禁,⛔ 不另存工具清单。",
|
|
1048
1054
|
"writtenTools": [
|
|
1049
|
-
"argent_claim_shadow",
|
|
1055
|
+
"argent_claim_shadow(影子写:隔离沙箱跑真实 CLI 路径,真台账零改动)",
|
|
1056
|
+
"argent_writeback_shadow(影子回写:同上)",
|
|
1057
|
+
"argent_shadow_compare(比对器:同输入两次独立影子跑 → 逐字段 diff 判据;不写真台账)",
|
|
1050
1058
|
"argent_claim(门禁=影子 verified;confirm=true 才真写)",
|
|
1051
1059
|
"argent_writeback(默认 dry-run;守卫在脚本内)"
|
|
1052
1060
|
],
|
|
1053
1061
|
"pendingRealWrites": [
|
|
1054
|
-
"report(待接入 flow_failure.py
|
|
1062
|
+
"report(待接入 flow_failure.py;当前 argent_report 仍只读)"
|
|
1055
1063
|
],
|
|
1056
1064
|
"isolation": "ARGENT_DATA_DIR → mkdtemp 沙箱(台账/案件/开关都在沙箱内)",
|
|
1057
1065
|
"proof": "realUnchanged=true(真台账事件数前后一致)",
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import fs from 'node:fs';
|
|
9
9
|
import os from 'node:os';
|
|
10
|
+
import path from 'node:path';
|
|
10
11
|
|
|
11
12
|
function arg(name, fallback = '') {
|
|
12
13
|
const i = process.argv.indexOf(name);
|
|
@@ -15,9 +16,43 @@ function arg(name, fallback = '') {
|
|
|
15
16
|
const raw = arg('--json');
|
|
16
17
|
if (!raw) { console.error('用法:--json <任务 JSON>'); process.exit(2); }
|
|
17
18
|
const task = JSON.parse(raw);
|
|
18
|
-
const
|
|
19
|
+
const DRY = process.argv.includes('--dry-run');
|
|
20
|
+
const pollArg = arg('--poll-interval') || (task.pollIntervalSec ?? '');
|
|
21
|
+
const pollIntervalSec = Number(pollArg);
|
|
22
|
+
if (!Number.isFinite(pollIntervalSec) || pollIntervalSec < 30 || pollIntervalSec > 600) {
|
|
23
|
+
console.error(JSON.stringify({ ok: false, error: { code: 'poll_interval_confirmation_required',
|
|
24
|
+
message: '创建前请先确认检测间隔:默认 30 秒;如需 45 秒请传 --poll-interval 45(允许 30-600)。' } }));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
task.pollIntervalSec = pollIntervalSec;
|
|
28
|
+
|
|
29
|
+
/** 读取本角色已确认的通知群;首次使用未确认时返回空,CLI 拒绝建任务。 */
|
|
30
|
+
function roleChatId(role) {
|
|
31
|
+
const candidates = [
|
|
32
|
+
process.env.ARGENT_GATEWAY_JSON,
|
|
33
|
+
process.env.DSH_HOME ? path.join(process.env.DSH_HOME, 'argent', 'gateway.json') : '',
|
|
34
|
+
path.join(os.homedir(), '.dsh', 'argent', 'gateway.json'),
|
|
35
|
+
path.join(os.homedir(), '.dsh-argent', 'argent', 'gateway.json'),
|
|
36
|
+
].filter(Boolean);
|
|
37
|
+
for (const f of candidates) {
|
|
38
|
+
try {
|
|
39
|
+
const d = JSON.parse(fs.readFileSync(f, 'utf8'));
|
|
40
|
+
const row = (d.roles || []).find((r) => r.role === role);
|
|
41
|
+
if (row) return String(row.chatId || '');
|
|
42
|
+
} catch { /* try next */ }
|
|
43
|
+
}
|
|
44
|
+
return '';
|
|
45
|
+
}
|
|
46
|
+
const role = arg('--role', 'ml-fulfillment');
|
|
47
|
+
const chatId = arg('--chat-id') || task.chatId || roleChatId(role);
|
|
48
|
+
const openId = arg('--open-id') || task.requesterOpenId || '';
|
|
49
|
+
if (!chatId && !openId) {
|
|
50
|
+
console.error(JSON.stringify({ ok: false, error: { code: 'missing_notify_group', message: '未配置抢预约通知群:请先在本群发送「设为通知群」,或在命令里传 --chat-id/--open-id' } }));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
19
53
|
if (chatId) task.chatId = chatId;
|
|
20
54
|
if (openId) task.requesterOpenId = openId;
|
|
55
|
+
if (DRY) { console.log(JSON.stringify({ ok: true, dryRun: true, chatId: Boolean(chatId), openId: Boolean(openId), pollIntervalSec, task })); process.exit(0); }
|
|
21
56
|
const secretPath = process.env.APPOINTMENT_BRIDGE_SECRET_FILE || `${os.homedir()}/.dsh/argent/appointment-bridge.secret`;
|
|
22
57
|
const secret = process.env.APPOINTMENT_BRIDGE_SECRET || fs.readFileSync(secretPath, 'utf8').trim();
|
|
23
58
|
const base = (process.env.ARGENT_API_BASE || 'https://whyshu.com/api/argent/v1').replace(/\/+$/, '');
|
|
@@ -31,4 +66,4 @@ const res = await fetch(`${base}/tenants/${appId}/appointments/bridge`, {
|
|
|
31
66
|
const json = await res.json().catch(() => ({}));
|
|
32
67
|
if (!res.ok) { console.error(JSON.stringify(json.error || { code: 'http_error', message: `HTTP ${res.status}` })); process.exit(1); }
|
|
33
68
|
const id = json.data?.task?._id || '';
|
|
34
|
-
console.log(JSON.stringify({ ok: true, id, status: json.data?.task?.status || '' }));
|
|
69
|
+
console.log(JSON.stringify({ ok: true, id, status: json.data?.task?.status || '', pollIntervalSec }));
|
|
@@ -18,6 +18,7 @@ const CFG_PATH = process.env.ARGENT_RUNNER_CONFIG || `${process.env.DSH_HOME ||
|
|
|
18
18
|
const PY = process.env.ARGENT_PY || `${os.homedir()}/.dsh/argent/venv/bin/python3`;
|
|
19
19
|
const GRAB = process.env.ARGENT_APPOINTMENT_GRAB || `${os.homedir()}/.argent-dsh/scripts/appointment_grab.py`;
|
|
20
20
|
const WORKER_ID = process.env.ARGENT_APPOINTMENT_WORKER_ID || `appointment-${os.hostname()}-${process.pid}`;
|
|
21
|
+
const MAX_CONCURRENCY = Math.min(5, Math.max(1, Number(process.env.ARGENT_APPOINTMENT_CONCURRENCY || 2) || 2));
|
|
21
22
|
|
|
22
23
|
const cfg = JSON.parse(fs.readFileSync(CFG_PATH, 'utf8'));
|
|
23
24
|
const base = `${String(cfg.serverUrl).replace(/\/+$/, '')}/api/argent/v1/tenants/${encodeURIComponent(cfg.tenantAppId)}`;
|
|
@@ -34,7 +35,7 @@ async function api(path, { method = 'GET', body } = {}) {
|
|
|
34
35
|
return json.data;
|
|
35
36
|
}
|
|
36
37
|
|
|
37
|
-
function runGrab(task) {
|
|
38
|
+
function runGrab(task, onEvent = null) {
|
|
38
39
|
return new Promise((resolve) => {
|
|
39
40
|
const args = [GRAB,
|
|
40
41
|
'--task-json', JSON.stringify(task),
|
|
@@ -44,8 +45,17 @@ function runGrab(task) {
|
|
|
44
45
|
cwd: `${os.homedir()}/.argent-dsh`, env: { ...process.env, ARGENT_DATA_DIR: `${os.homedir()}/.dsh/argent`, PATH: `${os.homedir()}/.local/node/bin:${os.homedir()}/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin` },
|
|
45
46
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
46
47
|
});
|
|
47
|
-
let stdout = ''; let stderr = '';
|
|
48
|
-
child.stdout.on('data', (d) => {
|
|
48
|
+
let stdout = ''; let stderr = ''; let lineBuf = '';
|
|
49
|
+
child.stdout.on('data', (d) => {
|
|
50
|
+
const text = String(d); stdout += text; console.log(text.trimEnd());
|
|
51
|
+
lineBuf += text;
|
|
52
|
+
let i;
|
|
53
|
+
while ((i = lineBuf.indexOf('\n')) >= 0) {
|
|
54
|
+
const line = lineBuf.slice(0, i).trim(); lineBuf = lineBuf.slice(i + 1);
|
|
55
|
+
if (!line) continue;
|
|
56
|
+
try { const evt = JSON.parse(line); if (evt && evt.event && onEvent) onEvent(evt); } catch { /* not json event */ }
|
|
57
|
+
}
|
|
58
|
+
});
|
|
49
59
|
child.stderr.on('data', (d) => { stderr += d; console.error(String(d).trimEnd()); });
|
|
50
60
|
const heartbeat = setInterval(async () => {
|
|
51
61
|
try {
|
|
@@ -61,15 +71,31 @@ function runGrab(task) {
|
|
|
61
71
|
});
|
|
62
72
|
}
|
|
63
73
|
|
|
64
|
-
async function
|
|
74
|
+
async function claimTask() {
|
|
65
75
|
const d = await api('/appointments/claim', { method: 'POST', body: { workerId: WORKER_ID } });
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
76
|
+
return d?.task || null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function runTask(task) {
|
|
80
|
+
console.log(JSON.stringify({ event: 'claimed', id: task._id, store: task.store, sku: task.sku, shipmentNo: task.shipmentNo, from: task.dateFrom, to: task.dateTo, concurrency: MAX_CONCURRENCY }));
|
|
81
|
+
// 串行发送:首张卡必须先完成(服务端回填 cardMessageId),后续 progress 才更新同一张卡。
|
|
82
|
+
// 旧实现 fire-and-forget,首批并发 progress 会在 cardMessageId 落库前各自发卡 ⇒ 重复“进行中”卡片。
|
|
83
|
+
let progressChain = Promise.resolve();
|
|
84
|
+
const sendProgress = (cycle, dateStates = {}, phase = 'running', checks = 0) => {
|
|
85
|
+
const next = progressChain.then(() => api(`/appointments/${encodeURIComponent(task._id)}/progress`, {
|
|
86
|
+
method: 'POST', body: { workerId: WORKER_ID, cycle, checks, dateStates, phase },
|
|
87
|
+
}).catch((e) => console.error(JSON.stringify({ event: 'progress.error', id: task._id, message: e.message }))));
|
|
88
|
+
progressChain = next.catch(() => {});
|
|
89
|
+
return next;
|
|
90
|
+
};
|
|
91
|
+
// 首轮前先发进行中卡片(第 0 轮),await 确保 cardMessageId 已回填,再启动浏览器子进程
|
|
92
|
+
await sendProgress(0, {}, 'starting');
|
|
93
|
+
const r = await runGrab(task, (evt) => {
|
|
94
|
+
if (evt.event === 'cycle' || evt.event === 'progress') {
|
|
95
|
+
sendProgress(evt.cycle || 0, evt.dateStates || {}, 'cycle', evt.checks || 0);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
71
98
|
let result = {};
|
|
72
|
-
if (!result.status && (r.signal === 'SIGTERM' || r.code === 143)) result = { status: 'stopped', summary: '用户停止' };
|
|
73
99
|
for (const line of String(r.stdout || '').trim().split('\n').reverse()) {
|
|
74
100
|
try { const j = JSON.parse(line); if (j && (j.status || j.outcome)) { result = j; break; } } catch { /* not json */ }
|
|
75
101
|
}
|
|
@@ -80,17 +106,48 @@ async function runOnce() {
|
|
|
80
106
|
body: { workerId: WORKER_ID, outcome, summary: result.summary || r.stderr.slice(-800) || r.stdout.slice(-800), resultDate: result.date || '', resultSlot: result.slot || '', dateStates: result.dateStates || {} },
|
|
81
107
|
});
|
|
82
108
|
console.log(JSON.stringify({ event: 'completed', id: task._id, outcome, date: result.date || '', slot: result.slot || '' }));
|
|
109
|
+
return outcome;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function runOnce() {
|
|
113
|
+
const task = await claimTask();
|
|
114
|
+
if (!task) return false;
|
|
115
|
+
await runTask(task);
|
|
83
116
|
return true;
|
|
84
117
|
}
|
|
85
118
|
|
|
119
|
+
async function runConcurrent() {
|
|
120
|
+
const active = new Map();
|
|
121
|
+
process.on('SIGTERM', () => {
|
|
122
|
+
for (const h of active.values()) { try { h.child?.kill('SIGTERM'); } catch { /* ignore */ } }
|
|
123
|
+
process.exit(0);
|
|
124
|
+
});
|
|
125
|
+
for (;;) {
|
|
126
|
+
while (active.size < MAX_CONCURRENCY) {
|
|
127
|
+
let task;
|
|
128
|
+
try { task = await claimTask(); } catch (e) { console.error(JSON.stringify({ event: 'worker.error', message: e.message })); break; }
|
|
129
|
+
if (!task) break;
|
|
130
|
+
const id = String(task._id);
|
|
131
|
+
const p = runTask(task)
|
|
132
|
+
.catch((e) => console.error(JSON.stringify({ event: 'task.error', id, message: e.message })))
|
|
133
|
+
.finally(() => active.delete(id));
|
|
134
|
+
active.set(id, p);
|
|
135
|
+
}
|
|
136
|
+
if (!active.size) { await sleep(5000); continue; }
|
|
137
|
+
await Promise.race([...active.values(), sleep(5000)]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
86
142
|
async function main() {
|
|
87
143
|
if (HEALTH) {
|
|
88
144
|
try { await api('/appointments?limit=1'); console.log(JSON.stringify({ ok: true, workerId: WORKER_ID })); process.exit(0); } catch (e) { console.error(e.message); process.exit(1); }
|
|
89
145
|
}
|
|
90
|
-
console.log(JSON.stringify({ event: 'worker.start', workerId: WORKER_ID, cfg: CFG_PATH, grab: GRAB }));
|
|
91
|
-
|
|
92
|
-
try { await runOnce(); } catch (e) { console.error(JSON.stringify({ event: 'worker.error', message: e.message }));
|
|
93
|
-
|
|
94
|
-
}
|
|
146
|
+
console.log(JSON.stringify({ event: 'worker.start', workerId: WORKER_ID, cfg: CFG_PATH, grab: GRAB, concurrency: MAX_CONCURRENCY }));
|
|
147
|
+
if (ONCE) {
|
|
148
|
+
try { await runOnce(); } catch (e) { console.error(JSON.stringify({ event: 'worker.error', message: e.message })); }
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
await runConcurrent();
|
|
95
152
|
}
|
|
96
153
|
main().catch((e) => { console.error(e); process.exit(1); });
|