@n8r/surface 0.0.0-stage → 0.1.0-experimental.5

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 (181) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE-DOCS +395 -0
  3. package/LICENSING.md +36 -0
  4. package/README.md +207 -2
  5. package/dist/activity.d.ts +16 -0
  6. package/dist/activity.js +44 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +412 -0
  9. package/dist/codec.d.ts +6 -0
  10. package/dist/codec.js +56 -0
  11. package/dist/codex.d.ts +72 -0
  12. package/dist/codex.js +526 -0
  13. package/dist/contracts.d.ts +235 -0
  14. package/dist/contracts.js +1 -0
  15. package/dist/cyclonedx-schemas/bom-1.7.schema.json +6700 -0
  16. package/dist/cyclonedx-schemas/cryptography-defs.schema.json +576 -0
  17. package/dist/cyclonedx-schemas/jsf-0.82.schema.json +240 -0
  18. package/dist/cyclonedx-schemas/spdx.schema.json +786 -0
  19. package/dist/cyclonedx-validation.d.ts +1 -0
  20. package/dist/cyclonedx-validation.js +45 -0
  21. package/dist/html.d.ts +5 -0
  22. package/dist/html.js +74 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.js +5 -0
  25. package/dist/notes.d.ts +52 -0
  26. package/dist/notes.js +184 -0
  27. package/dist/portable.d.ts +10 -0
  28. package/dist/portable.js +71 -0
  29. package/dist/recent.d.ts +9 -0
  30. package/dist/recent.js +71 -0
  31. package/dist/revisions.d.ts +2 -0
  32. package/dist/revisions.js +60 -0
  33. package/dist/settings.d.ts +23 -0
  34. package/dist/settings.js +100 -0
  35. package/dist/setup.d.ts +9 -0
  36. package/dist/setup.js +161 -0
  37. package/dist/skill-artifacts-cli.d.ts +1 -0
  38. package/dist/skill-artifacts-cli.js +13 -0
  39. package/dist/skill-artifacts.d.ts +15 -0
  40. package/dist/skill-artifacts.js +184 -0
  41. package/dist/skill-cyclonedx.d.ts +26 -0
  42. package/dist/skill-cyclonedx.js +214 -0
  43. package/dist/skill-presentation.d.ts +10 -0
  44. package/dist/skill-presentation.js +108 -0
  45. package/dist/skill-surface-cli.d.ts +1 -0
  46. package/dist/skill-surface-cli.js +37 -0
  47. package/dist/skill-surface-store.d.ts +7 -0
  48. package/dist/skill-surface-store.js +126 -0
  49. package/dist/source-tools.d.ts +102 -0
  50. package/dist/source-tools.js +201 -0
  51. package/dist/startup.d.ts +7 -0
  52. package/dist/startup.js +74 -0
  53. package/dist/surface-bom.d.ts +73 -0
  54. package/dist/surface-bom.js +139 -0
  55. package/dist/surface-draft.d.ts +22 -0
  56. package/dist/surface-draft.js +112 -0
  57. package/dist/surface-instructions.d.ts +3 -0
  58. package/dist/surface-instructions.js +32 -0
  59. package/dist/surface-overview.d.ts +15 -0
  60. package/dist/surface-overview.js +86 -0
  61. package/dist/surface-store.d.ts +34 -0
  62. package/dist/surface-store.js +213 -0
  63. package/dist/surface-view.d.ts +3 -0
  64. package/dist/surface-view.js +50 -0
  65. package/dist/validate.d.ts +4 -0
  66. package/dist/validate.js +482 -0
  67. package/docs/n8r-surface/README.md +133 -0
  68. package/docs/n8r-surface/cli-bundles.md +72 -0
  69. package/docs/n8r-surface/codex-research-transcript.md +51 -0
  70. package/docs/n8r-surface/codex-research-verification.md +176 -0
  71. package/docs/n8r-surface/command-outcomes.md +711 -0
  72. package/docs/n8r-surface/contracts.md +220 -0
  73. package/docs/n8r-surface/critical-path.md +184 -0
  74. package/docs/n8r-surface/design.md +289 -0
  75. package/docs/n8r-surface/first-use-access.md +143 -0
  76. package/docs/n8r-surface/first-use-overview.md +262 -0
  77. package/docs/n8r-surface/getting-started.md +74 -0
  78. package/docs/n8r-surface/guided-journey-verification.md +137 -0
  79. package/docs/n8r-surface/host-contract.md +176 -0
  80. package/docs/n8r-surface/implementation-decisions.md +96 -0
  81. package/docs/n8r-surface/instance-first-research.md +209 -0
  82. package/docs/n8r-surface/npm-distribution.md +107 -0
  83. package/docs/n8r-surface/npm-release.md +315 -0
  84. package/docs/n8r-surface/product-direction.md +327 -0
  85. package/docs/n8r-surface/recreation-handoff.md +117 -0
  86. package/docs/n8r-surface/researcher-discovery.md +157 -0
  87. package/docs/n8r-surface/researcher-prepared-check.md +117 -0
  88. package/docs/n8r-surface/researcher-reconciliation-trial.md +149 -0
  89. package/docs/n8r-surface/researcher-repository-check.md +95 -0
  90. package/docs/n8r-surface/researcher-skeleton-check.md +84 -0
  91. package/docs/n8r-surface/researcher-skill-verification.md +725 -0
  92. package/docs/n8r-surface/researcher-skill.md +309 -0
  93. package/docs/n8r-surface/researcher-vault.md +134 -0
  94. package/docs/n8r-surface/save-reopen-transcript.md +211 -0
  95. package/docs/n8r-surface/save-reopen-verification.md +152 -0
  96. package/docs/n8r-surface/security-assurance-strategy.md +267 -0
  97. package/docs/n8r-surface/skill-bom-verification.md +142 -0
  98. package/docs/n8r-surface/skill-cyclonedx-verification.md +144 -0
  99. package/docs/n8r-surface/skill-cyclonedx.md +85 -0
  100. package/docs/n8r-surface/skill-manual.md +129 -0
  101. package/docs/n8r-surface/skill-surface-artifacts.md +234 -0
  102. package/docs/n8r-surface/skill-usefulness-verification.md +135 -0
  103. package/docs/n8r-surface/skill-workspace-automation.md +359 -0
  104. package/docs/n8r-surface/startup-human-check.md +172 -0
  105. package/docs/n8r-surface/startup-verification.md +161 -0
  106. package/docs/n8r-surface/startup.md +151 -0
  107. package/docs/n8r-surface/surface-description-contract.md +224 -0
  108. package/docs/n8r-surface/surface-descriptions.md +173 -0
  109. package/docs/n8r-surface/surface-relationships.md +231 -0
  110. package/docs/n8r-surface/surface-revisions-transcript.md +552 -0
  111. package/docs/n8r-surface/surface-revisions-verification.md +161 -0
  112. package/docs/n8r-surface/tester-candidate.md +158 -0
  113. package/docs/n8r-surface/vault-setup-verification.md +210 -0
  114. package/docs/n8r-surface/verification.md +117 -0
  115. package/docs/n8r-surface/versioning.md +172 -0
  116. package/docs/n8r-surface/workspace-human-check.md +101 -0
  117. package/docs/n8r-surface/workspace-installation.md +68 -0
  118. package/docs/n8r-surface/workspace-verification.md +350 -0
  119. package/docs/n8r-surface/workspace.md +83 -0
  120. package/examples/researcher/README.md +100 -0
  121. package/examples/researcher/composed.surface.json +430 -0
  122. package/examples/researcher/composed.surface.yaml +283 -0
  123. package/examples/researcher/cyclonedx/configured/README.md +7 -0
  124. package/examples/researcher/cyclonedx/configured/manifest.json +10 -0
  125. package/examples/researcher/cyclonedx/configured/mapping.json +323 -0
  126. package/examples/researcher/cyclonedx/configured/surface-records.json +1275 -0
  127. package/examples/researcher/cyclonedx/configured/surface.cdx.json +79 -0
  128. package/examples/researcher/descriptions/README.md +29 -0
  129. package/examples/researcher/descriptions/bound-r1.json +141 -0
  130. package/examples/researcher/descriptions/bound-r2.json +153 -0
  131. package/examples/researcher/descriptions/capability.json +167 -0
  132. package/examples/researcher/descriptions/research-r1.json +153 -0
  133. package/examples/researcher/descriptions/research-r2.json +157 -0
  134. package/examples/researcher/descriptions/sources.md +24 -0
  135. package/examples/researcher/harbor-r1.research.html +193 -0
  136. package/examples/researcher/harbor-r2.research.html +226 -0
  137. package/examples/researcher/lumen-manual-edit.pending.html +271 -0
  138. package/examples/researcher/lumen-r1.research.html +271 -0
  139. package/examples/researcher/lumen-r2.research.html +280 -0
  140. package/examples/researcher/relationships/README.md +34 -0
  141. package/examples/researcher/relationships/bound-r1.json +346 -0
  142. package/examples/researcher/relationships/bound-r2.json +358 -0
  143. package/examples/researcher/relationships/capability.json +325 -0
  144. package/examples/researcher/relationships/config/assistant.env.example +4 -0
  145. package/examples/researcher/relationships/research-r1.json +300 -0
  146. package/examples/researcher/relationships/research-r2.json +304 -0
  147. package/examples/researcher/relationships/sources.md +38 -0
  148. package/examples/researcher/sources/harbor-api.md +16 -0
  149. package/examples/researcher/sources/harbor-auth.md +8 -0
  150. package/examples/researcher/sources/lumen-guide.md +28 -0
  151. package/examples/researcher/sources/lumen-settings.md +9 -0
  152. package/examples/researcher/surface-bom/README.md +17 -0
  153. package/examples/researcher/surface-bom/initial.cdx.json +188 -0
  154. package/package.json +45 -4
  155. package/plugins/n8r-surface/.codex-plugin/plugin.json +31 -0
  156. package/plugins/n8r-surface/LICENSE +202 -0
  157. package/plugins/n8r-surface/LICENSE-DOCS +395 -0
  158. package/plugins/n8r-surface/LICENSING.md +39 -0
  159. package/plugins/n8r-surface/assets/icon.svg +5 -0
  160. package/plugins/n8r-surface/plugin.json +27 -0
  161. package/plugins/n8r-surface/skills/research/SKILL.md +163 -0
  162. package/plugins/n8r-surface/skills/research/agents/openai.yaml +4 -0
  163. package/plugins/n8r-surface/skills/research/references/artifacts.md +152 -0
  164. package/plugins/n8r-surface/skills/research/references/cyclonedx.md +207 -0
  165. package/plugins/n8r-surface/skills/research/references/discovery-map.md +178 -0
  166. package/plugins/n8r-surface/skills/research/references/examples/bound-r1.json +346 -0
  167. package/plugins/n8r-surface/skills/research/references/examples/capability.json +325 -0
  168. package/plugins/n8r-surface/skills/research/references/examples/research-r1.json +300 -0
  169. package/plugins/n8r-surface/skills/research/references/examples/surface.cdx.json +188 -0
  170. package/plugins/n8r-surface/skills/research/references/first-use-access.md +97 -0
  171. package/plugins/n8r-surface/skills/research/references/first-use-overview.md +101 -0
  172. package/plugins/n8r-surface/skills/research/references/instance-first.md +125 -0
  173. package/plugins/n8r-surface/skills/research/references/model-meanings.md +55 -0
  174. package/plugins/n8r-surface/skills/research/references/skeleton-surface.md +105 -0
  175. package/plugins/n8r-surface/skills/research/references/working-notes.md +121 -0
  176. package/plugins/n8r-surface/skills/research/references/workspace.md +89 -0
  177. package/plugins/n8r-surface/skills/research/scripts/THIRD-PARTY-NOTICES.txt +273 -0
  178. package/plugins/n8r-surface/skills/research/scripts/artifacts.mjs +8348 -0
  179. package/plugins/n8r-surface/skills/research/scripts/cyclonedx.mjs +28113 -0
  180. package/plugins/n8r-surface/skills/research/scripts/surface.mjs +27800 -0
  181. package/plugins/n8r-surface/skills/research/scripts/workspace.mjs +120 -0
@@ -0,0 +1,105 @@
1
+ # Skeleton Surface v0.1
2
+
3
+ This is a provisional output profile within the AI Surface Model. Produce a
4
+ compact Markdown Surface working draft, not validated JSON/HTML or a deployment
5
+ recipe. The profile version describes these rules; the skill version identifies
6
+ the instructions used. Neither is the revision of the particular Surface/setup.
7
+
8
+ ## Select and bound the brief
9
+
10
+ Use this profile when asked for a skeleton or brief Surface. Broad discovery
11
+ starts shallow; a narrow question takes precedence over a general inventory.
12
+ Security is the focus of this profile, while the model supports other purposes.
13
+ The useful question is: where could a security integration inspect or intervene
14
+ in LLM and actual tool calls, with what powers, coverage and gaps?
15
+
16
+ Retain a node or distinction when removing it hides a key capability, a material
17
+ security boundary, or a place an Experiment could change or observe behavior.
18
+ Keep required supporting roles such as application persistence when they explain
19
+ the setup. Features can be capability nodes; do not turn every setting into a node.
20
+ Use a role such as MCP server or vector store when no instance is selected. Source
21
+ evidence may identify supported products/transports without identifying a binding.
22
+ An empty template field does not establish that every deployment lacks a binding.
23
+
24
+ Preserve stable node and relationship identities from supplied descriptions.
25
+ Different serialization or vocabulary requires an explicit mapping, not silent
26
+ renaming. Keep shared nodes, parallel routes and cycles. A historical claim not
27
+ re-established at the selected revision must stay qualified or move to a clearly
28
+ linked historical/gap record; it cannot become a current supported capability.
29
+
30
+ ## Keep the graph small without losing meaning
31
+
32
+ Lead with a short identity/scope line and a graph or edge table. Retain source
33
+ revision, Surface revision and profile name/version. Show key nodes, directed
34
+ relationships, purposes and relevant execution/authority boundaries. Label
35
+ supported possibilities separately from selected composition and observed setup.
36
+ No source-only graph establishes reachability or exercise.
37
+
38
+ Use concise claim references to linked research or source sections. Identify the
39
+ supporting revision and locator where available. Summarize coverage and unresolved
40
+ questions once where shared; retain exceptions beside the affected edge. Avoid
41
+ repeating boilerplate unknown bindings for every node, but never make an omitted
42
+ value imply absence. No arbitrary node count, depth ceiling or file-size minimum
43
+ applies. A smaller output is not permission to discard a condition or bypass.
44
+
45
+ | In the brief | In linked records |
46
+ | --- | --- |
47
+ | Nodes, directed edges, roles, material conditions and uncertainty | Detailed source excerpts, inspected ranges and investigation narrative |
48
+ | Claim basis and usable evidence references | Full provenance, conflicts and supporting findings |
49
+ | Interception location, visibility, powers and coverage gaps | Hook signatures, configuration details and vendor compatibility research |
50
+ | Binding status and reference when relevant | Protected resource bindings, nonsecret configuration and secret requirements/references |
51
+ | Observation summary with applicability, when supplied | Dated runtime observations, traces, tests and Experiment Run results |
52
+
53
+ Use existing evidence records when they suffice. Do not create a large companion
54
+ record just to satisfy a template; direct versioned source references can suffice.
55
+ Keep links portable or state which accompanying files are needed. Never invent
56
+ records or imply their contents were read. Credential values do not belong in
57
+ the brief or research evidence.
58
+
59
+ ## Map interception opportunities
60
+
61
+ For each relevant candidate, state compactly:
62
+
63
+ - **Location and stage:** node/edge, before/after model dispatch or tool execution.
64
+ - **Visible context:** messages, tool arguments/results, principal, or unknown.
65
+ - **Powers:** observe, modify, block or require approval, only as supported.
66
+ - **Coverage:** covered routes, conditions, bypasses and unresolved continuations.
67
+ - **Basis:** proposed placement, documented/implemented extension, configured
68
+ integration, or exercised behavior; link evidence and preserve its limits.
69
+
70
+ A proxy only sees traffic routed through it. Seeing tool schemas, model-proposed
71
+ calls or returned results in model traffic does not prove mediation of the actual
72
+ tool invocation or downstream effects. Trace the tool executor separately. Keep
73
+ browser-direct routes, scheduled workers and other known alternate paths visible.
74
+
75
+ A hook's presence does not establish its timing, veto power or complete coverage.
76
+ A sidecar is placement, not an interception mechanism: identify routing, hooks or
77
+ event delivery and how a decision reaches execution. Observation-only telemetry
78
+ is not enforcement. Record failure behavior if known, or as a gap relevant to
79
+ later setup selection; a documented claim is not a runtime test.
80
+
81
+ Record potential cross-service observation points and correlation gaps without
82
+ claiming end-to-end trace coverage. Do not select a vendor or infer product
83
+ compatibility from names or protocols. If evidence supports only an opportunity,
84
+ say so. Stop once the brief answers the question with gaps visible. Do not install,
85
+ bind resources, configure proxies/hooks or run integration tests as part of it.
86
+
87
+ ## Continue and reconcile
88
+
89
+ Size and deployment knowledge are independent. A bound setup can have a skeleton;
90
+ a detailed product description can remain unbound. When saving or continuing,
91
+ follow [working notes](working-notes.md), preserving predecessors and evidence.
92
+
93
+ For Lab-managed changes, the intended consumer behavior is to record a successor
94
+ setup/binding revision with the change and its evidence; an Experiment requests
95
+ resources from its Lab, which owns bindings. This skill does not implement that
96
+ automation. A request is not proof that configuration succeeded. Keep effective
97
+ setup unknown until supported by observation.
98
+
99
+ Changes outside the Lab do not automatically update saved descriptions. On an
100
+ explicit reconciliation request, read current identified evidence, compare it
101
+ with the predecessor and save an authorized successor. Preserve stable identities,
102
+ explain changed declarations/bindings and retain uncertainty about effective use.
103
+ Reference an unchanged definition when only bindings change; use a successor
104
+ definition when composition or intended settings change. Keep profile version
105
+ unchanged unless the output rules change. Do not retrospectively rebind prior Runs.
@@ -0,0 +1,121 @@
1
+ # Working research notes
2
+
3
+ Use Markdown for the first portable research increment. These are readable
4
+ working notes, not a released interchange schema or a validated experimental
5
+ HTML/Surface artefact. Use the user's requested prose format when practical;
6
+ retain the same evidence and limitations. Do not impose a large empty template.
7
+
8
+ ## Where notes live
9
+
10
+ Use a user-selected destination first. For work explicitly scoped to a recognized
11
+ Surface workspace, keep new notes under `research/<source-slug>/` within that
12
+ workspace, creating directories only on an authorized save. Do not redirect that
13
+ work to a global vault or the default below. When continuing a supplied note,
14
+ retain its folder unless the user asks to move it. Workspace setup itself creates
15
+ no notes or content directories. When an applicable vault convention places
16
+ Surface descriptions under `surfaces/<source-slug>/`, propose a numbered file
17
+ such as `surface-draft-001.md` there. A save offer does not create directories or
18
+ files; wait for acceptance. Without that convention, use the default below for
19
+ the same Markdown working draft. When continuing a saved note, use its
20
+ folder unless the user requests a move. Otherwise, on a host with a persistent
21
+ user-owned local filesystem, use:
22
+
23
+ ```text
24
+ ~/Documents/n8r-surface/research/<source-slug>/<topic>-001.md
25
+ ```
26
+
27
+ Derive short lowercase hyphenated slugs from the source and question. For a
28
+ LibreChat authentication investigation, use `librechat/authentication-001.md`.
29
+ Resolve the user's actual home directory through the host, expand `~`, and show
30
+ the absolute folder and filename before writing. Create missing directories as
31
+ part of an authorized save. Keep that local locator in the conversation, not in
32
+ portable note content. Do not treat a temporary execution container as the user's
33
+ persistent filesystem. If local saving is unavailable, explain that limitation
34
+ and offer a named Markdown download or text without claiming the default exists.
35
+
36
+ List existing notes for that topic first. Use the next unused three-digit number
37
+ (`002`, `003`, and so on; grow beyond three digits if needed). An existing filename
38
+ is never permission to overwrite. For continuation, read the predecessor and any
39
+ human edits, name it in the successor and record the change. Recheck its bytes
40
+ before saving; if they changed, reread and reconcile before choosing a new output.
41
+ Check that existing notes describe the same source before continuing them;
42
+ matching directory names alone do not establish source identity.
43
+
44
+ Provide the actual saved file as a clickable link after readback. On a local
45
+ host, use an absolute file link. The user should be able to open it without
46
+ searching the plugin cache or scrolling back through tool output. Skill removal
47
+ must leave this research folder and every previous note intact.
48
+
49
+ ## What a note retains
50
+
51
+ A saved note should let another person or a fresh chat continue the task:
52
+
53
+ - Identify the question, scope, date, skill version and host/tool capabilities
54
+ actually used. Do not guess a hidden model ID or application version.
55
+ - Identify the supplied sources using portable relative names or public locators.
56
+ Record available revision/version information and exact hashes for inspected
57
+ files when supported. Explicitly mark unavailable identity evidence.
58
+ - Lead with the partial AI Surface graph or edge table, stable component labels
59
+ and evidence locations. Keep supported possibilities separate from selected
60
+ connections. Include only settings needed to explain the graph, not an app-wide
61
+ configuration inventory.
62
+ - Preserve conflicting claims, unknowns, coverage limits and scoped absences.
63
+ - Retain human decisions and unanswered questions separately from source evidence.
64
+ - State what was actually read or exercised and what remains to be done. Include
65
+ **Recommended next steps** as described below, and a useful next question when
66
+ a user decision is needed.
67
+
68
+ Keep source links usable when the notes are moved, or explain what accompanying
69
+ source files are needed. Do not copy whole repositories or credentials into the
70
+ notes. A source digest identifies bytes, not truth, completeness or compatibility.
71
+
72
+ ## Recommended next steps
73
+
74
+ Include a **Recommended next steps** section in the latest Surface note for the
75
+ same source and scope. If no Surface note exists, include it in the latest research
76
+ note. A Surface note here is a saved prose description of the Surface; this rule
77
+ does not add validated structured-output support or require creating one.
78
+
79
+ For each recommendation, state:
80
+
81
+ - **Next investigation:** the concrete question or connection to investigate.
82
+ - **Why it matters:** which uncertainty or user decision it would resolve.
83
+ - **Where to resume:** the relevant source file/section, component ID, saved note
84
+ or permitted view, plus any access or missing evidence needed to proceed.
85
+
86
+ Use portable references, not local absolute paths or credentials. For example:
87
+
88
+ > **Next investigation:** establish the selected document-search target.
89
+ > **Why it matters:** the optional search path has no address in the supplied
90
+ > settings, so its selected connection remains unresolved.
91
+ > **Where to resume:** `current.env`, `DOCUMENT_SEARCH_URL`, and `system.md` →
92
+ > Uploaded documents; request applicable deployment settings if available.
93
+
94
+ When continuing, read this section alongside the predecessor and human edits,
95
+ re-establish source identity, and use it to choose the next investigation within
96
+ the user's current scope. Recommendations are proposed work, not permission for
97
+ new access or evidence that a connection exists. If the needed evidence is
98
+ unavailable, retain the blocker and a concrete resumption point.
99
+
100
+ In the saved successor, update the section to reflect what was resolved, what
101
+ remains and the next useful investigation. Explain a changed priority or superseded
102
+ recommendation briefly. Preserve earlier notes unchanged. If an older note has
103
+ no recommendations, derive them from its supported gaps and current evidence in
104
+ the successor; do not retrofit the predecessor. If no further investigation is
105
+ needed within scope, say so and explain why rather than inventing work.
106
+
107
+ ## Save and read back
108
+
109
+ If the destination already exists or changed since it was read, stop that write
110
+ and propose a new file or a reviewed merge. Do not claim atomic guarded storage
111
+ or byte-conflict guarantees that the host has not provided.
112
+
113
+ After saving, read the saved bytes through an available tool and check that the
114
+ findings, references, uncertainties, human choices and current recommendations
115
+ survived. Provide the actual path or download and report any readback limitation. Merely printing a filename
116
+ is not a save. Reopening in a fresh chat is a separate continuation check.
117
+
118
+ Installing or removing the skill changes its availability in the host. User notes
119
+ belong to the user and must remain outside the plugin installation/cache folders.
120
+ Never delete research as part of skill removal. Uninstallation does not erase
121
+ instructions or source content already present in an old conversation.
@@ -0,0 +1,89 @@
1
+ # Workspace operations
2
+
3
+ Use this mode for setup, repeated setup, readiness and fresh-chat recognition.
4
+ A workspace is a user-owned folder, independent of a vault, source checkout,
5
+ Lab or app project. The only initial file is `.n8r/workspace.json`.
6
+
7
+ If the user means starting research in a web Project rather than creating a local
8
+ folder, use [first-use access](first-use-access.md) and begin from supplied sources.
9
+ If explicit local setup is requested but the host cannot access a persistent local
10
+ filesystem or supported Node runtime, report that operation blocked. Keep useful
11
+ source research available; do not ask for a laptop path the host cannot access.
12
+
13
+ ## Run the shared helper
14
+
15
+ Requires a local persistent filesystem and Node.js 22, 24 or 26 on macOS/Linux.
16
+ Use the helper **from this installed skill**, resolving its absolute path relative
17
+ to this reference, not from a developer checkout. Invoke it through `node`:
18
+
19
+ ```sh
20
+ node /installed/skill/scripts/workspace.mjs inspect /selected/workspace
21
+ node /installed/skill/scripts/workspace.mjs setup /selected/workspace --purpose 'Investigate LibreChat'
22
+ ```
23
+
24
+ The paths above are placeholders. Quote actual paths and supplied text safely;
25
+ never interpolate untrusted metadata into shell code. `inspect` only reads.
26
+ `setup` requires the user's explicit setup request. Supply `--name` only if the
27
+ user supplied a display name; otherwise the folder name is used. Supply a brief
28
+ nonsecret `--purpose` from the stated intent when available; it is optional.
29
+ Do not put credentials, private bindings or absolute source paths in metadata.
30
+ No naming/schema questionnaire is needed. Ask for a destination only when the
31
+ user's selected/current folder cannot be established.
32
+
33
+ If Node, the helper, local access or persistent storage is unavailable, explain
34
+ that blocker and the concrete prerequisite. Do not install a runtime, recreate
35
+ the helper's filesystem logic by hand, or claim a download is a local workspace.
36
+ A host without shell/local persistence cannot perform this workspace operation.
37
+ The standalone research CLI and Labs do not yet expose this capability.
38
+
39
+ ## Interpret the result
40
+
41
+ The helper prints one JSON object with `status`, `message`, absolute `directory`
42
+ when available, and `record` for a supported workspace. Exit 0 means created or
43
+ recognized; exit 3 means missing, empty or awaiting a destination choice; exit 2
44
+ means invalid input, malformed/unsupported metadata, conflict or I/O failure.
45
+ These are helper results, not permission to expand the task.
46
+
47
+ - `created`: report the actual location and a useful next research action. The
48
+ helper has read back the complete record. No research has started.
49
+ - `recognized`: reuse the saved ID, name and optional purpose without rewriting
50
+ or asking again. Report readiness for research, not proof of prior research or
51
+ a configured target. For a readiness question, offer a next action based on
52
+ saved purpose or relevant existing notes without starting it. Read notes only
53
+ as needed; do not infer findings from metadata or generic filenames.
54
+ - `missing` / `empty`: inspection found no workspace. Explain this; recognition
55
+ alone does not authorize creation. An explicit setup request can call `setup`.
56
+ - `needs-choice`: explain that files already exist and ask “Initialize here, or
57
+ use another folder?” Make no writes before the choice. Only an explicit
58
+ initialize-here choice permits `setup PATH --adopt` (with supplied name/purpose).
59
+ If another folder is chosen, run normal setup there without `--adopt`.
60
+ - `malformed` / `unsupported` / `conflict`: explain the helper's specific reason
61
+ and offer another destination or separately requested repair assessment. Make
62
+ no changes; no automatic migration, downgrade, replacement or cleanup.
63
+ - `invalid-input` / `io-error`: report the specific limitation; do not claim
64
+ success. An interrupted operation may leave metadata staging files. Inspect
65
+ read-only if needed; repair is separate and never implied by a retry.
66
+
67
+ For recognized/created results, identify the saved format and stable ID without
68
+ requiring the user to understand their encoding. Keep the interaction short.
69
+ Filesystem creation does not attach the folder to an app project. Say attachment
70
+ is separate; only claim it if a supported host action actually occurred. Setup
71
+ does not require attachment, Git, credentials, global settings or a vault.
72
+ Do not create README, AGENTS.md, `.gitkeep`, models or content directories during
73
+ setup. Research remains a separate requested action.
74
+
75
+ ## Shared metadata meaning
76
+
77
+ `n8r.workspace/1` is independent of plugin and AI Surface Model versions. The
78
+ helper validates a JSON object with that exact `format`, generated UUID v4 `id`,
79
+ nonempty text `name`, and optional text `purpose`. Unknown fields are preserved
80
+ and confer no capabilities. The ID survives setup repetition, rename, move and
81
+ fresh sessions. Invalid JSON/required fields are malformed; a different format
82
+ token is unsupported. Recognition is always read-only, never repair.
83
+
84
+ The bundled `scripts/workspace.mjs` exports `validateWorkspace`,
85
+ `inspectWorkspace` and `setupWorkspace` for future consumers. It owns the
86
+ filesystem decisions; do not fork them into host-specific implementations.
87
+ It publishes complete metadata without overwriting a target. Interrupted staging
88
+ is never accepted as a valid record. Concurrent writers, adversarial filesystem
89
+ mutation, migration and power-loss durability are not supported guarantees.
@@ -0,0 +1,273 @@
1
+ Bundled third-party code and schemas
2
+
3
+ CycloneDX 1.7 schemas: OWASP Foundation / CycloneDX contributors, Apache-2.0.
4
+ Source commit 4b3f59453366e27c8073fd24e98bf21ef8892c8e. See bundled LICENSE for Apache-2.0 terms.
5
+
6
+ ajv 8.20.0 (MIT)
7
+ The MIT License (MIT)
8
+
9
+ Copyright (c) 2015-2021 Evgeny Poberezkin
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+
29
+
30
+
31
+ ajv-formats 3.0.1 (MIT)
32
+ MIT License
33
+
34
+ Copyright (c) 2020 Evgeny Poberezkin
35
+
36
+ Permission is hereby granted, free of charge, to any person obtaining a copy
37
+ of this software and associated documentation files (the "Software"), to deal
38
+ in the Software without restriction, including without limitation the rights
39
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
40
+ copies of the Software, and to permit persons to whom the Software is
41
+ furnished to do so, subject to the following conditions:
42
+
43
+ The above copyright notice and this permission notice shall be included in all
44
+ copies or substantial portions of the Software.
45
+
46
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
47
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
48
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
49
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
50
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
51
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52
+ SOFTWARE.
53
+
54
+
55
+ ajv-formats-draft2019 1.6.1 (MIT)
56
+ MIT License
57
+
58
+ Copyright (c) 2020 Carlo Q
59
+
60
+ Permission is hereby granted, free of charge, to any person obtaining a copy
61
+ of this software and associated documentation files (the "Software"), to deal
62
+ in the Software without restriction, including without limitation the rights
63
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
64
+ copies of the Software, and to permit persons to whom the Software is
65
+ furnished to do so, subject to the following conditions:
66
+
67
+ The above copyright notice and this permission notice shall be included in all
68
+ copies or substantial portions of the Software.
69
+
70
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
71
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
72
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
73
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
74
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
75
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
76
+ SOFTWARE.
77
+
78
+
79
+ extend 3.0.2 (MIT)
80
+ The MIT License (MIT)
81
+
82
+ Copyright (c) 2014 Stefan Thomas
83
+
84
+ Permission is hereby granted, free of charge, to any person obtaining
85
+ a copy of this software and associated documentation files (the
86
+ "Software"), to deal in the Software without restriction, including
87
+ without limitation the rights to use, copy, modify, merge, publish,
88
+ distribute, sublicense, and/or sell copies of the Software, and to
89
+ permit persons to whom the Software is furnished to do so, subject to
90
+ the following conditions:
91
+
92
+ The above copyright notice and this permission notice shall be
93
+ included in all copies or substantial portions of the Software.
94
+
95
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
96
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
97
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
98
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
99
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
100
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
101
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
102
+
103
+
104
+
105
+ fast-deep-equal 3.1.3 (MIT)
106
+ MIT License
107
+
108
+ Copyright (c) 2017 Evgeny Poberezkin
109
+
110
+ Permission is hereby granted, free of charge, to any person obtaining a copy
111
+ of this software and associated documentation files (the "Software"), to deal
112
+ in the Software without restriction, including without limitation the rights
113
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
114
+ copies of the Software, and to permit persons to whom the Software is
115
+ furnished to do so, subject to the following conditions:
116
+
117
+ The above copyright notice and this permission notice shall be included in all
118
+ copies or substantial portions of the Software.
119
+
120
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
121
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
122
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
123
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
124
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
125
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
126
+ SOFTWARE.
127
+
128
+
129
+ fast-uri 3.1.9 (BSD-3-Clause)
130
+ Copyright (c) 2011-2021, Gary Court until https://github.com/garycourt/uri-js/commit/a1acf730b4bba3f1097c9f52e7d9d3aba8cdcaae
131
+ Copyright (c) 2021-present The Fastify team <https://github.com/fastify/fastify#team>
132
+ All rights reserved.
133
+
134
+ Redistribution and use in source and binary forms, with or without
135
+ modification, are permitted provided that the following conditions are met:
136
+ * Redistributions of source code must retain the above copyright
137
+ notice, this list of conditions and the following disclaimer.
138
+ * Redistributions in binary form must reproduce the above copyright
139
+ notice, this list of conditions and the following disclaimer in the
140
+ documentation and/or other materials provided with the distribution.
141
+ * The names of any contributors may not be used to endorse or promote
142
+ products derived from this software without specific prior written
143
+ permission.
144
+
145
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
146
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
147
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
148
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
149
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
150
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
151
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
152
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
153
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
154
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
155
+
156
+ * * *
157
+
158
+ The complete list of contributors can be found at:
159
+ - https://github.com/garycourt/uri-js/graphs/contributors
160
+
161
+ json-schema-traverse 1.0.0 (MIT)
162
+ MIT License
163
+
164
+ Copyright (c) 2017 Evgeny Poberezkin
165
+
166
+ Permission is hereby granted, free of charge, to any person obtaining a copy
167
+ of this software and associated documentation files (the "Software"), to deal
168
+ in the Software without restriction, including without limitation the rights
169
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
170
+ copies of the Software, and to permit persons to whom the Software is
171
+ furnished to do so, subject to the following conditions:
172
+
173
+ The above copyright notice and this permission notice shall be included in all
174
+ copies or substantial portions of the Software.
175
+
176
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
177
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
178
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
179
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
180
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
181
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
182
+ SOFTWARE.
183
+
184
+
185
+ nearley 2.20.1 (MIT)
186
+ The MIT License (MIT)
187
+
188
+ Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019 Kartik Chandra, Tim Radvan
189
+
190
+ Permission is hereby granted, free of charge, to any person obtaining a copy
191
+ of this software and associated documentation files (the "Software"), to deal
192
+ in the Software without restriction, including without limitation the rights
193
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
194
+ copies of the Software, and to permit persons to whom the Software is
195
+ furnished to do so, subject to the following conditions:
196
+
197
+ The above copyright notice and this permission notice shall be included in all
198
+ copies or substantial portions of the Software.
199
+
200
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
201
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
202
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
203
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
204
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
205
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
206
+ SOFTWARE.
207
+
208
+
209
+ schemes 1.4.0 (MIT)
210
+
211
+ (The MIT License)
212
+
213
+ Copyright (c) 2015 Peter Müller <munter@fumle.dk>
214
+
215
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
216
+
217
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
218
+
219
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
220
+
221
+
222
+ smtp-address-parser 1.1.1 (MIT)
223
+ MIT License
224
+
225
+ Copyright (c) 2021 Gene Hightower
226
+
227
+ Permission is hereby granted, free of charge, to any person obtaining a copy
228
+ of this software and associated documentation files (the "Software"), to deal
229
+ in the Software without restriction, including without limitation the rights
230
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
231
+ copies of the Software, and to permit persons to whom the Software is
232
+ furnished to do so, subject to the following conditions:
233
+
234
+ The above copyright notice and this permission notice shall be included in all
235
+ copies or substantial portions of the Software.
236
+
237
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
238
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
239
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
240
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
241
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
242
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
243
+ SOFTWARE.
244
+
245
+
246
+ uri-js 4.4.1 (BSD-2-Clause)
247
+ Copyright 2011 Gary Court. All rights reserved.
248
+
249
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
250
+
251
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
252
+
253
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
254
+
255
+ THIS SOFTWARE IS PROVIDED BY GARY COURT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARY COURT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
256
+
257
+ The views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Gary Court.
258
+
259
+
260
+ yaml 2.9.1 (ISC)
261
+ Copyright Eemeli Aro <eemeli@gmail.com>
262
+
263
+ Permission to use, copy, modify, and/or distribute this software for any purpose
264
+ with or without fee is hereby granted, provided that the above copyright notice
265
+ and this permission notice appear in all copies.
266
+
267
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
268
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
269
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
270
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
271
+ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
272
+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
273
+ THIS SOFTWARE.