@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.
Files changed (43) hide show
  1. package/MANIFEST.json +39 -35
  2. package/engine/VERSION +1 -1
  3. package/engine/core/contracts/argent.contracts.json +12 -4
  4. package/engine/scripts/appointment-create.mjs +37 -2
  5. package/engine/scripts/appointment-worker.mjs +72 -15
  6. package/engine/scripts/appointment_grab.py +141 -20
  7. package/engine/scripts/argent-machine-setup.mjs +118 -0
  8. package/engine/scripts/argent-runner.mjs +63 -10
  9. package/engine/scripts/capability-packs.lock.json +54 -51
  10. package/engine/scripts/ci-run.sh +14 -2
  11. package/engine/scripts/collect-evidence.mjs +1 -1
  12. package/engine/scripts/customer-preflight.py +33 -0
  13. package/engine/scripts/flow-auto-retry.py +3 -0
  14. package/engine/scripts/flow-requirements.json +23 -13
  15. package/engine/scripts/flow-session-retention.mjs +88 -0
  16. package/engine/scripts/flow-trigger-wake.mjs +13 -1
  17. package/engine/scripts/flow-trigger.sh +2 -1
  18. package/engine/scripts/flow_config.py +4 -0
  19. package/engine/scripts/flow_failure.py +9 -4
  20. package/engine/scripts/flow_preflight.py +30 -0
  21. package/engine/scripts/flow_retry.py +22 -7
  22. package/engine/scripts/gen-agent-bundles.mjs +1 -1
  23. package/engine/scripts/gen-preset-rows.mjs +2 -2
  24. package/engine/scripts/invoice_lip_runner.py +30 -2
  25. package/engine/scripts/invoice_stageb.py +101 -0
  26. package/engine/scripts/login-readiness.py +220 -0
  27. package/engine/scripts/ml-oauth-setup.mjs +1 -1
  28. package/engine/scripts/orchestrator.py +416 -30
  29. package/engine/scripts/probe_ml_site.py +103 -0
  30. package/engine/scripts/release-argent.sh +26 -2
  31. package/engine/skills/argent-machine-onboarding/SKILL.md +143 -0
  32. package/engine/skills/internal.json +4 -0
  33. package/engine/skills/ml-full-appointment/SKILL.md +32 -13
  34. package/engine/skills/ml-invoice/SKILL.md +1 -1
  35. package/engine/skills/ml-invoice-xzh/SKILL.md +2 -2
  36. package/engine/version.mjs +1 -1
  37. package/engine/verticals/_engine-words.baseline.txt +42 -23
  38. package/engine/verticals/mercadolibre/flows.json +9 -5
  39. package/engine/verticals/mercadolibre/manifest.json +5 -4
  40. package/engine/verticals/mercadolibre/prompts/daily-report.failure.md +1 -1
  41. package/engine/verticals/mercadolibre/prompts/daily-report.md +7 -10
  42. package/package.json +1 -1
  43. 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": "966f2f8695b5c07de3f37c682b1409da1ac84b5c7ce04a27068bb4c017ac0cb8",
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": "ad0ebbcbfa06ab0da15043b0e5d86f676478bdbee6064cf437a3d08def9f3483",
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": "f8e0e0aae2aa60c554e4f4f857fae4f5db597ea22b002ce5b3195b6207b70aee",
47
+ "scripts/appointment-create.mjs": "d30d815183b8cffe3bf344c52ad875e1ca495b2c550247f00580f9c57646301d",
48
48
  "scripts/appointment-stop.mjs": "2e0a965346d33ef8683da5473c48df7f4e66ee8a3167526ee6b568e1adf5c91d",
49
- "scripts/appointment-worker.mjs": "2b5b6951233704bae46d55898cabc42d004424e66515f15930e34a377462a31e",
50
- "scripts/appointment_grab.py": "e043898e247e759b24e5b34003dee1d9ceb0807a634aef2f16c744e93375bdc1",
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-runner.mjs": "534ebb3b76731e76cffa3cd0ef56cf60e34e4113f923dce3ddc97400eb38f92d",
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": "2b83264992d6395e532fa7e70c07775fae5a9e71daf286cc1efc1dc51b033eae",
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": "e6c6cf2b7b8e8f0f80da1afd1341a218338e85c26a7b8fea7c95b04ce90ebf82",
89
- "scripts/collect-evidence.mjs": "5cb43aa19ce773d5029edc9947996fc9aa32fd023050e7720f8992268e9482a2",
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": "7af125636bec369ada3ed4a3387eab99adf4b97924c527588656a245d22a76a6",
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": "bf4cc963c9f766bd9011f4a252eb7a411b1b1a53cdd0e25c09c6dad95e1d44fa",
132
- "scripts/flow-requirements.json": "5265a51982407bbd4a6c7a6803dd725ecffb6ed5735833664b7610200e0a92d8",
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": "0bfd3204f62d7dd9b3f4f2fa69e0d1b9410e86f17948c06273dc488e64170c8f",
137
- "scripts/flow-trigger.sh": "23d8a37e1577eb01b5b35d3201a9199389c026bac267669ea33a71f4b0472116",
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": "ed3dd02a946086b4134a47a401ef8bb0de86d1f56860e5c689941a252ecd5b3a",
143
- "scripts/flow_failure.py": "220cc33c34edd8fdf7296a48bf908012cf71421b8ed644c1b183b09ee35bbd11",
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": "cf1cf8afbe3cdd63ba11df19ed83688f85ef433a0244f6ae245669fb06cd07a7",
149
+ "scripts/flow_preflight.py": "4afc572456febcd79d3a78d81fe9d35a27f8ca4e11f3f9148a36e409fbe0d39e",
148
150
  "scripts/flow_registry.py": "53928b3fb76351561bfbb4cbe2e86de94b0a9f31d3f28ee0673e9f43c2b12d21",
149
- "scripts/flow_retry.py": "e8d03a7e815e0cf8e254ecc3d97a54a3a7e99f65f6363ed46764c4ccd6ea3732",
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": "452582961b40e7b035d1ba423c1342321c9685f8bb622a2117e6027ec4fc4062",
162
- "scripts/gen-preset-rows.mjs": "d1b11c90126e28e671871c6904cbf366b8485b936899c48156a75ddf6f5b1fb0",
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": "885d3bf0b4a268114dcd05e4489d917d1625ee92c7c140b6288606f61b5d00b6",
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": "c15626379844731c2cb2863a58aa7f456f134f3eb550445c74ae5c271f177724",
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-ads.mjs": "3ab5204f70b72cfe1f3e0dee18016d1e6db082d998af46d3f7a9772344eacaed",
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": "3faf007308d1a52f47f2dcf712a02f613c8e3f0bbf539043364a91073307803b",
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": "2bbfb90b29f769ab96bd91091d84f862acdd6d0955da0068315292ab050106c9",
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/internal.json": "588911f893a40bc1055003c296b8e4961a8c0150786fe9f0bb137d1f98a8680d",
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": "7588023b8564da568eced23c350f0fd8fd6ace023ab9c7cca55e8ba713b2454d",
322
- "skills/ml-invoice-xzh/SKILL.md": "8d4002e56f931350f625a427f38d700f1f0edc56482afb6be71f099131e07cd9",
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": "bbc41260a0d0eeed23eac0a39bc1cf30b015f419c76e33aaab03c374b9df47c6",
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": "70a2e967a613221054dc0be4a54c8ff131da84f3375cd43849eb8b24265654de",
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": "6bc3d7198eb23c7c05278109313c69cb73140d16f6305977c46632d13a11451e",
341
- "verticals/mercadolibre/manifest.json": "257dbaf94a037890184b415a380aaa0d8c26585ce01c139335a2b118a3d1a650",
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": "d0dfb27c4220c257d5c6ee3b711dfb108edb9b124088953d2f027e9d27220618",
345
- "verticals/mercadolibre/prompts/daily-report.md": "2c0ed65e1dfd6e64a4edb1314be93a197845b0d0d5661c02c83a6dd55ac95dab",
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.5
1
+ 0.7.7
@@ -1,5 +1,6 @@
1
1
  {
2
- "argentVersion": "0.7.2",
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:691",
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 chatId = arg('--chat-id'); const openId = arg('--open-id');
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) => { stdout += d; console.log(String(d).trimEnd()); });
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 runOnce() {
74
+ async function claimTask() {
65
75
  const d = await api('/appointments/claim', { method: 'POST', body: { workerId: WORKER_ID } });
66
- const task = d?.task;
67
- if (!task) return false;
68
- console.log(JSON.stringify({ event: 'claimed', id: task._id, store: task.store, sku: task.sku, shipmentNo: task.shipmentNo, from: task.dateFrom, to: task.dateTo }));
69
- const r = await runGrab(task);
70
- // 从 Python stdout 最后一行 JSON 取结果;没有则按失败
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
- do {
92
- try { await runOnce(); } catch (e) { console.error(JSON.stringify({ event: 'worker.error', message: e.message })); await sleep(5000); }
93
- if (!ONCE) await sleep(5000);
94
- } while (!ONCE);
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); });