@things-factory/headless-twin 10.0.18 โ 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/canonical-ingest.d.ts +10 -1
- package/dist-server/engine/canonical-ingest.js +110 -33
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/event-time.d.ts +25 -0
- package/dist-server/engine/event-time.js +98 -0
- package/dist-server/engine/event-time.js.map +1 -0
- package/dist-server/engine/index.d.ts +2 -0
- package/dist-server/engine/index.js +23 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/ingest-dedupe.d.ts +18 -6
- package/dist-server/engine/ingest-dedupe.js +201 -15
- package/dist-server/engine/ingest-dedupe.js.map +1 -1
- package/dist-server/engine/ingest-health.d.ts +60 -1
- package/dist-server/engine/ingest-health.js +43 -8
- package/dist-server/engine/ingest-health.js.map +1 -1
- package/dist-server/engine/kpi-fold.d.ts +19 -0
- package/dist-server/engine/kpi-fold.js +4 -1
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.js +23 -3
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/oee-accumulator.d.ts +35 -2
- package/dist-server/engine/oee-accumulator.js +56 -4
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +72 -3
- package/dist-server/engine/twin-engine.js +118 -5
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/index.js +21 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.d.ts +5 -0
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js +66 -0
- package/dist-server/migrations/1786600000000-RenameOperatoMesAdapterType.js.map +1 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.d.ts +5 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js +79 -0
- package/dist-server/migrations/1786700000000-AddDispatchRetryColumns.js.map +1 -0
- package/dist-server/migrations/index.js +5 -1
- package/dist-server/migrations/index.js.map +1 -1
- package/dist-server/routes.js +19 -16
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/actuation/actuation-advisor.d.ts +60 -0
- package/dist-server/service/actuation/actuation-advisor.js +53 -0
- package/dist-server/service/actuation/actuation-advisor.js.map +1 -0
- package/dist-server/service/actuation/actuation-outcome.d.ts +52 -0
- package/dist-server/service/actuation/actuation-outcome.js +34 -0
- package/dist-server/service/actuation/actuation-outcome.js.map +1 -0
- package/dist-server/service/actuation/actuation-rule-resolver.d.ts +19 -0
- package/dist-server/service/actuation/actuation-rule-resolver.js +161 -0
- package/dist-server/service/actuation/actuation-rule-resolver.js.map +1 -0
- package/dist-server/service/actuation/actuation-rule.d.ts +55 -0
- package/dist-server/service/actuation/actuation-rule.js +130 -0
- package/dist-server/service/actuation/actuation-rule.js.map +1 -0
- package/dist-server/service/actuation/approval-gateway.d.ts +20 -0
- package/dist-server/service/actuation/approval-gateway.js +14 -0
- package/dist-server/service/actuation/approval-gateway.js.map +1 -0
- package/dist-server/service/actuation/catch-up-effects.d.ts +16 -0
- package/dist-server/service/actuation/catch-up-effects.js +120 -0
- package/dist-server/service/actuation/catch-up-effects.js.map +1 -0
- package/dist-server/service/actuation/command-dispatcher.d.ts +230 -0
- package/dist-server/service/actuation/command-dispatcher.js +269 -0
- package/dist-server/service/actuation/command-dispatcher.js.map +1 -0
- package/dist-server/service/actuation/command-store.d.ts +11 -0
- package/dist-server/service/actuation/command-store.js +219 -0
- package/dist-server/service/actuation/command-store.js.map +1 -0
- package/dist-server/service/actuation/dispatch-after-approval.d.ts +11 -0
- package/dist-server/service/actuation/dispatch-after-approval.js +73 -0
- package/dist-server/service/actuation/dispatch-after-approval.js.map +1 -0
- package/dist-server/service/actuation/effect-match.d.ts +53 -0
- package/dist-server/service/actuation/effect-match.js +65 -0
- package/dist-server/service/actuation/effect-match.js.map +1 -0
- package/dist-server/service/actuation/index.d.ts +25 -0
- package/dist-server/service/actuation/index.js +30 -0
- package/dist-server/service/actuation/index.js.map +1 -0
- package/dist-server/service/actuation/retry-plan.d.ts +63 -0
- package/dist-server/service/actuation/retry-plan.js +99 -0
- package/dist-server/service/actuation/retry-plan.js.map +1 -0
- package/dist-server/service/actuation/rule-evaluate.d.ts +127 -0
- package/dist-server/service/actuation/rule-evaluate.js +205 -0
- package/dist-server/service/actuation/rule-evaluate.js.map +1 -0
- package/dist-server/service/actuation/rule-loop.d.ts +5 -0
- package/dist-server/service/actuation/rule-loop.js +156 -0
- package/dist-server/service/actuation/rule-loop.js.map +1 -0
- package/dist-server/service/actuation/rule-runner.d.ts +52 -0
- package/dist-server/service/actuation/rule-runner.js +135 -0
- package/dist-server/service/actuation/rule-runner.js.map +1 -0
- package/dist-server/service/actuation/rule-wiring.d.ts +24 -0
- package/dist-server/service/actuation/rule-wiring.js +80 -0
- package/dist-server/service/actuation/rule-wiring.js.map +1 -0
- package/dist-server/service/actuation/settle-effects.d.ts +21 -0
- package/dist-server/service/actuation/settle-effects.js +101 -0
- package/dist-server/service/actuation/settle-effects.js.map +1 -0
- package/dist-server/service/actuation/sweep-dispatch.d.ts +37 -0
- package/dist-server/service/actuation/sweep-dispatch.js +125 -0
- package/dist-server/service/actuation/sweep-dispatch.js.map +1 -0
- package/dist-server/service/actuation/twin-command-resolver.d.ts +120 -0
- package/dist-server/service/actuation/twin-command-resolver.js +406 -0
- package/dist-server/service/actuation/twin-command-resolver.js.map +1 -0
- package/dist-server/service/actuation/twin-command.d.ts +111 -0
- package/dist-server/service/actuation/twin-command.js +170 -0
- package/dist-server/service/actuation/twin-command.js.map +1 -0
- package/dist-server/service/actuation/twin-now.d.ts +41 -0
- package/dist-server/service/actuation/twin-now.js +65 -0
- package/dist-server/service/actuation/twin-now.js.map +1 -0
- package/dist-server/service/index.d.ts +5 -2
- package/dist-server/service/index.js +28 -17
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/actuation-routing.d.ts +60 -0
- package/dist-server/service/reference/actuation-routing.js +126 -0
- package/dist-server/service/reference/actuation-routing.js.map +1 -0
- package/dist-server/service/reference/actuation-target.d.ts +65 -0
- package/dist-server/service/reference/actuation-target.js +94 -0
- package/dist-server/service/reference/actuation-target.js.map +1 -0
- package/dist-server/service/reference/connection-portability-resolver.d.ts +29 -0
- package/dist-server/service/reference/connection-portability-resolver.js +181 -0
- package/dist-server/service/reference/connection-portability-resolver.js.map +1 -0
- package/dist-server/service/reference/connection-portability.d.ts +138 -0
- package/dist-server/service/reference/connection-portability.js +230 -0
- package/dist-server/service/reference/connection-portability.js.map +1 -0
- package/dist-server/service/reference/fill-cadence.d.ts +17 -0
- package/dist-server/service/reference/fill-cadence.js +31 -0
- package/dist-server/service/reference/fill-cadence.js.map +1 -0
- package/dist-server/service/reference/fill-dedupe.d.ts +16 -0
- package/dist-server/service/reference/fill-dedupe.js +63 -0
- package/dist-server/service/reference/fill-dedupe.js.map +1 -0
- package/dist-server/service/reference/fill-loop.d.ts +35 -0
- package/dist-server/service/reference/fill-loop.js +187 -0
- package/dist-server/service/reference/fill-loop.js.map +1 -0
- package/dist-server/service/reference/fill-span.d.ts +10 -0
- package/dist-server/service/reference/fill-span.js +37 -0
- package/dist-server/service/reference/fill-span.js.map +1 -0
- package/dist-server/service/reference/hook-contract.d.ts +149 -22
- package/dist-server/service/reference/hook-contract.js +236 -23
- package/dist-server/service/reference/hook-contract.js.map +1 -1
- package/dist-server/service/reference/hook-rejected.d.ts +25 -0
- package/dist-server/service/reference/hook-rejected.js +48 -0
- package/dist-server/service/reference/hook-rejected.js.map +1 -0
- package/dist-server/service/reference/hook-store.d.ts +3 -0
- package/dist-server/service/reference/hook-store.js +28 -0
- package/dist-server/service/reference/hook-store.js.map +1 -0
- package/dist-server/service/reference/index.d.ts +4 -1
- package/dist-server/service/reference/index.js +5 -1
- package/dist-server/service/reference/index.js.map +1 -1
- package/dist-server/service/reference/live-cadence.d.ts +68 -0
- package/dist-server/service/reference/live-cadence.js +44 -0
- package/dist-server/service/reference/live-cadence.js.map +1 -0
- package/dist-server/service/reference/live-feed-lease.d.ts +15 -0
- package/dist-server/service/reference/live-feed-lease.js +56 -0
- package/dist-server/service/reference/live-feed-lease.js.map +1 -0
- package/dist-server/service/reference/live-ingest.d.ts +21 -0
- package/dist-server/service/reference/live-ingest.js +66 -0
- package/dist-server/service/reference/live-ingest.js.map +1 -0
- package/dist-server/service/reference/reference-adapter.d.ts +355 -2
- package/dist-server/service/reference/reference-adapter.js +19 -1
- package/dist-server/service/reference/reference-adapter.js.map +1 -1
- package/dist-server/service/reference/reference-fill-run.d.ts +50 -0
- package/dist-server/service/reference/reference-fill-run.js +142 -0
- package/dist-server/service/reference/reference-fill-run.js.map +1 -0
- package/dist-server/service/reference/reference-fill.d.ts +90 -0
- package/dist-server/service/reference/reference-fill.js +141 -0
- package/dist-server/service/reference/reference-fill.js.map +1 -0
- package/dist-server/service/reference/reference-hook.d.ts +64 -6
- package/dist-server/service/reference/reference-hook.js +265 -27
- package/dist-server/service/reference/reference-hook.js.map +1 -1
- package/dist-server/service/reference/reference-link-groups.d.ts +10 -0
- package/dist-server/service/reference/reference-link-groups.js +15 -0
- package/dist-server/service/reference/reference-link-groups.js.map +1 -0
- package/dist-server/service/reference/reference-links.d.ts +14 -0
- package/dist-server/service/reference/reference-links.js +73 -0
- package/dist-server/service/reference/reference-links.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +1 -0
- package/dist-server/service/reference/reference-live.js +32 -6
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +56 -2
- package/dist-server/service/reference/reference-master.js +33 -3
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +27 -0
- package/dist-server/service/reference/reference-resolver.js +79 -1
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +31 -3
- package/dist-server/service/twin-event/twin-event-keys.js +36 -4
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +1 -0
- package/dist-server/service/twin-event/twin-event.js +11 -2
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-model/choose-recipe.d.ts +15 -0
- package/dist-server/service/twin-model/choose-recipe.js +33 -0
- package/dist-server/service/twin-model/choose-recipe.js.map +1 -0
- package/dist-server/service/twin-model/external-resolver.d.ts +76 -0
- package/dist-server/service/twin-model/external-resolver.js +109 -0
- package/dist-server/service/twin-model/external-resolver.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.js +16 -3
- package/dist-server/service/twin-model/project-structure.js.map +1 -1
- package/dist-server/service/twin-model/twin-equipment.d.ts +17 -0
- package/dist-server/service/twin-model/twin-equipment.js +10 -0
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -1
- package/dist-server/service/twin-model/twin-lineage-query.js +75 -1
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-item-query.js +94 -5
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -1
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -1
- package/dist-server/service/twin-space/twin-space.d.ts +29 -0
- package/dist-server/service/twin-space/twin-space.js +13 -0
- package/dist-server/service/twin-space/twin-space.js.map +1 -1
- package/dist-server/service/twin-subject/event-subjects.d.ts +3 -1
- package/dist-server/service/twin-subject/event-subjects.js +8 -1
- package/dist-server/service/twin-subject/event-subjects.js.map +1 -1
- package/dist-shared/entity-delta.js +1 -1
- package/dist-shared/entity-delta.js.map +1 -1
- package/package.json +7 -7
- package/server/engine/canonical-ingest.ts +119 -33
- package/server/engine/event-time.ts +96 -0
- package/server/engine/index.ts +20 -0
- package/server/engine/ingest-dedupe.ts +203 -27
- package/server/engine/ingest-health.ts +91 -6
- package/server/engine/kpi-fold.ts +24 -1
- package/server/engine/kpi-query.ts +23 -4
- package/server/engine/oee-accumulator.ts +80 -8
- package/server/engine/twin-engine.ts +119 -5
- package/server/index.ts +23 -0
- package/server/migrations/1786600000000-RenameOperatoMesAdapterType.ts +66 -0
- package/server/migrations/1786700000000-AddDispatchRetryColumns.ts +82 -0
- package/server/migrations/index.ts +5 -1
- package/server/routes.ts +19 -20
- package/server/service/actuation/actuation-advisor.ts +124 -0
- package/server/service/actuation/actuation-outcome.ts +97 -0
- package/server/service/actuation/actuation-rule-resolver.ts +147 -0
- package/server/service/actuation/actuation-rule.ts +139 -0
- package/server/service/actuation/approval-gateway.ts +44 -0
- package/server/service/actuation/catch-up-effects.ts +152 -0
- package/server/service/actuation/command-dispatcher.ts +511 -0
- package/server/service/actuation/command-store.ts +236 -0
- package/server/service/actuation/dispatch-after-approval.ts +71 -0
- package/server/service/actuation/effect-match.ts +124 -0
- package/server/service/actuation/index.ts +27 -0
- package/server/service/actuation/retry-plan.ts +145 -0
- package/server/service/actuation/rule-evaluate.ts +352 -0
- package/server/service/actuation/rule-loop.ts +160 -0
- package/server/service/actuation/rule-runner.ts +216 -0
- package/server/service/actuation/rule-wiring.ts +84 -0
- package/server/service/actuation/settle-effects.ts +115 -0
- package/server/service/actuation/sweep-dispatch.ts +179 -0
- package/server/service/actuation/twin-command-resolver.ts +387 -0
- package/server/service/actuation/twin-command.ts +232 -0
- package/server/service/actuation/twin-now.ts +97 -0
- package/server/service/index.ts +11 -0
- package/server/service/reference/actuation-routing.ts +165 -0
- package/server/service/reference/actuation-target.ts +163 -0
- package/server/service/reference/connection-portability-resolver.ts +171 -0
- package/server/service/reference/connection-portability.ts +285 -0
- package/server/service/reference/fill-cadence.ts +29 -0
- package/server/service/reference/fill-dedupe.ts +66 -0
- package/server/service/reference/fill-loop.ts +153 -0
- package/server/service/reference/fill-span.ts +31 -0
- package/server/service/reference/hook-contract.ts +280 -22
- package/server/service/reference/hook-rejected.ts +53 -0
- package/server/service/reference/hook-store.ts +28 -0
- package/server/service/reference/index.ts +5 -1
- package/server/service/reference/live-cadence.ts +129 -0
- package/server/service/reference/live-feed-lease.ts +56 -0
- package/server/service/reference/live-ingest.ts +94 -0
- package/server/service/reference/reference-adapter.ts +392 -5
- package/server/service/reference/reference-fill-run.ts +165 -0
- package/server/service/reference/reference-fill.ts +223 -0
- package/server/service/reference/reference-hook.ts +355 -32
- package/server/service/reference/reference-link-groups.ts +21 -0
- package/server/service/reference/reference-links.ts +77 -0
- package/server/service/reference/reference-live.ts +30 -5
- package/server/service/reference/reference-master.ts +90 -5
- package/server/service/reference/reference-resolver.ts +77 -2
- package/server/service/twin-event/twin-event-keys.ts +37 -4
- package/server/service/twin-event/twin-event.ts +18 -1
- package/server/service/twin-model/choose-recipe.ts +31 -0
- package/server/service/twin-model/external-resolver.ts +161 -0
- package/server/service/twin-model/project-structure.ts +16 -3
- package/server/service/twin-model/twin-equipment.ts +22 -0
- package/server/service/twin-model/twin-lineage-query.ts +82 -1
- package/server/service/twin-model/twin-model-item-query.ts +95 -4
- package/server/service/twin-model/twin-model-tree-query.ts +1 -1
- package/server/service/twin-space/twin-space.ts +39 -0
- package/server/service/twin-subject/event-subjects.ts +8 -1
- package/shared/entity-delta.ts +1 -1
- package/test/ack-shape-alignment.test.ts +97 -0
- package/test/actuation-approval-door.test.ts +421 -0
- package/test/actuation-dispatch.test.ts +209 -0
- package/test/actuation-effect.test.ts +162 -0
- package/test/actuation-outcome.test.ts +152 -0
- package/test/actuation-rule-runner.test.ts +281 -0
- package/test/actuation-rule.test.ts +266 -0
- package/test/actuation-seam.test.ts +249 -0
- package/test/actuation-settle.test.ts +164 -0
- package/test/actuation-target.test.ts +145 -0
- package/test/canonical-ingest-vocabularies.test.ts +49 -2
- package/test/capability-mapping.test.ts +1 -1
- package/test/choose-recipe.test.ts +117 -0
- package/test/command-store-writes-columns.test.ts +126 -0
- package/test/connection-portability-doors.test.ts +87 -0
- package/test/connector-capability-declaration.test.ts +54 -4
- package/test/declaration-reaches-model.test.ts +43 -0
- package/test/dedupe-transformation.test.ts +112 -0
- package/test/entity-delta.test.ts +1 -1
- package/test/event-subjects.test.ts +2 -1
- package/test/external-resolver.test.ts +171 -0
- package/test/fill-dedupe.test.ts +59 -0
- package/test/fill-loop.test.ts +35 -0
- package/test/first-envelope.test.ts +153 -0
- package/test/fold-shift-dst.test.ts +110 -0
- package/test/home-in-area.test.ts +90 -0
- package/test/hook-rejected-shape.test.ts +86 -0
- package/test/hook-response-sum.test.ts +193 -0
- package/test/hook-sequence.test.ts +333 -0
- package/test/ingest-dedupe.test.ts +56 -0
- package/test/ingest-expected-quiet.test.ts +111 -0
- package/test/ingest-idempotent.test.ts +79 -0
- package/test/ingest-reconcile-four-ways.test.ts +97 -0
- package/test/ingest-rules-header.test.ts +100 -0
- package/test/ingest-window-rolls-unobserved.test.ts +72 -0
- package/test/intake-mapping-parity.test.ts +175 -0
- package/test/live-cadence.test.ts +170 -0
- package/test/live-feed-lease.test.ts +63 -0
- package/test/live-mirror-parity.test.ts +1 -1
- package/test/oee-accumulator.test.ts +3 -3
- package/test/oee-site-calendar.test.ts +146 -0
- package/test/order-and-transaction-split.test.ts +107 -0
- package/test/reference-fill.test.ts +235 -0
- package/test/reference-hook.test.ts +114 -23
- package/test/reference-links.test.ts +56 -0
- package/test/retry-plan.test.ts +139 -0
- package/test/sweep-dispatch.test.ts +191 -0
- package/test/twin-event-keys.test.ts +20 -6
- package/test/twin-model-item-db.test.ts +6 -6
- package/test/twin-model-tree-db.test.ts +6 -6
- package/tsconfig.shared.tsbuildinfo +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/dist-server/index.js
CHANGED
|
@@ -12,6 +12,9 @@ require("./routes.js");
|
|
|
12
12
|
const index_js_2 = require("./engine/index.js");
|
|
13
13
|
const reference_live_js_1 = require("./service/reference/reference-live.js");
|
|
14
14
|
const index_js_3 = require("./service/twin-ingest-window/index.js");
|
|
15
|
+
const reference_links_js_1 = require("./service/reference/reference-links.js");
|
|
16
|
+
const rule_loop_js_1 = require("./service/actuation/rule-loop.js");
|
|
17
|
+
const fill_loop_js_1 = require("./service/reference/fill-loop.js");
|
|
15
18
|
/*
|
|
16
19
|
* ๋ชจ๋ ๋ถํ
โ **๋๋ ํธ์์ ๋์ด๋ฆฐ๋ค.**
|
|
17
20
|
*
|
|
@@ -28,6 +31,11 @@ process.on('bootstrap-module-start', async ({ app, config, client }) => {
|
|
|
28
31
|
* ๋จ๋๋ค. ์ปค๋ ์ธต์ ์ ์ฅ ๊ณ์ธต์ ๋ชจ๋ฅด๋ฏ๋ก ์ด ๋ฑ๋ก์ด ๊ทธ ๋์ ์๋ ์ ์ผํ ์๋ฆฌ๋ค.
|
|
29
32
|
*/
|
|
30
33
|
(0, index_js_3.installIngestWindowWriter)();
|
|
34
|
+
/*
|
|
35
|
+
* ์๋ณธ์๋ง ์๋ ๊ด๊ณ๋ฅผ ์กฐํํ๋ ๋ฌธ์ ์ฐ๋ค โ MES ์ ์์ฐ ์ค์ ยท์ ๋น ๊ณํ์ฒ๋ผ ํธ์์ด ๋ด์ง ์๋
|
|
36
|
+
* ๊ฒ๋ค. ์กฐํ์ฉ ์ฐธ์กฐ๋ ํธ์์ผ๋ก ๋ณต์ ํ์ง ์๊ณ ๊ทธ๋ ๋ฌผ์ด๋ณธ๋ค.
|
|
37
|
+
*/
|
|
38
|
+
(0, reference_links_js_1.installReferenceLinkResolver)();
|
|
31
39
|
/*
|
|
32
40
|
* **์ ๋ ๋ณด์กด ๊ธฐ๊ฐ์ ์ ์ธ์์ ์จ๋ค** โ ์ฝ๋์ ๋ฐ์ ๋์ง ์๋๋ค(2026-08-22).
|
|
33
41
|
*
|
|
@@ -55,6 +63,19 @@ process.on('bootstrap-module-start', async ({ app, config, client }) => {
|
|
|
55
63
|
}
|
|
56
64
|
await index_js_2.TwinEngine.bootstrap();
|
|
57
65
|
await (0, reference_live_js_1.resumeReferenceLiveFeeds)();
|
|
66
|
+
/*
|
|
67
|
+
* ๋น ์ง ๊ตฌ๊ฐ์ ๋ค์ ๋ฐ๋ ์ฃผ๊ธฐ โ ๊ธฐ๋์์ ํ ๋ฒ, ๊ทธ ๋ค 10๋ถ๋ง๋ค(ยง`fill-loop.ts`).
|
|
68
|
+
* ํผ๋๋ฅผ ๋ถ์ธ **๋ค์** ์ธ์ด๋ค: ์ปค๋์ด ๋์ด์๋๊ธฐ ์ ์ ๋ถ๋ฅด๋ฉด ๋๋ ํธ์์ด 0๊ฐ๋ค.
|
|
69
|
+
*/
|
|
70
|
+
(0, fill_loop_js_1.startFillLoop)();
|
|
71
|
+
/*
|
|
72
|
+
* ์กฐ์น ๊ท์น ์ฃผ๊ธฐ โ **ํธ์์ด ๋ค ์ ๋ค์** ์ธ์ด๋ค. ์์ ์ธ์ฐ๋ฉด ์ฒซ ๋ฐํด๊ฐ ์์ง ์ ์ ํธ์๋ค์ ๋๊ณ
|
|
73
|
+
* ใ์ํ๋ฅผ ์ฝ์ ์ ์๋คใ๋ฅผ ๊ท์น ํ์ ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ค์ด์ง๋ง ์ฌ๋์๊ฒ๋ ์คํด๋ค.
|
|
74
|
+
*
|
|
75
|
+
* ์ปค๋ ํฑ๊ณผ ๋ฐ๋ก ๋๋ค โ ํฑ์ ์์ธ๊ฐ ๋๋ฉด ๊ทธ ํธ์์ ๋ฉ์ถ๊ณ , ๊ท์น ํ๋๊ฐ ์๋ชป๋๋ค๊ณ ๊ณต์ฅ์ด ๋ฉ์ถ๋ฉด
|
|
76
|
+
* ์ ๋๋ค(ยง`rule-loop.ts`).
|
|
77
|
+
*/
|
|
78
|
+
(0, rule_loop_js_1.startActuationRuleLoop)();
|
|
58
79
|
(0, log_js_1.twinLog)('Headless Twin host has started.');
|
|
59
80
|
}
|
|
60
81
|
catch (ex) {
|
package/dist-server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,4DAAiC;AACjC,6DAAkC;AAClC,qEAAqE;AACrE,kDAAkD;AAAzC,sGAAA,UAAU,OAAA;AAEnB,4CAAoD;AACpD,uBAAoB;AAEpB,gDAA8C;AAC9C,6EAAgF;AAChF,oEAAiF;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../server/index.ts"],"names":[],"mappings":";;;;AAAA,4DAAiC;AACjC,6DAAkC;AAClC,qEAAqE;AACrE,kDAAkD;AAAzC,sGAAA,UAAU,OAAA;AAEnB,4CAAoD;AACpD,uBAAoB;AAEpB,gDAA8C;AAC9C,6EAAgF;AAChF,oEAAiF;AACjF,+EAAqF;AACrF,mEAAyE;AACzE,mEAAgE;AAEhE;;;;;;;;GAQG;AACH,OAAO,CAAC,EAAE,CAAC,wBAA+B,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAO,EAAE,EAAE;IACjF,IAAI,CAAC;QACH;;;WAGG;QACH,IAAA,oCAAyB,GAAE,CAAA;QAC3B;;;WAGG;QACH,IAAA,iDAA4B,GAAE,CAAA;QAC9B;;;;;;;;WAQG;QACH;;;;;;;;WAQG;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,CAAC,CAAA;QACpE,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,oBAAoB,IAAI,CAAC,CAAC,CAAA;QAC3E,MAAM,aAAa,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAA;QACxD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,qBAAU,CAAC,sBAAsB,GAAG,aAAa,CAAA;YACjD,IAAA,gBAAO,EAAC,4BAA4B,aAAa,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAA;QACxF,CAAC;QAED,MAAM,qBAAU,CAAC,SAAS,EAAE,CAAA;QAC5B,MAAM,IAAA,4CAAwB,GAAE,CAAA;QAChC;;;WAGG;QACH,IAAA,4BAAa,GAAE,CAAA;QAEf;;;;;;WAMG;QACH,IAAA,qCAAsB,GAAE,CAAA;QAExB,IAAA,gBAAO,EAAC,iCAAiC,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC;QACZ,IAAA,kBAAS,EAAC,qCAAqC,EAAE,EAAE,CAAC,CAAA;IACtD,CAAC;AACH,CAAC,CAAC,CAAA","sourcesContent":["export * from './engine/index.js'\nexport * from './service/index.js'\n/* ์คํค๋ง ์ด๋ ฅ โ ํ๋ ์์ํฌ๊ฐ `migrations` export ๋ฅผ ๋ชจ์ ์คํํ๋ค(`run migration`). */\nexport { migrations } from './migrations/index.js'\n\nimport { twinLog, twinError } from './engine/log.js'\nimport './routes.js'\n\nimport { TwinEngine } from './engine/index.js'\nimport { resumeReferenceLiveFeeds } from './service/reference/reference-live.js'\nimport { installIngestWindowWriter } from './service/twin-ingest-window/index.js'\nimport { installReferenceLinkResolver } from './service/reference/reference-links.js'\nimport { startActuationRuleLoop } from './service/actuation/rule-loop.js'\nimport { startFillLoop } from './service/reference/fill-loop.js'\n\n/*\n * ๋ชจ๋ ๋ถํ
โ **๋๋ ํธ์์ ๋์ด๋ฆฐ๋ค.**\n *\n * ๋ ์ธต์ด ์์๋๋ก๋ค: โ ์์ง์ด ๋ฑ๋ก๋ถ์ `running` ํ์ ์ ์ธ๋ `restartPolicy` ๊ทธ๋๋ก ๋์ด๋ฆฌ๊ณ \n * (`bootstrap`), โก ๋ ํผ๋ฐ์ค ๊ณ์ธต์ด ๋ฏธ๋ฌ ํธ์์ ์ปค๋ฅํฐ ํผ๋๋ฅผ ๋ค์ ๋ถ์ธ๋ค. ์์๊ฐ ๋ค์งํ๋ฉด ํผ๋๊ฐ\n * ์์ง ์๋ ์ปค๋์ ๊ณ์ธก์ ๋ถ๊ฒ ๋๋ค.\n *\n * ์์ ์๋ โ ๋ โก๋ ์์๋ค โ ์ฌ๊ธฐ๋ ํ ๋ฒ์ ๋ฑ๋ก๋ถ๋ง ใ๋๋ ์คใ์ด๋ผ ๋งํ๋ ํธ์์ด ๋จ์๋ค.\n */\nprocess.on('bootstrap-module-start' as any, async ({ app, config, client }: any) => {\n try {\n /*\n * ๋ซํ ์ธ์ ์คํธ ์ฐฝ์ ํ๋ก ์ฎ๊ธฐ๋ ๋ฌธ์ ๋จผ์ ์ฐ๋ค โ ํธ์์ ๋์ด๋ฆฌ๊ธฐ **์ ์** ๋ฑ๋กํด์ผ ์ฒซ ์ฐฝ๋ถํฐ\n * ๋จ๋๋ค. ์ปค๋ ์ธต์ ์ ์ฅ ๊ณ์ธต์ ๋ชจ๋ฅด๋ฏ๋ก ์ด ๋ฑ๋ก์ด ๊ทธ ๋์ ์๋ ์ ์ผํ ์๋ฆฌ๋ค.\n */\n installIngestWindowWriter()\n /*\n * ์๋ณธ์๋ง ์๋ ๊ด๊ณ๋ฅผ ์กฐํํ๋ ๋ฌธ์ ์ฐ๋ค โ MES ์ ์์ฐ ์ค์ ยท์ ๋น ๊ณํ์ฒ๋ผ ํธ์์ด ๋ด์ง ์๋\n * ๊ฒ๋ค. ์กฐํ์ฉ ์ฐธ์กฐ๋ ํธ์์ผ๋ก ๋ณต์ ํ์ง ์๊ณ ๊ทธ๋ ๋ฌผ์ด๋ณธ๋ค.\n */\n installReferenceLinkResolver()\n /*\n * **์ ๋ ๋ณด์กด ๊ธฐ๊ฐ์ ์ ์ธ์์ ์จ๋ค** โ ์ฝ๋์ ๋ฐ์ ๋์ง ์๋๋ค(2026-08-22).\n *\n * ์ค์ธก: ๊ฐ๋ฐ ์ ๋์ด ์๊ฐ๋น 581,794ํ ยท 0.85GB(ํ๋ฃจ 20GB) ๋ก ์๋๊ณ ์ง์ฐ๋ ๊ฒ์ด ์์๋ค. ๊ทธ๋ฐ๋ฐ\n * ใ๋ฉฐ์น ๊น์ง ๋จ๊ธฐ๋ใ๋ **๋ฐฐํฌ๋ง๋ค ๊ฐ๋ฆฌ๋ ์ฌ์ค**์ด๋ค โ ๊ฐ๋ฐ์ ์งง์๋ ๋๊ณ ์ค์ฆ์ ๊ธธ์ด์ผ ํ๋ค.\n *\n * ์ ์ธ์ด ์์ผ๋ฉด **์๋ฌด๊ฒ๋ ์ง์ฐ์ง ์๋๋ค.** ์๋ฆฌ์ง ์๊ณ ์ง์ฐ๋ ํธ์ด ์๋ฆฌ์ง ์๊ณ ์๋ ๊ฒ๋ณด๋ค ๋์๋ค.\n * ๊ฐ์ ์ค๋
์ท TTL(7์ผ)๋ณด๋ค ์งง์ ์ ์๋ค โ ์์ง์ด ๊ทธ๊ฒ์ ์ฌ๋ ค ์ฃผ๊ณ ๊ทธ ์ฌ์ค์ ๋งํ๋ค.\n */\n /*\n * ์ฝ๋ ์์: **ํ๊ฒฝ๋ณ์ โ ์ค์ โ ์์.**\n *\n * ์ค์ (`config.twin.journalRetentionDays`)์ด ๋ฐฐํฌ์ ์ ์ธ์ด๊ณ , ํ๊ฒฝ๋ณ์\n * (`TWIN_JOURNAL_RETENTION_DAYS`)๋ ๊ทธ๊ฒ์ **๊ทธ ์๋ฆฌ์์** ๋ฎ๋๋ค. ์ปจํ
์ด๋๋ก ๋๋ ๋ฐฐํฌ์์๋\n * ํ์ผ์ ๊ณ ์น์ง ์๊ณ ๊ฐ์ ๋ฐ๊ฟ ์ ์์ด์ผ ํ๊ณ , ๊ฐ๋ฐ์์๋ ๊ทธ ํธ์ด ๋น ๋ฅด๋ค.\n *\n * ๋ ๋ค ์์ผ๋ฉด **์๋ฌด๊ฒ๋ ์ง์ฐ์ง ์๋๋ค.**\n */\n const fromEnv = Number(process.env.TWIN_JOURNAL_RETENTION_DAYS ?? 0)\n const fromConfig = Number(config?.get?.('twin')?.journalRetentionDays ?? 0)\n const retentionDays = fromEnv > 0 ? fromEnv : fromConfig\n if (retentionDays > 0) {\n TwinEngine.JOURNAL_RETENTION_DAYS = retentionDays\n twinLog(`[twin] journal retention ${retentionDays}์ผ (${fromEnv > 0 ? 'ํ๊ฒฝ๋ณ์' : '์ค์ '})`)\n }\n\n await TwinEngine.bootstrap()\n await resumeReferenceLiveFeeds()\n /*\n * ๋น ์ง ๊ตฌ๊ฐ์ ๋ค์ ๋ฐ๋ ์ฃผ๊ธฐ โ ๊ธฐ๋์์ ํ ๋ฒ, ๊ทธ ๋ค 10๋ถ๋ง๋ค(ยง`fill-loop.ts`).\n * ํผ๋๋ฅผ ๋ถ์ธ **๋ค์** ์ธ์ด๋ค: ์ปค๋์ด ๋์ด์๋๊ธฐ ์ ์ ๋ถ๋ฅด๋ฉด ๋๋ ํธ์์ด 0๊ฐ๋ค.\n */\n startFillLoop()\n\n /*\n * ์กฐ์น ๊ท์น ์ฃผ๊ธฐ โ **ํธ์์ด ๋ค ์ ๋ค์** ์ธ์ด๋ค. ์์ ์ธ์ฐ๋ฉด ์ฒซ ๋ฐํด๊ฐ ์์ง ์ ์ ํธ์๋ค์ ๋๊ณ \n * ใ์ํ๋ฅผ ์ฝ์ ์ ์๋คใ๋ฅผ ๊ท์น ํ์ ์ ๋๋ค. ๊ทธ๊ฒ์ ์ฌ์ค์ด์ง๋ง ์ฌ๋์๊ฒ๋ ์คํด๋ค.\n *\n * ์ปค๋ ํฑ๊ณผ ๋ฐ๋ก ๋๋ค โ ํฑ์ ์์ธ๊ฐ ๋๋ฉด ๊ทธ ํธ์์ ๋ฉ์ถ๊ณ , ๊ท์น ํ๋๊ฐ ์๋ชป๋๋ค๊ณ ๊ณต์ฅ์ด ๋ฉ์ถ๋ฉด\n * ์ ๋๋ค(ยง`rule-loop.ts`).\n */\n startActuationRuleLoop()\n\n twinLog('Headless Twin host has started.')\n } catch (ex) {\n twinError('Headless Twin host failed to start.', ex)\n }\n})\n"]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RenameOperatoMesAdapterType1786600000000 = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* `twin_references.adapter_type` โ `operato-mes` โ `operato-plant`.
|
|
6
|
+
*
|
|
7
|
+
* โโ ์ ๋ง์ด๊ทธ๋ ์ด์
์ด ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
8
|
+
* ์ปค๋ฅํฐ์ `type` ์ **์ ์ฅ๋๋ ์๋ณ์**๋ค. ํธ์์ ์๋ณธ์ ๋ถ์ผ ๋ ๊ทธ ๋ฌธ์์ด์ด ์ด ์ปฌ๋ผ์ ์ ํ๊ณ ,
|
|
9
|
+
* ๋๊ธธ ๋ยท๋ผ์ด๋ธ๋ฅผ ์ด ๋ ๊ทธ ๊ฐ์ผ๋ก ์ปค๋ฅํฐ๋ฅผ ์ฐพ๋๋ค(ยง`getAdapter`).
|
|
10
|
+
*
|
|
11
|
+
* ๊ทธ๋์ ์ ํ ๊ฐ๋ช
(`operato-mes` โ `operato-plant`)์ด ์ฝ๋๋ง ๋ฐ๋๋ฉด **์ด๋ฏธ ๋ถ์ด ์๋ ์๋ณธ์ด ์ปค๋ฅํฐ๋ฅผ
|
|
12
|
+
* ๋ชป ์ฐพ๋๋ค.** ๊ทธ๋ ๋์ค๋ ๊ฒ์ ์ด๋ ๋ค.
|
|
13
|
+
*
|
|
14
|
+
* ์กฐ์น ๋๊น `no-adapter` ๋ก ๊ฑฐ์
|
|
15
|
+
* ๋ผ์ด๋ธ ์ปค๋ฅํฐ๊ฐ ์์ด ๊ด์ธก์ด ๋๊ธด๋ค
|
|
16
|
+
* ํ๋ฉด ใ๋ฑ๋ก๋์ง ์์ ์ปค๋ฅํฐ์
๋๋ค (operato-mes)ใ ํ ์ค
|
|
17
|
+
*
|
|
18
|
+
* **์ค๋ฅ๋ ์ ๋๊ณ , ์์ธ์ด ๊ฐ๋ช
์ด๋ผ๋ ๊ฒ์ด ๊ทธ ๋ฌธ์ฅ์ ์๋ค.** ํธ์์ ๊ทธ๋๋ก ์ ์๊ณ ๊ฐ๋ง ์ ์จ๋ค.
|
|
19
|
+
* ์ด ์ ์ฅ์์์ ๊ฐ๋ช
์ด ์ ์ฅ๋ ์๋ณ์์ ๋ฟ์์ ๋ ๋ ์ด ๋ชจ์์ผ๋ก ๋ฌ๋ค(๋ณด๋ ํคยท์ฌ ์ปดํฌ๋ํธ ํ์
).
|
|
20
|
+
*
|
|
21
|
+
* โโ ์ ์ด ํจํค์ง์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
22
|
+
* ํ๋ฅผ ๋ ์ชฝ์ด ์ด ํจํค์ง๋ค(`twin_references`). ์ปค๋ฅํฐ๋ `operato-twin` ์ด ๋ฑ๋กํ์ง๋ง, ๊ทธ ๊ฐ์ด ์ฌ๋
|
|
23
|
+
* ์๋ฆฌ๋ ์ฌ๊ธฐ๋ค. ๋ง์ด๊ทธ๋ ์ด์
์ ํ๋ฅผ ๋ ํจํค์ง์ ๋๋ค.
|
|
24
|
+
*
|
|
25
|
+
* โโ ๋๋๋ฆฌ๊ธฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
26
|
+
* `down` ์ด ๊ฐ์ ๋๋๋ฆฐ๋ค. ์ ์ฝ๋๋ก ๋๋์๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ค์ ๋ก ์๊ณ (๋ฐฐํฌ ๋กค๋ฐฑ), ๊ทธ๋ ๊ฐ์ด ์ ์ด๋ฆ์ผ๋ก
|
|
27
|
+
* ๋จ์ ์์ผ๋ฉด ๊ฐ์ ๊ฒฐํจ์ด ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋๋ค.
|
|
28
|
+
*
|
|
29
|
+
* ๋ฉฑ๋ฑ: ํด๋นํ๋ ํ์ด ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค. TypeORM ์ง์ ๋น๋๋ง ์ด๋ค โ ๋๋ผ์ด๋ฒ๋ง๋ค ํ๋ผ๋ฏธํฐ
|
|
30
|
+
* ํ๊ธฐ๊ฐ ๋ค๋ฅด๋ฏ๋ก raw SQL ์ ์ฐ์ง ์๋๋ค.
|
|
31
|
+
*/
|
|
32
|
+
const REFS = 'twin_references';
|
|
33
|
+
const COLUMN = 'adapter_type';
|
|
34
|
+
/**
|
|
35
|
+
* ์ง์ ๋น๋์๋ **์์ฑ ์ด๋ฆ**์ ์ค๋ค.
|
|
36
|
+
*
|
|
37
|
+
* ์ฒ์์ ์ปฌ๋ผ ์ด๋ฆ(`adapter_type`)์ผ๋ก ์ผ๋๋ TypeORM ์ด ํ ์ด๋ฆ์ ์ํฐํฐ(`TwinReference`)๋ก ํ๊ณ
|
|
38
|
+
* ใ๊ทธ๋ฐ ์์ฑ์ด ์๋คใ๋ก ๊ฑฐ์ ํ๋ค โ ํ ์ด๋ฆ์ ์ฃผ๋๋ผ๋ ๋งคํ์ ์ํฐํฐ ๊ธฐ์ค์ด๋ค. ์ปฌ๋ผ ์ด๋ฆ์ ํ๊ฐ
|
|
39
|
+
* ์๋์ง ๋ณผ ๋๋ง ์ด๋ค.
|
|
40
|
+
*/
|
|
41
|
+
const PROPERTY = 'adapterType';
|
|
42
|
+
const OLD = 'operato-mes';
|
|
43
|
+
const NEW = 'operato-plant';
|
|
44
|
+
async function rename(queryRunner, from, to) {
|
|
45
|
+
/* ํ๊ฐ ์์ง ์๋ ๋ฐฐํฌ(์ฒซ ๊ธฐ๋)์์๋ ํ ์ผ์ด ์๋ค. */
|
|
46
|
+
const table = await queryRunner.getTable(REFS);
|
|
47
|
+
if (!table?.columns.some(c => c.name === COLUMN))
|
|
48
|
+
return;
|
|
49
|
+
/* ๊ฐ์ฒด ํํ๋ก ์ค๋ค โ ๋ฌธ์์ด ์กฐ๊ฑด์ ๋๋ผ์ด๋ฒ๋ง๋ค ์๋ณ์ ์ธ์ฉ์ด ๋ฌ๋ผ ๊ทธ๋๋ก ๋๊ฐ๋ค. */
|
|
50
|
+
await queryRunner.manager
|
|
51
|
+
.createQueryBuilder()
|
|
52
|
+
.update(REFS)
|
|
53
|
+
.set({ [PROPERTY]: to })
|
|
54
|
+
.where({ [PROPERTY]: from })
|
|
55
|
+
.execute();
|
|
56
|
+
}
|
|
57
|
+
class RenameOperatoMesAdapterType1786600000000 {
|
|
58
|
+
async up(queryRunner) {
|
|
59
|
+
await rename(queryRunner, OLD, NEW);
|
|
60
|
+
}
|
|
61
|
+
async down(queryRunner) {
|
|
62
|
+
await rename(queryRunner, NEW, OLD);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.RenameOperatoMesAdapterType1786600000000 = RenameOperatoMesAdapterType1786600000000;
|
|
66
|
+
//# sourceMappingURL=1786600000000-RenameOperatoMesAdapterType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1786600000000-RenameOperatoMesAdapterType.js","sourceRoot":"","sources":["../../server/migrations/1786600000000-RenameOperatoMesAdapterType.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,IAAI,GAAG,iBAAiB,CAAA;AAC9B,MAAM,MAAM,GAAG,cAAc,CAAA;AAC7B;;;;;;GAMG;AACH,MAAM,QAAQ,GAAG,aAAa,CAAA;AAC9B,MAAM,GAAG,GAAG,aAAa,CAAA;AACzB,MAAM,GAAG,GAAG,eAAe,CAAA;AAE3B,KAAK,UAAU,MAAM,CAAC,WAAwB,EAAE,IAAY,EAAE,EAAU;IACtE,mCAAmC;IACnC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9C,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;QAAE,OAAM;IAExD,oDAAoD;IACpD,MAAM,WAAW,CAAC,OAAO;SACtB,kBAAkB,EAAE;SACpB,MAAM,CAAC,IAAI,CAAC;SACZ,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;SAC3B,OAAO,EAAE,CAAA;AACd,CAAC;AAED,MAAa,wCAAwC;IAC5C,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,MAAM,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACrC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,MAAM,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACrC,CAAC;CACF;AARD,4FAQC","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\n\n/**\n * `twin_references.adapter_type` โ `operato-mes` โ `operato-plant`.\n *\n * โโ ์ ๋ง์ด๊ทธ๋ ์ด์
์ด ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋ฅํฐ์ `type` ์ **์ ์ฅ๋๋ ์๋ณ์**๋ค. ํธ์์ ์๋ณธ์ ๋ถ์ผ ๋ ๊ทธ ๋ฌธ์์ด์ด ์ด ์ปฌ๋ผ์ ์ ํ๊ณ ,\n * ๋๊ธธ ๋ยท๋ผ์ด๋ธ๋ฅผ ์ด ๋ ๊ทธ ๊ฐ์ผ๋ก ์ปค๋ฅํฐ๋ฅผ ์ฐพ๋๋ค(ยง`getAdapter`).\n *\n * ๊ทธ๋์ ์ ํ ๊ฐ๋ช
(`operato-mes` โ `operato-plant`)์ด ์ฝ๋๋ง ๋ฐ๋๋ฉด **์ด๋ฏธ ๋ถ์ด ์๋ ์๋ณธ์ด ์ปค๋ฅํฐ๋ฅผ\n * ๋ชป ์ฐพ๋๋ค.** ๊ทธ๋ ๋์ค๋ ๊ฒ์ ์ด๋ ๋ค.\n *\n * ์กฐ์น ๋๊น `no-adapter` ๋ก ๊ฑฐ์ \n * ๋ผ์ด๋ธ ์ปค๋ฅํฐ๊ฐ ์์ด ๊ด์ธก์ด ๋๊ธด๋ค\n * ํ๋ฉด ใ๋ฑ๋ก๋์ง ์์ ์ปค๋ฅํฐ์
๋๋ค (operato-mes)ใ ํ ์ค\n *\n * **์ค๋ฅ๋ ์ ๋๊ณ , ์์ธ์ด ๊ฐ๋ช
์ด๋ผ๋ ๊ฒ์ด ๊ทธ ๋ฌธ์ฅ์ ์๋ค.** ํธ์์ ๊ทธ๋๋ก ์ ์๊ณ ๊ฐ๋ง ์ ์จ๋ค.\n * ์ด ์ ์ฅ์์์ ๊ฐ๋ช
์ด ์ ์ฅ๋ ์๋ณ์์ ๋ฟ์์ ๋ ๋ ์ด ๋ชจ์์ผ๋ก ๋ฌ๋ค(๋ณด๋ ํคยท์ฌ ์ปดํฌ๋ํธ ํ์
).\n *\n * โโ ์ ์ด ํจํค์ง์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ํ๋ฅผ ๋ ์ชฝ์ด ์ด ํจํค์ง๋ค(`twin_references`). ์ปค๋ฅํฐ๋ `operato-twin` ์ด ๋ฑ๋กํ์ง๋ง, ๊ทธ ๊ฐ์ด ์ฌ๋\n * ์๋ฆฌ๋ ์ฌ๊ธฐ๋ค. ๋ง์ด๊ทธ๋ ์ด์
์ ํ๋ฅผ ๋ ํจํค์ง์ ๋๋ค.\n *\n * โโ ๋๋๋ฆฌ๊ธฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `down` ์ด ๊ฐ์ ๋๋๋ฆฐ๋ค. ์ ์ฝ๋๋ก ๋๋์๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ค์ ๋ก ์๊ณ (๋ฐฐํฌ ๋กค๋ฐฑ), ๊ทธ๋ ๊ฐ์ด ์ ์ด๋ฆ์ผ๋ก\n * ๋จ์ ์์ผ๋ฉด ๊ฐ์ ๊ฒฐํจ์ด ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋๋ค.\n *\n * ๋ฉฑ๋ฑ: ํด๋นํ๋ ํ์ด ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค. TypeORM ์ง์ ๋น๋๋ง ์ด๋ค โ ๋๋ผ์ด๋ฒ๋ง๋ค ํ๋ผ๋ฏธํฐ\n * ํ๊ธฐ๊ฐ ๋ค๋ฅด๋ฏ๋ก raw SQL ์ ์ฐ์ง ์๋๋ค.\n */\nconst REFS = 'twin_references'\nconst COLUMN = 'adapter_type'\n/**\n * ์ง์ ๋น๋์๋ **์์ฑ ์ด๋ฆ**์ ์ค๋ค.\n *\n * ์ฒ์์ ์ปฌ๋ผ ์ด๋ฆ(`adapter_type`)์ผ๋ก ์ผ๋๋ TypeORM ์ด ํ ์ด๋ฆ์ ์ํฐํฐ(`TwinReference`)๋ก ํ๊ณ \n * ใ๊ทธ๋ฐ ์์ฑ์ด ์๋คใ๋ก ๊ฑฐ์ ํ๋ค โ ํ ์ด๋ฆ์ ์ฃผ๋๋ผ๋ ๋งคํ์ ์ํฐํฐ ๊ธฐ์ค์ด๋ค. ์ปฌ๋ผ ์ด๋ฆ์ ํ๊ฐ\n * ์๋์ง ๋ณผ ๋๋ง ์ด๋ค.\n */\nconst PROPERTY = 'adapterType'\nconst OLD = 'operato-mes'\nconst NEW = 'operato-plant'\n\nasync function rename(queryRunner: QueryRunner, from: string, to: string): Promise<void> {\n /* ํ๊ฐ ์์ง ์๋ ๋ฐฐํฌ(์ฒซ ๊ธฐ๋)์์๋ ํ ์ผ์ด ์๋ค. */\n const table = await queryRunner.getTable(REFS)\n if (!table?.columns.some(c => c.name === COLUMN)) return\n\n /* ๊ฐ์ฒด ํํ๋ก ์ค๋ค โ ๋ฌธ์์ด ์กฐ๊ฑด์ ๋๋ผ์ด๋ฒ๋ง๋ค ์๋ณ์ ์ธ์ฉ์ด ๋ฌ๋ผ ๊ทธ๋๋ก ๋๊ฐ๋ค. */\n await queryRunner.manager\n .createQueryBuilder()\n .update(REFS)\n .set({ [PROPERTY]: to })\n .where({ [PROPERTY]: from })\n .execute()\n}\n\nexport class RenameOperatoMesAdapterType1786600000000 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n await rename(queryRunner, OLD, NEW)\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await rename(queryRunner, NEW, OLD)\n }\n}\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AddDispatchRetryColumns1786700000000 = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* ์กฐ์น ํ์ **์ผ๊พผ์ด ์ธ ๋ค ์นธ**์ ๋ํ๋ค.
|
|
6
|
+
*
|
|
7
|
+
* โโ ์ ํ์ ๋๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
8
|
+
* ๋ฌผ๋ฌ์ฌ์ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ฉด ์ฌ๊ธฐ๋์ ์ฌ๋ผ์ง๊ณ , ๊ทธ๋ฌ๋ฉด ๋ฌผ๋ฌ์๋ ๊ฒ์ด ์ ๋ถ ์ฆ์ ์ฌ์๋๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ
|
|
9
|
+
* ์ผ๊พผ์ด ์ฌ๋ฌ ๋๊ฐ ๋๋ฉด ๊ฐ์ ๋ต์ ๋ด์ผ ํ๋ค.
|
|
10
|
+
*
|
|
11
|
+
* dispatch_note_next ์ ์ชฝ ๋ง ์ค ใ๋ค์์ ํ ์ผใ ํ ์ค โ ์์ธ์ dispatch_note
|
|
12
|
+
* retry ๋ค์ ํด์ ๋ ์ผ์ธ๊ฐ (again ยท after-fix ยท never)
|
|
13
|
+
* attempts ๋ช ๋ฒ ๋๊ฒจ ๋ดค๋ โ ๋ชฉ๋ก์ ใ๋ช ๋ฒ ํด ๋ดค๋ใ
|
|
14
|
+
* next_attempt_at ๋ค์์ ๋๊ฒจ ๋ณผ ์๊ฐ(ISO)
|
|
15
|
+
*
|
|
16
|
+
* โโ ํ์
์ ์ง์ํ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
17
|
+
* ์ํฐํฐ๊ฐ `@Column({ nullable: true })` ๋ก ๋๋ฉด ๊ทธ๊ฒ์ด ์ด๋ ์ปฌ๋ผ ํ์
์ด ๋๋์ง๋ **๋๋ผ์ด๋ฒ๋ง๋ค
|
|
18
|
+
* ๋ค๋ฅด๋ค.** `'varchar'` ๋ผ๊ณ ์ ์ผ๋ฉด sqliteยทpostgresยทmysql ์์๋ ๋ง๊ณ MSSQLยทOracle ์์ ์ด๊ธ๋๋ค.
|
|
19
|
+
*
|
|
20
|
+
* ๊ทธ๋์ ๊ฐ์ ์ฑ์ง๋ก **์ด๋ฏธ ์ ์๋ ํ์ ์นธ**์ ํ์
์ ์ฝ์ด ๊ทธ๋๋ก ์ด๋ค โ ๋๋ผ์ด๋ฒ๊ฐ ์ค์ค๋ก ๊ณ ๋ฅธ
|
|
21
|
+
* ๋ต์ด๋ผ ๋ค์ฏ ๊ณณ์์ ๋ค ๋ง๋๋ค. ํ์ ๊ฐ ์์ผ๋ฉด ์ง์ํ์ง ์๊ณ ๋ฉ์ถ๋ค.
|
|
22
|
+
*
|
|
23
|
+
* ๊ธ์ ์
dispatch_note ์์
|
|
24
|
+
* ์ ํ๋ effect_seen ์์
|
|
25
|
+
*
|
|
26
|
+
* plant ๋ ์ธ์ด ์ค๋ `equipmentClassIds` ๋ง์ด๊ทธ๋ ์ด์
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ผ๋ค.
|
|
27
|
+
*
|
|
28
|
+
* โโ ๋ฉฑ๋ฑ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
29
|
+
* ์นธ์ด ์ด๋ฏธ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค โ ๊ฐ๋ฐ sqlite ๋ ์ํฐํฐ ์ ์ธ๋ง์ผ๋ก ์ด๋ฏธ ๋ง๋ค์ด ๋๋ค.
|
|
30
|
+
* ํ๊ฐ ์์ง ์๋ ์ฒซ ๊ธฐ๋์์๋ ํ ์ผ์ด ์๋ค.
|
|
31
|
+
*/
|
|
32
|
+
const typeorm_1 = require("typeorm");
|
|
33
|
+
const TABLE = 'twin_command_records';
|
|
34
|
+
/** ๊ธ์ ์นธ์ ํ์ โ ๊ฐ์ ์ฑ์ง(์ ํยท์์ ๋ฌธ์์ด)๋ก ์ด๋ฏธ ์ ์๋ค. */
|
|
35
|
+
const TEXT_SIBLING = 'dispatch_note';
|
|
36
|
+
/** ์ ์นธ์ ํ์ โ ์ ํยท์ ์. */
|
|
37
|
+
const INT_SIBLING = 'effect_seen';
|
|
38
|
+
const TEXT_COLUMNS = ['dispatch_note_next', 'retry', 'next_attempt_at'];
|
|
39
|
+
const INT_COLUMNS = ['attempts'];
|
|
40
|
+
class AddDispatchRetryColumns1786700000000 {
|
|
41
|
+
async up(queryRunner) {
|
|
42
|
+
const table = await queryRunner.getTable(TABLE);
|
|
43
|
+
if (!table)
|
|
44
|
+
return; /* ์ฒซ ๊ธฐ๋ โ ์ํฐํฐ๊ฐ ๋ง๋ ๋ค */
|
|
45
|
+
const typeOf = (sibling) => table.columns.find(c => c.name === sibling)?.type;
|
|
46
|
+
const textType = typeOf(TEXT_SIBLING);
|
|
47
|
+
const intType = typeOf(INT_SIBLING);
|
|
48
|
+
/*
|
|
49
|
+
* ํ์ ๊ฐ ์์ผ๋ฉด **๋ฉ์ถ๋ค.** ์ง์ํ ํ์
์ผ๋ก ์นธ์ ์ธ์ฐ๋ฉด ์ด๋ ๋๋ผ์ด๋ฒ์์ ์ด๊ธ๋๋์ง ๊ฐ๋ฐ์์
|
|
50
|
+
* ์ ์กํ๊ณ , ๊ทธ ๋ฐฐํฌ์์๋ง ๋๋ค.
|
|
51
|
+
*/
|
|
52
|
+
if (!textType || !intType) {
|
|
53
|
+
throw new Error(`${TABLE} ์์ ํ์ ์นธ์ ๋ชป ์ฐพ์์ต๋๋ค โ ${TEXT_SIBLING}(${textType ?? '์์'}) ยท ` +
|
|
54
|
+
`${INT_SIBLING}(${intType ?? '์์'}). ํ์
์ ์ง์ํ์ง ์๊ณ ๋ฉ์ถฅ๋๋ค`);
|
|
55
|
+
}
|
|
56
|
+
for (const name of TEXT_COLUMNS) {
|
|
57
|
+
if (table.columns.some(c => c.name === name))
|
|
58
|
+
continue;
|
|
59
|
+
await queryRunner.addColumn(TABLE, new typeorm_1.TableColumn({ name, type: textType, isNullable: true }));
|
|
60
|
+
}
|
|
61
|
+
for (const name of INT_COLUMNS) {
|
|
62
|
+
if (table.columns.some(c => c.name === name))
|
|
63
|
+
continue;
|
|
64
|
+
await queryRunner.addColumn(TABLE, new typeorm_1.TableColumn({ name, type: intType, isNullable: true }));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async down(queryRunner) {
|
|
68
|
+
const table = await queryRunner.getTable(TABLE);
|
|
69
|
+
if (!table)
|
|
70
|
+
return;
|
|
71
|
+
for (const name of [...TEXT_COLUMNS, ...INT_COLUMNS]) {
|
|
72
|
+
if (!table.columns.some(c => c.name === name))
|
|
73
|
+
continue;
|
|
74
|
+
await queryRunner.dropColumn(TABLE, name);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.AddDispatchRetryColumns1786700000000 = AddDispatchRetryColumns1786700000000;
|
|
79
|
+
//# sourceMappingURL=1786700000000-AddDispatchRetryColumns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1786700000000-AddDispatchRetryColumns.js","sourceRoot":"","sources":["../../server/migrations/1786700000000-AddDispatchRetryColumns.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qCAAsE;AAEtE,MAAM,KAAK,GAAG,sBAAsB,CAAA;AAEpC,4CAA4C;AAC5C,MAAM,YAAY,GAAG,eAAe,CAAA;AACpC,uBAAuB;AACvB,MAAM,WAAW,GAAG,aAAa,CAAA;AAEjC,MAAM,YAAY,GAAG,CAAC,oBAAoB,EAAE,OAAO,EAAE,iBAAiB,CAAU,CAAA;AAChF,MAAM,WAAW,GAAG,CAAC,UAAU,CAAU,CAAA;AAEzC,MAAa,oCAAoC;IACxC,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK;YAAE,OAAM,CAAC,qBAAqB;QAExC,MAAM,MAAM,GAAG,CAAC,OAAe,EAAsB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI,CAAA;QAEzG,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAA;QAEnC;;;WAGG;QACH,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,uBAAuB,YAAY,IAAI,QAAQ,IAAI,IAAI,MAAM;gBACnE,GAAG,WAAW,IAAI,OAAO,IAAI,IAAI,qBAAqB,CACzD,CAAA;QACH,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,SAAQ;YACtD,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,qBAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACjG,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,SAAQ;YACtD,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,qBAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAChG,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,YAAY,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;gBAAE,SAAQ;YACvD,MAAM,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;CACF;AAzCD,oFAyCC","sourcesContent":["/*\n * ์กฐ์น ํ์ **์ผ๊พผ์ด ์ธ ๋ค ์นธ**์ ๋ํ๋ค.\n *\n * โโ ์ ํ์ ๋๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ฌผ๋ฌ์ฌ์ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ฉด ์ฌ๊ธฐ๋์ ์ฌ๋ผ์ง๊ณ , ๊ทธ๋ฌ๋ฉด ๋ฌผ๋ฌ์๋ ๊ฒ์ด ์ ๋ถ ์ฆ์ ์ฌ์๋๊ฐ ๋๋ค. ๊ทธ๋ฆฌ๊ณ \n * ์ผ๊พผ์ด ์ฌ๋ฌ ๋๊ฐ ๋๋ฉด ๊ฐ์ ๋ต์ ๋ด์ผ ํ๋ค.\n *\n * dispatch_note_next ์ ์ชฝ ๋ง ์ค ใ๋ค์์ ํ ์ผใ ํ ์ค โ ์์ธ์ dispatch_note\n * retry ๋ค์ ํด์ ๋ ์ผ์ธ๊ฐ (again ยท after-fix ยท never)\n * attempts ๋ช ๋ฒ ๋๊ฒจ ๋ดค๋ โ ๋ชฉ๋ก์ ใ๋ช ๋ฒ ํด ๋ดค๋ใ\n * next_attempt_at ๋ค์์ ๋๊ฒจ ๋ณผ ์๊ฐ(ISO)\n *\n * โโ ํ์
์ ์ง์ํ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ํฐํฐ๊ฐ `@Column({ nullable: true })` ๋ก ๋๋ฉด ๊ทธ๊ฒ์ด ์ด๋ ์ปฌ๋ผ ํ์
์ด ๋๋์ง๋ **๋๋ผ์ด๋ฒ๋ง๋ค\n * ๋ค๋ฅด๋ค.** `'varchar'` ๋ผ๊ณ ์ ์ผ๋ฉด sqliteยทpostgresยทmysql ์์๋ ๋ง๊ณ MSSQLยทOracle ์์ ์ด๊ธ๋๋ค.\n *\n * ๊ทธ๋์ ๊ฐ์ ์ฑ์ง๋ก **์ด๋ฏธ ์ ์๋ ํ์ ์นธ**์ ํ์
์ ์ฝ์ด ๊ทธ๋๋ก ์ด๋ค โ ๋๋ผ์ด๋ฒ๊ฐ ์ค์ค๋ก ๊ณ ๋ฅธ\n * ๋ต์ด๋ผ ๋ค์ฏ ๊ณณ์์ ๋ค ๋ง๋๋ค. ํ์ ๊ฐ ์์ผ๋ฉด ์ง์ํ์ง ์๊ณ ๋ฉ์ถ๋ค.\n *\n * ๊ธ์ ์
dispatch_note ์์\n * ์ ํ๋ effect_seen ์์\n *\n * plant ๋ ์ธ์ด ์ค๋ `equipmentClassIds` ๋ง์ด๊ทธ๋ ์ด์
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ผ๋ค.\n *\n * โโ ๋ฉฑ๋ฑ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์นธ์ด ์ด๋ฏธ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ์๋๋ค โ ๊ฐ๋ฐ sqlite ๋ ์ํฐํฐ ์ ์ธ๋ง์ผ๋ก ์ด๋ฏธ ๋ง๋ค์ด ๋๋ค.\n * ํ๊ฐ ์์ง ์๋ ์ฒซ ๊ธฐ๋์์๋ ํ ์ผ์ด ์๋ค.\n */\nimport { MigrationInterface, QueryRunner, TableColumn } from 'typeorm'\n\nconst TABLE = 'twin_command_records'\n\n/** ๊ธ์ ์นธ์ ํ์ โ ๊ฐ์ ์ฑ์ง(์ ํยท์์ ๋ฌธ์์ด)๋ก ์ด๋ฏธ ์ ์๋ค. */\nconst TEXT_SIBLING = 'dispatch_note'\n/** ์ ์นธ์ ํ์ โ ์ ํยท์ ์. */\nconst INT_SIBLING = 'effect_seen'\n\nconst TEXT_COLUMNS = ['dispatch_note_next', 'retry', 'next_attempt_at'] as const\nconst INT_COLUMNS = ['attempts'] as const\n\nexport class AddDispatchRetryColumns1786700000000 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n const table = await queryRunner.getTable(TABLE)\n if (!table) return /* ์ฒซ ๊ธฐ๋ โ ์ํฐํฐ๊ฐ ๋ง๋ ๋ค */\n\n const typeOf = (sibling: string): string | undefined => table.columns.find(c => c.name === sibling)?.type\n\n const textType = typeOf(TEXT_SIBLING)\n const intType = typeOf(INT_SIBLING)\n\n /*\n * ํ์ ๊ฐ ์์ผ๋ฉด **๋ฉ์ถ๋ค.** ์ง์ํ ํ์
์ผ๋ก ์นธ์ ์ธ์ฐ๋ฉด ์ด๋ ๋๋ผ์ด๋ฒ์์ ์ด๊ธ๋๋์ง ๊ฐ๋ฐ์์\n * ์ ์กํ๊ณ , ๊ทธ ๋ฐฐํฌ์์๋ง ๋๋ค.\n */\n if (!textType || !intType) {\n throw new Error(\n `${TABLE} ์์ ํ์ ์นธ์ ๋ชป ์ฐพ์์ต๋๋ค โ ${TEXT_SIBLING}(${textType ?? '์์'}) ยท ` +\n `${INT_SIBLING}(${intType ?? '์์'}). ํ์
์ ์ง์ํ์ง ์๊ณ ๋ฉ์ถฅ๋๋ค`\n )\n }\n\n for (const name of TEXT_COLUMNS) {\n if (table.columns.some(c => c.name === name)) continue\n await queryRunner.addColumn(TABLE, new TableColumn({ name, type: textType, isNullable: true }))\n }\n\n for (const name of INT_COLUMNS) {\n if (table.columns.some(c => c.name === name)) continue\n await queryRunner.addColumn(TABLE, new TableColumn({ name, type: intType, isNullable: true }))\n }\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n const table = await queryRunner.getTable(TABLE)\n if (!table) return\n\n for (const name of [...TEXT_COLUMNS, ...INT_COLUMNS]) {\n if (!table.columns.some(c => c.name === name)) continue\n await queryRunner.dropColumn(TABLE, name)\n }\n }\n}\n"]}
|
|
@@ -11,12 +11,16 @@ const _1786200000000_CarryLiveFeedCursor_js_1 = require("./1786200000000-CarryLi
|
|
|
11
11
|
const _1786300000000_IndexEventTypeByTime_js_1 = require("./1786300000000-IndexEventTypeByTime.js");
|
|
12
12
|
const _1786400000000_IndexEventCreatedAt_js_1 = require("./1786400000000-IndexEventCreatedAt.js");
|
|
13
13
|
const _1786500000000_CreateTwinSubjectEvents_js_1 = require("./1786500000000-CreateTwinSubjectEvents.js");
|
|
14
|
+
const _1786700000000_AddDispatchRetryColumns_js_1 = require("./1786700000000-AddDispatchRetryColumns.js");
|
|
15
|
+
const _1786600000000_RenameOperatoMesAdapterType_js_1 = require("./1786600000000-RenameOperatoMesAdapterType.js");
|
|
14
16
|
exports.migrations = [
|
|
15
17
|
_1786000000000_RenameTwinInstanceBoardToModel_js_1.RenameTwinInstanceBoardToModel1786000000000,
|
|
16
18
|
_1786100000000_PromoteEventActionAndSyncWarnings_js_1.PromoteEventActionAndSyncWarnings1786100000000,
|
|
17
19
|
_1786200000000_CarryLiveFeedCursor_js_1.CarryLiveFeedCursor1786200000000,
|
|
18
20
|
_1786300000000_IndexEventTypeByTime_js_1.IndexEventTypeByTime1786300000000,
|
|
19
21
|
_1786400000000_IndexEventCreatedAt_js_1.IndexEventCreatedAt1786400000000,
|
|
20
|
-
_1786500000000_CreateTwinSubjectEvents_js_1.CreateTwinSubjectEvents1786500000000
|
|
22
|
+
_1786500000000_CreateTwinSubjectEvents_js_1.CreateTwinSubjectEvents1786500000000,
|
|
23
|
+
_1786600000000_RenameOperatoMesAdapterType_js_1.RenameOperatoMesAdapterType1786600000000,
|
|
24
|
+
_1786700000000_AddDispatchRetryColumns_js_1.AddDispatchRetryColumns1786700000000
|
|
21
25
|
];
|
|
22
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/migrations/index.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,wHAA+G;AAC/G,8HAAqH;AACrH,kGAAyF;AACzF,oGAA2F;AAC3F,kGAAyF;AACzF,0GAAiG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/migrations/index.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,wHAA+G;AAC/G,8HAAqH;AACrH,kGAAyF;AACzF,oGAA2F;AAC3F,kGAAyF;AACzF,0GAAiG;AACjG,0GAAiG;AACjG,kHAAyG;AAE5F,QAAA,UAAU,GAAG;IACxB,8FAA2C;IAC3C,oGAA8C;IAC9C,wEAAgC;IAChC,0EAAiC;IACjC,wEAAgC;IAChC,gFAAoC;IACpC,wFAAwC;IACxC,gFAAoC;CACrC,CAAA","sourcesContent":["/*\n * ๋ง์ด๊ทธ๋ ์ด์
๋ฌถ์ โ ํ๋ ์์ํฌ ๊ท์ฝ(`@things-factory/shell` ยท `auth-base` ์ ๊ฐ์ ๋ฐฉ์).\n * ํ์ผ๋ง๋ค ํ๋์ฉ export ํ๊ณ ์ฌ๊ธฐ์ ๋ชจ์ `server/index.ts` ๊ฐ ๋ด๋ณด๋ธ๋ค.\n */\nimport { RenameTwinInstanceBoardToModel1786000000000 } from './1786000000000-RenameTwinInstanceBoardToModel.js'\nimport { PromoteEventActionAndSyncWarnings1786100000000 } from './1786100000000-PromoteEventActionAndSyncWarnings.js'\nimport { CarryLiveFeedCursor1786200000000 } from './1786200000000-CarryLiveFeedCursor.js'\nimport { IndexEventTypeByTime1786300000000 } from './1786300000000-IndexEventTypeByTime.js'\nimport { IndexEventCreatedAt1786400000000 } from './1786400000000-IndexEventCreatedAt.js'\nimport { CreateTwinSubjectEvents1786500000000 } from './1786500000000-CreateTwinSubjectEvents.js'\nimport { AddDispatchRetryColumns1786700000000 } from './1786700000000-AddDispatchRetryColumns.js'\nimport { RenameOperatoMesAdapterType1786600000000 } from './1786600000000-RenameOperatoMesAdapterType.js'\n\nexport const migrations = [\n RenameTwinInstanceBoardToModel1786000000000,\n PromoteEventActionAndSyncWarnings1786100000000,\n CarryLiveFeedCursor1786200000000,\n IndexEventTypeByTime1786300000000,\n IndexEventCreatedAt1786400000000,\n CreateTwinSubjectEvents1786500000000,\n RenameOperatoMesAdapterType1786600000000,\n AddDispatchRetryColumns1786700000000\n]\n"]}
|
package/dist-server/routes.js
CHANGED
|
@@ -17,9 +17,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
* ๋์ **์ฐ๊ฒฐ๋ง๋ค ๋น๋ฐ๊ฐ**์ ๋๊ณ ๊ทธ๊ฒ์ผ๋ก ํ์ธํ๋ค. ๋น๋ฐ๊ฐ์ ์ ์ธํ์ง ์์ ์ฐ๊ฒฐ์ ํ
์ ๋ฐ์ง ์๋๋ค โ
|
|
18
18
|
* ์ธ์ฆ ์๋ ์
๊ตฌ๋ฅผ ์ด์ด ๋๋ ๊ฒ๋ณด๋ค ํ
์ ๋ชป ์ฐ๋ ๊ฒ์ด ๋ซ๋ค.
|
|
19
19
|
*/
|
|
20
|
-
const
|
|
21
|
-
const
|
|
20
|
+
const live_ingest_js_1 = require("./service/reference/live-ingest.js");
|
|
21
|
+
const fill_loop_js_1 = require("./service/reference/fill-loop.js");
|
|
22
22
|
const reference_hook_js_1 = require("./service/reference/reference-hook.js");
|
|
23
|
+
const hook_store_js_1 = require("./service/reference/hook-store.js");
|
|
23
24
|
process.on('bootstrap-module-domain-public-route', (_app, router) => {
|
|
24
25
|
/*
|
|
25
26
|
* ์ฃผ์์ ํธ์๊น์ง ์ ๋๋ค โ ์ด๋ ํธ์์ ๋ฃ์์ง ์ง์ํ์ง ์๋๋ค.
|
|
@@ -40,24 +41,26 @@ process.on('bootstrap-module-domain-public-route', (_app, router) => {
|
|
|
40
41
|
instanceId: String(ctx.params.instanceId ?? ''),
|
|
41
42
|
headers: (ctx.request?.headers ?? {}),
|
|
42
43
|
body: ctx.request?.body,
|
|
44
|
+
/*
|
|
45
|
+
* ๋ฐ์ ๋ฐ์ดํธ ๊ทธ๋๋ก โ ์๋ช
์ ํ์ธํ๋ ค๋ฉด ์ด๊ฒ์ด ์์ด์ผ ํ๋ค. `koa-bodyparser` ๊ฐ ํ์ฑํ ๋ณธ๋ฌธ๊ณผ
|
|
46
|
+
* ํจ๊ป ๋จ๊ฒจ ์ค๋ค. ํ์ฑ๋ณธ์ ๋ค์ ๋ฌธ์์ด๋ก ๋ง๋ค๋ฉด ํค ์์์ ๊ณต๋ฐฑ์ด ๋ฌ๋ผ์ ธ ์๋ช
์ด ๋ง์ง ์๋๋ค.
|
|
47
|
+
*/
|
|
48
|
+
rawBody: typeof ctx.request?.rawBody === 'string' ? ctx.request.rawBody : undefined,
|
|
49
|
+
store: (0, hook_store_js_1.databaseStore)(),
|
|
43
50
|
/*
|
|
44
51
|
* ํด๋ง์ด ์ฐ๋ ๊ธธ์ ๊ทธ๋๋ก ์ด๋ค โ ๊ฒ์ฆ๋ ์ ์
๋ ๊ฐ์ ์๋ฆฌ๋ค. ๊ทธ๋์ ํธ์ ์ชฝ์์๋ ๋ฌผ์ด์ ๋ฐ์
|
|
45
52
|
* ๊ฒ๊ณผ ๋ฐ์ด ๋ฐ์ ๊ฒ์ด ๊ตฌ๋ณ๋์ง ์๋๋ค. ๊ตฌ๋ณ๋๋ ๊ฒ์ ์ ์
์ฅ๋ถ์ `sources` ํ ์ค๋ฟ์ด๋ค.
|
|
46
53
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const undelivered = Math.max(0, accepted.length - applied - duplicates);
|
|
58
|
-
twin_engine_js_1.TwinEngine.recordIngestResult(domain.id, instanceId, records.length, rejected, Date.now(), undelivered);
|
|
59
|
-
return { applied, duplicates, rejected: rejected.length };
|
|
60
|
-
}
|
|
54
|
+
/*
|
|
55
|
+
* ์ ์
๋ชธํต์ `live-ingest.ts` ํ ๊ณณ์ ์๋ค โ backfill ์ด ๊ฐ์ ๊ฒ์ ์ด๋ค. ์ฌ๊ธฐ์ ๋๋ฉด ๋ ๊ธธ์ด
|
|
56
|
+
* ์๋ก ๋ค๋ฅธ ๊ท์น์ผ๋ก ๋ฐ๊ฒ ๋๊ณ , ํ์ชฝ๋ง ์์ ๋๋ ๋ ์ด ์จ๋ค.
|
|
57
|
+
*/
|
|
58
|
+
ingest: (instanceId, records) => (0, live_ingest_js_1.liveIngest)(domain.id, instanceId, records, 'hook'),
|
|
59
|
+
/*
|
|
60
|
+
* ๊ตฌ๋ฉ์ ๋ณธ ๊ทธ ์๋ฆฌ์์ ๋ฐ๋ก ๋ฐ๋๋ค โ ๋ฒํธ๊ฐ ๋น์๋ค๋ ๊ฒ์ ์๋ ๊ฐ์ฅ ์ด๋ฅธ ์๊ฐ์ด๋ค.
|
|
61
|
+
* ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค(ยง`requestFill`): ํ
์ ์๋ต์ด ๋ฆ์ผ๋ฉด ๋ณด๋ด๋ ์ชฝ์ด ๋ํ์ดํ๋ค.
|
|
62
|
+
*/
|
|
63
|
+
onGap: scope => (0, fill_loop_js_1.requestFill)(domain.id, String(ctx.params.instanceId ?? ''), scope)
|
|
61
64
|
});
|
|
62
65
|
ctx.status = outcome.status;
|
|
63
66
|
ctx.body = outcome.body;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,uEAA+D;AAC/D,mEAA8D;AAC9D,6EAAkE;AAClE,qEAAiE;AAEjE,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,IAAS,EAAE,MAAW,EAAE,EAAE;IACnF;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,EAAE,GAAQ,EAAE,EAAE;QAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,MAAM,CAAA;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,MAAM,GAAG,GAAG,CAAA;YAChB,GAAG,CAAC,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAA;YACpD,OAAM;QACR,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAA,8BAAU,EAAC;YAC/B,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YAC/C,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAA4B;YAChE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI;YACvB;;;eAGG;YACH,OAAO,EAAE,OAAO,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACnF,KAAK,EAAE,IAAA,6BAAa,GAAE;YACtB;;;eAGG;YACH;;;eAGG;YACH,MAAM,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC,IAAA,2BAAU,EAAC,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC;YACnF;;;eAGG;YACH,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,0BAAW,EAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;SACnF,CAAC,CAAA;QACF,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC3B,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,2DAA2D;AAC3D,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,IAAS,EAAE,OAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;AAC1F,OAAO,CAAC,EAAE,CAAC,uCAA8C,EAAE,CAAC,IAAS,EAAE,OAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA;AAC3F,OAAO,CAAC,EAAE,CAAC,uCAA8C,EAAE,CAAC,IAAS,EAAE,OAAY,EAAE,EAAE,GAAE,CAAC,CAAC,CAAA","sourcesContent":["/*\n * ์ด ํจํค์ง๊ฐ ์ฌ๋ HTTP ์๋ฆฌ โ ์ง๊ธ์ ์นํ
ํ๋๋ค.\n *\n * โโ ์ ์ฌ๊ธฐ์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ปค๋ฅํฐ๋ ์ฃผ์๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ํฐ ๊ณ์ฝ์ ์ฃผ์๋ฅผ ๋ฑ๋กํ๋ ์๋ฆฌ๊ฐ ์๊ณ , ์์ด์๋ ์ ๋๋ค โ ์ฃผ์๋\n * ์ฑ์ ๊ฒ์ด๊ณ ์ปค๋ฅํฐ๋ง๋ค ์ ๊ฐ๊ธฐ ์ด๋ฉด ์ธ์ฆ๋ ์ ๊ฐ๊ธฐ๊ฐ ๋๋ค.\n *\n * ๊ทธ๋์ ์
๊ตฌ๋ **ํ๋**๋ค. ์ด๋ ์ฐ๊ฒฐ์ ๊ฒ์ธ์ง๋ ์ฃผ์์ ์ด๋ฆ์ผ๋ก ๊ฐ๋ ค๋ด๊ณ , ๋ณธ๋ฌธ์ ์ฐ๋ฆฌ ์ดํ๋ก ์ฎ๊ธฐ๋\n * ๊ฒ์ ๊ทธ ์ฐ๊ฒฐ์ ์ปค๋ฅํฐ๊ฐ ํ๋ค(ยง`reference-hook`).\n *\n * โโ ์ ๋๋ฉ์ธ ๊ณต๊ฐ ๋ผ์ฐํฐ์ธ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๋ฐ์ด ์ฃผ๋ ์ชฝ์ ์ฌ๋์ด ์๋๋ค. ์ฌ๋ ์ธ์ฆ(JWT)์ ์๊ตฌํ๋ฉด ์ฐ๊ฒฐ๋ ์์คํ
์ด ์ฐ๋ฆฌ ํ ํฐ์ ๋ฐ๊ธ๋ฐ์\n * ๊ฐฑ์ ํ๋ฉฐ ๊ด๋ฆฌํด์ผ ํ๊ณ , ๋๋ถ๋ถ์ ํ์ฅ์์ ๊ทธ๊ฒ ๋๋ฌธ์ ์ฐ๋์ด ์์ง ์๋๋ค.\n *\n * ๋์ **์ฐ๊ฒฐ๋ง๋ค ๋น๋ฐ๊ฐ**์ ๋๊ณ ๊ทธ๊ฒ์ผ๋ก ํ์ธํ๋ค. ๋น๋ฐ๊ฐ์ ์ ์ธํ์ง ์์ ์ฐ๊ฒฐ์ ํ
์ ๋ฐ์ง ์๋๋ค โ\n * ์ธ์ฆ ์๋ ์
๊ตฌ๋ฅผ ์ด์ด ๋๋ ๊ฒ๋ณด๋ค ํ
์ ๋ชป ์ฐ๋ ๊ฒ์ด ๋ซ๋ค.\n */\nimport { liveIngest } from './service/reference/live-ingest.js'\nimport { requestFill } from './service/reference/fill-loop.js'\nimport { handleHook } from './service/reference/reference-hook.js'\nimport { databaseStore } from './service/reference/hook-store.js'\n\nprocess.on('bootstrap-module-domain-public-route' as any, (_app: any, router: any) => {\n /*\n * ์ฃผ์์ ํธ์๊น์ง ์ ๋๋ค โ ์ด๋ ํธ์์ ๋ฃ์์ง ์ง์ํ์ง ์๋๋ค.\n *\n * ํ ์ฐ๊ฒฐ์ด ์ฌ๋ฌ ์ฌ์ดํธ๋ฅผ ๋ง๋ค๋ฉด ํธ์๋ ์ฌ๋ฟ์ด๋ค. ๋ณธ๋ฌธ์ ๋ณด๊ณ ๊ณ ๋ฅด๊ฒ ํ๋ฉด ๊ทธ ํ๋จ์ด ์ปค๋ฅํฐ๋ง๋ค\n * ๋ฌ๋ผ์ง๊ณ , ํ๋ฆฌ๋ฉด ๋ค๋ฅธ ๊ณต์ฅ์ ์ฌ์ค์ด ์ด ๊ณต์ฅ์ ๋ค์ด๊ฐ๋ค. ์ฃผ์๊ฐ ๋งํ๊ฒ ํ๋ฉด ๊ทธ ์ผ์ด ์๋ค.\n */\n router.post('/twin/hook/:source/:instanceId', async (ctx: any) => {\n const domain = ctx.state?.domain\n if (!domain) {\n ctx.status = 400\n ctx.body = { ok: false, error: 'no domain context' }\n return\n }\n const outcome = await handleHook({\n domainId: domain.id,\n source: String(ctx.params.source ?? ''),\n instanceId: String(ctx.params.instanceId ?? ''),\n headers: (ctx.request?.headers ?? {}) as Record<string, unknown>,\n body: ctx.request?.body,\n /*\n * ๋ฐ์ ๋ฐ์ดํธ ๊ทธ๋๋ก โ ์๋ช
์ ํ์ธํ๋ ค๋ฉด ์ด๊ฒ์ด ์์ด์ผ ํ๋ค. `koa-bodyparser` ๊ฐ ํ์ฑํ ๋ณธ๋ฌธ๊ณผ\n * ํจ๊ป ๋จ๊ฒจ ์ค๋ค. ํ์ฑ๋ณธ์ ๋ค์ ๋ฌธ์์ด๋ก ๋ง๋ค๋ฉด ํค ์์์ ๊ณต๋ฐฑ์ด ๋ฌ๋ผ์ ธ ์๋ช
์ด ๋ง์ง ์๋๋ค.\n */\n rawBody: typeof ctx.request?.rawBody === 'string' ? ctx.request.rawBody : undefined,\n store: databaseStore(),\n /*\n * ํด๋ง์ด ์ฐ๋ ๊ธธ์ ๊ทธ๋๋ก ์ด๋ค โ ๊ฒ์ฆ๋ ์ ์
๋ ๊ฐ์ ์๋ฆฌ๋ค. ๊ทธ๋์ ํธ์ ์ชฝ์์๋ ๋ฌผ์ด์ ๋ฐ์\n * ๊ฒ๊ณผ ๋ฐ์ด ๋ฐ์ ๊ฒ์ด ๊ตฌ๋ณ๋์ง ์๋๋ค. ๊ตฌ๋ณ๋๋ ๊ฒ์ ์ ์
์ฅ๋ถ์ `sources` ํ ์ค๋ฟ์ด๋ค.\n */\n /*\n * ์ ์
๋ชธํต์ `live-ingest.ts` ํ ๊ณณ์ ์๋ค โ backfill ์ด ๊ฐ์ ๊ฒ์ ์ด๋ค. ์ฌ๊ธฐ์ ๋๋ฉด ๋ ๊ธธ์ด\n * ์๋ก ๋ค๋ฅธ ๊ท์น์ผ๋ก ๋ฐ๊ฒ ๋๊ณ , ํ์ชฝ๋ง ์์ ๋๋ ๋ ์ด ์จ๋ค.\n */\n ingest: (instanceId, records) => liveIngest(domain.id, instanceId, records, 'hook'),\n /*\n * ๊ตฌ๋ฉ์ ๋ณธ ๊ทธ ์๋ฆฌ์์ ๋ฐ๋ก ๋ฐ๋๋ค โ ๋ฒํธ๊ฐ ๋น์๋ค๋ ๊ฒ์ ์๋ ๊ฐ์ฅ ์ด๋ฅธ ์๊ฐ์ด๋ค.\n * ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค(ยง`requestFill`): ํ
์ ์๋ต์ด ๋ฆ์ผ๋ฉด ๋ณด๋ด๋ ์ชฝ์ด ๋ํ์ดํ๋ค.\n */\n onGap: scope => requestFill(domain.id, String(ctx.params.instanceId ?? ''), scope)\n })\n ctx.status = outcome.status\n ctx.body = outcome.body\n })\n})\n\n/* ๋๋จธ์ง ์
์ ์ด ํจํค์ง๊ฐ ์ฐ์ง ์๋๋ค โ ์๋ฆฌ๋ ๋จ๊ฒจ ๋๋ค(๋ค๋ฅธ ๋ชจ๋์ด ๊ฐ์ ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค). */\nprocess.on('bootstrap-module-global-public-route' as any, (_app: any, _router: any) => {})\nprocess.on('bootstrap-module-global-private-route' as any, (_app: any, _router: any) => {})\nprocess.on('bootstrap-module-domain-private-route' as any, (_app: any, _router: any) => {})\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { StoredCommand } from './command-dispatcher.js';
|
|
2
|
+
import type { TwinNow } from './twin-now.js';
|
|
3
|
+
/**
|
|
4
|
+
* AI ๊ฐ ์ด๋ค ํ๋๋ฅผ ๋๋ โ **์ธ ๊ฐ๋์ฌ์ผ ํ๋ค.**
|
|
5
|
+
*
|
|
6
|
+
* ใ๋ชจ๋ฅด๊ฒ ๋คใ๊ฐ ์์ผ๋ฉด ๋ชจ๋ฅผ ๋ ๋์๋ก ๋ตํ๋ค. ๊ทธ๋ฆฌ๊ณ ์น์ธ์๊ฐ ๊ทธ๊ฒ์ ใAI ๊ฐ ๊ด์ฐฎ๋ค๊ณ ํ๋คใ๋ก ์ฝ๋๋ค.
|
|
7
|
+
* ์๋ ์น์ธ ํธํฅ์ด ๊ฑฐ๊ธฐ์ ์์ํ๋ค.
|
|
8
|
+
*/
|
|
9
|
+
export type AdvisorStance = 'object' | 'concur' | 'unsure';
|
|
10
|
+
export interface AdvisorOpinion {
|
|
11
|
+
stance: AdvisorStance;
|
|
12
|
+
/** ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ฅ. AI ๊ฐ ์ด ๊ทธ๋๋ก โ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฌ์ง ์๋๋ค(๋ค๋ฌ์ผ๋ฉด ๋๊ฐ ๋งํ ๊ฒ์ธ์ง ํ๋ ค์ง๋ค). */
|
|
13
|
+
text: string;
|
|
14
|
+
/** ๋ฌด์์ ๋ณด๊ณ ๋งํ๋ โ ์ฃผ์ ์๋ณ์ยท๊ฐ. ์น์ธ์๊ฐ ๊ทผ๊ฑฐ๋ฅผ ๋์ง์ ์ ์๊ฒ. */
|
|
15
|
+
basis?: string[];
|
|
16
|
+
}
|
|
17
|
+
/** ์๊ฒฌ์ ๋ด๋ ์๋ฆฌ โ ์ฑ์ด ์ฑ์ด๋ค(headless-twin ์ `twin-ai` ๋ฅผ ๋ถ๋ฅด์ง ์๋๋ค). */
|
|
18
|
+
export interface ActuationAdvisor {
|
|
19
|
+
/** ํ๋ฉด์ด ์ถ์ฒ๋ฅผ ๋งํด์ผ ํ๋ค โ ใAI ์๊ฒฌใ. ์ฌ๋์ ์๊ฒฌ๊ณผ ์์ด๋ฉด ์ ๋๋ค. */
|
|
20
|
+
label: string;
|
|
21
|
+
/**
|
|
22
|
+
* ์ด ์กฐ์น์ ๋ํด ํ๋ง๋.
|
|
23
|
+
*
|
|
24
|
+
* ์คํจยท์๊ฐ์ด๊ณผ๋ฉด `undefined` ๋ฅผ ๋๋ ค์ค๋ค. ์ง์ด๋ด์ง ์๋๋ค.
|
|
25
|
+
*/
|
|
26
|
+
advise(input: {
|
|
27
|
+
command: StoredCommand;
|
|
28
|
+
twinNow: TwinNow;
|
|
29
|
+
locale?: string;
|
|
30
|
+
}): Promise<AdvisorOpinion | undefined>;
|
|
31
|
+
}
|
|
32
|
+
/** ์ฑ์ด ๋ถํ
์์ ํ ๋ฒ ๋ถ๋ฅธ๋ค. */
|
|
33
|
+
export declare function setActuationAdvisor(next: ActuationAdvisor): void;
|
|
34
|
+
export declare function actuationAdvisor(): ActuationAdvisor | undefined;
|
|
35
|
+
/** ์๊ฒฌ์ ๋ฌผ์ ๊ฒฐ๊ณผ โ **์์๋ ์ฌ์ค์ด๋ค.** */
|
|
36
|
+
export interface AdvisorResult {
|
|
37
|
+
/** ๋๊ฐ ๋งํ๋. ์์ผ๋ฉด ์๋ฌด๋ ๋งํ์ง ์์๋ค. */
|
|
38
|
+
by?: string;
|
|
39
|
+
opinion?: AdvisorOpinion;
|
|
40
|
+
/**
|
|
41
|
+
* ์๊ฒฌ์ด ์์ผ๋ฉด ์ ์๋.
|
|
42
|
+
*
|
|
43
|
+
* ๋น์นธ์ ใAI ๊ฐ ๋ฐ๋ํ์ง ์์๋คใ๋ก ์ฝ์ผ๋ฉด ์ ๋๋ค. ํ๋ฉด์ด ์ด ๋ฌธ์ฅ์ ๊ทธ๋๋ก ๋ณด์ฌ์ผ ํ๋ค.
|
|
44
|
+
*/
|
|
45
|
+
absent?: string;
|
|
46
|
+
}
|
|
47
|
+
/** ๋ช ์ด๊น์ง ๊ธฐ๋ค๋ฆฌ๋ โ ์น์ธ ํ๋ฉด์ด ์ด๊ฒ ๋๋ฌธ์ ์ ์ด๋ฆฌ๋ฉด ์ ๋๋ค. */
|
|
48
|
+
export declare const ADVISOR_BUDGET_MS = 8000;
|
|
49
|
+
/**
|
|
50
|
+
* ์๊ฒฌ์ ๋ฌป๋๋ค โ **์์ผ๋ฉด ์๋ค๊ณ ๋ตํ๋ค.**
|
|
51
|
+
*
|
|
52
|
+
* ์คํจ๋ฅผ ์ผํค์ง ์๋๋ค. AI ๊ฐ ์ฃฝ์ด ์์ด์ ์๊ฒฌ์ด ์๋ ๊ฒ๊ณผ AI ๊ฐ ๋ฐ๋ํ ๊ฒ์ด ์์ด์ ์กฐ์ฉํ ๊ฒ์ ๋ค๋ฅธ
|
|
53
|
+
* ์ฌ์ค์ด๊ณ , ์น์ธํ๋ ์ฌ๋์๊ฒ ๊ทธ ์ฐจ์ด๊ฐ ํฌ๋ค.
|
|
54
|
+
*/
|
|
55
|
+
export declare function askAdvisor(args: {
|
|
56
|
+
command: StoredCommand;
|
|
57
|
+
twinNow: TwinNow;
|
|
58
|
+
locale?: string;
|
|
59
|
+
budgetMs?: number;
|
|
60
|
+
}): Promise<AdvisorResult>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ADVISOR_BUDGET_MS = void 0;
|
|
4
|
+
exports.setActuationAdvisor = setActuationAdvisor;
|
|
5
|
+
exports.actuationAdvisor = actuationAdvisor;
|
|
6
|
+
exports.askAdvisor = askAdvisor;
|
|
7
|
+
let advisor;
|
|
8
|
+
/** ์ฑ์ด ๋ถํ
์์ ํ ๋ฒ ๋ถ๋ฅธ๋ค. */
|
|
9
|
+
function setActuationAdvisor(next) {
|
|
10
|
+
advisor = next;
|
|
11
|
+
}
|
|
12
|
+
function actuationAdvisor() {
|
|
13
|
+
return advisor;
|
|
14
|
+
}
|
|
15
|
+
/** ๋ช ์ด๊น์ง ๊ธฐ๋ค๋ฆฌ๋ โ ์น์ธ ํ๋ฉด์ด ์ด๊ฒ ๋๋ฌธ์ ์ ์ด๋ฆฌ๋ฉด ์ ๋๋ค. */
|
|
16
|
+
exports.ADVISOR_BUDGET_MS = 8_000;
|
|
17
|
+
/**
|
|
18
|
+
* ์๊ฒฌ์ ๋ฌป๋๋ค โ **์์ผ๋ฉด ์๋ค๊ณ ๋ตํ๋ค.**
|
|
19
|
+
*
|
|
20
|
+
* ์คํจ๋ฅผ ์ผํค์ง ์๋๋ค. AI ๊ฐ ์ฃฝ์ด ์์ด์ ์๊ฒฌ์ด ์๋ ๊ฒ๊ณผ AI ๊ฐ ๋ฐ๋ํ ๊ฒ์ด ์์ด์ ์กฐ์ฉํ ๊ฒ์ ๋ค๋ฅธ
|
|
21
|
+
* ์ฌ์ค์ด๊ณ , ์น์ธํ๋ ์ฌ๋์๊ฒ ๊ทธ ์ฐจ์ด๊ฐ ํฌ๋ค.
|
|
22
|
+
*/
|
|
23
|
+
async function askAdvisor(args) {
|
|
24
|
+
const a = advisor;
|
|
25
|
+
if (!a)
|
|
26
|
+
return { absent: 'AI ์๊ฒฌ์ ๋ด๋ ์๋ฆฌ๊ฐ ์ค์น๋์ง ์์์ต๋๋ค' };
|
|
27
|
+
const budget = args.budgetMs ?? exports.ADVISOR_BUDGET_MS;
|
|
28
|
+
let timer;
|
|
29
|
+
try {
|
|
30
|
+
const opinion = await Promise.race([
|
|
31
|
+
a.advise({ command: args.command, twinNow: args.twinNow, ...(args.locale ? { locale: args.locale } : {}) }),
|
|
32
|
+
new Promise(resolve => {
|
|
33
|
+
timer = setTimeout(() => resolve(TIMED_OUT), budget);
|
|
34
|
+
})
|
|
35
|
+
]);
|
|
36
|
+
if (opinion === TIMED_OUT) {
|
|
37
|
+
return { by: a.label, absent: `${Math.round(budget / 1000)}์ด ์์ ๋ต์ด ์ค์ง ์์์ต๋๋ค` };
|
|
38
|
+
}
|
|
39
|
+
if (!opinion?.text?.trim())
|
|
40
|
+
return { by: a.label, absent: 'AI ๊ฐ ํ ๋ง์ด ์๋ค๊ณ ๋ตํ์ต๋๋ค' };
|
|
41
|
+
return { by: a.label, opinion };
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
return { by: a.label, absent: `์๊ฒฌ์ ๋ฐ์ง ๋ชปํ์ต๋๋ค โ ${String(e?.message ?? e)}` };
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
if (timer)
|
|
48
|
+
clearTimeout(timer);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** ์๊ฐ์ด๊ณผ๋ฅผ ๊ฐ์ผ๋ก ๊ตฌ๋ณํ๋ค โ `undefined` ๋ก ๋๋ฉด ใํ ๋ง ์์ใ๊ณผ ์์ธ๋ค. */
|
|
52
|
+
const TIMED_OUT = Symbol('advisor-timeout');
|
|
53
|
+
//# sourceMappingURL=actuation-advisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actuation-advisor.js","sourceRoot":"","sources":["../../../server/service/actuation/actuation-advisor.ts"],"names":[],"mappings":";;;AA4DA,kDAEC;AAED,4CAEC;AAwBD,gCA8BC;AA/DD,IAAI,OAAqC,CAAA;AAEzC,uBAAuB;AACvB,SAAgB,mBAAmB,CAAC,IAAsB;IACxD,OAAO,GAAG,IAAI,CAAA;AAChB,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,OAAO,CAAA;AAChB,CAAC;AAeD,6CAA6C;AAChC,QAAA,iBAAiB,GAAG,KAAK,CAAA;AAEtC;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAAC,IAKhC;IACC,MAAM,CAAC,GAAG,OAAO,CAAA;IACjB,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAA;IAErD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,IAAI,yBAAiB,CAAA;IACjD,IAAI,KAAU,CAAA;IACd,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACjC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3G,IAAI,OAAO,CAAY,OAAO,CAAC,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAgB,CAAC,EAAE,MAAM,CAAC,CAAA;YAC7D,CAAC,CAAC;SACH,CAAC,CAAA;QAEF,IAAK,OAAe,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAChF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAA;QAEjF,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAA;IACjC,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,EAAE,CAAA;IAC7E,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAA","sourcesContent":["/*\n * **AI ๊ฐ ์๊ฒฌ์ ๋ด๋ ์๋ฆฌ** โ ํ์ ์ด ์๋๋ผ ๋ฐ์ธ.\n *\n * โโ ์ ํ์ํ๊ฐ (2026-09-01, ์ฌ์ฉ์ ์ง์ ) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ฌ์ฉ์๊ฐ ๋ฌผ์๋ค โ ใAI ์์ ์ ๊ฒฐ์ฌ/์น์ธ์ ๋ด๋น์ด ๋ ์ ์๋. ์ต์ํ ์๊ฒฌ์ ์์๋ผ๋ ๋ ์ ์์ง ์๋.ใ\n *\n * ์น์ธ์๋ ์ ๋๋ค. ์น์ธ ๊ธฐ๋ก์ ๊ฐ์ด์น๋ ์ฌ๊ณ ๋ค์ **์ฑ
์์ ๋ฌผ์ ์ ์๋ ๊ฒ**์ด๊ณ , ใAI ๊ฐ ์น์ธํ๋คใ๋ก๋\n * ์๋ฌด์๊ฒ๋ ๋ฌป์ง ๋ชปํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ธ ์ชฝ์ด ์น์ธํ๋ฉด ๋ ์ฌ๋์ด ์๋๋ค โ ์๊ธฐ ์น์ธ์ ๋ง๋ ๊ท์น๊ณผ ๊ฐ์ ์ด์ ๋ค.\n *\n * ์๊ฒฌ์ ๋ด์ผ ํ๋ค. `twinNow` ๋ก ใ๋๊ธ ๋๊ธฐ๊ฐ ์ฌ์ฏ ๋ฐฐ๋คใ๋ ์ฌ์ค์ ์น์ธ ํ๋ฉด์ ์ค์์ง๋ง, ๊ทธ๊ฑด ๊ณ์ฐ๊ฐ์ด๋ค.\n * ใ๊ทธ๋ฌ๋ ๋ ๋ง๋ค๋ฉด ๋๊ธฐ๊ฐ ๋์ด๋๋คใ๊ฐ ์๊ฒฌ์ด๊ณ ๊ทธ ์๋ฆฌ๊ฐ ์์๋ค.\n *\n * โโ ์ธ์ ๋ฌป๋ โ ์น์ธ ํ๋ฉด์ ์ด ๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ฒฐ์ฌ์ ์ ์ฌ๋ฆด ๋ ๋ฌป์ง ์๋๋ค. ๊ทธ ์๋ฆฌ๋ ํธ๋์ญ์
์์ด๊ณ (`raiseTwinCommand` ์ `@transaction`),\n * ๊ฑฐ๊ธฐ์ LLM ์ ๊ธฐ๋ค๋ฆฌ๋ฉด **DB ์ฐ๊ฒฐ ํ๋๋ฅผ ๋ช ์ด ๋ถ์ก๋๋ค**(sqlite ๋ ์ฐ๊ฒฐ์ด ํ๋๋ค).\n *\n * ๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ ์ด ๋ ๋ฌป๋ ๊ฒ์ด ๋ ์ณ๋ค. ์น์ธํ๋ ์ฌ๋์ **์ง๊ธ** ํ๋จํ๊ณ , ์ฌ๋ฆฐ ์๊ฐ์ ์๊ฒฌ์ ๋ก์๋ค.\n *\n * โโ ํ์ ์ ์ฐ์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ด ๊ฐ์ ์ฝ์ด ๋ฌด์์ ๋ง๋ ์ฝ๋๊ฐ ์๋ค. ์น์ธยท๊ฑฐ์ ์ ์ฌ๋์ด ํ๋ค. AI ๊ฐ ๋ฐ๋ํด๋ ์น์ธ๋๊ณ , ๋์ํด๋\n * ๊ฑฐ์ ๋๋ค. ๊ทธ ์ฌ์ค์ด ์ฝ๋์ ๋๋ฌ๋ ์์ด์ผ ํ๋ค โ ํ์ ์ ์ฐ๋ฉด AI ๊ฐ ์ฌ์ค์ ์น์ธ์๊ฐ ๋๋ค.\n */\nimport type { StoredCommand } from './command-dispatcher.js'\nimport type { TwinNow } from './twin-now.js'\n\n/**\n * AI ๊ฐ ์ด๋ค ํ๋๋ฅผ ๋๋ โ **์ธ ๊ฐ๋์ฌ์ผ ํ๋ค.**\n *\n * ใ๋ชจ๋ฅด๊ฒ ๋คใ๊ฐ ์์ผ๋ฉด ๋ชจ๋ฅผ ๋ ๋์๋ก ๋ตํ๋ค. ๊ทธ๋ฆฌ๊ณ ์น์ธ์๊ฐ ๊ทธ๊ฒ์ ใAI ๊ฐ ๊ด์ฐฎ๋ค๊ณ ํ๋คใ๋ก ์ฝ๋๋ค.\n * ์๋ ์น์ธ ํธํฅ์ด ๊ฑฐ๊ธฐ์ ์์ํ๋ค.\n */\nexport type AdvisorStance = 'object' | 'concur' | 'unsure'\n\nexport interface AdvisorOpinion {\n stance: AdvisorStance\n /** ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ฅ. AI ๊ฐ ์ด ๊ทธ๋๋ก โ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฌ์ง ์๋๋ค(๋ค๋ฌ์ผ๋ฉด ๋๊ฐ ๋งํ ๊ฒ์ธ์ง ํ๋ ค์ง๋ค). */\n text: string\n /** ๋ฌด์์ ๋ณด๊ณ ๋งํ๋ โ ์ฃผ์ ์๋ณ์ยท๊ฐ. ์น์ธ์๊ฐ ๊ทผ๊ฑฐ๋ฅผ ๋์ง์ ์ ์๊ฒ. */\n basis?: string[]\n}\n\n/** ์๊ฒฌ์ ๋ด๋ ์๋ฆฌ โ ์ฑ์ด ์ฑ์ด๋ค(headless-twin ์ `twin-ai` ๋ฅผ ๋ถ๋ฅด์ง ์๋๋ค). */\nexport interface ActuationAdvisor {\n /** ํ๋ฉด์ด ์ถ์ฒ๋ฅผ ๋งํด์ผ ํ๋ค โ ใAI ์๊ฒฌใ. ์ฌ๋์ ์๊ฒฌ๊ณผ ์์ด๋ฉด ์ ๋๋ค. */\n label: string\n /**\n * ์ด ์กฐ์น์ ๋ํด ํ๋ง๋.\n *\n * ์คํจยท์๊ฐ์ด๊ณผ๋ฉด `undefined` ๋ฅผ ๋๋ ค์ค๋ค. ์ง์ด๋ด์ง ์๋๋ค.\n */\n advise(input: {\n command: StoredCommand\n twinNow: TwinNow\n locale?: string\n }): Promise<AdvisorOpinion | undefined>\n}\n\nlet advisor: ActuationAdvisor | undefined\n\n/** ์ฑ์ด ๋ถํ
์์ ํ ๋ฒ ๋ถ๋ฅธ๋ค. */\nexport function setActuationAdvisor(next: ActuationAdvisor): void {\n advisor = next\n}\n\nexport function actuationAdvisor(): ActuationAdvisor | undefined {\n return advisor\n}\n\n/** ์๊ฒฌ์ ๋ฌผ์ ๊ฒฐ๊ณผ โ **์์๋ ์ฌ์ค์ด๋ค.** */\nexport interface AdvisorResult {\n /** ๋๊ฐ ๋งํ๋. ์์ผ๋ฉด ์๋ฌด๋ ๋งํ์ง ์์๋ค. */\n by?: string\n opinion?: AdvisorOpinion\n /**\n * ์๊ฒฌ์ด ์์ผ๋ฉด ์ ์๋.\n *\n * ๋น์นธ์ ใAI ๊ฐ ๋ฐ๋ํ์ง ์์๋คใ๋ก ์ฝ์ผ๋ฉด ์ ๋๋ค. ํ๋ฉด์ด ์ด ๋ฌธ์ฅ์ ๊ทธ๋๋ก ๋ณด์ฌ์ผ ํ๋ค.\n */\n absent?: string\n}\n\n/** ๋ช ์ด๊น์ง ๊ธฐ๋ค๋ฆฌ๋ โ ์น์ธ ํ๋ฉด์ด ์ด๊ฒ ๋๋ฌธ์ ์ ์ด๋ฆฌ๋ฉด ์ ๋๋ค. */\nexport const ADVISOR_BUDGET_MS = 8_000\n\n/**\n * ์๊ฒฌ์ ๋ฌป๋๋ค โ **์์ผ๋ฉด ์๋ค๊ณ ๋ตํ๋ค.**\n *\n * ์คํจ๋ฅผ ์ผํค์ง ์๋๋ค. AI ๊ฐ ์ฃฝ์ด ์์ด์ ์๊ฒฌ์ด ์๋ ๊ฒ๊ณผ AI ๊ฐ ๋ฐ๋ํ ๊ฒ์ด ์์ด์ ์กฐ์ฉํ ๊ฒ์ ๋ค๋ฅธ\n * ์ฌ์ค์ด๊ณ , ์น์ธํ๋ ์ฌ๋์๊ฒ ๊ทธ ์ฐจ์ด๊ฐ ํฌ๋ค.\n */\nexport async function askAdvisor(args: {\n command: StoredCommand\n twinNow: TwinNow\n locale?: string\n budgetMs?: number\n}): Promise<AdvisorResult> {\n const a = advisor\n if (!a) return { absent: 'AI ์๊ฒฌ์ ๋ด๋ ์๋ฆฌ๊ฐ ์ค์น๋์ง ์์์ต๋๋ค' }\n\n const budget = args.budgetMs ?? ADVISOR_BUDGET_MS\n let timer: any\n try {\n const opinion = await Promise.race([\n a.advise({ command: args.command, twinNow: args.twinNow, ...(args.locale ? { locale: args.locale } : {}) }),\n new Promise<undefined>(resolve => {\n timer = setTimeout(() => resolve(TIMED_OUT as any), budget)\n })\n ])\n\n if ((opinion as any) === TIMED_OUT) {\n return { by: a.label, absent: `${Math.round(budget / 1000)}์ด ์์ ๋ต์ด ์ค์ง ์์์ต๋๋ค` }\n }\n if (!opinion?.text?.trim()) return { by: a.label, absent: 'AI ๊ฐ ํ ๋ง์ด ์๋ค๊ณ ๋ตํ์ต๋๋ค' }\n\n return { by: a.label, opinion }\n } catch (e: any) {\n return { by: a.label, absent: `์๊ฒฌ์ ๋ฐ์ง ๋ชปํ์ต๋๋ค โ ${String(e?.message ?? e)}` }\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\n/** ์๊ฐ์ด๊ณผ๋ฅผ ๊ฐ์ผ๋ก ๊ตฌ๋ณํ๋ค โ `undefined` ๋ก ๋๋ฉด ใํ ๋ง ์์ใ๊ณผ ์์ธ๋ค. */\nconst TIMED_OUT = Symbol('advisor-timeout')\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { StoredCommand } from './command-dispatcher.js';
|
|
2
|
+
/** ์น์ธํ ์ฌ๋์๊ฒ ๋๋ ค์ค ๊ฒ โ ํ๋ฉด์ด ๊ฒน์ณ ๋ณผ ๊ฒ์ด ์๊ฒ ํ์ ๊น์ง ๋ธ๋ค. */
|
|
3
|
+
export interface ActuationOutcome {
|
|
4
|
+
id: string;
|
|
5
|
+
/** proposed ยท approved ยท dispatching ยท acked ยท failed ยท rejected. */
|
|
6
|
+
state: string;
|
|
7
|
+
/** ์ ์ชฝ์ด ์ค ์ด๋ฆ โ ๋๊ฐ์ ๋๋ง. ์์ผ๋ฉด ๋ฌด์์ ๋๋๋ฆด์ง ์ง๋ชฉํ ์ ์๋ค. */
|
|
8
|
+
dispatchRef?: string;
|
|
9
|
+
/** ๋ชป ๋๊ฐ ์ฌ์ โ ์ ์ชฝ ๋ฌธ์ฅ ๊ทธ๋๋ก. */
|
|
10
|
+
error?: string;
|
|
11
|
+
/** ์ ์ชฝ์ด ๋ฐ์ผ๋ฉด์ ๋ง๋ถ์ธ ๋ง โ **์คํจ๊ฐ ์๋๋ค.** ์์ธ ์ชฝ ๋ฌธ์ฅ. */
|
|
12
|
+
note?: string;
|
|
13
|
+
/**
|
|
14
|
+
* ๊ทธ ๋ง ์ค **๋ค์์ ํ ์ผ** ํ ์ค.
|
|
15
|
+
*
|
|
16
|
+
* ์ ๋๋ก ์ค๋: ์ฝ๋ ์ฌ๋์ ใ๊ทธ๋์ ๋ด๊ฐ ๋ญ ํด์ผ ํ๋ใ๋ฅผ ๋จผ์ ์ฐพ๋๋ค(UX ๋ ์ธ). ํ ๋ฌธ์ฅ์ผ๋ก
|
|
17
|
+
* ์ฃผ๋ฉด ํ๋ฉด์ด ์๋ฅด๊ฒ ๋๊ณ , **์๋ฅด๋ ๊ท์น์ด ํ๋ฉด๋ง๋ค ์๊ธด๋ค.** ์ด๋ํฐ๊ฐ ์ด๋ฏธ ๋๋ก ์๊ณ ์์ผ๋
|
|
18
|
+
* ๋ถ์ด์ง ์๊ณ ๊ทธ๋๋ก ๋๋ฅธ๋ค.
|
|
19
|
+
*
|
|
20
|
+
* ์ด๋ํฐ๊ฐ ์์ง ๊ฐ๋ผ ์ฃผ์ง ์์ผ๋ฉด **๋น์ด ์๋ค.** ๊ทธ๋ `note` ๋ ๋ ๋ฌธ์ฅ์ด ๋ถ์ ํ ๋ฉ์ด์ด๊ณ ,
|
|
21
|
+
* ํ๋ฉด์ ๊ทธ๊ฒ์ ํต์งธ๋ก ๊ทธ๋ ค์ผ ํ๋ค โ ํ์ฑํด์ ๋๋๋ฉด ์ด๋ํฐ๊ฐ ๊ฐ๋ผ ์ฃผ๋ ๋ ์กฐ์ฉํ ๊นจ์ง๋ค.
|
|
22
|
+
*/
|
|
23
|
+
noteNext?: string;
|
|
24
|
+
/** ์์ฒ์ด ๋ณด๊ณ ํ ์ํ โ ๋ฑ๋ง ๊ทธ๋๋ก. */
|
|
25
|
+
effectStatus?: string;
|
|
26
|
+
/** ๊ทธ ๋ณด๊ณ ๋ฅผ ๋ณธ ์๊ฐ. */
|
|
27
|
+
effectAt?: string;
|
|
28
|
+
/**
|
|
29
|
+
* ๋๋๋ฆด ์ ์๋ โ ํ๋ฉด์ **์ฐธ์ผ ๋๋ง** ํ ์ค ๋ธ๋ค.
|
|
30
|
+
*
|
|
31
|
+
* ์ง๊ธ ๊ท์น์์ ๊ฒฐ์ฌํจ์ ์ฌ๋ผ์จ ์กฐ์น๋ ๊ฑฐ์ ๋ค ๋๋๋ฆด ์ ์๋ค(๋๋๋ฆด ์ ์๋ ๊ฒ๋ง ์น์ธ์
|
|
32
|
+
* ์๊ตฌํ๋ค). ๊ทธ๋์ ใ๋๋๋ฆด ์ ์์ต๋๋คใ๋ฅผ ๋งค๋ฒ ์ ์ผ๋ฉด ๋ ์ฐธ์ธ ๊ฒฝ๊ณ ๊ฐ ๋๊ณ , ๋ ์ฐธ์ธ ๊ฒฝ๊ณ ๋
|
|
33
|
+
* ์ฌํ์ด๋ฉด ์ ์ฝํ๋ค โ ๊ทธ๋ฌ๋ฉด ๊ทธ ์๋ฆฌ์ ๋ค๋ฅธ ๋ง์ด ํ์ํ ๋ ์๋ฆฌ๊ฐ ์ด๋ฏธ ์ฃฝ์ด ์๋ค(UX ๋ ์ธ ํ๋จ).
|
|
34
|
+
*/
|
|
35
|
+
reversible?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* **์ ์ชฝ์์ ์ฌ๋์ด ํ ์ผ์ด ๋จ์๋** โ ์ด ํ์ ์ด ์ด ํ์
์ ์กด์ฌ ์ด์ ๋ค(๋จธ๋ฆฌ๋ง).
|
|
38
|
+
*
|
|
39
|
+
* ใ๋ชจ๋ฅธ๋คใ๊ฐ ์๋ค: ์์ง ๋๊ธฐ์ง ์์์ผ๋ฉด ๋ฌผ์ด๋ณผ ๊ฒ์ด ์๋ค. `false` ๋ก ์ ์ผ๋ฉด ํ๋ฉด์ด ใํ ์ผ
|
|
40
|
+
* ์์ใ์ผ๋ก ๊ทธ๋ฆฌ๊ณ , ๊ทธ๊ฒ์ ๋๊ธด ๋ค์ ๊ตฌ๋ณ๋์ง ์๋๋ค.
|
|
41
|
+
*/
|
|
42
|
+
pendingAtSource?: boolean;
|
|
43
|
+
/** ๋๊ธธ ์ ์๋ ์ํ์ธ๊ฐ โ `acked` ๋ ์ข
์ฐฉ์ด๋ผ ์ ์ชฝ์ด ์ค๋น๋ผ ์์ด๋ ๋ค์ ๋๊ธฐ์ง ์๋๋ค. */
|
|
44
|
+
dispatchable: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* ์ ์ฅ๋ ์กฐ์น ํ๋๋ฅผ ์ฌ๋์ด ์ฝ์ ์ฌ์ค๋ก ์ฎ๊ธด๋ค โ **์์ํ๋ค.**
|
|
48
|
+
*
|
|
49
|
+
* DB ๋ ์ด๋ํฐ๋ ๋ณด์ง ์๋๋ค. ๊ทธ๋์ ์ด ํ์ ์ ์ํ์ด ๊ฐ๋ง ๋ฐ๊ฟ ๊ฐ๋ฉฐ ํ์ธํ ์ ์๊ณ , ํ๋ฉด์ด
|
|
50
|
+
* ๊ฐ์ ๊ท์น์ ๋ค์ ์ฐ์ง ์์๋ ๋๋ค.
|
|
51
|
+
*/
|
|
52
|
+
export declare function actuationOutcomeOf(command: StoredCommand, dispatchable: boolean): ActuationOutcome;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.actuationOutcomeOf = actuationOutcomeOf;
|
|
4
|
+
/** ๋๊น์ ์๋ํด ๋ณธ ์ํ์ธ๊ฐ โ ์ด ๋ค์์ผ ใ์ ์ชฝ์ ํ ์ผ์ด ๋จ์๋ใ๋ฅผ ๋ฌผ์ ์ ์๋ค. */
|
|
5
|
+
const TRIED = new Set(['dispatching', 'acked', 'failed']);
|
|
6
|
+
/**
|
|
7
|
+
* ์ ์ฅ๋ ์กฐ์น ํ๋๋ฅผ ์ฌ๋์ด ์ฝ์ ์ฌ์ค๋ก ์ฎ๊ธด๋ค โ **์์ํ๋ค.**
|
|
8
|
+
*
|
|
9
|
+
* DB ๋ ์ด๋ํฐ๋ ๋ณด์ง ์๋๋ค. ๊ทธ๋์ ์ด ํ์ ์ ์ํ์ด ๊ฐ๋ง ๋ฐ๊ฟ ๊ฐ๋ฉฐ ํ์ธํ ์ ์๊ณ , ํ๋ฉด์ด
|
|
10
|
+
* ๊ฐ์ ๊ท์น์ ๋ค์ ์ฐ์ง ์์๋ ๋๋ค.
|
|
11
|
+
*/
|
|
12
|
+
function actuationOutcomeOf(command, dispatchable) {
|
|
13
|
+
const note = command.dispatchNote;
|
|
14
|
+
const effect = command.effect;
|
|
15
|
+
/*
|
|
16
|
+
* ๋๊ฒจ ๋ณด์ง ์์์ผ๋ฉด ํ์ ํ์ง ์๋๋ค. ๋๊ธด ๋ค๋ผ๋ฉด ใ๋ง์ด ์๋๋ฐ ํจ๊ณผ๊ฐ ์์ง ์๋คใ๊ฐ ๊ณง
|
|
17
|
+
* ใ์ ์ชฝ์์ ์ฌ๋์ด ํ ์ผ์ด ๋จ์๋คใ๋ค.
|
|
18
|
+
*/
|
|
19
|
+
const pendingAtSource = TRIED.has(command.state) ? Boolean(note) && !effect?.status : undefined;
|
|
20
|
+
return {
|
|
21
|
+
id: command.id,
|
|
22
|
+
state: command.state,
|
|
23
|
+
...(command.dispatchRef ? { dispatchRef: command.dispatchRef } : {}),
|
|
24
|
+
...(command.error ? { error: command.error } : {}),
|
|
25
|
+
...(note ? { note } : {}),
|
|
26
|
+
...(command.dispatchNoteNext ? { noteNext: command.dispatchNoteNext } : {}),
|
|
27
|
+
...(effect?.status ? { effectStatus: effect.status } : {}),
|
|
28
|
+
...(effect?.at ? { effectAt: effect.at } : {}),
|
|
29
|
+
...(command.reversible === undefined ? {} : { reversible: command.reversible }),
|
|
30
|
+
...(pendingAtSource === undefined ? {} : { pendingAtSource }),
|
|
31
|
+
dispatchable
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=actuation-outcome.js.map
|