sdn-flow 0.2.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.
Files changed (69) hide show
  1. package/.claude/SKILLS.md +7 -0
  2. package/.claude/skills/sdn-plugin-abi-compliance/SKILL.md +56 -0
  3. package/.claude/todo/001-js-host-startup-and-deno.md +85 -0
  4. package/LICENSE +21 -0
  5. package/README.md +223 -0
  6. package/bin/sdn-flow-host.js +169 -0
  7. package/docs/.nojekyll +0 -0
  8. package/docs/ARCHITECTURE.md +200 -0
  9. package/docs/HOST_CAPABILITY_MODEL.md +317 -0
  10. package/docs/PLUGIN_ARCHITECTURE.md +145 -0
  11. package/docs/PLUGIN_COMPATIBILITY.md +61 -0
  12. package/docs/PLUGIN_COMPLIANCE_CHECKS.md +82 -0
  13. package/docs/PLUGIN_MANIFEST.md +94 -0
  14. package/docs/css/style.css +465 -0
  15. package/docs/index.html +218 -0
  16. package/docs/js/app.mjs +751 -0
  17. package/docs/js/editor-panel.mjs +203 -0
  18. package/docs/js/flow-canvas.mjs +515 -0
  19. package/docs/js/flow-model.mjs +391 -0
  20. package/docs/js/workers/emception.worker.js +146 -0
  21. package/docs/js/workers/pyodide.worker.js +134 -0
  22. package/native/flow_source_generator.cpp +1958 -0
  23. package/package.json +67 -0
  24. package/schemas/FlowRuntimeAbi.fbs +91 -0
  25. package/src/auth/canonicalize.js +5 -0
  26. package/src/auth/index.js +11 -0
  27. package/src/auth/permissions.js +8 -0
  28. package/src/compiler/CppFlowSourceGenerator.js +475 -0
  29. package/src/compiler/EmceptionCompilerAdapter.js +244 -0
  30. package/src/compiler/SignedArtifactCatalog.js +152 -0
  31. package/src/compiler/index.js +8 -0
  32. package/src/compiler/nativeFlowSourceGeneratorTool.js +144 -0
  33. package/src/compliance/index.js +13 -0
  34. package/src/compliance/pluginCompliance.js +11 -0
  35. package/src/deploy/FlowDeploymentClient.js +532 -0
  36. package/src/deploy/index.js +8 -0
  37. package/src/designer/FlowDesignerSession.js +158 -0
  38. package/src/designer/index.js +2 -0
  39. package/src/designer/requirements.js +184 -0
  40. package/src/generated/runtimeAbiLayouts.js +544 -0
  41. package/src/host/appHost.js +105 -0
  42. package/src/host/autoHost.js +113 -0
  43. package/src/host/browserHostAdapters.js +108 -0
  44. package/src/host/compiledFlowRuntimeHost.js +703 -0
  45. package/src/host/constants.js +55 -0
  46. package/src/host/dependencyRuntime.js +227 -0
  47. package/src/host/descriptorAbi.js +351 -0
  48. package/src/host/fetchService.js +237 -0
  49. package/src/host/httpHostAdapters.js +280 -0
  50. package/src/host/index.js +91 -0
  51. package/src/host/installedFlowHost.js +885 -0
  52. package/src/host/invocationAbi.js +440 -0
  53. package/src/host/normalize.js +372 -0
  54. package/src/host/packageManagers.js +369 -0
  55. package/src/host/profile.js +134 -0
  56. package/src/host/runtimeAbi.js +106 -0
  57. package/src/host/workspace.js +895 -0
  58. package/src/index.js +8 -0
  59. package/src/runtime/FlowRuntime.js +273 -0
  60. package/src/runtime/MethodRegistry.js +295 -0
  61. package/src/runtime/constants.js +44 -0
  62. package/src/runtime/index.js +19 -0
  63. package/src/runtime/normalize.js +377 -0
  64. package/src/transport/index.js +7 -0
  65. package/src/transport/pki.js +7 -0
  66. package/src/utils/crypto.js +7 -0
  67. package/src/utils/encoding.js +65 -0
  68. package/src/utils/wasmCrypto.js +69 -0
  69. package/tools/run-plugin-compliance-check.mjs +153 -0
@@ -0,0 +1,203 @@
1
+ /**
2
+ * editor-panel.mjs — Monaco editor integration with multi-language
3
+ * intellisense for C++, Python, TypeScript, JavaScript, Rust, Go, etc.
4
+ */
5
+
6
+ // Language ID mapping for Monaco
7
+ const LANG_MAP = {
8
+ cpp: "cpp",
9
+ c: "c",
10
+ python: "python",
11
+ typescript: "typescript",
12
+ javascript: "javascript",
13
+ rust: "rust",
14
+ go: "go",
15
+ json: "json",
16
+ yaml: "yaml",
17
+ };
18
+
19
+ // Emscripten C++ completion items
20
+ const EMSCRIPTEN_COMPLETIONS = [
21
+ { label: "EM_JS", kind: "Function", detail: "Inline JavaScript in C++ (Emscripten)", insertText: 'EM_JS(${1:return_type}, ${2:name}, (${3:args}), {\n ${4}\n})' },
22
+ { label: "EM_ASM", kind: "Function", detail: "Execute JavaScript (Emscripten)", insertText: 'EM_ASM({\n ${1}\n})' },
23
+ { label: "EMSCRIPTEN_KEEPALIVE", kind: "Keyword", detail: "Prevent dead-code elimination", insertText: "EMSCRIPTEN_KEEPALIVE" },
24
+ { label: "emscripten_run_script", kind: "Function", detail: "Run JavaScript string", insertText: 'emscripten_run_script("${1}")' },
25
+ { label: "emscripten_get_now", kind: "Function", detail: "High-resolution timer (ms)", insertText: "emscripten_get_now()" },
26
+ { label: "WASM_EXPORT", kind: "Keyword", detail: 'extern "C" export', insertText: 'extern "C" EMSCRIPTEN_KEEPALIVE' },
27
+ ];
28
+
29
+ // FlatBuffer C++ completions
30
+ const FLATBUFFER_CPP_COMPLETIONS = [
31
+ { label: "flatbuffers::FlatBufferBuilder", kind: "Class", detail: "FlatBuffer builder", insertText: "flatbuffers::FlatBufferBuilder ${1:builder}(${2:1024})" },
32
+ { label: "flatbuffers::GetRoot", kind: "Function", detail: "Get root object from buffer", insertText: "flatbuffers::GetRoot<${1:Type}>(${2:buf})" },
33
+ { label: "flatbuffers::Verifier", kind: "Class", detail: "FlatBuffer verifier", insertText: "flatbuffers::Verifier ${1:verifier}(${2:buf}, ${3:size})" },
34
+ { label: "CreateString", kind: "Function", detail: "Create FlatBuffer string", insertText: "${1:builder}.CreateString(${2:str})" },
35
+ { label: "Finish", kind: "Function", detail: "Finish building buffer", insertText: "${1:builder}.Finish(${2:offset})" },
36
+ { label: "GetBufferPointer", kind: "Function", detail: "Get raw buffer pointer", insertText: "${1:builder}.GetBufferPointer()" },
37
+ { label: "GetSize", kind: "Function", detail: "Get buffer size", insertText: "${1:builder}.GetSize()" },
38
+ ];
39
+
40
+ // SDN-Flow Python completions (Pyodide context)
41
+ const PYTHON_SDN_COMPLETIONS = [
42
+ { label: "import flatbuffers", kind: "Module", insertText: "import flatbuffers" },
43
+ { label: "from flatbuffers import Builder", kind: "Module", insertText: "from flatbuffers import Builder" },
44
+ { label: "Builder", kind: "Class", detail: "FlatBuffer builder", insertText: "Builder(${1:initial_size})" },
45
+ { label: "process", kind: "Function", detail: "SDN flow process function", insertText: 'def process(input_bytes: bytes) -> bytes:\n """Process a FlatBuffer frame."""\n ${1:pass}\n' },
46
+ { label: "pybind11_module", kind: "Snippet", detail: "pybind11 module template", insertText: '#include <pybind11/pybind11.h>\nnamespace py = pybind11;\n\nint process(py::bytes input) {\n ${1}\n return 0;\n}\n\nPYBIND11_MODULE(${2:module_name}, m) {\n m.def("process", &process);\n}\n' },
47
+ ];
48
+
49
+ export class EditorPanel {
50
+ constructor(containerId, langSelectId) {
51
+ this.containerId = containerId;
52
+ this.langSelectId = langSelectId;
53
+ this.editor = null;
54
+ this.monaco = null;
55
+ this._currentNodeId = null;
56
+ this._model = null;
57
+ this._suppressChange = false;
58
+ this._initPromise = this._init();
59
+ }
60
+
61
+ async _init() {
62
+ return new Promise((resolve) => {
63
+ // AMD require for Monaco from CDN
64
+ require.config({ paths: { vs: "https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs" } });
65
+ require(["vs/editor/editor.main"], (monaco) => {
66
+ this.monaco = monaco;
67
+
68
+ // Configure themes
69
+ monaco.editor.defineTheme("sdn-dark", {
70
+ base: "vs-dark",
71
+ inherit: true,
72
+ rules: [
73
+ { token: "comment", foreground: "6A9955" },
74
+ { token: "keyword", foreground: "569CD6" },
75
+ { token: "string", foreground: "CE9178" },
76
+ { token: "number", foreground: "B5CEA8" },
77
+ { token: "type", foreground: "4EC9B0" },
78
+ ],
79
+ colors: {
80
+ "editor.background": "#1e1e1e",
81
+ "editor.foreground": "#d4d4d4",
82
+ "editorLineNumber.foreground": "#858585",
83
+ "editor.selectionBackground": "#264f78",
84
+ "editor.lineHighlightBackground": "#2a2d2e",
85
+ },
86
+ });
87
+
88
+ // Create editor
89
+ this.editor = monaco.editor.create(document.getElementById(this.containerId), {
90
+ value: "",
91
+ language: "cpp",
92
+ theme: "sdn-dark",
93
+ fontSize: 13,
94
+ fontFamily: "'Cascadia Code', 'Fira Code', Consolas, monospace",
95
+ fontLigatures: true,
96
+ minimap: { enabled: true, maxColumn: 80 },
97
+ scrollBeyondLastLine: false,
98
+ renderWhitespace: "selection",
99
+ tabSize: 4,
100
+ insertSpaces: true,
101
+ automaticLayout: true,
102
+ wordWrap: "off",
103
+ lineNumbers: "on",
104
+ glyphMargin: true,
105
+ folding: true,
106
+ bracketPairColorization: { enabled: true },
107
+ suggestOnTriggerCharacters: true,
108
+ quickSuggestions: true,
109
+ parameterHints: { enabled: true },
110
+ formatOnPaste: true,
111
+ formatOnType: true,
112
+ });
113
+
114
+ // Register completion providers
115
+ this._registerCompletions(monaco);
116
+
117
+ // Editor is read-only (generated source view)
118
+ // Language select is informational only
119
+
120
+ resolve();
121
+ });
122
+ });
123
+ }
124
+
125
+ async ready() { return this._initPromise; }
126
+
127
+ bindModel(model) {
128
+ this._model = model;
129
+ }
130
+
131
+ setNode(nodeId) {
132
+ // No longer used for per-node editing; editor is read-only generated source
133
+ this._currentNodeId = nodeId;
134
+ }
135
+
136
+ /** Set the generated C++ flow source (read-only). */
137
+ setGeneratedSource(source) {
138
+ if (!this.editor) return;
139
+ this._suppressChange = true;
140
+ this.editor.setValue(source);
141
+ this.editor.updateOptions({ readOnly: true });
142
+ this._suppressChange = false;
143
+ if (this.monaco) {
144
+ this.monaco.editor.setModelLanguage(this.editor.getModel(), "cpp");
145
+ }
146
+ }
147
+
148
+ getValue() {
149
+ return this.editor?.getValue() || "";
150
+ }
151
+
152
+ layout() {
153
+ this.editor?.layout();
154
+ }
155
+
156
+ _registerCompletions(monaco) {
157
+ // C++ completions for Emscripten + FlatBuffers
158
+ monaco.languages.registerCompletionItemProvider("cpp", {
159
+ provideCompletionItems: (model, position) => {
160
+ const word = model.getWordUntilPosition(position);
161
+ const range = {
162
+ startLineNumber: position.lineNumber,
163
+ endLineNumber: position.lineNumber,
164
+ startColumn: word.startColumn,
165
+ endColumn: word.endColumn,
166
+ };
167
+ return {
168
+ suggestions: [...EMSCRIPTEN_COMPLETIONS, ...FLATBUFFER_CPP_COMPLETIONS].map(item => ({
169
+ label: item.label,
170
+ kind: monaco.languages.CompletionItemKind[item.kind] || monaco.languages.CompletionItemKind.Text,
171
+ detail: item.detail || "",
172
+ insertText: item.insertText,
173
+ insertTextRules: item.insertText.includes("$") ? monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet : undefined,
174
+ range,
175
+ })),
176
+ };
177
+ },
178
+ });
179
+
180
+ // Python completions for SDN flow
181
+ monaco.languages.registerCompletionItemProvider("python", {
182
+ provideCompletionItems: (model, position) => {
183
+ const word = model.getWordUntilPosition(position);
184
+ const range = {
185
+ startLineNumber: position.lineNumber,
186
+ endLineNumber: position.lineNumber,
187
+ startColumn: word.startColumn,
188
+ endColumn: word.endColumn,
189
+ };
190
+ return {
191
+ suggestions: PYTHON_SDN_COMPLETIONS.map(item => ({
192
+ label: item.label,
193
+ kind: monaco.languages.CompletionItemKind[item.kind] || monaco.languages.CompletionItemKind.Text,
194
+ detail: item.detail || "",
195
+ insertText: item.insertText,
196
+ insertTextRules: item.insertText.includes("$") ? monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet : undefined,
197
+ range,
198
+ })),
199
+ };
200
+ },
201
+ });
202
+ }
203
+ }