@aryacode/dsh-engineering 0.0.0-stage → 0.4.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/CHANGELOG.md +128 -0
- package/LICENSE +21 -0
- package/README.md +230 -2
- package/cordis.patch.yml +123 -0
- package/lib/client.js +3448 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +9 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +94 -3
- package/vendor/ftview/README.md +55 -0
- package/vendor/ftview/SKILL.md +74 -0
- package/vendor/ftview/lib/checks.d.ts +27 -0
- package/vendor/ftview/lib/checks.js +39 -0
- package/vendor/ftview/lib/core.d.ts +208 -0
- package/vendor/ftview/lib/core.js +160 -0
- package/vendor/ftview/lib/edit/drafts.d.ts +49 -0
- package/vendor/ftview/lib/edit/drafts.js +84 -0
- package/vendor/ftview/lib/edit/operations.d.ts +62 -0
- package/vendor/ftview/lib/edit/operations.js +126 -0
- package/vendor/ftview/lib/edit/prepare.d.ts +38 -0
- package/vendor/ftview/lib/edit/prepare.js +133 -0
- package/vendor/ftview/lib/edit/tools.d.ts +25 -0
- package/vendor/ftview/lib/edit/tools.js +198 -0
- package/vendor/ftview/lib/edit.d.ts +30 -0
- package/vendor/ftview/lib/edit.js +38 -0
- package/vendor/ftview/lib/index.d.ts +31 -0
- package/vendor/ftview/lib/index.js +36 -0
- package/vendor/ftview/lib/model.d.ts +80 -0
- package/vendor/ftview/lib/model.js +267 -0
- package/vendor/ftview/lib/session.d.ts +48 -0
- package/vendor/ftview/lib/session.js +98 -0
- package/vendor/ftview/lib/skill.d.ts +29 -0
- package/vendor/ftview/lib/skill.js +43 -0
- package/vendor/ftview/lib/studio/discover.d.ts +36 -0
- package/vendor/ftview/lib/studio/discover.js +87 -0
- package/vendor/ftview/lib/studio/preflight.d.ts +51 -0
- package/vendor/ftview/lib/studio/preflight.js +64 -0
- package/vendor/ftview/lib/studio/tools.d.ts +15 -0
- package/vendor/ftview/lib/studio/tools.js +83 -0
- package/vendor/ftview/lib/studio.d.ts +30 -0
- package/vendor/ftview/lib/studio.js +37 -0
- package/vendor/ftview/lib/tools.d.ts +14 -0
- package/vendor/ftview/lib/tools.js +202 -0
- package/vendor/l5x/README.md +62 -0
- package/vendor/l5x/SKILL.md +81 -0
- package/vendor/l5x/lib/approvals.d.ts +50 -0
- package/vendor/l5x/lib/approvals.js +93 -0
- package/vendor/l5x/lib/client.js +412 -0
- package/vendor/l5x/lib/client.js.map +1 -0
- package/vendor/l5x/lib/core/errors.d.ts +38 -0
- package/vendor/l5x/lib/core/errors.js +48 -0
- package/vendor/l5x/lib/core/params.d.ts +49 -0
- package/vendor/l5x/lib/core/params.js +39 -0
- package/vendor/l5x/lib/core/result.d.ts +46 -0
- package/vendor/l5x/lib/core/result.js +21 -0
- package/vendor/l5x/lib/core/tool.d.ts +102 -0
- package/vendor/l5x/lib/core/tool.js +19 -0
- package/vendor/l5x/lib/drafts.d.ts +66 -0
- package/vendor/l5x/lib/drafts.js +98 -0
- package/vendor/l5x/lib/editing.d.ts +30 -0
- package/vendor/l5x/lib/editing.js +42 -0
- package/vendor/l5x/lib/engine/acd-edit.d.ts +13 -0
- package/vendor/l5x/lib/engine/acd-edit.js +115 -0
- package/vendor/l5x/lib/engine/analysis.d.ts +22 -0
- package/vendor/l5x/lib/engine/analysis.js +258 -0
- package/vendor/l5x/lib/engine/capabilities.d.ts +9 -0
- package/vendor/l5x/lib/engine/capabilities.js +40 -0
- package/vendor/l5x/lib/engine/change-set.d.ts +122 -0
- package/vendor/l5x/lib/engine/change-set.js +446 -0
- package/vendor/l5x/lib/engine/configuration.d.ts +21 -0
- package/vendor/l5x/lib/engine/configuration.js +42 -0
- package/vendor/l5x/lib/engine/details.d.ts +47 -0
- package/vendor/l5x/lib/engine/details.js +173 -0
- package/vendor/l5x/lib/engine/direct-polling.d.ts +91 -0
- package/vendor/l5x/lib/engine/direct-polling.js +193 -0
- package/vendor/l5x/lib/engine/download-review.d.ts +15 -0
- package/vendor/l5x/lib/engine/download-review.js +63 -0
- package/vendor/l5x/lib/engine/logic-syntax.d.ts +60 -0
- package/vendor/l5x/lib/engine/logic-syntax.js +237 -0
- package/vendor/l5x/lib/engine/observations.d.ts +41 -0
- package/vendor/l5x/lib/engine/observations.js +67 -0
- package/vendor/l5x/lib/engine/project-analysis.d.ts +131 -0
- package/vendor/l5x/lib/engine/project-analysis.js +314 -0
- package/vendor/l5x/lib/engine/review-evidence.d.ts +8 -0
- package/vendor/l5x/lib/engine/review-evidence.js +49 -0
- package/vendor/l5x/lib/engine/review.d.ts +18 -0
- package/vendor/l5x/lib/engine/review.js +123 -0
- package/vendor/l5x/lib/engine/studio-sdk.d.ts +101 -0
- package/vendor/l5x/lib/engine/studio-sdk.js +571 -0
- package/vendor/l5x/lib/engine/tag-resolution.d.ts +20 -0
- package/vendor/l5x/lib/engine/tag-resolution.js +169 -0
- package/vendor/l5x/lib/engine/usage.d.ts +16 -0
- package/vendor/l5x/lib/engine/usage.js +92 -0
- package/vendor/l5x/lib/engine/xml-regions.d.ts +23 -0
- package/vendor/l5x/lib/engine/xml-regions.js +77 -0
- package/vendor/l5x/lib/fs.d.ts +17 -0
- package/vendor/l5x/lib/fs.js +36 -0
- package/vendor/l5x/lib/index.d.ts +36 -0
- package/vendor/l5x/lib/index.js +42 -0
- package/vendor/l5x/lib/live.d.ts +48 -0
- package/vendor/l5x/lib/live.js +48 -0
- package/vendor/l5x/lib/model/aois.d.ts +39 -0
- package/vendor/l5x/lib/model/aois.js +112 -0
- package/vendor/l5x/lib/model/errors.d.ts +15 -0
- package/vendor/l5x/lib/model/errors.js +18 -0
- package/vendor/l5x/lib/model/index.d.ts +20 -0
- package/vendor/l5x/lib/model/index.js +19 -0
- package/vendor/l5x/lib/model/module.d.ts +37 -0
- package/vendor/l5x/lib/model/module.js +54 -0
- package/vendor/l5x/lib/model/modules.d.ts +24 -0
- package/vendor/l5x/lib/model/modules.js +55 -0
- package/vendor/l5x/lib/model/parse.d.ts +32 -0
- package/vendor/l5x/lib/model/parse.js +116 -0
- package/vendor/l5x/lib/model/project.d.ts +15 -0
- package/vendor/l5x/lib/model/project.js +31 -0
- package/vendor/l5x/lib/model/routines.d.ts +71 -0
- package/vendor/l5x/lib/model/routines.js +183 -0
- package/vendor/l5x/lib/model/tags.d.ts +51 -0
- package/vendor/l5x/lib/model/tags.js +119 -0
- package/vendor/l5x/lib/model/types.d.ts +304 -0
- package/vendor/l5x/lib/model/types.js +12 -0
- package/vendor/l5x/lib/model/udts.d.ts +34 -0
- package/vendor/l5x/lib/model/udts.js +81 -0
- package/vendor/l5x/lib/model/xml.d.ts +139 -0
- package/vendor/l5x/lib/model/xml.js +291 -0
- package/vendor/l5x/lib/model/xref.d.ts +28 -0
- package/vendor/l5x/lib/model/xref.js +154 -0
- package/vendor/l5x/lib/session.d.ts +119 -0
- package/vendor/l5x/lib/session.js +236 -0
- package/vendor/l5x/lib/skill.d.ts +30 -0
- package/vendor/l5x/lib/skill.js +44 -0
- package/vendor/l5x/lib/studio-state.d.ts +77 -0
- package/vendor/l5x/lib/studio-state.js +79 -0
- package/vendor/l5x/lib/studio.d.ts +29 -0
- package/vendor/l5x/lib/studio.js +40 -0
- package/vendor/l5x/lib/tools/checks.d.ts +19 -0
- package/vendor/l5x/lib/tools/checks.js +140 -0
- package/vendor/l5x/lib/tools/common.d.ts +41 -0
- package/vendor/l5x/lib/tools/common.js +84 -0
- package/vendor/l5x/lib/tools/controller.d.ts +21 -0
- package/vendor/l5x/lib/tools/controller.js +170 -0
- package/vendor/l5x/lib/tools/drafts.d.ts +23 -0
- package/vendor/l5x/lib/tools/drafts.js +270 -0
- package/vendor/l5x/lib/tools/live.d.ts +21 -0
- package/vendor/l5x/lib/tools/live.js +175 -0
- package/vendor/l5x/lib/tools/read.d.ts +19 -0
- package/vendor/l5x/lib/tools/read.js +245 -0
- package/vendor/l5x/lib/tools/references.d.ts +20 -0
- package/vendor/l5x/lib/tools/references.js +269 -0
- package/vendor/l5x/lib/tools/studio.d.ts +21 -0
- package/vendor/l5x/lib/tools/studio.js +193 -0
- package/vendor/l5x/poll-worker.mjs +77 -0
- package/vendor/l5x/studio-bridge/NuGet.Config +1 -0
- package/vendor/l5x/studio-bridge/Program.cs +304 -0
- package/vendor/l5x/studio-bridge/StudioBridge.csproj +11 -0
- package/vendor/mwi/README.md +60 -0
- package/vendor/mwi/SKILL.md +87 -0
- package/vendor/mwi/bridge/README.md +8 -0
- package/vendor/mwi/bridge/mw_bridge.ps1 +2763 -0
- package/vendor/mwi/bridge/sdk-interop-importer.cs +30 -0
- package/vendor/mwi/bridge/sdk-variable-reader.cs +22 -0
- package/vendor/mwi/bridge/start_bridge.cmd +21 -0
- package/vendor/mwi/bridge/watch_dialogs.cmd +13 -0
- package/vendor/mwi/bridge/watch_dialogs.ps1 +153 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__init__.py +14 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/__init__.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/block_interfaces.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/cfb.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/datatypes.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/declarations.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/errors.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/graphical_listing.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/grid.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/knowledge.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/mwt_bind.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/navigation.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/program_checks.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/project.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/staging.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/structure.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/task_bindings.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/tasks.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/tree.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/validation.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/variable_edit.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/variables.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/__pycache__/workflow.cpython-312.pyc +0 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/block_interfaces.py +275 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/build.py +339 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/capture.py +448 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/cfb.py +765 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/com.py +268 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/datatypes.py +204 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/declarations.py +399 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/descriptions.py +30 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/eip.py +292 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/errors.py +36 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/graphical_listing.py +208 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/grid.py +227 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/ide.py +317 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/iec.py +317 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/installed_help.py +151 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/knowledge.py +218 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/libraries.py +250 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/manuals.py +520 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/mwt_bind.py +133 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/navigation.py +44 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/pou_writer.py +1547 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/program_checks.py +360 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/project.py +704 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/reference_data/catalog.json +672 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/reference_data/patterns.json +86 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/restore.py +208 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/server.py +1913 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/snapshot.py +138 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/st_comments.py +25 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/staging.py +179 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/stlint.py +676 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/structure.py +98 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/task_bindings.py +68 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/tasks.py +162 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/transaction.py +157 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/tree.py +563 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/tree_writer.py +790 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/uia.py +465 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/validation.py +41 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/variable_edit.py +183 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/variables.py +472 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/workflow.py +130 -0
- package/vendor/mwi/code/engine/motionworks_iec_mcp/writer.py +666 -0
- package/vendor/mwi/code/mw_code.py +1258 -0
- package/vendor/mwi/legacy/edit-session.js +50 -0
- package/vendor/mwi/legacy/fb-insertion.js +74 -0
- package/vendor/mwi/legacy/native-code.js +83 -0
- package/vendor/mwi/legacy/native-groups.js +75 -0
- package/vendor/mwi/legacy/native-structure.js +143 -0
- package/vendor/mwi/legacy/native-variables.js +77 -0
- package/vendor/mwi/legacy/pou-conversion.js +47 -0
- package/vendor/mwi/legacy/pou-package.js +66 -0
- package/vendor/mwi/lib/core/bridge.d.ts +71 -0
- package/vendor/mwi/lib/core/bridge.js +53 -0
- package/vendor/mwi/lib/core/code-engine.d.ts +47 -0
- package/vendor/mwi/lib/core/code-engine.js +109 -0
- package/vendor/mwi/lib/core/errors.d.ts +37 -0
- package/vendor/mwi/lib/core/errors.js +47 -0
- package/vendor/mwi/lib/core/params.d.ts +52 -0
- package/vendor/mwi/lib/core/params.js +46 -0
- package/vendor/mwi/lib/core/ps-bridge.d.ts +62 -0
- package/vendor/mwi/lib/core/ps-bridge.js +127 -0
- package/vendor/mwi/lib/core/result.d.ts +45 -0
- package/vendor/mwi/lib/core/result.js +20 -0
- package/vendor/mwi/lib/core/tool.d.ts +80 -0
- package/vendor/mwi/lib/core/tool.js +55 -0
- package/vendor/mwi/lib/edit/compare.d.ts +33 -0
- package/vendor/mwi/lib/edit/compare.js +70 -0
- package/vendor/mwi/lib/edit.d.ts +20 -0
- package/vendor/mwi/lib/edit.js +32 -0
- package/vendor/mwi/lib/index.d.ts +21 -0
- package/vendor/mwi/lib/index.js +33 -0
- package/vendor/mwi/lib/read/service.d.ts +117 -0
- package/vendor/mwi/lib/read/service.js +229 -0
- package/vendor/mwi/lib/read.d.ts +21 -0
- package/vendor/mwi/lib/read.js +33 -0
- package/vendor/mwi/lib/session/project.d.ts +34 -0
- package/vendor/mwi/lib/session/project.js +54 -0
- package/vendor/mwi/lib/session/service.d.ts +167 -0
- package/vendor/mwi/lib/session/service.js +566 -0
- package/vendor/mwi/lib/session/stage.d.ts +84 -0
- package/vendor/mwi/lib/session/stage.js +187 -0
- package/vendor/mwi/lib/session/workspace.d.ts +52 -0
- package/vendor/mwi/lib/session/workspace.js +90 -0
- package/vendor/mwi/lib/skill.d.ts +36 -0
- package/vendor/mwi/lib/skill.js +56 -0
- package/vendor/mwi/lib/tools/edit.d.ts +20 -0
- package/vendor/mwi/lib/tools/edit.js +286 -0
- package/vendor/mwi/lib/tools/read.d.ts +19 -0
- package/vendor/mwi/lib/tools/read.js +161 -0
- package/vendor/mwi/lib/tools/session.d.ts +20 -0
- package/vendor/mwi/lib/tools/session.js +166 -0
- package/vendor/mwi/lib/tools/verify.d.ts +19 -0
- package/vendor/mwi/lib/tools/verify.js +85 -0
- package/vendor/mwi/lib/verify.d.ts +17 -0
- package/vendor/mwi/lib/verify.js +29 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
/** Source-positioned Logix tokens and NeutralText structure for static analysis. */
|
|
2
|
+
/** Tokenize Logix source without treating comments or quoted literals as symbols.
|
|
3
|
+
* @param source - Original routine or rung text.
|
|
4
|
+
* @returns Source tokens and lexical issues; newlines in comments and literals retain their positions.
|
|
5
|
+
*/
|
|
6
|
+
export function lexLogic(source) {
|
|
7
|
+
const tokens = [];
|
|
8
|
+
const issues = [];
|
|
9
|
+
let cursor = 0;
|
|
10
|
+
let line = 0;
|
|
11
|
+
const advance = () => { if (source[cursor] === '\n')
|
|
12
|
+
line++; cursor++; };
|
|
13
|
+
while (cursor < source.length) {
|
|
14
|
+
const char = source[cursor];
|
|
15
|
+
if (/\s/u.test(char)) {
|
|
16
|
+
advance();
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (source.startsWith('//', cursor)) {
|
|
20
|
+
while (cursor < source.length && source[cursor] !== '\n')
|
|
21
|
+
advance();
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (source.startsWith('(*', cursor) || source.startsWith('/*', cursor)) {
|
|
25
|
+
const start = cursor;
|
|
26
|
+
const close = source.startsWith('(*', cursor) ? '*)' : '*/';
|
|
27
|
+
advance();
|
|
28
|
+
advance();
|
|
29
|
+
while (cursor < source.length && !source.startsWith(close, cursor))
|
|
30
|
+
advance();
|
|
31
|
+
if (cursor === source.length)
|
|
32
|
+
issues.push({ offset: start, message: 'Unterminated block comment' });
|
|
33
|
+
else {
|
|
34
|
+
advance();
|
|
35
|
+
advance();
|
|
36
|
+
}
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
const start = cursor;
|
|
40
|
+
const firstLine = line;
|
|
41
|
+
let kind = 'punctuation';
|
|
42
|
+
if (char === "'" || char === '"') {
|
|
43
|
+
kind = 'string';
|
|
44
|
+
advance();
|
|
45
|
+
let closed = false;
|
|
46
|
+
while (cursor < source.length) {
|
|
47
|
+
if (source[cursor] === '$') {
|
|
48
|
+
advance();
|
|
49
|
+
if (cursor < source.length)
|
|
50
|
+
advance();
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (source[cursor] === char) {
|
|
54
|
+
advance();
|
|
55
|
+
if (source[cursor] === char) {
|
|
56
|
+
advance();
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
closed = true;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
advance();
|
|
63
|
+
}
|
|
64
|
+
if (!closed)
|
|
65
|
+
issues.push({ offset: start, message: 'Unterminated string literal' });
|
|
66
|
+
}
|
|
67
|
+
else if (/[A-Za-z_]/u.test(char)) {
|
|
68
|
+
kind = 'identifier';
|
|
69
|
+
while (cursor < source.length && /[A-Za-z0-9_]/u.test(source[cursor]))
|
|
70
|
+
advance();
|
|
71
|
+
}
|
|
72
|
+
else if (/[0-9]/u.test(char)) {
|
|
73
|
+
kind = 'number';
|
|
74
|
+
while (cursor < source.length && /[0-9A-Fa-f_#]/u.test(source[cursor]))
|
|
75
|
+
advance();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
advance();
|
|
79
|
+
if ([':=', '<=', '>=', '<>', '**'].includes(source.slice(start, cursor + 1)))
|
|
80
|
+
advance();
|
|
81
|
+
}
|
|
82
|
+
tokens.push({ kind, text: source.slice(start, cursor), start, end: cursor, line: firstLine });
|
|
83
|
+
}
|
|
84
|
+
return { tokens, issues };
|
|
85
|
+
}
|
|
86
|
+
/** Parse standard NeutralText instructions and nested parallel branches.
|
|
87
|
+
* @param source - One complete rung, including its terminator.
|
|
88
|
+
* @returns Parsed nodes and located issues; malformed structure is never silently complete.
|
|
89
|
+
*/
|
|
90
|
+
export function parseLadder(source) {
|
|
91
|
+
const lexical = lexLogic(source);
|
|
92
|
+
const tokens = lexical.tokens;
|
|
93
|
+
const issues = [...lexical.issues];
|
|
94
|
+
let cursor = 0;
|
|
95
|
+
const sequence = (depth) => {
|
|
96
|
+
const nodes = [];
|
|
97
|
+
if (depth > 128) {
|
|
98
|
+
issues.push({ offset: tokens[cursor]?.start ?? source.length, message: 'Branch nesting exceeds the parser limit' });
|
|
99
|
+
cursor = tokens.length;
|
|
100
|
+
return nodes;
|
|
101
|
+
}
|
|
102
|
+
while (cursor < tokens.length) {
|
|
103
|
+
const token = tokens[cursor];
|
|
104
|
+
if (token.text === ']' || token.text === ',')
|
|
105
|
+
break;
|
|
106
|
+
if (token.kind === 'identifier' && ['NXB', 'BND'].includes(token.text.toUpperCase()))
|
|
107
|
+
break;
|
|
108
|
+
if (token.text === ';') {
|
|
109
|
+
cursor++;
|
|
110
|
+
if (cursor < tokens.length)
|
|
111
|
+
issues.push({ offset: token.start, message: 'Content after rung terminator' });
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
if (token.text === '[') {
|
|
115
|
+
cursor++;
|
|
116
|
+
const paths = [];
|
|
117
|
+
paths.push(sequence(depth + 1));
|
|
118
|
+
while (tokens[cursor]?.text === ',') {
|
|
119
|
+
cursor++;
|
|
120
|
+
paths.push(sequence(depth + 1));
|
|
121
|
+
}
|
|
122
|
+
const close = tokens[cursor];
|
|
123
|
+
if (close?.text !== ']') {
|
|
124
|
+
issues.push({ offset: token.start, message: 'Unterminated ladder branch' });
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
cursor++;
|
|
128
|
+
if (paths.length < 2 || paths.some(path => path.length === 0))
|
|
129
|
+
issues.push({ offset: token.start, message: 'Branch requires nonempty parallel paths' });
|
|
130
|
+
nodes.push({ kind: 'branch', paths, start: token.start, end: close.end });
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (token.kind === 'identifier' && token.text.toUpperCase() === 'BST') {
|
|
134
|
+
cursor++;
|
|
135
|
+
const paths = [sequence(depth + 1)];
|
|
136
|
+
while (tokens[cursor]?.text.toUpperCase() === 'NXB') {
|
|
137
|
+
cursor++;
|
|
138
|
+
paths.push(sequence(depth + 1));
|
|
139
|
+
}
|
|
140
|
+
const close = tokens[cursor];
|
|
141
|
+
if (close?.text.toUpperCase() !== 'BND') {
|
|
142
|
+
issues.push({ offset: token.start, message: 'Unterminated BST branch' });
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
cursor++;
|
|
146
|
+
if (paths.length < 2 || paths.some(path => path.length === 0))
|
|
147
|
+
issues.push({ offset: token.start, message: 'Branch requires nonempty parallel paths' });
|
|
148
|
+
nodes.push({ kind: 'branch', paths, start: token.start, end: close.end });
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (token.kind !== 'identifier' || tokens[cursor + 1]?.text !== '(') {
|
|
152
|
+
issues.push({ offset: token.start, message: `Unsupported ladder token ${token.text}` });
|
|
153
|
+
cursor++;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
cursor += 2;
|
|
157
|
+
const operands = [[]];
|
|
158
|
+
let parentheses = 1;
|
|
159
|
+
let brackets = 0;
|
|
160
|
+
let end = token.end;
|
|
161
|
+
while (cursor < tokens.length) {
|
|
162
|
+
const operand = tokens[cursor++];
|
|
163
|
+
if (operand.text === '(')
|
|
164
|
+
parentheses++;
|
|
165
|
+
if (operand.text === ')')
|
|
166
|
+
parentheses--;
|
|
167
|
+
if (parentheses === 0) {
|
|
168
|
+
end = operand.end;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
if (operand.text === '[')
|
|
172
|
+
brackets++;
|
|
173
|
+
if (operand.text === ']')
|
|
174
|
+
brackets--;
|
|
175
|
+
if (operand.text === ',' && parentheses === 1 && brackets === 0)
|
|
176
|
+
operands.push([]);
|
|
177
|
+
else
|
|
178
|
+
operands[operands.length - 1].push(operand);
|
|
179
|
+
}
|
|
180
|
+
if (parentheses !== 0 || brackets !== 0)
|
|
181
|
+
issues.push({ offset: token.start, message: 'Unbalanced instruction operands' });
|
|
182
|
+
nodes.push({ kind: 'instruction', name: token.text, operands: operands.length === 1 && operands[0].length === 0 ? [] : operands, start: token.start, end });
|
|
183
|
+
}
|
|
184
|
+
return nodes;
|
|
185
|
+
};
|
|
186
|
+
const nodes = sequence(0);
|
|
187
|
+
if (cursor !== tokens.length)
|
|
188
|
+
issues.push({ offset: tokens[cursor].start, message: 'Unexpected branch delimiter' });
|
|
189
|
+
if (tokens[tokens.length - 1]?.text !== ';')
|
|
190
|
+
issues.push({ offset: source.length, message: 'Missing rung terminator' });
|
|
191
|
+
return { nodes, issues };
|
|
192
|
+
}
|
|
193
|
+
/** Read an identifier with optional program qualification, member paths and indices.
|
|
194
|
+
* @param tokens - Source-positioned tokens.
|
|
195
|
+
* @param offset - Index of the address's first identifier.
|
|
196
|
+
* @returns The address and next token index, or undefined for malformed indices.
|
|
197
|
+
*/
|
|
198
|
+
export function addressAt(tokens, offset) {
|
|
199
|
+
const first = tokens[offset];
|
|
200
|
+
if (first?.kind !== 'identifier')
|
|
201
|
+
return undefined;
|
|
202
|
+
let cursor = offset + 1;
|
|
203
|
+
let text = first.text;
|
|
204
|
+
const indexTokens = [];
|
|
205
|
+
if (first.text.toLowerCase() === 'program' && tokens[cursor]?.text === ':' && tokens[cursor + 1]?.kind === 'identifier' && tokens[cursor + 2]?.text === '.') {
|
|
206
|
+
text += `:${tokens[cursor + 1].text}.`;
|
|
207
|
+
cursor += 3;
|
|
208
|
+
if (tokens[cursor]?.kind !== 'identifier')
|
|
209
|
+
return undefined;
|
|
210
|
+
text += tokens[cursor++].text;
|
|
211
|
+
}
|
|
212
|
+
while (cursor < tokens.length) {
|
|
213
|
+
if (tokens[cursor]?.text === '[') {
|
|
214
|
+
let depth = 1;
|
|
215
|
+
text += tokens[cursor++].text;
|
|
216
|
+
while (cursor < tokens.length && depth > 0) {
|
|
217
|
+
const token = tokens[cursor++];
|
|
218
|
+
if (token.text === '[')
|
|
219
|
+
depth++;
|
|
220
|
+
if (token.text === ']')
|
|
221
|
+
depth--;
|
|
222
|
+
text += token.text;
|
|
223
|
+
if (depth > 0)
|
|
224
|
+
indexTokens.push(token);
|
|
225
|
+
}
|
|
226
|
+
if (depth !== 0)
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
else if (tokens[cursor]?.text === '.' && ['identifier', 'number'].includes(tokens[cursor + 1]?.kind ?? '')) {
|
|
230
|
+
text += `.${tokens[cursor + 1].text}`;
|
|
231
|
+
cursor += 2;
|
|
232
|
+
}
|
|
233
|
+
else
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
return { address: { text, start: first.start, end: tokens[cursor - 1].end, line: first.line, indexTokens }, next: cursor };
|
|
237
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Bind bounded live samples to source evidence; only simple series BOOL contacts are evaluated. */
|
|
2
|
+
import { type Evidence } from './analysis.ts';
|
|
3
|
+
import { type ProjectSnapshot } from '../session.ts';
|
|
4
|
+
import type { LiveWatchTag } from './studio-sdk.ts';
|
|
5
|
+
/** A sweep returned by the SDK with per-tag quality and actual timestamps. */
|
|
6
|
+
export interface LogicSample {
|
|
7
|
+
elapsed_ms: number;
|
|
8
|
+
sweep_ms: number;
|
|
9
|
+
values: {
|
|
10
|
+
tag: string;
|
|
11
|
+
value: string | number | boolean | null;
|
|
12
|
+
quality: string;
|
|
13
|
+
observed_at: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
17
|
+
/** Choose controller scalar tags referenced by exactly one selected routine.
|
|
18
|
+
* @param project - verified export snapshot.
|
|
19
|
+
* @param program - exact program name.
|
|
20
|
+
* @param routine - exact routine name.
|
|
21
|
+
* @param selected - optional explicit subset of tag names.
|
|
22
|
+
* @returns bounded watch candidates and unresolved evidence; never truncates a watch silently.
|
|
23
|
+
*/
|
|
24
|
+
export declare function logicWatch(project: ProjectSnapshot, program: string, routine: string, selected?: readonly string[]): {
|
|
25
|
+
program: string;
|
|
26
|
+
routine: string;
|
|
27
|
+
language: string;
|
|
28
|
+
tags: LiveWatchTag[];
|
|
29
|
+
unresolved: Evidence[];
|
|
30
|
+
evidence: Evidence[];
|
|
31
|
+
sampling_available: boolean;
|
|
32
|
+
next_step: string;
|
|
33
|
+
};
|
|
34
|
+
/** Explain only supported series contacts; sequential reads cannot establish runtime causality.
|
|
35
|
+
* @param project - source export.
|
|
36
|
+
* @param program - selected program.
|
|
37
|
+
* @param routine - selected routine.
|
|
38
|
+
* @param samples - timestamped SDK sweeps.
|
|
39
|
+
* @returns contacts failing their observed conditions and explicit unresolved rungs.
|
|
40
|
+
*/
|
|
41
|
+
export declare function explainLogicSamples(project: ProjectSnapshot, program: string, routine: string, samples: readonly LogicSample[]): object;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Bind bounded live samples to source evidence; only simple series BOOL contacts are evaluated. */
|
|
2
|
+
import { evidenceOf } from "./analysis.js";
|
|
3
|
+
import { EngineeringError } from "../session.js";
|
|
4
|
+
import { aliasesOf } from "./configuration.js";
|
|
5
|
+
/** Choose controller scalar tags referenced by exactly one selected routine.
|
|
6
|
+
* @param project - verified export snapshot.
|
|
7
|
+
* @param program - exact program name.
|
|
8
|
+
* @param routine - exact routine name.
|
|
9
|
+
* @param selected - optional explicit subset of tag names.
|
|
10
|
+
* @returns bounded watch candidates and unresolved evidence; never truncates a watch silently.
|
|
11
|
+
*/
|
|
12
|
+
export function logicWatch(project, program, routine, selected) {
|
|
13
|
+
const body = project.document.routines.find(entry => entry.program === program && entry.name === routine);
|
|
14
|
+
if (body === undefined)
|
|
15
|
+
throw new EngineeringError('COMPONENT_NOT_FOUND', 'Select an existing program and routine');
|
|
16
|
+
const evidence = evidenceOf(project).filter(entry => entry.scope === program && entry.routine === routine);
|
|
17
|
+
const tags = [];
|
|
18
|
+
const unresolved = [];
|
|
19
|
+
for (const entry of evidence) {
|
|
20
|
+
const tag = project.document.tags.find(candidate => candidate.scope === 'controller' && entry.resolved === `controller::${candidate.name}`);
|
|
21
|
+
if (tag === undefined || aliasesOf(project.document).has(`controller::${tag.name}`) || !['BOOL', 'INT', 'DINT', 'REAL'].includes(tag.dataType)) {
|
|
22
|
+
unresolved.push(entry);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
if (selected !== undefined && !selected.some(name => name.toLowerCase() === tag.name.toLowerCase()))
|
|
26
|
+
continue;
|
|
27
|
+
if (!tags.some(item => item.name.toLowerCase() === tag.name.toLowerCase())) {
|
|
28
|
+
const type = tag.dataType;
|
|
29
|
+
if (type === 'BOOL' || type === 'INT' || type === 'DINT' || type === 'REAL')
|
|
30
|
+
tags.push({ name: tag.name, data_type: type });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (selected !== undefined && (selected.length === 0 || selected.some(name => !tags.some(tag => tag.name.toLowerCase() === name.toLowerCase()))))
|
|
34
|
+
throw new EngineeringError('INVALID_WATCH', 'Every selected tag must be a controller scalar referenced by this routine');
|
|
35
|
+
return { program, routine, language: body.type, tags, unresolved, evidence,
|
|
36
|
+
sampling_available: tags.length > 0 && tags.length <= 16,
|
|
37
|
+
next_step: tags.length > 16 ? 'Select at most 16 tag names using tags_json; all candidates are shown.' : tags.length === 0 ? 'This routine has no supported controller scalar candidates; inspect unresolved evidence.' : 'Use observe_logic with sample_count and interval_ms to sample this watch.' };
|
|
38
|
+
}
|
|
39
|
+
/** Explain only supported series contacts; sequential reads cannot establish runtime causality.
|
|
40
|
+
* @param project - source export.
|
|
41
|
+
* @param program - selected program.
|
|
42
|
+
* @param routine - selected routine.
|
|
43
|
+
* @param samples - timestamped SDK sweeps.
|
|
44
|
+
* @returns contacts failing their observed conditions and explicit unresolved rungs.
|
|
45
|
+
*/
|
|
46
|
+
export function explainLogicSamples(project, program, routine, samples) {
|
|
47
|
+
const body = project.document.routines.find(entry => entry.program === program && entry.name === routine)?.body;
|
|
48
|
+
const observations = samples.map(sample => {
|
|
49
|
+
const conditions = body?.type !== 'RLL' ? [] : body.rungs.map(rung => {
|
|
50
|
+
const supported = /^(?:XIC\([A-Za-z_][A-Za-z0-9_]*\)|XIO\([A-Za-z_][A-Za-z0-9_]*\))+OTE\([A-Za-z_][A-Za-z0-9_]*\);?$/u.test(rung.text.trim());
|
|
51
|
+
if (!supported)
|
|
52
|
+
return { rung: rung.number, status: 'unresolved', reason: 'Only series XIC/XIO contacts ending in OTE are evaluated; branches and other instructions need review.' };
|
|
53
|
+
const contacts = [...rung.text.matchAll(/(XIC|XIO)\(([A-Za-z_][A-Za-z0-9_]*)\)/gu)].map(match => {
|
|
54
|
+
const symbol = match[2] ?? '';
|
|
55
|
+
// A program tag shadows a controller tag of the same name.
|
|
56
|
+
const scoped = project.document.tags.some(tag => tag.scope === program && tag.name.toLowerCase() === symbol.toLowerCase());
|
|
57
|
+
const reading = scoped ? undefined : sample.values.find(value => value.tag.toLowerCase() === symbol.toLowerCase());
|
|
58
|
+
const boolean = reading?.quality === 'good' ? reading.value === true || reading.value === 'true' ? true : reading.value === false || reading.value === 'false' ? false : undefined : undefined;
|
|
59
|
+
return { symbol, instruction: match[1], value: boolean ?? null, condition: boolean === undefined ? 'unknown' : boolean === (match[1] === 'XIC') ? 'met' : 'not_met' };
|
|
60
|
+
});
|
|
61
|
+
return { rung: rung.number, status: contacts.some(contact => contact.condition === 'unknown') ? 'unresolved' : 'observed', contacts, unmet_contacts: contacts.filter(contact => contact.condition === 'not_met').map(contact => contact.symbol) };
|
|
62
|
+
});
|
|
63
|
+
return { elapsed_ms: sample.elapsed_ms, sweep_ms: sample.sweep_ms, conditions };
|
|
64
|
+
});
|
|
65
|
+
return { observations, evaluation: body?.type === 'RLL' ? 'limited_series_contacts' : 'source_evidence_only',
|
|
66
|
+
limitation: 'Sequential point-in-time samples can miss transitions. Contact observations do not prove execution, scheduling, output state, or the root cause. Export logic may differ from online logic.' };
|
|
67
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { ProjectSnapshot } from '../session.ts';
|
|
2
|
+
/** Stable location within the source snapshot identified by its project hash. */
|
|
3
|
+
export interface SourceLocation {
|
|
4
|
+
readonly scope: string;
|
|
5
|
+
readonly routine: string;
|
|
6
|
+
readonly language: string;
|
|
7
|
+
readonly rung?: number;
|
|
8
|
+
readonly line?: number;
|
|
9
|
+
readonly start: number;
|
|
10
|
+
readonly end: number;
|
|
11
|
+
}
|
|
12
|
+
/** One source occurrence, with an operand classification and declaration resolution. */
|
|
13
|
+
export interface ParsedReference extends SourceLocation {
|
|
14
|
+
readonly symbol: string;
|
|
15
|
+
readonly canonical?: string;
|
|
16
|
+
readonly access: 'read' | 'write' | 'read_write' | 'call' | 'unknown';
|
|
17
|
+
readonly instruction?: string;
|
|
18
|
+
readonly indices_verified: boolean;
|
|
19
|
+
readonly context: string;
|
|
20
|
+
}
|
|
21
|
+
/** A located limitation that prevents a claim of complete static coverage. */
|
|
22
|
+
export interface AnalysisLimitation {
|
|
23
|
+
readonly scope: string;
|
|
24
|
+
readonly routine: string;
|
|
25
|
+
readonly rung?: number;
|
|
26
|
+
readonly offset?: number;
|
|
27
|
+
readonly reason: string;
|
|
28
|
+
}
|
|
29
|
+
/** Edge evidence uses indices into the containing analysis's reference array. */
|
|
30
|
+
export interface DependencyEdge {
|
|
31
|
+
readonly from: string;
|
|
32
|
+
readonly to: string;
|
|
33
|
+
readonly kind: 'operand' | 'condition_candidate';
|
|
34
|
+
readonly evidence: readonly number[];
|
|
35
|
+
}
|
|
36
|
+
/** Shared result for model tools and other consumers. */
|
|
37
|
+
export interface ProjectAnalysis {
|
|
38
|
+
readonly project_id: string;
|
|
39
|
+
readonly source_sha256: string;
|
|
40
|
+
readonly references: readonly ParsedReference[];
|
|
41
|
+
readonly dependencies: readonly DependencyEdge[];
|
|
42
|
+
readonly limitations: readonly AnalysisLimitation[];
|
|
43
|
+
readonly static_complete: boolean;
|
|
44
|
+
readonly runtime_causality_verified: false;
|
|
45
|
+
}
|
|
46
|
+
/** Deployment limits prevent dense logic from producing unbounded reference and edge arrays. */
|
|
47
|
+
export interface AnalysisBounds {
|
|
48
|
+
readonly references: number;
|
|
49
|
+
readonly edges: number;
|
|
50
|
+
}
|
|
51
|
+
/** Registry version changes when operand roles change. It does not certify controller availability. */
|
|
52
|
+
export declare const SEMANTICS_VERSION = 1;
|
|
53
|
+
/** Build source-positioned references and conservative local dependency edges once per snapshot.
|
|
54
|
+
* @param project - Immutable export snapshot.
|
|
55
|
+
* @param bounds - Inclusive reference and edge limits; truncation makes coverage incomplete.
|
|
56
|
+
* @returns Shared analysis with located limitations and source identity.
|
|
57
|
+
*/
|
|
58
|
+
export declare function analyzeProject(project: ProjectSnapshot, bounds: AnalysisBounds): ProjectAnalysis;
|
|
59
|
+
/** Read exported task scheduling, program entry routines and parsed JSR/AOI call locations.
|
|
60
|
+
* @param project - Immutable selected export.
|
|
61
|
+
* @param limits - Deployment bounds for graph size and source analysis.
|
|
62
|
+
* @returns A bounded execution graph; declared scheduling is not observed scan execution.
|
|
63
|
+
*/
|
|
64
|
+
export declare function executionGraph(project: ProjectSnapshot, limits: TraceLimits): {
|
|
65
|
+
project_id: string;
|
|
66
|
+
source_sha256: string;
|
|
67
|
+
nodes: {
|
|
68
|
+
identity: string;
|
|
69
|
+
kind: "task" | "program" | "routine" | "aoi";
|
|
70
|
+
declared: boolean;
|
|
71
|
+
}[];
|
|
72
|
+
edges: {
|
|
73
|
+
from: string;
|
|
74
|
+
to: string;
|
|
75
|
+
kind: "schedules" | "entry" | "call";
|
|
76
|
+
evidence?: ParsedReference;
|
|
77
|
+
}[];
|
|
78
|
+
truncated: boolean;
|
|
79
|
+
unscheduled_programs: string[];
|
|
80
|
+
static_complete: boolean;
|
|
81
|
+
runtime_execution_verified: boolean;
|
|
82
|
+
};
|
|
83
|
+
/** Bounds for a breadth-first static dependency traversal. */
|
|
84
|
+
export interface TraceLimits {
|
|
85
|
+
readonly depth: number;
|
|
86
|
+
readonly nodes: number;
|
|
87
|
+
readonly edges: number;
|
|
88
|
+
readonly analysis: AnalysisBounds;
|
|
89
|
+
}
|
|
90
|
+
/** Trace dependencies or dependents, returning every stopping reason.
|
|
91
|
+
* @param project - Immutable selected source.
|
|
92
|
+
* @param symbol - Selected tag address.
|
|
93
|
+
* @param scope - Its resolution scope.
|
|
94
|
+
* @param direction - Upstream sources or downstream impact.
|
|
95
|
+
* @param limits - Validated deployment bounds.
|
|
96
|
+
* @returns Bounded graph with source-linked edges, coverage and truncation indicators.
|
|
97
|
+
*/
|
|
98
|
+
export declare function traceDependencies(project: ProjectSnapshot, symbol: string, scope: string, direction: 'upstream' | 'downstream', limits: TraceLimits): {
|
|
99
|
+
truncated: boolean;
|
|
100
|
+
static_complete: boolean;
|
|
101
|
+
runtime_causality_verified: boolean;
|
|
102
|
+
limitations: AnalysisLimitation[];
|
|
103
|
+
limitations_total: number;
|
|
104
|
+
limitations_truncated: boolean;
|
|
105
|
+
project_id: string;
|
|
106
|
+
source_sha256: string;
|
|
107
|
+
resolution: import("./tag-resolution.ts").TagResolution;
|
|
108
|
+
nodes: never[];
|
|
109
|
+
edges: never[];
|
|
110
|
+
} | {
|
|
111
|
+
truncated: boolean;
|
|
112
|
+
static_complete: boolean;
|
|
113
|
+
runtime_causality_verified: boolean;
|
|
114
|
+
limitations: AnalysisLimitation[];
|
|
115
|
+
limitations_total: number;
|
|
116
|
+
limitations_truncated: boolean;
|
|
117
|
+
project_id: string;
|
|
118
|
+
source_sha256: string;
|
|
119
|
+
resolution: import("./tag-resolution.ts").TagResolution;
|
|
120
|
+
direction: "upstream" | "downstream";
|
|
121
|
+
nodes: {
|
|
122
|
+
symbol: string;
|
|
123
|
+
depth: number;
|
|
124
|
+
}[];
|
|
125
|
+
edges: {
|
|
126
|
+
evidence: ParsedReference[];
|
|
127
|
+
from: string;
|
|
128
|
+
to: string;
|
|
129
|
+
kind: "operand" | "condition_candidate";
|
|
130
|
+
}[];
|
|
131
|
+
};
|