witnora 0.18.7 → 0.18.8

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/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ Witnora CLI Commercial License
2
+
3
+ Copyright (c) 2026 the Witnora copyright holders. All rights reserved.
4
+
5
+ This package may be installed and used to connect customer-owned Agents to an
6
+ authorized Witnora service. Redistribution, modification, reverse engineering,
7
+ or use to operate a competing hosted service is not permitted without written
8
+ permission from the copyright holders.
9
+
10
+ Historical package versions released under Apache License 2.0 retain the rights
11
+ granted with those versions. Public schemas, SDKs, Runtime interfaces, Probe,
12
+ and offline verifiers are available separately in `witnora-framework` under
13
+ Apache License 2.0.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR
17
+ A PARTICULAR PURPOSE, AND NONINFRINGEMENT.
@@ -58,13 +58,15 @@ export function createGatewayServicePlan(input) {
58
58
  }
59
59
  function windowsPlan(input, id, args) {
60
60
  const definitionPath = `${input.serviceHome}\\${id}.xml`;
61
- const argumentsValue = args.map(windowsArgument).join(" ");
61
+ const hiddenCommand = `& ${[input.nodeExecutable, ...args].map(powerShellArgument).join(" ")}`;
62
+ const argumentsValue = ["-NoLogo", "-NoProfile", "-NonInteractive", "-WindowStyle", "Hidden", "-Command", hiddenCommand]
63
+ .map(windowsArgument).join(" ");
62
64
  const definition = `<?xml version="1.0" encoding="UTF-16"?>
63
65
  <Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
64
66
  <Triggers><LogonTrigger><Enabled>true</Enabled><UserId>${xml(input.userId)}</UserId></LogonTrigger></Triggers>
65
67
  <Principals><Principal id="Author"><UserId>${xml(input.userId)}</UserId><LogonType>InteractiveToken</LogonType><RunLevel>LeastPrivilege</RunLevel></Principal></Principals>
66
68
  <Settings><MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy><StartWhenAvailable>true</StartWhenAvailable><ExecutionTimeLimit>PT0S</ExecutionTimeLimit><RestartOnFailure><Interval>PT1M</Interval><Count>999</Count></RestartOnFailure></Settings>
67
- <Actions Context="Author"><Exec><Command>${xml(input.nodeExecutable)}</Command><Arguments>${xml(argumentsValue)}</Arguments><WorkingDirectory>${xml(input.repository)}</WorkingDirectory></Exec></Actions>
69
+ <Actions Context="Author"><Exec><Command>powershell.exe</Command><Arguments>${xml(argumentsValue)}</Arguments><WorkingDirectory>${xml(input.repository)}</WorkingDirectory></Exec></Actions>
68
70
  </Task>`;
69
71
  return { id, kind: "WINDOWS_TASK", definitionPath, definition,
70
72
  install: { command: "schtasks.exe", args: ["/Create", "/TN", id, "/XML", definitionPath, "/F"] },
@@ -106,5 +108,6 @@ function launchdPlan(input, id, args) {
106
108
  uninstall: { command: "launchctl", args: ["bootout", domain, definitionPath] } };
107
109
  }
108
110
  function windowsArgument(value) { return `"${value.replaceAll('"', '\\"')}"`; }
111
+ function powerShellArgument(value) { return `'${value.replaceAll("'", "''")}'`; }
109
112
  function systemd(value) { return `"${value.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`; }
110
113
  function xml(value) { return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&apos;"); }
package/dist/onboard.js CHANGED
@@ -240,7 +240,9 @@ export async function runOnboard(options) {
240
240
  ? { state: "LOCAL_SANDBOX_READY", checkedAt: new Date().toISOString(), limitations: [] }
241
241
  : { state: "RECORDED_ONLY", checkedAt: new Date().toISOString(), limitations: [runtimeLimitation ?? "The local sandbox Runtime worker has not established exact adapter, probe, source-key, identity, mandate, and readiness bindings."] };
242
242
  await reportInstall(requestFetch, server, token.projectId, token.apiKey, setupPlan.id, {
243
- status: "verified", attemptId, generatedFiles: relativeGeneratedFiles(repositoryPath, generatedFiles), runtimeReadiness, ...(runtimeBinding ? { runtimeBinding } : {}),
243
+ status: "verified", attemptId, generatedFiles: relativeGeneratedFiles(repositoryPath, generatedFiles), runtimeReadiness,
244
+ connectedAgent: { externalId: repository.name, name: humanizeAgentName(repository.name), version: repository.version, framework: frameworkForTemplate(repository.template) },
245
+ ...(runtimeBinding ? { runtimeBinding } : {}),
244
246
  });
245
247
  output(`\nWitnora Setup Autopilot completed for ${repository.name}.\n`);
246
248
  output(`Project: ${token.projectId}\nTemplate: ${repository.template} (${repository.kind})\n`);
@@ -256,7 +258,7 @@ export async function runOnboard(options) {
256
258
  output(assuranceHarnessReadiness.state === "ACTIVE"
257
259
  ? `Assurance Harness: ACTIVE. Nora can dispatch authority-ready Replay and no-write Shadow evaluations without manual Workflow IDs, evaluator origins, credentials, or contract digests.${realPathActivation.activations.length ? ` ${realPathActivation.activations.length} exact Stripe test-mode real-path binding(s) passed read-only preflight.` : ""}\n`
258
260
  : `Assurance Harness: WAITING_FOR_CUSTOMER_HARNESS. ${assuranceHarnessReadiness.limitation}\n`);
259
- output("The self-test remains isolated. The Gateway is ready in the background; run the agent normally. The first source-signed, server-reconciled Gateway run completes onboarding.\n");
261
+ output("Connected. Nora is monitoring this Agent. Run it normally whenever it is ready; the first source-signed activity will appear automatically without blocking setup.\n");
260
262
  return { projectId: token.projectId, connectionName: token.connectionName, credentialsPath, template: repository.template,
261
263
  repositoryKind: repository.kind, generatedFiles, receiptPath, discovery, setupPlanId: setupPlan.id,
262
264
  gatewayDirectory: join(repositoryPath, ".witnora", "gateway"), gatewayArchiveDirectory: gatewayMigration?.archiveDirectory,
@@ -389,6 +391,7 @@ export async function inspectRepository(repositoryPath, explicitTemplate) {
389
391
  const rawName = typeof packageJson?.name === "string" ? packageJson.name : basename(repositoryPath);
390
392
  const name = rawName.replace(/^@[^/]+\//, "") || "agent-repository";
391
393
  const slug = (name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "") || "agent-repository").slice(0, 64);
394
+ const version = typeof packageJson?.version === "string" && packageJson.version.trim() ? packageJson.version.trim() : "local";
392
395
  const fingerprintSha256 = createHash("sha256").update(JSON.stringify({ kind, name, files: names.filter((value) => !value.startsWith(".")).slice(0, 200) })).digest("hex");
393
396
  const dependencyNames = packageJson ? [
394
397
  ...Object.keys(record(packageJson.dependencies)),
@@ -397,7 +400,21 @@ export async function inspectRepository(repositoryPath, explicitTemplate) {
397
400
  ] : [];
398
401
  const manifest = await optionalJson(join(repositoryPath, "witnora.discovery.json"));
399
402
  const capabilities = inferPrivateCapabilities({ dependencyNames, topLevelNames: names, manifest });
400
- return { kind, name, slug, template, fingerprintSha256, capabilities };
403
+ return { kind, name, slug, version, template, fingerprintSha256, capabilities };
404
+ }
405
+ function frameworkForTemplate(template) {
406
+ if (template === "coding")
407
+ return "coding-agent";
408
+ if (template === "workflow")
409
+ return "workflow-engine";
410
+ if (template === "data")
411
+ return "data-agent";
412
+ if (template === "browser")
413
+ return "browser-agent";
414
+ return "mcp";
415
+ }
416
+ function humanizeAgentName(value) {
417
+ return value.replace(/[-_.]+/g, " ").replace(/\b\w/g, (character) => character.toUpperCase()).trim() || value;
401
418
  }
402
419
  async function generateRepositoryConfig(repositoryPath, template, subject) {
403
420
  const files = new Map();
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "witnora",
3
- "version": "0.18.7",
3
+ "version": "0.18.8",
4
4
  "description": "Independent assurance for covered agent action paths across models and frameworks.",
5
5
  "type": "module",
6
- "license": "Apache-2.0",
6
+ "license": "SEE LICENSE IN LICENSE",
7
7
  "homepage": "https://witnora.com/",
8
8
  "repository": {
9
9
  "type": "git",
@@ -64,6 +64,7 @@
64
64
  "files": [
65
65
  "dist",
66
66
  "README.md",
67
+ "LICENSE",
67
68
  "package.json"
68
69
  ],
69
70
  "scripts": {